【问题标题】:SBCL ASDF problem vs. CCL Re: Circular Ref?SBCL ASDF 问题与 CCL Re:循环参考?
【发布时间】:2019-08-29 22:27:04
【问题描述】:

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

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

【问题讨论】:

    标签: common-lisp sbcl ccl asdf


    【解决方案1】:
    (load-system :kp)
    

    您不应该在 ASDF 声明中包含此内容。最好不要将系统定义视为 Lisp 程序,而仅将其视为声明依赖项的声明方式。

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

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

    【讨论】:

    • 谢谢,但现在我得到了:((LABELS QUICKLISP-CLIENT::RECURSE :IN QUICKLISP-CLIENT::COMPUTE-LOAD-STRATEGY) "kp")(如果我以交互方式从 repl 执行此操作,则相同)。 (asdf:operate 'asdf:load-op :kp) 给出:((:METHOD ASDF/OPERATE:OPERATE (SYMBOL T)) ASDF/LISP-ACTION:LOAD-OP :KP) [fast-method] error finding frame source: Bogus form-number: the source file has probably changed too much to cope with.
    • 如果您启动第二个 SBCL 进程并运行该命令,它还会发生吗?或者如果您触摸 .asd 文件以更改其时间戳并重新编译?如果没有更多信息,这有点难以调试。
    • 让它工作,但需要包含(in-package :asdf)并明确加载 .asd 文件。感谢您的帮助。
    • 如果您直接加载文件,则需要更改包,但预期用途不是手动加载 asd 文件。如果你能让它工作,那很好,但这可能会隐藏一个未解决的问题。祝你好运。
    【解决方案2】:

    您的 .asd 无效,应该丢失。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多