問題2-4/2-6

第二章の問題を一つずつ解いていこうと先へ進んでいますが、問題2-6で大きくつまずいてしまいました。lambdaが連鎖している状況で、どのように手続きが評価されていくのかということを理解していないと先へは進めないと感じたので、それに近いことやらなければならない問題2-4に立ち戻って、評価手順の書き出し方を練習しようと思います。

(define (cons x y)
  (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))

(car (cons 10 20))

これがどのように置き換えられていくのかを追ってみました。

(car (lambda (m) (m 10 20)))

((lambda (m) (m 10 20)) (lambda (p q) p))

((lambda (p q) p) 10 20)

10

この調子で、問題2-6の例題手続きを置き換えてみます。

(define zero (lambda (f) (lambda (x) x)))

(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))

(define one (add-1 zero))

one
(add-1 (lambda (f) (lambda (x) x)))

(lambda (f) (lambda (x) (f ((lambda (f) (lambda (x) x)) f) x)))

(lambda (f) (lambda (x) (f ((lambda (x) x) x))))

(lambda (f) (lambda (x) (f x)))

この結果は手続きで、oneの引数に何らかのアクションを渡すと、さらにそれ利用する手続きが返ってくるので、それに何らかのオブジェクトを渡すと、最初に引数で渡したアクションがオブジェクトを引数として適用される、ということが今わかりました。そもそもこの置換え過程で抜けがないかは自信がありませんが、加算手続きをアクションにして、oneとかtwoとかをオブジェクトとして表現すればいいのではと、このエントリーを書きながら気づくことができました。もう少し考えてみようと思います。