08/09/05 15:46:59
P.137の multirember&co の定義で2つコレクター出てくる。
ひとつは
(lambda (newlat seen)
(col newlat
(cons (car lat) seen)))
もうひとつは
(lambda (newlat seen)
(col (cons (car lat) newlat)
seen))
実は2つとも無名関数で再帰をしている。このコレクターが再帰のたびに別な関数になっていることをちゃんと理解できてるかな?
これが分かるならP.140までは理解できているはず。つまりTenth Commandmentはコレクターを作れってことだよね。実行してみるとこうなる。
URLリンク(codepad.org)
8章のテーマは確かに継続渡しなんだけど、無名関数で再帰することを上手にやるのがコレクターってこと。
9章のネタではさらに再帰のさせ方を工夫してやるとYコンビネータを作れるというお話。
P.137からP.140が理解できればコレクターとYコンビネータを両方とも理解できます。頑張れ。
259:デフォルトの名無しさん
08/09/05 16:08:06
Yコンビネータは memoization に役立つんだけど、それとコレクターは瓜二つで8章・9章のもとネタになっています。
260:デフォルトの名無しさん
08/09/05 16:28:25
>再帰のたびに別な関数になっていることをちゃんと
無名関数で新しい関数が作れることをマクロ内でやれるようになると、プログラムの記述量を物凄く減らすことができる。
SchemeなどのLisp系言語の特徴はプログラムの記述量が少ないこと。これを支えているのが8章・9章の考え方。
ここを理解できると「Lisp脳」の人たちの考え方に近づくことが出来ます。
261:デフォルトの名無しさん
08/09/05 16:45:03
Tenth Commandment・・・Lisp脳で問題を考え直せ
↓
・コレクターを使ってみる
・Yコンビネータを使ってみる
・マクロを使ってみる。
そういえばSchemerシリーズにはマクロの説明が無いね。Reasoned Schemerでは使ってるけど。
262:デフォルトの名無しさん
08/09/05 16:45:52
再帰というか自己参照ね。
それが無限の入れ子になったのが再帰。
263:デフォルトの名無しさん
08/09/05 17:00:17
>それが無限の入れ子になったのが再帰。
有限じゃないと処理が終了しない常考。
264:デフォルトの名無しさん
08/09/05 17:28:36
弱参照も張らずにメモ化とな
265:257
08/09/05 17:53:48
chapter8,9を理解できるのがいまのところの目標であることはわかりますた。
sicp読んでみたけど1.11の反復版の答え見て「なんだこれは」と実力不足は実感しましたし。
Yコンビネータのところは
URLリンク(www.ece.uc.edu)とか
URLリンク(dangermouse.brynmawr.edu)みながら読み返してます。
collectorについては
8章のmultirember&coは書き出したりしながら雰囲気は掴めたんだけど、最後のeven-only*&coの
一番ネストが浅いcondのelseのコレクターをどうするの?って言うところ(P.146の上から4段目)で
ボブロスばりに答えの(lambda (al ap as)...)ってのが出てくるのが、面喰らいました。
でこれはURLリンク(practical-scheme.net)の末尾再帰と継続って項で説明されてるような考え方を使って
ようやく「なるほど」って思える程度の理解に辿りついた次第であります。
マクロはTeach yourself scheme in fixnum days、Programming Language Schemeのマクロの項
あとOn Lispとpractice schemeのpractical-scheme.netのScheme:OnLispの項を参考にしてます。
elispを一年ぐらい触ってて()に抵抗が無いぐらいは馴染んでるつもりですが、それでもここまで詰まるとは…
やっぱり生のLispってものは怒ろしいものですね。
あとmultirember&coの"&"の読み方がわかったのも収穫です、ありがとう皆
266:デフォルトの名無しさん
08/09/05 17:59:08
弱参照(weak reference)の話を始めたらソフト参照もしなきゃならない。
ここではコレクターやYコンビネータの話をしてるのに。
メモ化(memoization)ですら話が遠くなるからあとにしてくれ。
267:デフォルトの名無しさん
08/09/05 18:00:05
そんな我が儘言われても・・・
268:デフォルトの名無しさん
08/09/05 18:22:31
multirember&co では lambda + collector は2つ使う。
multiinsertLR&co では lambda + collector は3つ使う。コレクターを1つ余計に使うだけ。
evens-only*&coでは lambda + collector は3つ使う。これは multiinsertLR&co と同じ。
multirember&co では a-friend の引数は2つ。
evens-only*&coでは the-last-friend の引数は3つ。コレクターの引数を1つ余計に使うだけ。
>一番ネストが浅いcondのelseのコレクターをどうするの?って言うところ(P.146の上から4段目)で
>ボブロスばりに答えの(lambda (al ap as)...)ってのが出てくるのが、面喰らいました。
そこで詰まるのはプログラミングの概念が原因じゃなくてP.145の3段目が頭に入ってなかっただけでしょ。
分かってるみたいだし気にしないで大丈夫。
269:デフォルトの名無しさん
08/09/05 18:30:38
>>267
オマエ、弱参照が話したいだけだろ。ぼくちゃん知ってるよーみたく。ガキだねw
270:デフォルトの名無しさん
08/09/05 18:34:21
ここはおまえが演説する場所ではない
271:デフォルトの名無しさん
08/09/05 18:40:39
>>270
オマエが弱参照を教えてやれば?
他の香具師は優しく>>257に教えてるぞ。
なんでけんか腰になるかね?
272:デフォルトの名無しさん
08/09/05 18:48:39
>>269 みたいなこと言ってるガキには喧嘩腰が適切
273:デフォルトの名無しさん
08/09/05 18:50:56
>>266
「あとにしてくれ」とか書いてる時点で「おまえの演説」だろ。
ここは私物ではない。
274:デフォルトの名無しさん
08/09/05 18:56:22
負け犬が暴れているようにしか見えないんだがw
275:デフォルトの名無しさん
08/09/05 19:05:47
雑音気にしないで演説続けろ
276:デフォルトの名無しさん
08/09/05 19:26:53
メモリリークの話はHaskellスレでもやってたね。メモ化じゃなくて遅延評価だけど。
277:デフォルトの名無しさん
08/09/05 19:40:48
LLFuture 動画リスト
URLリンク(www.nicovideo.jp)
278:デフォルトの名無しさん
08/09/05 21:44:50
evens-only* (P.144)
URLリンク(codepad.org)
((9 1 2 8) 3 10 ((9 9) 7 6) 2)
↓
((2 8) 10 (() 6) 2)
evens-only*&co (P.145-146)
URLリンク(codepad.org)
((9 1 2 8) 3 10 ((9 9) 7 6) 2)
↓
(38 1920 (2 8) 10 (() 6) 2)
リストの中にリストがある場合の処理がちょっと面倒でした。