Common lisp 跨包共享Lisp符号

Common lisp 跨包共享Lisp符号,common-lisp,packages,symbols,Common Lisp,Packages,Symbols,我在包我的包中定义了一个函数foo: (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。 我找到了一种解决方法,即导入符号v

我在包
我的包
中定义了一个函数
foo

(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”
,但这只是一个补丁。 跨软件包共享符号的最佳方式是什么?
感谢您的帮助。

使用关键字符号,您可以随时编写该符号,而无需命名其软件包
关键字

(foo:bar :value1)
关键字符号位于
关键字
包中,它们自身进行计算,自动导出,您无需写下包名

由于关键字符号的计算结果是自身的,所以您甚至不必引用它们,但您可以

(foo:bar ':value1)
备选方案:短程序包名称

有时,在特定的包中有一个符号可能很有用。然后我将使用一个短的包名,您也可以将其定义为昵称。请参见
DEFPACKAGE
上的选项。例如,包
彩色图形
可以有昵称
cg

然后人们会写道:

(foo:bar 'cg:green)

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

使用关键字符号,您可以随时编写该符号,而无需命名其包
关键字

(foo:bar :value1)
关键字符号位于
关键字
包中,它们自身进行计算,自动导出,您无需写下包名

由于关键字符号的计算结果是自身的,所以您甚至不必引用它们,但您可以

(foo:bar ':value1)
备选方案:短程序包名称

有时,在特定的包中有一个符号可能很有用。然后我将使用一个短的包名,您也可以将其定义为昵称。请参见
DEFPACKAGE
上的选项。例如,包
彩色图形
可以有昵称
cg

然后人们会写道:

(foo:bar 'cg:green)

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

通常使用关键字来实现此目的。如果您想使用非关键字符号,只需导出(如果您不想使用包限定名,则导入)符号,方法与您对所有其他符号所做的相同。通常,关键字用于此目的。如果要使用非关键字符号,只需以与所有其他符号相同的方式导出(如果不想使用包限定名,则导入)符号即可。