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的隐含错误?或者我的代码有什么问题?
谢谢你的帮助!:)
基本规则:如果有疑问,请始终控制在源代码中使用哪个包,在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)
上图:FOO在CL-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.
还要确保任何源代码都是已定义的包...确保不会通过加载代码的不同方式更改包...