use Foo () としたときFoo->importが呼ばれないのはなぜか
perl5の話題。
use Foo
とするとFooをrequireしつつ、Foo->import
が呼ばれることはよく知られているが、
use Foo ()
としたときには、importは呼ばれない。
これをどういう風にして実現しているのか前から疑問に思っていた。 というのも普通の関数は「引数なし」と「空リストの引数」を区別できないからだ。
perlのソースコードをみたところ、 parseのところで「引数なし」と「空リストの引数」を区別しているとわかった。
https://github.com/Perl/perl5/blob/v5.24.0/op.c#L6048
https://github.com/Perl/perl5/blob/v5.24.0/perly.y#L346-L354
追記
import を呼ばないための記法として use Foo () が用意された、という経緯があった気がしますん> https://t.co/rloCEVR1fm
— hkoba (@hkoba) November 6, 2016
@shoichikaji perlfunc に書き加わったのがこのパッチの時ぽいです. 1995. (This is patch.2b1g to perl5.002beta1.)> https://t.co/GJ0JtlerYZ
— hkoba (@hkoba) November 6, 2016