今日は、『The Little Schemer』の
- Chapter 8 Lambda the Ultimate
の後半(p141〜)を読みました。Lambdaってすごいと思います。
evens-only*は,リストから偶数だけを取り出す関数です。以下のように動作します。
gosh> (evens-only* '((9 1 2 8) 3 10 ((9 9) 7 6) 2)) ((2 8) 10 (() 6) 2)
上記を継続を使って書き直すことによって,こんなことができるようになります。
gosh> (evens-only*&co '((9 1 2 8) 3 10 ((9 9) 7 6) 2) (lambda (newl product sum) (cons sum (cons product newl)))) (38 1920 (2 8) 10 (() 6) 2)
38は奇数の和,1920は偶数の積,(2 8)…は偶数のリストです。evens-only*では,偶数のリストを作り出すことしかできなかったのですが,継続を利用することにより,偶数のリストを得ると同時に奇数の和,偶数の積も求めることができ,とても興味深いなぁと感じます。
evens-only*&coの最後のelse節以降は,難しかったのですが,なんとか理解することはできたと思います。が,自分で書けと言われたら書けないと思います…(^^)。
本文のeven?は以下のように書き換えて使用しました。
(define even? (lambda (n) (= (modulo n 2) 0))) ;(= (* (/ n 2) 2 ) n)))