runkitはPECLでなくて標準添付・Windows版でもデフォルトで有効でいいんじゃないかと思う今日この頃。PHPでもこういうことがしたくなってきました。
<?php // ブロックの外側の変数に影響を与えずコードを実行してその結果を取得 $result = sandbox($a, $b) { /* 何かしらの処理をする */ return $result; } // create_functionと同等のことをより自然な記法で $lambda = lambda($a, $b) { /* 何かしらの処理を記述する */ } // コールは普通に可変関数スタイルで $lambda($a, $b); // これもOK usort($array, lambda($a, $b){ return - strcmp($a, $b); }); // ついでにスタティック変数インジェクションも set_static_variable($lambda, 'foo', 1); // 配列・ハッシュを簡単に書く $list = [1, 2, 3]; $map = {'foo': 1, 'bar': 2, 'baz': 3};
スタティック変数インジェクションはcontinuationの技術を応用すれば実現できるけど、残りは全部BisonとFlexから学ばないといけない... パッチを当ててPHPをリビルドしなくても、Zend Extensionにして関数ポインタzend_compile_fileとzend_compile_stringを差し替えればよさそうというところまでは当たりをつけているのですが...