[ruby-list:664] Re: help for lambda

From:
Date: 1996-09-30 07:39:56 UTC
List: ruby-list #664
けいじゅ@SHLジャパンです. 

In [ruby-list :00662 ] the message: "[ruby-list:662] Re: help for
lambda ", on Sep/30 15:33(JST) matz@caelum.co.jp (Yukihiro Matsumoto)
writes:

>|あともうすこしですから(今日で終り?) がんばってね. 
>少なくとも今週は続きそうです.

そうですか... といいつつメイルを出してしまう(^^;;

>|そしたら, とんでもない? バグを発見しました!! これをバグというには可哀
>|想ですが SEGV で落ちるので...
>いやあ,バグですね.修正しました.

忙しい割りに素早いですね(^^;; 
# メイルのリプライに若干ディレイがあるので, 忙しいことは感じますが
# (^^;;;

>イテレータブロックとlambdaでの動きの違いですが,以下のルール
>になっています.
>
>  * イテレータブロックがまだスタック上に残っている時(イテレー
>    タの終了前)にはイテレータと同じ
>  * それ以外の場合には,retry,returnは使えない(戻り先が無い
>    ので).
>
>そんなに難しくないでしょ.

なるほど, 結構動的だったんですね. 普通(常識的)に考えればよいと...

さっき, breakの動きが変だといっていたのは, breakを再定義していたせいで
した. 良く分析してみると, 以下のような状況になっています.

def baz
  print "baz\n"
end

class Foo
  def baz
    print "Foo#baz\n"
  end

  def foo
    yield
  end
  
  def bar
    if iterator?
      p = proc
    else
      p = proc{baz}
    end
    p.call
  end
end

f = Foo.new
f.foo{
  baz
}
f.bar
f.bar{baz}

---
Foo#baz
Foo#baz
baz

この実行結果は正しいのですかねえ?? 特に1番めの結果が気になるのですが???
1番めは, そのイテレータブロックの定義されている静的スコープで有効なも
のになるはずですから, 結果は``baz''になるはずだと思うのですが?

ちなみに, 0.99-96/07/22では

baz
Foo#baz
baz

となります. 

__
..........................................石塚 圭樹@SHLジャパン(株)...
------------->アドレス変わりました!! e-mail: keiju@shljapan.co.jp <----

In This Thread

Prev Next