guile中的通函

时间:2019-04-23 13:16:10

标签: scheme lisp circular-reference guile

我正在使用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 个答案:

答案 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)

请在发布之前测试您的代码。