>>228
>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(>>199) の関数型言語におけるクロージャ定義に当てはめれば
「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 のクロージャ定義の引用元(ソース)は >>199 で示したが、まともな反論はない
むしろオレオレ定義と騒ぎ立てていた連中がSICP本を読んだ事もないお馬鹿達だったのでは?
あるいはSICP本を読んでいなくても、関数型言語の操作的意味論や処理系実装の知識があれば
>>4 がオレオレ定義でないことは直ぐに理解できていたはず
クロージャって何がいいの? [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
237デフォルトの名無しさん
2014/12/14(日) 20:48:34.17ID:lkA9lgpO■ このスレッドは過去ログ倉庫に格納されています
