簡體   English   中英

為什么不是asdf:load-system創建包

[英]Why isn't asdf:load-system creating the package

我正在嘗試使用asdf的功能從repl運行我的測試套件,但是當使用quicklisps quickload時,如果在第一次嘗試加載foo時失敗並在第二次嘗試成功。

(in-package :cl-user)
(defpackage :foo-system
  (:use :cl :asdf))
(in-package :foo-system)

(asdf:defsystem :foo
  :components ((:file "foo")))

(asdf:defsystem :foo-tests
  :depends-on (:foo)
  :components ((:file "foo-tests")))

(defmethod asdf:perform ((op test-op) (system (eql (find-system :foo))))
  (asdf:load-system 'foo-tests)
  (foo-tests:run-tests))

這是有道理的,因為當我編譯asd文件時,錯誤似乎是asdf:perfom defmethod的第二種形式。 錯誤,用foo替換nclack,是:

../../nclack/nclack.asd:36:27:讀取錯誤:COMPILE-FILE期間的READ錯誤:

  Package NCLACK-TESTS does not exist. Line: 36, Column: 27, File-Position: 1034 Stream: #<SB-SYS:FD-STREAM for "file /Users/PuercoPop/quicklisp/local-projects/nclack/nclack.asd" {1005DB11A3}> 

它匹配(foo-tests:run-tests)行。 所以似乎“加載”系統與編譯其形式不同? 或者為什么在加載系統后沒有定義包? 有任何想法嗎? 我不知所措。

當你compile-file

(defmethod asdf:perform ((op test-op) (system (eql (find-system :foo))))
  (asdf:load-system 'foo-tests)
  (foo-tests:run-tests))

第一步是read整個表格。 Read包括發現的所有符號的實習。 但是,在讀取時,表單尚未執行,因此尚未加載系統foo-tests 由於該系統包含foo-tests軟件包,並且尚未加載,因此您無法在此表單的讀取時將任何符號實例化到該軟件包中。

這就是為什么compile-file在嘗試read表單時會顯示錯誤的原因。

在我看來你需要(funcall (find-symbol "RUN-TESTS" #:foo-tests))

第一:

如果您定義一個新的包FOO-SYSTEM使用ASDF然后使用仍然帶有前綴的asdf符號,那么您有點打敗了包的使用 為什么要使用它,當你為符號添加前綴?

很難說錯誤是什么,因為我們沒有看到回溯並且看不到文件。

無論如何,您需要確保在編譯文件期間可以使用包。 例如,編譯DEFPACKAGE表單可能不會更改編譯時環境。 您需要執行DEFPACKAGE表單。 您還需要確保在加載系統操作期間加載包定義。

如果包不存在,則需要確保它存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM