SBCL REPL 错误地重复使用 Cons 细胞?

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

下面与SBCL REPL的交互是怎么回事(最后一个表格)?

TEST> (acons 'k 'v1 nil)
((K . V1))
TEST> (assoc 'k *)
(K . V1)
TEST> (push 'v2 (cdr *))
(V2 . V1)
TEST> (cdr '(K . V1))
(V2 . V1)

我猜这是一个错误?

common-lisp sbcl
1个回答
0
投票

在 SLIME 中使用演示文稿可能会导致一个可能的交互问题。

我正在使用 SLIME 和 SBCL。

CL-USER> (acons 'k 'v1 nil)
((K . V1))
CL-USER> (assoc 'k *)
(K . V1)
CL-USER> (push 'v2 (cdr *))
(V2 . V1)
CL-USER> (cdr '(K . V1))
(V2 . V1)
CL-USER> 

所以,我可以得到和你一样的结果。我做了什么?

首先:SLIME 可以使用演示文稿,而不仅仅是文本数据。 presentation 是实际数据的文本表示。然后文本仍然链接到基础数据。

我正在输入:

(acons 'k 'v1 nil)

CL-USER> (acons 'k 'v1 nil)

SLIME 呈现结果列表:

((K . V1))

我正在输入:

(assoc 'k *)

CL-USER> (assoc 'k *)

SLIME 呈现结果列表:

(K . V1)

我正在输入:

(push 'v2 (cdr *))

CL-USER> 

SLIME 呈现结果列表:

(V2 . V1)

现在变得有趣了。我正在输入

(cdr '
,然后通过复制/粘贴从上面复制*演示文稿
(K . V1)
。我不是在输入列表,而是在复制它。然后我输入
)

CL-USER> (cdr '(K . V1))

演示文稿的基础数据已更改。史莱姆告诉 SBCL 评估

(cdr '(K V2 . V1))

我们可以看到实际更改后的演示文稿的值:我再次复制上面的

(K . V1)
演示文稿。

CL-USER> '(K . V1)
(K V2 . V1)

以上显示您所看到的不是您得到的。

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