ASDlite — это легкая
версия
ASDF
(Another System Definition Facility), широкоизвестного инструмента для
разработки программ на языке Коммон Лисп (аналог make).
ASDLite поддерживает те же основные функции и классы
операций, что и модуль ASDF, и во многих случаях может использоваться вместо последнего.
operation ::= keyword | operation-instance operation-type ::= keyword | type-symbol operation-designator ::= keyword | (keyword . plist) | type-symbol | operation-instance
Операции передаются в качестве аргументов функции perform
и
других методов.
Спецификатор operation-designator может встречаться в правых частях
правил.
В качестве спецификаторов мы рекомендуем просто задавать ключи, например,
:compile
или :load
. Для них в ASDlite определены
методы с eql
-уточнителями.
В методы для операции можно лередать ключевые аргументы, указав из в списке свойств plist. В нормальном режиме ASDlite допускает только спецификаторы с ключами, но с символами типа.
Если Вы считаете, что этого мало, и нуждаетесь в полноценных
;
классах операций ASDF, переключитесь в режим совместимости с ASDF следующим образом:
:asdf-compat
в список системных возможностей *features*
перед компиляцией asdlite.lisp,asdf:compile-op
, asdf:load-op
и т.п.,operation
и т.д.В режиме совместимости ASDlite допускает все вышеупомянуютые формы операций и спецификаторы.
Действие (action) - это пара операция плюс компонент (component, составная часть проекта, системы в терминологии ASDF). Некоторые действия производят изменения в файловой системе, другие - изменяют текущий Лисп-образ. Они отличаются трактовкой отметок времени (timestamps).
Зависимости между действиями, или правила (rules), хранятся в каждом (целевом) компоненте и представлены в виде двух списков, ассоциирующих целевые операции с другими действиями, называемыми посылками (dependee).
Соответственно, существуют два вида правил.
in-order-to)
do-first)
rule ::= (target-op (dep-op {dependee}+)+) target-op ::= operation-type dep-op ::= operation-designator | :features dependee ::= name-or-path | (name-or-path . plist) name-or-path ::= component-name | vector | feature plist ::= ([:features feature] [:version minimum-version] {property value}*) feature ::= keyword | feature-expression
(:component "A" :caused-by ((:compile (:compile "B" "C") (:load "D")) (:load (:load "B" "C"))) :requires ((:compile (:load "B"))))
Если исходный файл B изменяется, то необходимо перекомпилировать. Правило caused-by приводит к перекомпиляции A.fasl независимо от того, изменился ли сам файл A или нет..
Если A сам изменился, это не влечёт ни компиляции B, ни компиляции C. Согласно правилу requires, загрузка B.fasl в текущий образ должна предшествовать компиляции A.
ВНИМАНИЕ: Компонент может зависеть только от своих соседей, т.е.е компонентов в того же модуля, независимо от способа определения зависимостей:
:depends-on
,operation-caused-by/-requires
.make-sub-operation
, это не имеет
место.
visiting-...
, используется для пометки пройденных
узлов в функции traverse, но она изрядно переписана в
ASDLite и базируется на другом подходе.:do-first
фактически игнорируется ASDF -
слот всегда получает значение ((compile-op (load-op ,@depends-on))))
eval
,remove-method
в LispWorks 4.4,
эта реализация постоянно сигнализирует об удалении метода при переопределении
(т.е. повторном оценивании формы defsystem
) системы.component-parent
vs. operation-parent
component-version
vs. missing-ver
sionmodule-components
vs. circular-dependency-components
Исходный код тестировался на следующих реализациях Коммон Лисп:
Просто выкачайте файл asdlite.lisp, откомпилируйте и загрузите его в Лисп-систему.
Концепции и функции описаны в полной документации по ASDF.
См. Changes and additions на англоязычной странице ASDLite.