scheme - 诡计多端的循环列表

标签 scheme lisp circular-reference 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,我只想知道它是否应该根据方案规范工作,不知道在哪里搜索此类内容。

最佳答案

您的示例的问题是 - 它们不起作用。他们都没有。我不知道第一个是如何返回 (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/

相关文章:

c++ - Schliemann 的编程语言学习方法

Delphi:声明变量避免循环引用

c++ - Microsoft Visual Studio 2012 C++ 循环引用

c# - 在列表中查找循环引用的最有效方法

scheme - 在 Racket 中创建网页?

recursion - 方案中的迭代图

lisp - 合并和提取列表

clojure - Clojure 树函数中的子树总计

c++ - 在 C++ 中嵌入 Guile 的问题

方案 - 无法在空句法环境中绑定(bind)名称 : tmp