続・XSのlooks_like_number()
前回の続き。
ListUtil.xs
#if (PERL_VERSION < 8) || (PERL_VERSION == 8 && PERL_SUBVERSION <5) if (SvPOK(sv) || SvPOKp(sv)) { RETVAL = looks_like_number(sv); } else { RETVAL = SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK); } #else RETVAL = looks_like_number(sv); #endif OUTPUT: RETVAL
C言語のプリプロセッサってどんなんだったけ…?、というレベルの僕です。
参考サイト:
「C言語 プリプロセッサ」
「Yahoo!¥¸¥ª¥·¥Æ¥£¡¼¥º」
ありがとうございます。
#if (PERL_VERSION < 8) || (PERL_VERSION == 8 && PERL_SUBVERSION <5)
#if の中はコンパイル前なので定数しか使えないということなので、その定数を探してみる。
まあ雰囲気からしてPerlのメジャーバージョン、マイナバージョンを表しているのだろう。
ListUtil.xs
先頭の方にありました。
#ifndef PERL_VERSION # include <patchlevel.h> # if !(defined(PERL_VERSION) || (SUBVERSION > 0 && defined(PATCHLEVEL))) # include <could_not_find_Perl_patchlevel.h> # endif # define PERL_REVISION 5 # define PERL_VERSION PATCHLEVEL # define PERL_SUBVERSION SUBVERSION #endif
リビジョン、バージョン、サブバージョンか。
もうここは調べない。
いま5.11.4をいれてるから、
- PERL_REVISION -> 5
- PERL_VERSION -> 11
- PERL_SUBVERSION -> 4
になるはずたぶん。
で、#ifの中を通るのか通らないのかといえば。
#if (PERL_VERSION < 8) || (PERL_VERSION == 8 && PERL_SUBVERSION <5)
はPerl5.8未満、あるいは、Perl5.8.5未満のときに真なので、通らない。
ということは、
#else RETVAL = looks_like_number(sv); #endif
を通るわけでってええ!?
再帰するんですか!?
うーん、つまりグロブやらリファレンスやらの間接的な変数の値を再帰的に戻していく、みたいな感じかー?
でRETVALがOUTPUTされる、と。
おお、結局どこで数値か判定しているのかどうかわからなかった。
どこかのマクロなんだろうとは思うけれど…。
どうしよう。手出すのが早かったのかなー。感想がほんと「よくわからん」で終わってしまいそうだ。
まあPerlの内部構造がちょっとでも分かったのでよしとしたい自分の中では以上。