Где в моем исходном коде должен находиться Quicklisp QUICKLOAD? Нигде?

Допустим, я создаю приложение поверх net.aserve и bordeaux-threads. Мое объявление пакета может выглядеть так:

(defpackage :my-package
  (:use :cl :net.aserve :bordeaux-threads)
  (:export …))

Я использую Quicklisp, поэтому я запускаю (ql:quickload "aserve") (ql:quickload "bordeaux-threads") в SLIME перед компиляцией моего пакета, и все в порядке.

Конечно, завтра я снова запускаю SLIME, и я должен не забыть выдать QUICKLOAD перед компиляцией, иначе у меня будут проблемы.

Я мог написать что-то вроде

(eval-when (:compile-toplevel)
  (ql:quickload "aserve")
  (ql:quickload "bordeaux-threads"))

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

Есть ли лучшая альтернатива?


person Asherah    schedule 23.03.2012    source источник
comment
Можете ли вы поместить его в свой файл .clinit.cl? См. franz.com/support/documentation/6.2. /док/.   -  person John Pick    schedule 23.03.2012
comment
@JohnPick Я мог бы, хотя я не использую Allegro CL, но у SBCL, вероятно, есть эквивалент.   -  person Asherah    schedule 23.03.2012
comment
(действительно, .sbclrc) Я думаю, что это, вероятно, мой лучший выбор - у меня такое чувство, что мне как-то жаль, что я должен запускать его при каждом запуске, но что-то в глубине моего сознания подсказывает мне, что то, что я ищу даже не имеет смысла — отсюда Нигде? в названии вопроса, я думаю!   -  person Asherah    schedule 23.03.2012


Ответы (4)


В вашем файле asd вы должны определить зависимость, как показано ниже:

(asdf:defsystem #:aserve
 :serial t
 :depends-on (#:hunchentoot :hunchentoot-cgi
           #::bordeaux-threads
           #:parenscript)
 ...)

После этого вам просто нужно (ql:quickload :aserve) .

person z_axis    schedule 23.03.2012
comment
Я не пишу aserve, я пытаюсь его потреблять, и я пытаюсь избежать простого запуска (ql:quickload :aserve) вручную! - person Asherah; 23.03.2012
comment
@ArlenCuss: Просто добавьте aserve в список зависимостей, таких как hunchentoot или bordeaux-threads, тогда, когда вы загрузите (или быстро загрузите) эту систему, она загрузит зависимости. На самом деле, это в основном то, что делает Quicklisp, он использует ASDF и загружает недостающие зависимости. - person Daimrod; 23.03.2012
comment
Это правильный ответ на заданный вопрос; принятый ответ - это ответ на другой вопрос (я точно не знаю, какой именно). - person Xach; 23.03.2012
comment
@Xach: я исправлен. Принятый ответ был тем, который, казалось, достиг моей цели. Я пока понятия не имею, что такое ASDF, поэтому ссылка z_axis на [мой] asd-файл сбила меня с толку. Я посмотрю, как это пойдет! - person Asherah; 24.03.2012

Используйте quickproject (доступен через (ql:quickload :quickproject)), чтобы создать систему для вашего приложения. Как описано в z_axis, вы можете затем заполнить список зависимостей в объявлении defsystem (если вы что-то пропустили при вызове quickproject:make-project).

Если вы создаете новый проект по пути local-projects вашего Quicklisp установки, вы также можете быстро загрузить свой проект (даже если он еще не является частью дистрибутива Quicklisp). Быстрая загрузка вашего проекта, конечно же, загрузит зависимости (если они являются частью дистрибутива Quicklisp), а затем загрузит их.

person Miron Brezuleanu    schedule 23.03.2012
comment
Как подразумевается z_axis (?), я могу быстро загрузить его, если .asd находится в том же каталоге. - person Asherah; 24.03.2012
comment
В том же каталоге, что и ваш проект, и если каталог вашего проекта является прямым потомком каталога local-projects. Просто следуйте инструкциям Xach из связанного сообщения в блоге (blog.quicklisp.org/ 2011/11/ноябрь-quicklisp-updates.html). - person Miron Brezuleanu; 24.03.2012
comment
Ого, совсем пропустил эту ссылку на local-projects. Спасибо! - person Asherah; 26.03.2012

У меня был точно такой же вопрос, и я согласен, что не должен навязывать пользователю менеджер пакетов. До появления quicklisp я использовал clbuild, и он помещает все файлы .asd в каталог systems/. Пока каталог `systems/' находится в asdf:central-registry, можно просто (требуется "a-package"), по крайней мере, в SBCL и CCL, загрузить все соответствующие пакеты. Новый clbuild2 сохраняет эту функцию, если вы выполняете установку из основной ветки разработки, а его встроенный quicklisp учитывает пакеты, устанавливаемые отдельно из основной ветки разработки, но установленные пакеты quicklisp больше не раскрывают свои файлы .asd.

Итак, мое решение состоит в том, чтобы написать сценарий оболочки, который сканирует все установленные пакеты quicklisp, обычно в dists/quicklisp/software/, и связывает все файлы .asd там с центральным местом. Таким образом, вам не нужно загружать quicklisp в образ cl, если вы хотите использовать только установленные пакеты quicklisp. Я надеюсь, что quicklisp сможет добавить эту функцию по умолчанию.

person z9p    schedule 21.05.2013

Если вы вообще не хотите включать вызов quicklisp в развернутый исходный код, отделите файл определения системы quickproject от остального исходного кода.

В верхней части исходного кода, непосредственно перед вызовом defpackage, добавьте необходимые (require ...) для зависимостей вашего пакета. Это гарантирует, что эти пакеты lisp будут загружены (каким-то образом) до продолжения, но не указывает, «как» эти пакеты загружаются. Их можно загрузить, запустив вызов ql:quickload :my-package (используя quickproject), который сначала загрузит зависимости, а затем запустит вызовы require при загрузке исходного кода. Или, возможно, пользователь может загрузить исходный код напрямую (без вызова ql:quickload), а зависимости будут загружены во время вызова require, если эти зависимости можно найти в файле *module-search-path*. Этот метод, как вы сказали, позволит конечному пользователю использовать любой инструмент сборки, который он / она хочет, для загрузки вашего источника.

Поэкспериментировав с этим в течение нескольких минут, кажется, что quicklisp защелкивается в вызове функции require, так что, если quicklisp установлен и вызывается, например, (require :bordeaux-threads), lisp будет использовать quicklisp для загрузки и установки этой зависимости. Это очень хорошая функция (IMO), потому что она позволяет стандартной функции Common Lisp require действовать как уровень интерфейса и абстрагирует конкретный инструмент сборки, используемый для удовлетворения зависимости. Quicklisp может привязываться к требованию, asdf — к нему (IIRC) и т. д.

Итак, чтобы ответить на ваш вопрос, вызовы quicklisp не должны никуда идти в развернутом исходном коде, а requires следует использовать для обеспечения загрузки зависимостей до оценки файла определения пакета. Если кто-то установил quicklisp перед загрузкой файла определения пакета, эти требования будут удовлетворены за счет использования quicklisp для загрузки и установки зависимостей. Если у кого-то установлен asdf, эти зависимости будут удовлетворены этим инструментом сборки. И если у кого-то уже установлены зависимости (используя какой-то другой метод), требования будут просто пропущены.

person Clayton Stanley    schedule 29.05.2013