Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

10章分の8章(後半)

今日は、『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)))