使用eq?来比较表结构是否共享,(eq? x y)。eq?实际上比较的是x,y的指针是否相同。
下图,z1->((a b) a b), z2->((a b) a b),好像没有区别。
实际上,(eq? (car z1) (cdr z1))-->#t, (eq? (car z2) (cdr z2))-->#f
我如果(set-car! (car z1) 'wow),那么z就是((wow b) wow b),因为z1中x的指针就会从指向a,转向指向'wow。
下面是cons的实现,但是书上的代码执行时会出错,应该改成下面的样子
(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"))))
dispatch)
(define (car z) (z 'car))
(define (cdr z) (z 'cdr))
(define (set-car! z new) ((z 'set-car!) new))
(define (set-cdr! z new) ((z 'set-cdr!) new))