为什么不是asdf:load-system创建包

时间:2013-08-22 06:15:54

标签: package common-lisp asdf

我正在尝试使用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期间读取错误:

  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)行。所以似乎“加载”系统与编译其形式不同?或者为什么在加载系统后没有定义包?有任何想法吗?我很茫然。

2 个答案:

答案 0 :(得分:3)

当你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))

答案 1 :(得分:0)

首先:

如果你定义一个新包FOO-SYSTEM使用ASDF,然后使用仍然带有前缀的asdf符号,那么你就打败了使用包。为什么要使用它,当你为符号加前缀?

很难说错误是什么,因为我们没有看到回溯并且看不到文件。

无论如何,您需要确保在编译文件期间可以使用包。例如,编译DEFPACKAGE表单可能不会更改编译时环境。您需要执行DEFPACKAGE表单。您还需要确保在加载系统操作期间加载包定义。

如果包不存在,您需要确保它存在。