トップ «前の日記(2009-01-11) 最新 次の日記(2009-01-17)» 編集

Route 477



2009-01-16

[ruby] 「expr」は本当にexpressionなのか? - Rubyの式と文について考える

Rubyのparse.yを読むと、「stmt (statement)」と「expr (expression)」という非終端記号があることがわかる。

stmtに入るのは、例えばif修飾子(print "hello" if x)とか。exprに入るのは、1 + 2など、値を持つものすべてだ。

exprはstmtの一種である。つまり、stmtが書けるところならどこでもexprが書けるということ。

stmt =
     ...
     | expr;

ではexprとstmtはどう違うのだろう?parse.yを見ると、ifの条件部分など、「exprは書けるがstmtが書けないところ」があることが分かる。

     | kIF expr_value then
       compstmt
       if_tail
       kEND

ifの条件部分は当然、値をもつものでなければならないので、ここにexprしか書けないのは妥当に思える。 だが、実は先ほどの説明には嘘があって、実際にはstmtもすべて値を持つのだ。

stmtの値を取り出すには、グルーピングの括弧を使えばいい。例えば 「1 if true」はstmtだから、

p( 1 if true )

はパースエラーだ。一方、括弧を付けた「(1 if true)」はexprになるので、

p( (1 if true) )

は正しく実行でき「1」が出力される。

stmtとexprという名前

C言語などではstatement(文)とexpression(式)は明確に区別され、式は値を持つが文は値を持たない。 けれど、Rubyではstmtもexprもすべて値を持つ。

とすれば、Rubyのstmtとexprには、もっと「よりふさわしい名前」があるのではないだろうか?

例えば、

  • stmt = Expression, expr = Value expression

とか。

もちろん、非終端記号の名前なんてRubyユーザには関係ないし、Rubyを開発しているコミッタにとってさえ、それほど重要ではない。 けれど、規格書を書く側としては何にどういう名前を付けるかが重要ででですね…、 悩み多き日々です。良い名前を思いついた方は教えてください。

[link] memo: Cyanを設計した高校生、5カ月で5つの言語を習得 − @IT自分戦略研究所

Javaは遊び心がないかなと思って。その点C#はちょっとユーモアがあるので。

「遊び心」という視点はなかったなぁ。

HSPからCに入ったときに、Cが構造化されていることに感動を覚えた

僕はこの順序と逆なんだよな。

これは後付けですが、Cyanをローマ字読みするとシアン。Cyanには「思案」「試案」「私案」という意味があります。

なるほどw

[ruby][waves] Ruby Wavesでジャグリングの記録簿アプリを作ってみた

こんなんです。→Jugti 画像の説明

「Jugti」は「蛇口」と読みます。「じゃぐ」なら何でも良かった。反省はしていない。

ソースはgithubにあるんで、resources/trick.rbあたりを眺めてみると Ruby Wavesの雰囲気がなんとなく分かるかも知れません。 今回はWaves + Sequel + Markabyという構成で作ったけど、楽しかったよ。

Ruby Waves は、ポストRails世代のRuby用Webアプリケーションフレームワークです。 RESTfulだとか、サイズが比較的小さいとかいろいろ特徴はあるけど、詳しい紹介はgihyo.jpの記事を。(せっかく日本語でまとまった記事なのに、 ぜんぜん検索で上に来てないので…。)

本日のツッコミ(全2件) [ツッコミを入れる]
shugo (2009-01-16 21:12)

exprってけっこう中途半端だよね。andとか、そのまま引数に渡せないし。やっぱりsecondary expressionにするしか。

ujihisa (2009-01-16 21:57)

> secondary expression<br>略してS式ですね。