我正在尝试编写一个简单的函数来创建包并转到创建的包。为此,我正在尝试以下方法:
(let ((my-pack (make-package "dada")))
(in-package (package-name my-pack)))
然而,它不起作用。仔细看,我注意到它是因为包内是宏 - 并且它接受符号或字符串作为名称。我不能尝试任何有趣的技巧,比如事先定义保存名称的变量,因为持有名称的符号名称将被解释为我正在寻找的包的名称。
那么,我怎么能
我在Linux上使用SBCL 1.1.18,但我希望解决方案能够跨平台。
答案 0 :(得分:4)
没有什么比'去打包'更真实了。你可以告诉Lisp,它是当前包。这会影响符号的进一步查找/创建(例如在读取期间)和符号打印。
你可以做的一件事是:
CL-USER 53 > (cl:setf cl:*package* (cl:make-package "DADA"))
#<The DADA package, 0/16 internal, 0/16 external>
Above创建名为DADA
的包,并将cl:*package*
设置为它。
DADA 54 > 'foo
FOO
DADA 55 > (cl:describe 'foo)
FOO is a SYMBOL
NAME "FOO"
VALUE #<unbound value>
FUNCTION #<unbound function>
PLIST NIL
PACKAGE #<The DADA package, 1/16 internal, 0/16 external>
将默认包重新设置为CL-USER
:
COMMON-LISP 57 > (cl:setf *package* (cl:find-package "CL-USER"))
#<The COMMON-LISP-USER package, 1307/4096 internal, 0/4 external>
in-package
也存在告诉Lisp在编译时期间更改当前包。