残念な結果であった。基本的なアイディアはともかく、 その表現と評価方法に難があったようだ。めげずに頑張ろう。
昨日のエントリでもすこし触れたが、 ブロックパラメータの文法を変更したい気持ちがある。 理由は、昨日述べた通り「メソッド引数リストと同じ文法を使えない」からだ。 yaccをあきらめてパーザをもっとずっと複雑にすれば不可能ではないかもしれないけど。
jijixiさんからツッコミでは(冗談とはいえ)、 Groovyの -> を逆輸入することが提案されていたが、これはあんまりうまくない。
新しい文法への要求としては
である。Groovyの -> はyaccを使う限り、2番目の要求を満たさないと思う。
ちょっと考えて思い付くのは以下のようなものか。
Perl6風無名関数
Groovy同様 -> を使うが、こちらは
-> (x,y) { ... }
のようなもの。Perl6では
foreach ary -> (x) { print x; }
という感じで使う。
こっちの方が見栄えがよいような気がするな。 でも、この場合、-> は引数リストと本体との区切りではなく「lambdaの代わり」になっているな。 ブロックとして使う場合は
{ -> (x, y) ... }
か。なんか変だな。
新しい予約語を使う
昔々、ブロックが導入される前のRubyの文法を検討したメモには「using」という予約語を使う文法を考えていたことが示されている。これを復活させるか。
{ using x, y; ...}
あんまりパラメータらしくないな。やはりメソッド引数宣言に似た文法(つまり括弧で囲まれているということか)が良さそうだ。
lambdaを拡張
結局、メソッド引数のすべての文法が欲しくなるのは無名関数の場合であって、 インラインブロックの文法は今のままで構わないというのもひとつの見識だ。
そこで、lambdaを予約語としてしまうのはどうだろうか。
lambda(x,y) {....}
インラインブロックでたとえばオプショナル引数が指定したい場合には、
foo(args, &lambda(x=15){...})
のように指定することになるだろう。こういうケースはまれだろうから、 積極的に短くすることを支援しなくても良い。
別の記号
しかし、それでもlambdaは長い。では、別の記号を導入するか。 先ほどのPerl6における -> でも良い。Haskellではlambdaはバックスラッシュを使っていなかっただろうか。
\(x,y) { ....}
うーむ、一目で意味が分からないぞ。慣れたらなんとかなるものなのだろうか。 また、フォントによってはバックスラッシュでなく円記号に見えるのもうまくない。
と、考えを撒き散らすだけで、結論はない。
ライセンスの懸念を解消するため、 missingの下にあるerf.cとcrypt.cを4.4BSDからのものに置換。 しかし、そのままではコンパイルできず各方面に迷惑をかけてしまった。
あ、crypt.cはともかくerf.cは奥村先生に連絡を取ってpublic domainの確認を取れば良かったんでないか。 今、気がついた。どうしたもんだか。