- 240 名前:デフォルトの名無しさん mailto:sage [2014/12/14(日) 20:48:34.17 ID:lkA9lgpO.net]
- >>231
>Rubyのブロックはラムダじゃないしファーストクラスでもないよね? Python や JavaScript のクロージャは、(名前が宣言された)関数と同様に クロージャへ引数を渡すだけで評価される closure = function(x) { return x + 1 } # クロージャを生成して名前に束縛 succ_of_one = closure(1) # クロージャを評価 それに対して Ruby だと、メソッド Proc#call を呼ばなければ評価されない block = lambda { |x| x + 1 } # ブロックを生成して名前に束縛 succ_of_1 = block.call(1) # ブロックを評価 従って >>4(>>201) の関数型言語におけるクロージャ定義に当てはめれば 「Ruby のブロックは(本物の)クロージャではない」あるいは「....はクロージャもどきである」 またRuby のブロックの意味はオブジェクト(Procクラスのインスタンス)だからファーストクラスである >メソッドにラムダを渡すこともできるけど、不格好なんだが? たしかに不格好だ def foo(x, y, &block); .... ; end # メソッドを定義 foo(x, y, lambda { |z| .... }) # メソッドの呼び出し だから Ruby には「ブロック付きメソッド呼び出し」という構文糖が最初から用意されている def foo(x, y); .... ; end # メソッドを定義 foo(x, y) { |z| .... } # メソッドの呼び出し >Pythonの仕様をあげつらうためだけにオレオレ定義をこねくって >>4 のクロージャ定義の引用元(ソース)は >>201 で示したが、まともな反論はない むしろオレオレ定義と騒ぎ立てていた連中がSICP本を読んだ事もないお馬鹿達だったのでは? あるいはSICP本を読んでいなくても、関数型言語の操作的意味論や処理系実装の知識があれば >>4 がオレオレ定義でないことは直ぐに理解できていたはず
|

|