トップ «前の日記(2004-05-20 (Thu)) 最新 次の日記(2004-05-22 (Sat))» 編集   RSS 1.0 FEED  

Journal InTime


2004-05-21 (Fri) [長年日記]

_ レシーバとパラメータの評価順序

今回の投票(Ruby: recv.m(a1, a2, ..., &block) の評価順序が a1, a2, ..., recv, block という順序になって許せるか?)は、左から右へ、の原則が嫌だ、というわけではもちろん無くて、「仕様を無視してでも高速化のためには妥協しても仕方がない」部分かそうでないか、ということだと思っております。で、どっちとも取れなくて悩む。

1+2 で 2,1 と評価されるのは気持ち悪いし、やっぱり recv は先にくるべきかなぁ、と揺れ動く今日この頃。

[だいありーより引用]

まつもとさんと話したら、自分の処理系では評価順序を保証したいけど、言語仕様としては 処理系依存でも許せるかなあ、とおっしゃってました。 あと、メソッド探索に失敗した場合に、引数は評価されるべきかどうかも処理系依存で いいんじゃないかとか。

今の処理系で評価順序を保証しているのは、Satherの影響らしい。

ちなみに、Satherではx < yx.is_lt(y)の糖衣構文で、x > yy.is_lt(x)のようにオペランドを入れ換えることになっている *1 のだが、その場合でも評価順序はx -> yでなければならないと 規定されている。

.NETにはswap命令がないので、babelでは

x: BOOL := 2 > 1;

は、

IL_0000:  ldc.i4 2
IL_0005:  stloc.1
IL_0006:  ldc.i4 1
IL_000b:  ldloc.1
IL_000c:  call bool class [bscore]'Babel.Base.INT'::'is_lt'(int32, int32)
IL_0011:  stloc.0

のようになってしまう。 せつない。

Tags: Ruby babel

*1  したがって、is_ltだけ定義しておけば、is_gtを定義しなくてもよい