読者です 読者をやめる 読者になる 読者になる

なんだこれ

ruby

node.hにあるNODE_OP_ASGN_ORNODE_OP_ASGN_ANDNODE_OP_ASGN1NODE_OP_ASGN2についてです。問題は、これがなんなのかということ。すぐに思い付くのはx += 1みたいのですが、これはパーサの時点でx = x + 1になります。

じゃなんだこれ。

まず、ORとANDですが、これはx &&= yy ||= zに対応します。多分、&&と||の評価をショートカットしたいので、特別な式になっているんでしょう。試してみよう。

a = nil
a &&= (1/0)
a += (1/0)

なるほど。

で、NODE_OP_ASGN1NODE_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やるなぁ。