yarv-dev:1085
From: SASADA Koichi <ko1 atdot.net>
Date: Fri, 18 Aug 2006 02:25:44 +0900
Subject: [yarv-dev:1085] fixed> Re: open>value of expression "foo.foo=val" is not r-value
ささだです. これ,スタックマシンでは実現するのが難しくてやってなかったというか,仕 様変更してくれーと思っていたんですが,色々と逆風が強いので従来の仕様にな りました. これのために,スタックトップの値を,スタックの下のほうにコピーする,と いうへんてこな命令を追加しました.悔しい. 言い訳: これは,ary[1, 2]=:x も :x を返さないといけないので,同じ話なのです が,Ruby でベタに書くと,ary.[]=(1, 2, :x) と解釈されるので,これを YARV 命令にするとこんな感じになります. push ary push 1 push 2 push :x send []=, 3 この状態では,スタックに残っているのは []= の返り値になり,返さないとい けない :x は,どっかにいってしまいます. そこで,返す必要があるときは, push nil # (1) place holder push ary push 1 push 2 push :x setn 3 # スタックトップの :x を (1) の領域へコピー send []=, 3 pop こんなふうにした,というわけです.なんとも気持ち悪い命令作っちゃった なぁ.いっそのこと,ランダムアクセス可能にしてしまおうか. Ken Date wrote: > 伊達です。 > > foo=(val) 形式のメソッドを使って代入をした時に、式の値が右辺値ではなくメ > ソッドの戻り値になります。 > > $ ruby-yarv -v -e ' > class Foo > def foo=(val) > nil > end > end > p Foo.new.foo=1 > ' > ruby 2.0.0 (Base: Ruby 1.9.0 2006-04-08) [i686-linux] > YARVCore 0.4.1 Rev: 527 (2006-07-19) [opts: [direct threaded code] > [inline method cache] ] > nil > > $ ruby18 -v -e ' > class Foo > def foo=(val) > nil > end > end > p Foo.new.foo=1 > ' > ruby 1.8.4 (2005-12-24) [i686-linux] > 1 > > $ ruby19 -v -e ' > class Foo > def foo=(val) > nil > end > end > p Foo.new.foo=1 > ' > ruby 1.9.0 (2006-07-21) [i686-linux] > 1 > > attr_writer を使った場合には右辺値になります。 > $ ruby-yarv -v -e ' > class Foo > attr_writer :foo > end > p Foo.new.foo=1 > ' > ruby 2.0.0 (Base: Ruby 1.9.0 2006-04-08) [i686-linux] > YARVCore 0.4.1 Rev: 527 (2006-07-19) [opts: [direct threaded code] > [inline method cache] ] > 1 > > -- > ML: yarv-dev quickml.atdot.net > Info: http://www.atdot.net/~ko1/quickml -- // SASADA Koichi at atdot dot net -- ML: yarv-dev quickml.atdot.net Info: http://www.atdot.net/~ko1/quickml
1065 2006-07-23 01:11 [itacchi gmail.com ] open>value of expression "foo.foo=val" is not r-value -> 1085 2006-08-18 02:25 ┗[ko1 atdot.net ] fixed> Re: open>value of expression "foo.foo=val" is not r-value