2012-03-01 74 views
1

我看到了下面的代码:(缺点(车L)(CDR L))不一样的L,当L不是空的?

#lang r5rs 
(define ma-liste-1 (list 2 3 4 5)) 
(define ma-liste-2 (list 6 7 8 9)) 

(define (cons! e L) 
    (set-cdr! L (cons (car L) (cdr L))) 
    (set-car! L e)) 

(cons! 1 ma-liste-1) 
ma-liste-1 ; (list 1 2 3 4 5) 

我只是不明白,为什么下面的代码不工作:

#lang r5rs 
(define ma-liste-1 (list 2 3 4 5)) 
(define ma-liste-2 (list 6 7 8 9)) 

(define (cons! e L) 
    (set-cdr! L L) 
    (set-car! L e)) 

(cons! 1 ma-liste-1) 
ma-liste-1 ; #0=(mcons 1 #0#) 

谁能帮助?

回答

4
(set-cdr! L L) 

产生cons细胞,其cdr引用本身圆,ASCII领域

.-> (CAR . CDR) 
/  /
\___________/ 

(set-cdr! L (cons (car L) (cdr L)))第一重构cdr使得没有循环引用。

1

你是被迫进行复制,否则你可以看到,你最终变异现有列表,并最终使其成为一个圆形列表(符号用于这种共享结构)。