kiyokaのブログアーカイブ

Archive of old blog posts

Rubyの構文が柔軟すぎる(複雑すぎる)件

ちょっと思う所があって、Rubyの構文を調べてみた。 そんな中Rubyソースコード完全解説がWebで公開されているのを知った。 こんなものが公開されているとは…青木峰郎さんに感謝。 さて、話をRuby構文に戻す。 第10章 パーサのrubyの文法(概要)のあたりを読むと、すごいことが分かってくる。 以下引用 Rubyに存在するあらゆる構文は括弧で囲むと primaryになってしまう、即ちメソッドの引数にも代入の右辺にもできるということで ある。これはとんでもない事実だ。実際に確かめてみよう。

p((class C; end))
p((def a() end))
p((alias ali gets))
p((if true then nil else nil end))
p((1 + 1 * 1 ** 1 - 1 / 1 ^ 1))

このファイルを-cオプション付きでrubyにかける。 -cは構文チェックをするオプションだ。

% ruby -c primprog.rb
Syntax OK

実に信じ難いことだが、本当に通ってしまった。どうやら勘違いではないようである。

なぬー。 実際は、後で構文木の構築を行う際にエラーになるパターンもあるだろうが、このパーサのルールはトンデモない。 Pythonと比べてRubyがPerlの如き柔軟性を感じさせる理由はこのへんかもしれない。 YARVのプレゼンで、ささださんがRubyは何でも式に成ってしまうので最適化という面では 非常に苦労するという話をされていたが、どうやら、このことだったのか…

ちょっと実験でRubyっぽいサブセット構文のパーサを試作してみようと思ったが、 Rubyっぽいだけで結局Rubyの本質が抜け落ちたものに成りそうで、やめた。 練習としてはいいと思うけど。

Rubyソースコード完全解説の他の章も読んでみるといい。Rubyの奥行きはかなり深い。