诡计的通知单

问题描述 投票:0回答:1

我在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我只是想知道它是否应该按照方案规范工作,不知道在哪里搜索这些东西。

scheme lisp circular-reference guile
1个回答
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)

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

© www.soinside.com 2019 - 2024. All rights reserved.