Поиск…


замечания

ASDF - другой механизм определения системы

ASDF - это инструмент для определения того, как системы программного обеспечения Common Lisp состоят из компонентов (подсистем и файлов) и как работать с этими компонентами в правильном порядке, чтобы их можно было компилировать, загружать, тестировать и т. Д.

Простая система ASDF с плоской структурой каталогов

Рассмотрим этот простой проект с плоской структурой каталогов:

example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp

Файл example.asd - это просто еще один файл Lisp, содержащий немного больше, чем вызов функции ASDF. Предполагая, что ваш проект зависит от систем drakma и clsql , его содержимое может быть примерно таким:

(asdf:defsystem :example
    :description "a simple example project"
    :version "1.0"
    :author "TheAuthor"
    :depends-on (:clsql
                 :drakma)
    :components ((:file "packages")
                 (:file "tools" :depends-on ("packages"))
                 (:file "functions" :depends-on ("packages"))
                 (:file "main" :depends-on ("packages"
                                            "functions"))))

Когда вы загружаете этот файл Lisp, вы указываете ASDF о своей системе :example , но вы еще не загружаете систему. Это делается либо (asdf:require-system :example) либо (ql:quickload :example) .

И когда вы загружаете систему, ASDF будет:

  1. Загрузите зависимости - в этом случае системы clsql и drakma
  2. Компилируйте и загрузите компоненты вашей системы, то есть файлы Lisp, основанные на данных зависимостях
    1. packages сначала (без зависимостей)
    2. functions после packages (поскольку это зависит только от packages ), но до main (что зависит от него)
    3. main после functions (поскольку это зависит от packages и functions )
    4. tools любое время после packages

Иметь ввиду:

  • Введите зависимости по мере необходимости (например, для использования требуется определение макросов). Если вы этого не сделаете, ASDF будет ошибочно при загрузке вашей системы.
  • Все перечисленные файлы заканчиваются на .lisp но этот постфикс должен быть .lisp в сценарии asdf
  • Если ваша система названа так же, как и ее .asd файл, и вы перемещаете (или символизируете) ее папку в папку quicklisp/local-projects/ , вы можете загрузить проект, используя (ql:quickload "example") .
  • Библиотеки, зависящие от вашей системы, должны быть известны либо ASDF (через ASDF:*CENTRAL-REGISTRY ), либо Quicklisp (либо через QUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES* либо доступны в любом из ее дисках)

Как определить тестовую операцию для системы

(in-package #:asdf-user)

(defsystem #:foo
  :components ((:file "foo"))
  :in-order-to ((asdf:test-op (asdf:load-op :foo)))
  :perform (asdf:test-op (o c)
                    (uiop:symbol-call :foo-tests 'run-tests)))

(defsystem #:foo-tests
  :name "foo-test"
  :components ((:file "tests")))

;; Afterwards to run the tests we type in the REPL
(asdf:test-system :foo)

Заметки:

  • Мы предполагаем, что система : foo-tests определяет пакет под названием «FOO-TESTS»
  • run-tests - это точка входа для тестового бегуна
  • uoip: symbol-call позволяет определить метод, который вызывает функцию, которая еще не была прочитана. Пакет, определяемый функцией, не существует, когда мы определяем систему

В каком пакете я должен определить свою систему ASDF?

ASDF предоставляет пакет ASDF-USER разработчикам для определения своих пакетов.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow