如何在包中使用#'package-name with'?

时间:2015-11-12 13:36:36

标签: package common-lisp

我正在尝试编写一个简单的函数来创建包并转到创建的包。为此,我正在尝试以下方法:

(let ((my-pack (make-package "dada")))
   (in-package (package-name my-pack)))

然而,它不起作用。仔细看,我注意到它是因为包内是宏 - 并且它接受符号或字符串作为名称。我不能尝试任何有趣的技巧,比如事先定义保存名称的变量,因为持有名称的符号名称将被解释为我正在寻找的包的名称。

那么,我怎么能

我在Linux上使用SBCL 1.1.18,但我希望解决方案能够跨平台。

1 个答案:

答案 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在编译时期间更改当前包