Macros 加载lisp宏时出错:错误:找不到名为ENTITY的类。执行时:FIND-CLASS,进程内侦听器(4)

Macros 加载lisp宏时出错:错误:找不到名为ENTITY的类。执行时:FIND-CLASS,进程内侦听器(4),macros,lisp,common-lisp,ccl,Macros,Lisp,Common Lisp,Ccl,我得到这个错误: 错误:找不到名为实体的类。 执行时:FIND-CLASS,进程内侦听器(4)。 键入cmd-/继续,cmd-。要中止,请使用cmd-\获取可用重新启动的列表。 如果继续:请再次尝试查找该类 类型:?其他选择 加载/编译包含此宏的文件时: (defmacro def-post-entity (entity) (let* ((repository-var-name (cl-ddd::repository-var entity)) (base-url (st

我得到这个错误:

错误:找不到名为实体的类。 执行时:FIND-CLASS,进程内侦听器(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类没有理由期望实体是类名,它是宏的一个参数。错误消息指示正在执行find类,但它不是。我只是通过(ql:quickload“filename”)加载包含这个宏的文件,或者直接编译它


如果您能帮助我了解发生了什么,并对其进行修复,我们将不胜感激。

问题在于这一次之后的宏,我将其称为def post entity。它也是一个宏,我忘了这意味着def post实体也会在那里展开。

Coredumps的评论帮助我弄明白了这一点。

当您只执行
(加载“文件名”)
时会发生什么
quickload
用于加载系统,它可以加载其他文件,并且可以解释执行
find class
的原因。编译也会做同样的事情。有一件事绝对是错误的,那就是处理
progn语句。您将绑定隐藏在
循环中,然后将其丢弃。我使用ningle和cl ddd的附加包定义粘贴了您的代码(请参阅),但使用CCL加载或编译文件都不会带来您提到的问题。这里缺少一些上下文。如何调用
def post entry
?您是否在调用中使用名为
entity
的变量作为参数?由于宏参数未计算,因此它必须是命名类的符号,而不是计算为此类符号的变量。