gpt4 book ai didi

common-lisp - 普通口齿不清 : got different result with SBCL after saving image

转载 作者:行者123 更新时间:2023-12-01 11:35:53 26 4
gpt4 key购买 nike

(我是第一次在这里发帖,我搜索了一下,没有找到任何有用的信息....)

我在普通的 lisp 中发现了一个有趣的(这让我困惑了整个上午)。

我正在使用在 Gentoo/Linux 上运行的 SBCL 1.1.18。这是我的问题:

假设有一个名为 eql-test 的包,它有一个 asd 文件、一个 package.lisp 和一个 main.lisp(非常常见的配置)。在 main.lisp 中,只有一个函数:

    (defun main ()
(format t "~a~%" (eql 'hello (read-from-string "hello"))))

现在,如果我们运行:

    sbcl --eval "(progn (load \"main.lisp\") \
(sb-ext:save-lisp-and-die \"eql-test\" :toplevel #'main \
:executable t))"

然后运行“eql-test”二进制文件,我们会得到一个漂亮的 T。

但是,如果我们使用另一个名为“make.lisp”的文件,其中包含:

    (asdf:load-system 'eql-test)
(sb-ext:save-lisp-and-die "eql-test2"
:toplevel #'eql-test:main
:executable t)

然后运行:

    sbcl --load "make.lisp"

然后运行二进制“eql-test2”,它会给出一个 NIL。

我不明白为什么相同的代码给出不同的结果(绝对是第二个不正确)。因为它是 ASDF 的隐含错误?或者我的代码有什么问题?

感谢您的帮助! :)

最佳答案

基本规则:如有疑问,请始终控制在源代码中、在 IO 操作中、在创建新符号时、在搜索符号时使用哪个包...

如果你从一个字符串中读取,你应该确保创建的任何符号都在正确的包中。你可以绑定(bind)*package*:

CL-USER 1 > *package*
#<The COMMON-LISP-USER package, 155/256 internal, 0/4 external>

CL-USER 2 > (read-from-string "FOO")
FOO
3

上图:FOOCL-USER 包中。

让我们创建一个新包:

CL-USER 3 > (defpackage "BAR" (:use "CL"))
#<The BAR package, 0/16 internal, 0/16 external>

全局 *package* 没有改变:

CL-USER 4 > *package*
#<The COMMON-LISP-USER package, 155/256 internal, 0/4 external>

绑定(bind)变量:

CL-USER 5 > (let ((*package* (find-package "BAR")))
(read-from-string "FOO"))
BAR::FOO
3

上图:FOOBAR 包中。

还要确保任何源代码都是一个已定义的包...确保包通过不同的方式更改以加载代码...

关于common-lisp - 普通口齿不清 : got different result with SBCL after saving image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27244415/

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