トップページ > プログラム > 2014年12月16日 > IiuX/rSM

書き込み順位&時間帯一覧

29 位/188 ID中時間01234567891011121314151617181920212223Total
書き込み数1000000000000000000000102



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
クロージャって何がいいの? [転載禁止]©2ch.net

書き込みレス一覧

クロージャって何がいいの? [転載禁止]©2ch.net
264 :デフォルトの名無しさん[sage]:2014/12/16(火) 00:31:08.98 ID:IiuX/rSM
自己レスになりますが、>>242 では:
> (Python だけでなく、この「お題(>>189)」は Ruby であっても再帰を使えば同じく分かりにくいコードになる)
とカキコしました
で、後から考え直して「手続き型のループ&破壊的代入」ではなく、しかも「関数再帰」も使わずに、
参照透明性がある関数型プログラミングのコードを考えてみました
 http://ideone.com/UrfbuL
ポイントは「反復に組み込みメソッド loop」を「ブロック脱出に引数付のbreak文」を使った2点です
なおメソッド loop は一般に loop do .... end という手続き型のスタイルで書かれることが多いために
ループ構文の一種と誤解されがちですが、(lambda を構文糖であると >>254 が 勘違いしたように....)
loop はメソッドですので(コードで示したように) inject へチェーンさせることができます

また「参照透明性はあっても、手続き型の制御構造であるbreak文の利用は反則ではないか?」という
指摘を予測して、
同じスタイルで(break文の代わりに)組み込みメソッド catch と throw を使ったコードも書きました
 http://ideone.com/SaCAFi
ただし、この catch/throw は大域脱出のために用意されたメソッドですから、
今回の「お題」のように単一ブロックを脱出するだけならbreak文を使うのが素直だと考えます

ついでに(catch/throw の代わりに)Scheme 由来の継続(continuation)を使ったコードも書きました
 http://ideone.com/5t1VEq
クロージャって何がいいの? [転載禁止]©2ch.net
277 :デフォルトの名無しさん[sage]:2014/12/16(火) 22:27:19.26 ID:IiuX/rSM
>>267
>あたかも「ブロックはlambdaの構文糖」であるかのような主張をするから、

いや「あるかのよう」ではない、>>244 で以下のように、断定的に明記したとおり:
 > まず >>237 で書いたように、Ruby の「ブロック付きメソッド呼び出し」は構文糖だ
Ruby インタブリタの内部では「ブロック付きメソッド呼び出し」と
「値渡しされた Proc オブジェクト」とは別の表現(C構造体)が用いられ、それらを相互変換している
ただし Ruby プログラマの視点では、値渡しされたProc オブジェクトで「あるかのように」
(すなわちファーストクラスとして)ブロックを扱う事ができる、だから「ブロックは構文糖」になる

ブロックを評価するのにメソッド Proc#call が必須(>>254)なのは、また別の理由....
それらをごっちゃにすべきではない


>>268
>まあ、「構文糖のような存在のメソッド」って用語がおかしいというなら

いや「構文糖のような」という比喩表現であれば、何の問題も無い

>「真のクロージャ」って用語もおかしいのだと気付いて欲しいな

>>4 でクロージャ定義を示してから >>199 までソースを明かすのを遅らせたのは意図的だったけど、
「真のクロージャ」という曖昧な表現でいらぬ混乱を与えたことは余計だったと反省している
最初からストレートに「関数型言語のクロージャ」とすべきだったね


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。