From: Takaaki Tateishi Date: 2002-07-22T03:49:53+09:00 Subject: [ruby-dev:17759] Re: self in block At Mon, 22 Jul 2002 02:42:10 +0900, > Y lambda {|f| lambda {|arg| ...}} > > というのは(f のスコープを除いて) > > f = lambda {|arg| ...} > > と等価なので、「実は使いたい場面はある」というのは信じられません。 > Y を使う利点というのはどこにあるんでしょうか? 一時的な変数であるfに他の値が代入されない限りは,機能的に 等価になることは理解できます.そのときは def foo ... yield(...) ... end f = lambda{|arg| ... f[arg'] ... } foo(&f) # ここで,f は defined と書くことによって,再帰的なブロックを定義したいためにfという 一時的な変数をfooを呼んでいるスコープで宣言/定義することを避 けたかったのです.再帰的な処理でなければfを定義せずに, foo{|arg| ... } と書いて, f = lambda{|arg| .... } foo(&f) とはしない場合があると思います.このような場合は,fをそこで定義 する必要はない場合で,つまり再帰のためにcall_current_block()やY を使いたい場合と僕が書いたものです.それで,Yを使うなら, foo(&(Y lambda{|f| lambda{|arg|... f[arg'] ..}})) # ここで,f は undefined ということを思ったのですが,Yは普通は使わないし,あえて使おうとも 普通は思わないです.なら,ブロック自体をyield()のように再び呼び出 せればいいのではないかと考え, foo{|arg| ... call_current_block(arg') ... } ということを提案したわけですが, foo{|arg| f = lambda{|_arg| ... f[_arg'] ... } f[arg] } # ここで,f は undefined というように,ローカルにfを定義するだけで十分だなと気がついたので, ちょっと後悔しました. ただ,今でもcall_current_block()があれば楽にかけるのになと思う気持 ちはありますがかなり緩くはなりました. -- Takaaki Tateishi