SICPを読む(36) 2.1.3 データとは何か。

プログラムを見て「印刷ミス」なんじゃないかと思った。

(define (cons x y)
  (define (dispatch m)
    (cond ((= m 0) x)
          ((= m 1) y)
          (else (error "Argument not 0 or 1 -- CONS" m))))
  dispatch)

(define (car z) (z 0))
(define (cdr z) (z 1))

こんなので、consが定義出来るはずが無い!!

うそだぁぁぁ〜〜〜!!

と、しばらく考えてしまった。

束縛

キーワードは「束縛」にあった。

(cons 1 2)で、#を返す。作用していない。

なんと、xとy(1と2)を「束縛」した状態で#を返しているのだ!!!!!!!!!!!!!!!!!

(cons 1 2) ; #<procedure:dispatch>
(car (cons 1 2)) ; 1
(cdr (cons 1 2)) ; 2

僕の常識が音を立てて崩れ始めた。

  • 1.3.4で手続きから手続きを作り出したが、これも引数の手続きを束縛した状態だと思う。
  • JavaScriptもこんな感じなのかなぁと思ってみた。