2015-01-12 127 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

還有很多其他選項。該包系統在如何配置符號引用方面非常靈活。