Perl5.11.2 の Perl_keyword_plugin ハックがまじアツイゼ!の巻。
最近、さっぱり Perl のことを書かないので、Go に改宗したかとおもわれがちな tokuhirom ですこんばんわ。
http://d.hatena.ne.jp/gfx/20091121/1258770809
をみてたら、Perl5.11.2 でクールなハックがはいってることを知りました。こ れ は 熱 い!!ということでちょっと調べてみたよ!
端的にいうと、PL_keyword_plugin をつかえば、Devel::Declare のようなシンタックスを操作してしまう系の hack が可能になるということ。
つまり、Perl の syntax の制限で実現できなかった記法とかが、CPAN モジュールにより可能になるということ!その仕組みが Perl5 に公式にはいるということ!
これは熱い。しかもこれ、激しく自由度が高い。これはキーワードをフックして、そっから先のパーズを Perl5 ではなくモジュールでやるということなので、ソースコードフィルターなみの自由度が実現できる。それでいて、イジくっている箇所がステートメントの途中とかでも構わないという。
Perl5.11.2 に付属している、XS::APITest::RPN というサンプルコードでは、RPN (後置記法)で数式をかけるモジュールが実現されている!もちろん、このモジュール自体はまったく実用的ではないが、どういうことができるかというサンプルになるだろう。
use XS::APItest::KeywordRPN qw(rpn calcrpn); $triangle = rpn($n $n 1 + * 2 /); calcrpn $triangle { $n $n 1 + * 2 / }
このコードはあきらかに Perl5 では syntax error になるが、Perl5.11.2 なら、こういうハックが可能なのだ。
この syntax を動的にかえられるという機能は Perl6 には前からあったものだが(iirc)、その思想が形をかえて Perl5 にやってきたということでしょう。
これをうまくつかえば、Perl5 だと syntax の制限からちょっとダサい書き方をしてた DSL とかもパリッと書けますね。具体的には
BEGIN { extends "Foo"; }
とか書かんでも、extends を keyword でフックすればコンパイルタイムに処理できる!ワッホイ!