Обычный шепот - почему этот символ не внешний? - PullRequest
2 голосов
/ 30 января 2020

Я пытаюсь запустить тесты в ASDF, который выглядит следующим образом:

;;;; foo.asd

(defsystem "foo/tests"
  :depends-on ("foo"
               "fiveam")
  :components ((:module "tests"
                :components
                ((:file "main"))))
  :perform (test-op (op c) (symbol-call :fiveam '#:run! 'foo/tests:all-tests))

И мой файл tests/main.lisp начинается следующим образом:

;;;; tests/main.lisp

(defpackage foo/tests
  (:use :cl
        :foo
        :fiveam)
  (:export :#run! :#all-tests))
(in-package :foo/tests)

Когда я запускаю (asdf:test-system 'foo) в моем REPL, я попал в отладчик с LOAD-SYSTEM-DEFINITION-ERROR. Отладчик жалуется, что The symbol "ALL-TESTS" is not external in the FOO/TESTS package.

Однако я явно экспортирую символ в пакете foo/tests. Может кто-нибудь сказать мне, что мне здесь не хватает и почему компилятор Lisp не видит внешний символ? Большое спасибо.

1 Ответ

4 голосов
/ 30 января 2020

Синтаксис для неустранимого символа: #:foo, а не :#foo.

Вам также необходимо разрешить символы в форме :perform во время выполнения, например, через uiop:find-symbol*, просто как вы используете uiop:symbol-call там.

:perform (test-op (op c)
           (symbol-call :fiveam '#:run!
                        (find-symbol* '#:all-tests '#:foo/tests)))

Или, поскольку вы, кажется, экспортируете функцию run! из вашего тестового пакета, вы можете захотеть вызвать ее вместо fiveam:run!:

:perform (test-op (op c)
           (symbol-call '#:foo/tests '#:run!))
...