2015-01-12 4 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. Если у вас есть (: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.

Есть много других возможностей. Система пакетов довольно гибкая в том, как она позволяет настраивать ссылки на символы.

Смежные вопросы