我在包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"
,但同样,这只是一个补丁。
跨包共享符号的最佳方法是什么?
谢谢你的帮助。
答案 0 :(得分:4)
使用关键字符号,您始终可以在不命名其包keyword
的情况下编写:
(foo:bar :value1)
关键字符号位于KEYWORD
包中,正在自行评估,会自动导出,您无需记下包名称。
由于关键字符号的评估结果为自己,因此您甚至不必引用它们 - 但您可以。
(foo:bar ':value1)
替代方案:短包名称
有时在特定包中包含符号可能很有用。然后我会使用一个简短的包名,您也可以将其定义为昵称。查看DEFPACKAGE
上的选项。例如,包color-graphics
可能有昵称cg
。
然后会写:
(foo:bar 'cg:green)
因为它是一个普通的符号,你必须引用它,否则它将是一个变量。