なんだこれ
node.hにあるNODE_OP_ASGN_OR、NODE_OP_ASGN_AND、NODE_OP_ASGN1、NODE_OP_ASGN2についてです。問題は、これがなんなのかということ。すぐに思い付くのはx += 1みたいのですが、これはパーサの時点でx = x + 1になります。
じゃなんだこれ。
まず、ORとANDですが、これはx &&= yとy ||= zに対応します。多分、&&と||の評価をショートカットしたいので、特別な式になっているんでしょう。試してみよう。
a = nil a &&= (1/0) a += (1/0)
なるほど。
で、NODE_OP_ASGN1とNODE_OP_ASGN2。なんでしょうこのやる気のない名前は。
compile.cを読むと、コメントになんか書いてあるのがわかります。
/* * a[x] (op)= y * * eval a # a * eval x # a x * dupn 2 # a x a x * send :[] # a x a[x] * eval y # a x a[x] y * send op # a x a[x]+y * send []= # ret */
えー。
- NODE_OP_ASGN1
- a[x] (op)= yに対応
- a[x] = a[x] (op) yになる
- NODE_OP_ASGN2
- a.f (op)= yに対応
- a.f=(a.f() (op) y)になる
うーん。Rubyやるなぁ。