Lisp Scheme Part19
..
771:デフォルトの名無しさん
08/03/01 01:04:22
little schemer - multirember&co - reprise for dec 2006
URLリンク(groups.google.co.jp)
772:デフォルトの名無しさん
08/03/01 02:16:04
>>767
「at a time」でやることによって、
純関数型に特徴的なプログラミングスタイルが登場します。
昔birdが書いたコンパイラの純関数型ワン・パス・パーザや,
DanvyのTABA(There and Back Again)パターンや、
purely functional algorithmに出てくるようなコードなどでも
この章で使うようなテクニックが使われてます。
Little Schemeは非常に簡単な例でやっているので、
何が何だか分からない奇妙なパズルをやらされている気分になるかもしれませんが、
無意味なことはほとんどないので、著者を信じて頑張ってください。
まあバリバリ手続き型で書きたい人には苦行すぎる面もありますが。
773:デフォルトの名無しさん
08/03/01 12:01:59
>>770
&か。何の文字かわからなかった。
>>772
実用的なコードの源泉かあ。
今は習うより慣れろのレベルだけど、Schemerシリーズは全部やる。
単純な例でも脳の体操にもなるし。
774:デフォルトの名無しさん
08/03/01 21:26:31
URLリンク(www.amazon.com)
The Scheme Programming Language, 3rd Edition
これは評価が高いですが、やはり良書ですか?
CのK&R相当らしく、数日でたくさん学ぶ人もいるらしいですが
どうなんでしょう。
775:デフォルトの名無しさん
08/03/01 21:42:06
>>774
Second Edition と村上さんの邦訳をもっているけど、
3rdはかなり改訂されてるんかい?
776:デフォルトの名無しさん
08/03/01 21:49:40
URLリンク(www.scheme.com)
777:デフォルトの名無しさん
08/03/01 21:55:25
>>776
おお、公開されてるんだ。Dybvigさん、太っ腹。
778:デフォルトの名無しさん
08/03/01 21:59:06
Schemers.Incの「The Schemer's Guide」が好きだったなぁ。
初心者向けの良い本だと思う。
779:デフォルトの名無しさん
08/03/02 00:08:16
Little Schemer P146
にある以下のプログラムなんですが、
(define evens-only*&co
(lambda (l col)
(cond
((null? l) (col (quote ()) 1 0))
((atom? (car l))
(cond
((even? (car l)) (evens-only*&co (cdr l)
(lambda (newl P S)
(col (cons (car l) newl) (* (car l) P) S))))
(else (evens-only*&co (cdr l)
(lambda (newl P S)
(col newl P (+ (car l) S)))))))
(else
(evens-only*&co (car l) ; ここから以下がよく理解できない
(lambda (al ap as)
(evens-only*&co (cdr l)
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds))))))))))
特に (col (cons al dl) (* ap dp) (+ as ds)) とする意味が分かりません。
こういうものはどういう思考で捉えていけば良いのでしょうか?
具体値で考えると確かに正しいことは分かるのですが、それを一般式で
表すのが難しくて思いつきません。
780:779
08/03/02 00:31:17
具体値を入れて考えたメモを見ていたら何となく見てきました。
(evens-only*&co (car l) ; ここから以下がよく理解できない
(lambda (al ap as)
(evens-only*&co (cdr l)
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds))))))))))
(car l) と (cdr l) について再帰してそれぞれの結果を得る。
まず、(cdr l) に対して結果を得る。つまり、dl dp ds が具体値に
決まる。その後、その結果に対して、(car l) に対する再帰の結果
である al ap as を得て、(cdr l) に対する結果とマージする。
よく分からなかったのはlambda関数のパラメータでした。
自分としてのキーポイントは、
@lambda関数のパラメータが具体値に求まる。
Alambda関数のパラメータが具体値に求まる順番はネストの深い
ものから始まる。
という風に考えるとよいかなと思いました。
781:779
08/03/02 00:36:37
表現がおかしかったです。
(evens-only*&co (cdr l)
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds)))
要は、まず上の部分の (cdr l) の再帰が先に終了し、そのパラメータであるdl dp ds
が具体値に求まる。その後で、具体値に求まったdl dp dsとともに
(evens-only*&co (car l) (lambda (al ap as) ・・・の (car l) の部分の再帰が行われる。
782:779
08/03/02 00:42:43
やはりパラメータが具体値に求まるというのはおかしいですね。
パラメータは変数なので。。
ただ具体的な値で追っていくと、例えば
(col (cons al (2 4)) (* ap 8) (+ as 4)))
みたいな感じで、dl dp ds 部分が決まっていくようです。
パラメータが具体値に求まるというのは、その程度の意味です。
783:デフォルトの名無しさん
08/03/02 01:58:27
>>779-782
; direct style
(define (fact n)
(if (= n 0) 1
(* n (fact (- n 1)))))
; accumulator style
(define (fact n) (factacc n 1))
(define (factacc n acc)
(if (= n 0) acc
(factacc (- n 1) (* n acc))))
; continuation passing style
(define (fact n) (factacc n (lambda () 1)))
(define (factacc n cc)
(if (= n 0) (cc)
(factacc (- n 1) (lambda () (* n (cc))))))
accumulator styleは演算子が可換、
あるいは逆から数え上げることが可能(e.g. (from n) ←→(to n))でないと困る。
例えばリストに対する演算の場合。consは可換でない。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5377日前に更新/210 KB
担当:undef