我正在使用guile测试此代码:
> (define xxx (let ((x '(1 2 3))) (set-cdr! (cddr x) x) x))
> xxx
它显示(1 2 3)
但这:
(define x '(1 2 3))
(set-cdr! (cddr x) x)
x
=> (1 2 3 . #-2#)
创建循环列表
为什么第一个代码在guile中不起作用?如果您不知道guile,而只是想知道它是否应该按照方案规范工作,就不知道在哪里搜索这类东西。
答案 0 :(得分:2)
您的示例的问题是-它们不起作用。没有一个。我不知道第一个如何返回(1 2 3)
。但是,当您在两个示例中都解决了相同的问题时,它们将按预期工作并创建循环列表。
问题?
'(1 2 3)
和(quote 1 2 3)
与(list 1 2 3)
截然不同。它们都“看起来”相同,但是第一个是静态列表,您不能对其进行修改。只有使用list
函数(以及cons
)创建的列表才可以修改。
修复:
(define xxx
(let ((x (list 1 2 3)))
(set-cdr! (cddr x) x)
x))
xxx ;; => (1 2 3 . #-2#)
第二个示例也是如此:
(define x (list 1 2 3))
(set-cdr! (cddr x) x)
请在发布之前测试您的代码。