kiyoka.2009_09_24 RSSPLAIN

Related pages: !kiyoka.blog.list !kiyoka.blog.2009_09
5555555555555555555555555444444444455555555454555
5

[Nendo] Ruby 1.8.x対応を見送った

5

私がRubyで書いているLisp方言、 Nendoについて。

5

 

5

Nendoでmapをネストして2重ループを形成すると変な動作をする。何だこれは。

5

クロージャのレキシカル変数の内容がどんどん破壊される。

5

小一時間ほど追いかけた結果、Ruby 1.8.xのクロージャの問題だということが発覚した。

5

結論としては、Ruby 1.8.xのクロージャはレキシカルクロージャではないことを自分が忘れていたのが問題。... 3844653122_4b8def232e_m

5

NendoのlambdaはRubyのクロージャにそのままマッピングするようになっているため、Rubyのクロージャがレキシカルクロージャでない限りNendoのlambdaが正常に動かないのも当然だった。

5

 

5

ちょっとテストとしてはわかりにくいかも知れないが、こんなRubyコードで実験した。

5
#!/usr/local/bin/ruby
5
5
lambda1 = lambda { |val|
5
  printf( "(0) = %s\n", val )
5
  val = 'A'
5
  printf( "(1) = %s\n", val )
5
  lambda2 = lambda { |val|
5
    printf( "(2) = %s\n", val )
5
  }
5
  lambda2.call( 'B' )
5
  printf( "(3) = %s\n", val )
5
  val
5
}
5
lambda1.call( 'START' )
5

 

4
Ruby 1.9.2devでは期待通り
4
$ ruby --version
4
ruby 1.9.2dev (2009-07-18 trunk 24186) [powerpc-darwin9.5.0]
4
$ ./t.rb
4
(0) = START
4
(1) = A
4
(2) = B
4
(3) = A
4

(3)の箇所で値 'A' が保持されている

4

 

5
Ruby 1.8.7では...
5
bash-3.2$ ruby --version
5
ruby 1.8.7 (2009-06-12 patchlevel 174) [powerpc-darwin9.5.0]
5
bash-3.2$ ./t.rb
5
(0) = START
5
(1) = A
5
(2) = B
5
(3) = B
4

(3)の箇所で値 'B' になる。

5

 

4

Ruby 1.9.2がもうすぐ正式に出る時期なので、まじめにRuby 1.8.xでも動く様にするのはあきらめよう。

5

ちなみに、JRubyとかはどっちなんだろう。今度確認しよう。

5

 

5

...comment disabled...