Common lisp SBCL ASDF问题与CCL Re:循环参考?

Common lisp SBCL ASDF问题与CCL Re:循环参考?,common-lisp,sbcl,ccl,asdf,Common Lisp,Sbcl,Ccl,Asdf,这在ccl上编译良好,但在SBCL上由于循环引用错误而失败: kp.asd: (in-package :asdf) (defsystem kp :components ((:module "utils" :components ((:file "utils") )) )) (load-system :kp) ------------------------ utils.lisp: (defpackage

这在ccl上编译良好,但在SBCL上由于循环引用错误而失败:

kp.asd:

(in-package :asdf)
(defsystem kp
  :components
  ((:module "utils"
            :components
            ((:file "utils")
             ))
   ))
(load-system :kp)

------------------------
utils.lisp:

(defpackage :utils)
(in-package :utils)

(defvar *kp-version-utime* (get-universal-time))

------------------------
Error reported by SBCL:

debugger invoked on a LOAD-SYSTEM-DEFINITION-ERROR in thread #<THREAD "main thread" RUNNING {10005E85B3}>: Error while trying to load definition for \
system kp from pathname /var/www/ai/insights/kp.asd: Circular dependency: ((#<DEFINE-OP > . #<SYSTEM "kp">) (#<LOAD-OP > . #<SYSTEM "kp">) (#<LOAD-OP\
 > . #<MODULE "kp" "utils">) (#<LOAD-OP > . #<CL-SOURCE-FILE "kp" "utils" "utils">) (#<PREPARE-OP > . #<CL-SOURCE-FILE "kp" "utils" "utils">) (#<PREP\
ARE-OP > . #<MODULE "kp" "utils">) (#<PREPARE-OP > . #<SYSTEM "kp">))

kp.asd:
(包装内:asdf)
(除霜系统kp)
:组件
((:模块“utils”
:组件
(:文件“utils”)
))
))
(负载系统:kp)
------------------------
utils.lisp:
(defpackage:utils)
(打包:utils)
(defvar*kp版本utime*(获取世界时))
------------------------
SBCL报告的错误:
在线程#中的LOAD-SYSTEM-DEFINITION-ERROR上调用调试器:尝试加载的定义时出错\
来自路径名/var/www/ai/insights/kp.asd的系统kp:循环依赖:(((#.#))(#.#)(#.#.#)(#.#.#.#)(#.#.#)(#.#.#)
(看起来你的帖子大部分是代码;请添加更多详细信息。)

您不应该在ASDF声明中包含这一点。最好不要将系统定义视为LISP程序,而只是声明声明依赖关系的声明方式。 如果在系统声明期间,您还需要加载另一个系统,则该系统将成为依赖项。最可能发生的是,SBCL在评估文件时将其视为一个整体,在加载<代码> KP<代码>时,要求它加载<代码> KP<代码>,这确实是一个循环依赖关系。也许CCL默默地考虑文件已经加载,我不知道。 如果删除它,在REPL中输入
(ql:quickload:kp)
就可以了。另外,
(在包中:asdf)
是无用的(如果提供,它应该是
asdf用户

您不应该在ASDF声明中包含这一点。最好不要将系统定义视为LISP程序,而只是声明声明依赖关系的声明方式。 如果在系统声明期间,您还需要加载另一个系统,则该系统将成为依赖项。最可能发生的是,SBCL在评估文件时将其视为一个整体,在加载<代码> KP<代码>时,要求它加载<代码> KP<代码>,这确实是一个循环依赖关系。也许CCL默默地考虑文件已经加载,我不知道。
如果删除它,在REPL中输入
(ql:quickload:kp)
就可以了。另外,
(在包中:asdf)
是无用的(如果提供了,它应该是
asdf用户

您的.asd无效,应该丢失


您是否有ASDF 3.2或更早版本的旧CCL?然后它无法检测到.asd中的错误。ASDF 3.3在加载.asd文件时正确检测循环依赖项。

您的.asd无效,应该丢失


您是否有ASDF 3.2或更早版本的旧CCL?然后它无法检测到.asd中的错误。ASDF 3.3在加载.asd文件时正确地检测循环依赖关系。

谢谢,但现在我得到:
((标签QUICKLISP-CLIENT::RECURSE:in QUICKLISP-CLIENT::COMPUTE-LOAD-STRATEGY)“kp”)
(如果我从repl以交互方式执行此操作,则相同)。和
(asdf:operate'asdf:load op:kp)
给出:
((:方法asdf/operate:operate(符号T))asdf/LISP-ACTION:load-op:kp)[快速方法]查找帧源时出错:伪造表单编号:源文件可能已更改过多,无法处理。
如果启动第二个SBCL进程并运行该命令,是否仍会发生这种情况?或者如果您触摸.asd文件以更改其时间戳并重新编译?在没有更多信息的情况下进行调试有点困难。让它正常工作,但确实需要包含(在包中:asdf)并显式加载.asd文件。感谢您的帮助。如果您直接加载文件,则有必要更改包,但预期用途不是手动加载asd文件。如果你能让它工作,那很好,但这可能隐藏了一个未解决的问题。祝你好运。谢谢,但现在我得到了:
((标签QUICKLISP-CLIENT::RECURSE:IN QUICKLISP-CLIENT::COMPUTE-LOAD-STRATEGY)“kp”)
(如果我以交互方式从repl执行此操作,则相同)。和
(asdf:operate'asdf:load op:kp)
给出:
((:方法asdf/operate:operate(符号T))asdf/LISP-ACTION:load-op:kp)[快速方法]查找帧源时出错:伪造表单编号:源文件可能已更改过多,无法处理。
如果启动第二个SBCL进程并运行该命令,是否仍会发生这种情况?或者如果您触摸.asd文件以更改其时间戳并重新编译?在没有更多信息的情况下进行调试有点困难。让它正常工作,但确实需要包含(在包中:asdf)并显式加载.asd文件。感谢您的帮助。如果您直接加载文件,则有必要更改包,但预期用途不是手动加载asd文件。如果你能让它工作,那很好,但这可能隐藏了一个未解决的问题。祝你好运
(load-system :kp)