1

asdf の機能を使用して repl からテスト スイートを実行しようとしていますが、quicklisps の quickload を使用すると、最初の foo のロードに失敗し、2 番目の試行で成功します。

(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 の 2 番目の形式にあるように見えるため、これは理にかなっています。nclack を foo に置き換えたエラーは次のとおりです。

../../nclack/nclack.asd:36:27: read-error: 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) 行に一致します。システムを「ロード」することは、そのフォームをコンパイルすることとは異なるように見えますか? または、システムのロード後にパッケージが定義されないのはなぜですか? 何か案は?私は途方に暮れています。

4

2 に答える 2

3

あなたがcompile-fileこれをするとき:

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

最初のステップはreadフォーム全体です。 Reading には、見つかったすべてのシンボルのインターンが含まれます。ただし、読み取り時にはフォームが実行されていないため、システムfoo-testsはまだロードされていません。そのシステムにはパッケージが含まれておりfoo-tests、それもまだロードされていないため、このフォームの読み取り時にそのパッケージにシンボルをインターンすることはできません。

そのため、フォームcompile-fileにアクセスしようとするとエラーが表示されます。read

あなたがする必要があるように私には思えます(funcall (find-symbol "RUN-TESTS" #:foo-tests))

于 2013-08-22T09:57:29.487 に答える