3.3.1 变动的表结构

使用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),因为z1x的指针就会从指向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))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值