如何将#'package-name 与'in-package 一起使用?

How to use #'package-name with 'in-package?

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

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

但是,它不起作用。仔细观察,我注意到这是因为包内是宏 - 它接受符号或字符串作为名称。我无法尝试任何有趣的技巧,例如预先定义包含名称的变量,因为包含名称的符号名称将被解释为我正在寻找的包的名称。

那么,我怎样才能

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

没有什么比 'going to a package' 更好的了。你可以告诉 Lisp,current package 是哪个。这会进一步影响 lookup/creation 符号(例如在 阅读 期间)和符号打印。

您可以做的一件事是:

CL-USER 53 > (cl:setf cl:*package* (cl:make-package "DADA"))
#<The DADA package, 0/16 internal, 0/16 external>

上面创建了名为 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 在 编译时间 .

期间更改 当前包