SICP 2.4

トップレベルでcar, cdrにオリジナルとは別の手続きをdefineしていいんだっけ?R5RSにはこんなことが書いてあるけど、わからん。

プログラムはトップ=レベル定義を使って任意の変数を束縛してよい。そして後からその束縛を代入によって変更してよい(4.1.6 節参照)。これらの演算はScheme の組込み手続きの振舞を改変しない。

(define (_cons x y)
  (lambda (m) (m x y)))

(define (_car z)
  (z (lambda (p q) p)))

(define (_cdr z)
  (z (lambda (p q) q)))

;(_car (_cons x y))
; -> (_car ((lambda (m) (m x y)) x y))
; -> (_car (lambda (m) (m x y))
; -> ((lambda (m) (m x y)) (lambda (p q) p))
; -> ((lambda (p q) p)) x y)
; -> x

; test
(define p (_cons 1 '(2 3)))
(_car p)
(_cdr p)