読者です 読者をやめる 読者になる 読者になる

Perl日記

PerlとかRubyとかPHPとかPythonとか

続・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をいれてるから、

になるはずたぶん。


で、#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の内部構造がちょっとでも分かったのでよしとしたい自分の中では以上。