我使用sbcl和粘液。
我定义了一个名为slot
的函数,sbcl编译器向我抛出了一个错误:
Lock on package SB-ALIEN violated when defining SLOT as a
function while in package COMMON-LISP-USER.
[Condition of type SYMBOL-PACKAGE-LOCKED-ERROR]
See also:
SBCL Manual, Package Locks [:node]
Restarts:
0: [CONTINUE] Ignore the package lock.
1: [IGNORE-ALL] Ignore all package locks in the context of this operation.
2: [UNLOCK-PACKAGE] Unlock the package.
3: [ABORT] Abort compilation.
4: [*ABORT] Return to SLIME's top level.
5: [ABORT] Abort thread (#<THREAD "worker" RUNNING {C3E4771}>)
由于某种原因,似乎保留了函数名slot
我可以继续使用选项0或2,但是,我不希望每次编译后都看到此错误。
编译后是否可以抑制此错误?
我正在考虑不加载像插槽这样的预留功能名称,但我不确定。
答案 0 :(得分:4)
在您正在使用的包中,没有前缀的名称slot
与符号sb-alien:slot
相同。有很多方法可以解决这个问题:你不能用这个名字来命名你自己的东西(函数,宏等)。
首先,您可以使用不使用sb-alien
包的方式构建包。如果您的(:use sb-alien)
表单中有defpackage
或类似内容,则可以将其删除。之后,如果您想引用sb-alien
符号,则必须在其前面添加sb-alien:
。如果sb-alien
中只有几个关键符号始终引用,则可以使用:import
子句导入它们,这样就不需要前缀。
另一种选择是继续:use
sb-alien
包,但配置包以排除某些符号。你可以这样做:
(defpackage #:my-great-package
(:use #:cl #:sb-alien)
(:shadow #:slot))
有了这样的定义,没有前缀的slot
会引用my-great-package::slot
,但没有前缀的define-alien-routine
会引用sb-alien:define-alien-routine
。
还有很多其他选择。软件包系统在允许您配置符号引用方面非常灵活。