我见过以下代码:
#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#)
有人可以帮忙吗?
答案 0 :(得分:4)
(set-cdr! L L)
生成一个cons
单元格,其cdr
以ASCII艺术
.-> ( CAR . CDR )
/ /
\___________/
而(set-cdr! L (cons (car L) (cdr L)))
首先重建cdr
,以便没有循环引用。
答案 1 :(得分:1)
您被迫制作副本,否则如您所见,您最终会改变现有列表,并最终将其设为循环列表(该符号用于此类共享结构)。