gpt4 book ai didi

common-lisp - #'equal compare true compared to (list 7 1) but false when compared to ' (7 1),为什么?

转载 作者:行者123 更新时间:2023-12-02 06:31:32 27 4
gpt4 key购买 nike

SBCL 1.3.1

综上所述,a是一个列表,'(7)b通过setq<设置为同一个列表。一个值附加到 b。列表 c 设置为附加后的预期结果,即 '(7 1)a 然后与 c 进行比较,并正确比较为真。但是,当通过 (equal a '(7 1)) 比较 a 时,它比较 false。

我的猜测是编译器没有看到追加,因为它是在 b 上完成的,并且优化了与不正确结果的常量的比较。如果是这样,有哪些选项可以提示编译器。 a 能以某种方式被标记为特殊吗?或者,除了与破坏性编程相关的样式问题之外,这里还有其他问题吗?

    (defun test-0 ()
(let ((a '(7))
b
(c '(7 1)))
(setq b a)
(setf (cdr b) (cons 1 '()))
(pprint (list a b c))

(values (equal c a) (equal '(7 1) a) (equal (list 7 1) a) c a)))


* (test-0)

((7 1) (7 1) (7 1))
T
NIL <== ??
T
(7 1)
(7 1)

这是在空环境中加载和运行时的文字记录。该文件是上述代码的复制和粘贴。可以看到没有错误消息。有趣的是在这里看到结果不同。

§sbcl> sbcl
This is SBCL 1.3.1.debian, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
* (load "src/test-0")

T
* (test-0)

((7 1) (7 1) (7 1))
NIL
NIL
T
(7 1)
(7 1)
*

最佳答案

引用列表是“文字”,修改它们(如您在 (setf (cdr b) ...) 中所做的那样)会导致未定义的后果。 test-0 的任何结果都是有效的,例如,格式化您的硬盘并炸毁您的房子。

'(7) 替换为 (list 7),您应该会得到预期的结果。

附言。请正确格式化您的代码。

关于common-lisp - #'equal compare true compared to (list 7 1) but false when compared to ' (7 1),为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34878234/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com