tokuhirom's Blog

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 でフックすればコンパイルタイムに処理できる!ワッホイ!