常见的lisp:保存图像后,SBCL得到不同的结果

She*_*uke 3 packages common-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"))))
Run Code Online (Sandbox Code Playgroud)

现在,如果我们运行:

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

然后运行"eql-test"二进制文件,我们将得到一个美丽的T.

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

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

然后运行:

    sbcl --load "make.lisp"
Run Code Online (Sandbox Code Playgroud)

然后运行二进制"eql-test2",它会给出一个NIL.

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

谢谢你的帮助!:)

Rai*_*wig 5

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

如果从字符串中读取,则应确保创建的任何符号都在正确的包中.你可以绑定*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
Run Code Online (Sandbox Code Playgroud)

上图:FOOCL-USER包装中.

让我们创建一个新包:

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

全球*package*没有改变:

CL-USER 4 > *package*
#<The COMMON-LISP-USER package, 155/256 internal, 0/4 external>
Run Code Online (Sandbox Code Playgroud)

绑定变量:

CL-USER 5 > (let ((*package* (find-package "BAR")))
              (read-from-string "FOO"))
BAR::FOO
3
Run Code Online (Sandbox Code Playgroud)

上图:FOO在包装中BAR.

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