抑制编译器错误

时间:2015-01-12 17:57:54

标签: lisp common-lisp

我使用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,但是,我不希望每次编译后都看到此错误。
编译后是否可以抑制此错误?
我正在考虑不加载像插槽这样的预留功能名称,但我不确定。

1 个答案:

答案 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

还有很多其他选择。软件包系统在允许您配置符号引用方面非常灵活。