Lisp 抑制编译器错误

Lisp 抑制编译器错误,lisp,common-lisp,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] Rest

我使用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}>)
将插槽定义为
函数在COMMON-LISP-USER包中运行。
[类型SYMBOL-PACKAGE-LOCKED-ERROR的条件]
另见:
SBCL手册,包锁[:节点]
重新启动:
0:[继续]忽略包锁。
1:[IGNORE-ALL]忽略此操作上下文中的所有包锁。
2:[解锁-软件包]解锁软件包。
3:[中止]中止编译。
4:[*中止]返回SLIME的顶层。
5:[中止]中止线程(#)
函数名
插槽
似乎是出于某种原因保留的。
我可以继续使用选项0或2,但是,我不希望每次出现后都看到此错误。
是否可以在编译后抑制此错误?

我正在考虑不加载预先保留的函数名,如slot,但我不确定。

在您正在使用的包中,没有前缀的名称
slot
与符号
sb alien:slot
相同。有很多方法可以解决这样一个事实:你不能用这个名字来命名你自己的东西(函数、宏等等)

首先,您可以以这样一种方式构造包,即它不使用
sb-alien
包。如果您的
defpackage
表单中有
(:use sb alien)
或类似内容,您可以将其取出。在此之后,如果您想引用
sb-alien
符号,则必须在其前面加上
sb-alien:
。如果在
sb alien
中只有几个关键符号是您一直引用的,那么您可以使用
:import
子句来导入它们,这样您就不需要前缀

另一个选项是继续
:使用
sb alien
包,但将包配置为排除某些符号。您可以这样做:

(defpackage #:my-great-package
  (:use #:cl #:sb-alien)
  (:shadow #:slot))
对于这样的定义,
slot
无前缀将指
my great package::slot
,但
定义外来例程
无前缀将指
sb alien:define alien routine


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

在您正在使用的软件包中,没有前缀的名称
slot
与符号
sb alien:slot
相同。有很多方法可以解决这样一个事实:你不能用这个名字来命名你自己的东西(函数、宏等等)

首先,您可以以这样一种方式构造包,即它不使用
sb-alien
包。如果您的
defpackage
表单中有
(:use sb alien)
或类似内容,您可以将其取出。在此之后,如果您想引用
sb-alien
符号,则必须在其前面加上
sb-alien:
。如果在
sb alien
中只有几个关键符号是您一直引用的,那么您可以使用
:import
子句来导入它们,这样您就不需要前缀

另一个选项是继续
:使用
sb alien
包,但将包配置为排除某些符号。您可以这样做:

(defpackage #:my-great-package
  (:use #:cl #:sb-alien)
  (:shadow #:slot))
对于这样的定义,
slot
无前缀将指
my great package::slot
,但
定义外来例程
无前缀将指
sb alien:define alien routine


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

您的软件包使用的是
SB-ALIEN
软件包,并且它导出
插槽
。您的代码正在尝试重新定义该函数,这可能会破坏该包。如果您不使用
SB-ALIEN:SLOT
,则可以将其隐藏在您自己的包中。如何“不使用”SB-ALIEN包?
SB-ALIEN
用于。如果您不调用C函数,我认为您不应该需要它。您的包使用的是
SB-ALIEN
包,它将导出
SLOT
。您的代码正在尝试重新定义该函数,这可能会破坏该包。如果您不使用
SB-ALIEN:SLOT
,则可以将其隐藏在您自己的包中。如何“不使用”SB-ALIEN包?
SB-ALIEN
用于。如果你不调用C函数,我认为你不需要它。