我在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我只是想知道它是否应该按照方案规范工作,不知道在哪里搜索这些东西。
您的示例存在问题 - 它们不起作用。他们都不是。我不知道第一个如何返回(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)
请在发布前测试您的代码。