跨包共享Lisp符号

时间:2017-07-29 06:35:48

标签: common-lisp packages symbols

我在包foo中定义了一个函数my-package

(in-package :my-package)
(defun foo (a)
  (if (eql a 'value1)
    (do-this)
    (do-the-other)))

当我从另一个包调用此函数时,我必须使用包名称限定参数:

(in-package :cl-user)
(my-package:foo 'my-package::value1)

但这很难看。我想与所有其他包共享符号value1。 我找到了一个解决方法,即导入符号value1,但这只有在已经在另一个包中定义的情况下才有效。 另一种可能性是传递字符串"value1",但同样,这只是一个补丁。 跨包共享符号的最佳方法是什么? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

使用关键字符号,您始终可以在不命名其包keyword的情况下编写:

(foo:bar :value1)

关键字符号位于KEYWORD包中,正在自行评估,会自动导出,您无需记下包名称。

由于关键字符号的评估结果为自己,因此您甚至不必引用它们 - 但您可以。

(foo:bar ':value1)

替代方案:短包名称

有时在特定包中包含符号可能很有用。然后我会使用一个简短的包名,您也可以将其定义为昵称。查看DEFPACKAGE上的选项。例如,包color-graphics可能有昵称cg

然后会写:

(foo:bar 'cg:green)

因为它是一个普通的符号,你必须引用它,否则它将是一个变量。