理系学生日記

おまえはいつまで学生気分なのか

問題3-20 (3.3.1 Mutable List Structure)

cons, car, cdr, set-car!, set-cdr! を local state と assignment で実現した以下の関数セット.

(define (cons x y)
  (define (set-x! v) (set! x v))
  (define (set-y! v) (set! y v))
  (define (dispatch m)
    (cond ((eq? m 'car) x)
          ((eq? m 'cdr) y)
          ((eq? m 'set-car!) set-x!)
          ((eq? m 'set-cdr!) set-y!)
          (else (error "Undefined operation -- CONS" m))))
  dispatch)
(define (car z) (z 'car))
(define (cdr z) (z 'cdr))
(define (set-car! z new-value)
  ((z 'set-car!) new-value)
  z)
(define (set-cdr! z new-value)
  ((z 'set-cdr!) new-value)
  z)

これらを用いた場合に,以下の命令はどうなるかをダイアグラムで書く.

(define x (cons 1 2))


(define z (cons x x))


(set-car! (cdr z) 17)