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)
因为它是一个普通符号,所以您必须引用它,否则它将是一个变量。通常使用关键字来实现此目的。如果您想使用非关键字符号,只需导出(如果您不想使用包限定名,则导入)符号,方法与您对所有其他符号所做的相同。通常,关键字用于此目的。如果要使用非关键字符号,只需以与所有其他符号相同的方式导出(如果不想使用包限定名,则导入)符号即可。