SICPを読む(37) 問題 2.4 consの別の表現。

問題2.4

consの別の表現。何故xを返すことが出来るのか。

(define (cons x y)
  (lambda (m) (m x y)))
(define (car z)
  (z (lambda (p q) p)))

(cons 1 2)
(car (cons 1 2)) ; 1

展開してみよう。

(car (cons 1 2))
; (cons 1 2)を(cons x y)で展開。
(car (lambda (m) (m 1 2)))
; carを展開。
((lambda (m) (m 1 2)) (lambda (p q) p))
; mに代入する。
((lambda (p q) p) 1 2)
; (p q)に1 2を代入するとpを返すから、
1 


でた。zの所が逆になるのでややこしい。

一番のポイントは最初の展開、x yは1 2で束縛されてる。

cdrは簡単。

(define (cdr z)
  (z (lambda (p q) q)))

直感的に捉えるのはちょっとムズい。

今日のSchemeリンク

なんでもλ

以前覗いたときはさっぱり意味不明だったけど、理解できる!!

成長したな僕。

しかし・・・。

Schemeにおける「関数」はより抽象的な処理ブロックを記述するのに使われ、 C言語における「関数」とは一対一に対応しない。

言い替えると、C言語の関数はポインタで、Schemeの関数はオブジェクトだって事だ!!

orz。

もう一個

Karetta|Schemeの評価モデルとは?
最後の方の環境フレームの説明がわかりやすい。

完璧に理解できた(ようなきがする)

次の2問が難問なんですが・・・。