(当(L)不为空时,(cons(car L)(cdr L))与L不同?

时间:2012-03-01 14:13:59

标签: scheme racket

我见过以下代码:

#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#)

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

(set-cdr! L L)

生成一个cons单元格,其cdr以ASCII艺术

循环引用自己
 .-> ( CAR . CDR )
/            /
\___________/

(set-cdr! L (cons (car L) (cdr L)))首先重建cdr,以便没有循环引用。

答案 1 :(得分:1)

您被迫制作副本,否则如您所见,您最终会改变现有列表,并最终将其设为循环列表(该符号用于此类共享结构)。