SBCL ASDF 问题与 CCL 回复:Circular Ref?

SBCL ASDF problem vs. CCL Re: Circular Ref?

这在 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">))

(看起来您的 post 主要是代码;请添加更多详细信息。)

(load-system :kp)

你不应该在 ASDF 声明中有这个。最好不要将系统定义视为 Lisp 程序,而只是作为声明依赖项的声明方式。

如果在系统声明期间,您还需要加载另一个系统,则该系统成为依赖项。最有可能发生的情况是,SBCL 在评估文件时将文件视为一个整体,并且在加载 kp 时,您要求它加载 kp,这确实是一个循环依赖。也许CCL默默地认为文件已经加载了,我不知道。

如果删除它,在 REPL 中输入 (ql:quickload :kp) 就可以正常工作。此外,(in-package :asdf) 是无用的(如果提供,它应该是 asdf-user

您的 .asd 无效,活该。

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