Загрузка дополнительного компонента с помощью ASDF

Как указать ASDF обрабатывать файл компонента только в том случае, если он существует (чтобы он не выдавал ошибку, если он еще не существует).

(asdf:defsystem "my-system"
  :components ((:file "utilities")
               (:file "temp-file" :depends-on ("utilities"))))

Мой обходной путь — использование макроса для чтения #. на (probe-file "temp-file"), но не могу заставить это работать.


person davypough    schedule 06.06.2019    source источник
comment
Выглядит многообещающе. Не знаю, делает ли это то, что вы хотите, поэтому не ставьте это как ответ. Зачем ты вообще хочешь это сделать?   -  person    schedule 06.06.2019
comment
Да, похоже, вы создаете исходные файлы, что лично я считаю антипаттерном. Чего вы на самом деле пытаетесь достичь?   -  person Svante    schedule 07.06.2019
comment
Иногда для удобства разработки не требуется компилировать и загружать файл описания проблемы вместе с системой. Думаю, я мог бы создать фиктивную спецификацию, но подумал, что будет проще просто проверить, существует ли файл спецификации.   -  person davypough    schedule 07.06.2019
comment
Почему бы не использовать #|...code...|# синтаксис комментариев вокруг содержимого файла, если вы хотите заблокировать файл? ASDF преуспеет при загрузке пустого (согласно программе чтения lisp) файла.   -  person Spenser Truex    schedule 19.06.2019


Ответы (1)


Я думаю, что вы действительно пытаетесь сделать, чтобы ASDF просто предупреждал вас вместо того, чтобы вызывать отладчик во время ошибок компиляции. Измените *compile-file-warnings-behaviour* и *compile-file-failure-behaviour* и прочтите раздел по обработке ошибок. в руководстве.

Остальная часть этого ответа - как проверить всю систему. Вы можете упаковать файлы «возможно, чтобы загрузить» в их собственные системы и сделать это следующим образом.

Из раздела 6.3.8 Руководства ASDF. .

6.3.8 Слабо зависит от

Мы НЕ рекомендуем использовать эту функцию.

Так что вы могли бы просто использовать его в любом случае. Так:

(defpackage :foo-system
  (:use :cl :asdf))
(in-package :foo-system)
(defsystem foo
  :description "The main package that maybe loads bar if it exists."
  :weakly-depends-on (:bar)
  :components ((:file "foo")))

Простой не так ли?

Вот что они рекомендуют:

Если у вас возникнет искушение написать system foo, которая слабо зависит от системной панели, мы рекомендуем вместо этого написать system foo параметрическим способом и предложить какую-то специальную переменную и/или какой-нибудь хук для специализации ее поведения; тогда вы должны написать систему foo+bar, которая соединяет вещи вместе.

Я никогда не видел ни одного из них в дикой природе, вероятно, потому, что делать это таким образом ужасно запутанно.

(defpackage :bar-system
  (:use :cl :asdf))
(in-package :bar-system)
(defsystem bar
  :description "The package that maybe exists and is needed by foo."
  :components ((:file "bar")))

(defpackage :foo+bar-system
  (:use :cl :asdf))
(in-package :foo+bar-system)
(defsystem foo+bar
  :version      "0.1.0"
  :description  "Hook together foo and bar."
  :author       "Spenser Truex <[email protected]>"
  :serial       t
  :components ((:file "foo+bar")))

(defpackage :foo-system
  (:use :cl :asdf))
(in-package :foo-system)
(defsystem foo
  :description "The main package that maybe loads bar if it exists."
  :depends-on (:foo+bar)
  :components ((:file "foo")))
person Spenser Truex    schedule 19.06.2019