如何理解这个Scheme代码?

时间:2014-03-01 18:12:52

标签: scheme

(define l '(a))
(define p (cons l l))
(set-car! (cdr p) 'b)

在上一次(set-car! (cdr p) 'b)之后,p将是((b) b)而不是((a) b)。为什么呢?

1 个答案:

答案 0 :(得分:4)

cons单元格实际上包含两个指针到另外两个对象。您的相关代码将大致转换为此伪C:

struct cons {
    void *car;
    void *cdr;
};

cons *l = &cons{"a", NULL};
cons *p = &cons{l, l};  // no copy takes place, we're handling pointers here
p->cdr->car = "b";  // this changes the "l" object, and nothing else