呼び出し元のローカル変数を変更する

Evanから資料が上がってこないので、Rubiniusで遊んでみる。
次のコードは、あるメソッドの中から呼び出し元のローカル変数を変更するサンプル。
もちろんRubinius限定。

def f()
  var = 1
  g(var)                   # var が 2 に変更される
  puts "f(): var=#{var}"   #=> "f(): var=2"
end

def g(x)
  ## 呼び出し元のローカル変数の値を操作する
  context = MethodContext.current.sender
  v = context.locals[0]    # context.locals[:a] とできて欲しい
  context.locals[0] = v + 1
end

f()

こんなことができてうれしいかというと、なんともいえない。
ただ、これを喜ぶ人は優秀なハッカーになれる資質がある。
喜ばない人は、RubyよりJavaC#が向いていると思う。