我正在用诡计测试这段代码:
> (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,我只想知道它是否应该根据方案规范工作,不知道在哪里搜索此类内容。
最佳答案
您的示例的问题是 - 它们不起作用。他们都没有。我不知道第一个是如何返回 (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)
请在发布前测试您的代码。
关于scheme - 诡计多端的循环列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55812133/