SBCL REPL中Cons单元格疑似错误复用问题咨询
解释SBCL REPL中的这个交互行为
这不是bug,是Common Lisp实现中字面量对象重用导致的预期行为,拆解每一步的细节:
- 第一步执行
(acons 'k 'v1 nil),生成包含单个cons单元的列表((K . V1)),该cons单元的car是K,cdr是V1。 - 第二步
(assoc 'k *)中的*指代前一步的结果列表,assoc找到并返回目标cons单元(K . V1)。 - 第三步
(push 'v2 (cdr *))中的*指代前一步返回的cons单元,(cdr *)指向该cons的cdr部分(原本是V1)。push操作直接修改了这个cdr,将其变为新的cons(V2 . V1)。 - 第四步
(cdr '(K . V1))看似读取新字面量的cdr,但SBCL会在代码读取阶段重用相同的字面量对象:第二步返回的(K . V1)和第四步的字面量'(K . V1)是同一个内存对象。由于之前已经修改了这个对象的cdr,此时读取自然会得到修改后的(V2 . V1)。
本质是Common Lisp标准允许实现重用相同字面量,SBCL采用了这一策略,导致修改某一字面量实例会影响所有对应相同字面量的引用。
内容的提问来源于stack exchange,提问作者John Badie
相关产品推荐
相关产品推荐

