2015-03-31 3 views
2

Я пытаюсь написать небольшую игру в (SBCL) Common Lisp, используя Quickload и ASDF для определения зависимостей и управления ими. Он использует CLOS, поэтому у меня есть каталог в project под названием classes, а там есть файл, locatable.cl.Загрузка файла, который указывает форму ошибки, но получение ошибки

defclass формы для передвижного класса нужен параметр LOCATOR, поэтому у меня есть строка:

:initform (error "Must supply a locator parameter for this class.") 

Всякий раз, когда я пытаюсь загрузить этот файл или quickload в системе, хотя, я получаю ошибку выше (» Должен предоставить параметр локатора для этого класса »). Поскольку я пытаюсь определить систему и не создавать какие-либо экземпляры класса, я не понимаю, почему я получаю это. Если я прокомментирую строку ошибки, все загрузится нормально, но мне повезло, что у меня есть стандартный способ требовать :initval для слота.

Как вы определяете такую ​​вещь, чтобы вы могли загрузить файл/сделать определение системы без фактической сигнализации об ошибке?

Вот класс -

(defclass locatable() 
    ((zone 
    :accessor zone 
    :initform nil) 
    (locator 
    :initarg :locator 
    :initform (error "Must supply a locator parameter for this class.") 
    :allocation :class 
    :accessor locator))) 

UPDATE: Я вошел в форму на РЕПЛ и получил ту же ошибку. Для любопытства я дважды ввел его дважды, сначала с :initform "", затем с формой ошибки. Он принял первую форму и не пожаловался на вторую, так что эта проблема, похоже, не происходит на re -definition.

+0

Что-то в определении вашей системы должно создавать экземпляр без предоставления правильных аргументов инициализации. – Barmar

+1

Если эта строка сама по себе, на уровне файла, она будет оценивать форму ERROR во время загрузки. Можете ли вы поделиться всей формой DEFCLASS? – Xach

+0

Я добавил определение класса к основному вопросу, Xach, спасибо. @Barmar, это происходит в SLIME, даже если я только пытаюсь загрузить «locatable.cl», в котором нет вызова «make-instance». – amp108

ответ

1
(defclass locatable() 
    ((zone 
    :accessor zone 
    :initform nil) 
    (locator 
    :initarg :locator 
    :initform (error "Must supply a locator parameter for this class.") 
    :allocation :class 
    :accessor locator))) 

Разъем locator является общим в классе. Он будет как-то выделен в объекте класса. Форма DEFCLASS создает этот объект класса. Таким образом, слот locator обычно инициализируется, когда объект класса создается и инициализируется. Путь до создания первого экземпляра этого класса.

LispWorks Backtrace

CL-USER 50 : 1 > :b 
Call to CLOS::CLASS-REDEFINITION-LOCK-DEBUGGER-WRAPPER 
Call to INVOKE-DEBUGGER 
Call to ERROR 
Call to (METHOD CLOS::COMPUTE-CLASS-SLOT-CONSES (STANDARD-CLASS)) 
Call to (METHOD SHARED-INITIALIZE :AFTER (STANDARD-CLASS T)) ; <-- 
Call to CLOS::ENSURE-CLASS-USING-CLASS-INTERNAL 
Call to (METHOD CLOS:ENSURE-CLASS-USING-CLASS (CLASS T)) 
Call to CLOS::ENSURE-CLASS-WITHOUT-LOD 
Call to LET 
Call to LET 
Call to EVAL 
Call to CAPI::CAPI-TOP-LEVEL-FUNCTION 
Call to CAPI::INTERACTIVE-PANE-TOP-LOOP 
Call to MP::PROCESS-SG-FUNCTION 

Как вы видите SHARED-INITIALIZE вызывается на объект класса, который затем инициализирует общие слоты.

Я также не думаю, что вызов error, как это должно быть сделано в коде пользователя. Вы можете найти лучший способ проверить отсутствие initargs.

+0

Спасибо.Я полагаю, что в конечном итоге я использую метод ': after' для' initialize-instance' или ': initform', который по умолчанию по умолчанию. – amp108

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