2015-01-12 126 views
0

我使用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

你的软件包使用'SB-ALIEN'软件包,并输出'SLOT'。您的代码正在尝试重新定义该函数,这可能会破坏该程序包。 – Barmar

+1

如果你不使用'SB-ALIEN:SLOT',你可以将它放在你自己的包中。 – Barmar

+0

如何“不使用”SB-ALIEN包? –

回答

4

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

首先,你可以构建你的包,使它不会不使用sb-alien包。如果您在defpackage表单中有(:use sb-alien)或类似内容,则可以将其取出。之后,如果您想要参考sb-alien符号,则必须以sb-alien:为前缀。如果您一直提到的sb-alien中只有几个关键符号,则可以使用:import子句导入它们,因此不需要前缀。

另一种选择是继续:usesb-alien包,但配置包以排除某些符号。你可以这样做:

(defpackage #:my-great-package 
    (:use #:cl #:sb-alien) 
    (:shadow #:slot)) 

有了这样,slot定义无前缀将参考my-great-package::slot,但define-alien-routine没有前缀将参考sb-alien:define-alien-routine

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