ひまじんのためのこんぴゅーたさいえんす(1)

コーナー名が変わってしまったが気にしたら負けだ!

問題 2.4

cons car cdr は標準装備の手続きなので、それぞれ lcons lcar lcdr とします。

(define (lcons x y)
  (lambda (m) (m x y)))

(define (lcar z)
  (z (lambda (p q) p)))

トレースすればわかります。
x と y だとわかりにくいので具体的な値にして考えよう。

(lcons 1 2)

は、define で定義されているとおり、

(lambda (m) (m 1 2))

です。この無名手続きが lcar の z に渡されます。

((lambda (m) (m 1 2)) (lambda (p q) p))

lcar はこうなる。前部分の無名手続きは m に手続きをとりますね。
(m 1 2) となっていることからわかります。
なので、m には後ろ部分の無名手続きが渡されます。

((lambda (p q) p) 1 2)

m に後ろの無名手続きを適用するとこうなります。
この無名手続きは二つの引数 p q を取って、一つ目の p を返します、となってますね。
最後のほうにある 1 と 2 が無名手続きに与える二つの引数です。すなわち、p=1, q=2 となり、
最終的に p の値 1 を返します。

というわけで、元の式に戻ると、

(lcar (lcons x y))

は x を返すことがわかります。
ここまでがきちんと理解できれば、lcdr の実装は簡単ですね。

(define (lcdr z)
  (z (lambda (p q) q)))

lcdr はこのように実装できます。