Получение ошибки при загрузке макроса lisp: Ошибка: класс с именем ENTITY не найден. При выполнении: FIND-CLASS, в процессе Listener(4)

Я получаю эту ошибку:

Ошибка: класс с именем ENTITY не найден. При выполнении: FIND-CLASS, в процессе Listener(4). Введите cmd-/, чтобы продолжить, cmd-. чтобы прервать, cmd-\ для списка доступных перезапусков. Если продолжить: Попробуйте снова найти класс Введите :? для других вариантов.

Когда я загружаю/компилирую файл с этим макросом:

(defmacro def-post-entity (entity)
   (let* ((repository-var-name (cl-ddd::repository-var entity))
          (base-url (string-downcase (concatenate 'string "/api/" (string entity))))
          (progn-statement '(progn)))
     (loop 
       for slot in (ccl:class-slots (find-class entity)) 
       append `(setf (,(ccl:slot-definition-name slot) new-entity)  
               (cdr (assoc ,(string (ccl:slot-definition-name slot)) params :test #'string=)))
       into progn-statement)
      `(setf (ningle:route cl::*app* ,base-url :method :post)
             (lambda (params)
               (let ((new-entity (make-instance ,entity)))
                 (,progn-statement))))))

Насколько я понимаю макросы lisp (я новичок), у find-class нет причин ожидать, что сущность будет именем класса, это параметр макроса. Сообщение об ошибке указывает, что find-class выполняется, но это не так. Я просто загружаю файл, содержащий этот макрос, через (ql:quickload "имя файла") или компилирую его напрямую.

Буду признателен за любую помощь, которая поможет мне понять, что происходит, и исправить это.


person Jim Barrows    schedule 23.10.2015    source источник
comment
Что происходит, когда вы делаете только (load "filename")? quickload предназначен для загрузки систем, которые могут загружать другие файлы и могут объяснить, почему find-class выполняется.   -  person coredump    schedule 23.10.2015
comment
Компиляция делает то же самое.   -  person Jim Barrows    schedule 23.10.2015
comment
Одна вещь, которая определенно неверна, — это обработка progn-statement. Вы скрываете привязку внутри loop, а затем выбрасываете ее.   -  person Svante    schedule 23.10.2015
comment
Я вставил ваш код с дополнительными определениями пакетов для ningle и cl-ddd (см. pastebin.com/raw. php?i=ewZEbjTt), но ни загрузка, ни компиляция файла с помощью CCL не приводят к упомянутой вами проблеме. Здесь нам не хватает контекста.   -  person coredump    schedule 23.10.2015
comment
Как вы называете def-post-entry? Используете ли вы переменную с именем entity в качестве параметра вызова? Поскольку аргумент макроса не оценивается, он должен быть символом, именующим класс, а не переменной, результатом которой является такой символ.   -  person Terje D.    schedule 25.10.2015


Ответы (1)


Проблема заключалась в макросе ПОСЛЕ этого, где я вызываю def-post-entity. Это тоже макрос, и я забыл, что это будет означать, что def-post-entity также расширяется там.
Комментарий Coredumps помог мне понять это.

person Jim Barrows    schedule 25.10.2015