Rubyをいじってみた in セプキャン2011

セプキャンに関わったすべての方へ、ありがとうございました。そしてお疲れ様でした。

僕はRubyの文法ハックという個人課題テーマのもと、二重のforループを1文にまとめる記法を付け加えました。

わかりやすくコードで示す

簡単に、

for x in 1..3 do
    for y in 2..4 do
      #...(中略)...
    end
end

という2重ループをよく作ると思いますが、これを

for2 x in 1..3 with y in 2..4 do
 #...(中略)...
end

という形で書けるというものです。

どういう成果か?

上の二つの構文は、構文解析の結果が同じになるようにしています。
つまり、構文木を生成するときに2重のforループとして生成しています。そうなるようなパーサを悩みながらカリカリ書いたわけですよ。
yaccは初歩的な部分しか分かっていなかったので、Rubyの1万行もあるparse.yは読むだけでとても骨が折れました。
コードはgithubに置いておきました。コミットログを見たら苦悩の日々が伺えるでしょう。
https://github.com/nikuuchi/oreore_ruby
多分make時にgperfが必要となります。また、発表時にビルドしたものから改善し、Ripperクラスに対するエラーは出なくなりました。

ツッコミどころに対する言い訳

作っている途中や発表後にツッコミを入れられたFAQ的なものです。
Rubyistってforよりeach使うことが多いよね
はい、僕もRubyでforループほとんど使いません。とはいえeach使うならブロックつきメソッドをRubyで書いたら簡単に出来ますよね。
文法ハックがテーマなので、そこは多めに見てあげてください。
for2とか、forに出来なかったの?
自分の知識不足で、セプキャン時間内に既存のforと衝突しないyaccの書き方ができませんでした。
今後の課題です。
withって何?分かりづらい。
他に良い英単語が思いつきませんでした。また、最初はカンマでやりたかったのですが、条件式が柔軟に式を取れるようになっているので、
","だとメソッドの引数と間違われるというパーサエラーにぶつかりました。誰か英語力をください。

まとめ

まだまだ質が低いので、多重ループに対応したりfor2の2を書かなくても大丈夫にしてより良いものにしたいなあと思います。