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-parentcomponent-version vs. missing-versionmodule-components vs. circular-dependency-componentsИсходный код тестировался на следующих реализациях Коммон Лисп:
Просто выкачайте файл asdlite.lisp, откомпилируйте и загрузите его в Лисп-систему.
Концепции и функции описаны в полной документации по ASDF.
См. Changes and additions на англоязычной странице ASDLite.