Как избежать загрузки нескольких файлов asdf для общего проекта lisp?

Работая над книгой Питера Сейбеля Practical Common Lisp, я столкнулся с трудностями в понимании того, как обращаться с системой пакетов Common Lisp в сочетании с Emacs SLIME и quicklisp. Проект, который он предоставляет, имеет следующую структуру:

  • spam.lisp в пакете com.gigamonkeys.spam, который зависит от двух других пакетов, cl-ppcre и com.gigamonkeys.pathnames.
  • pathnames.lisp в упаковке com.gigamonkeys.pathnames
  • spam.asd, в котором описаны зависимости пакета com.gigamonkeys.spam
  • pathnames.asd, в котором описаны зависимости пакета com.gigamonkeys.pathnames

Единственный способ, который я нашел в настоящее время для создания конечной цели, spam.lisp, заключается в следующем:

  1. Скомпилируйте и загрузите файл pathnames.asd с помощью SLIME (C-x C-k)
  2. Загрузите пакет com.gigamonkeys.pathname, набрав (asdf:operate 'asdf:load-op 'spam) в REPL.
  3. Загрузите пакет cl-ppcre, набрав (ql:quickload "cl-ppcre") в REPL.
  4. Скомпилируйте и загрузите файл spam.asd с помощью SLIME.
  5. Загрузите пакет com.gigamonkeys.spam, набрав (asdf:operate 'asdf:load-op 'spam) в REPL

Это похоже на безумный объем работы, необходимый для использования функций, определенных в одном файле (spam.lisp) - я должен делать что-то не так. Есть ли способ загрузить spam.lisp и рекурсивно его зависимости с меньшим количеством команд?


person zeptonaut    schedule 18.11.2012    source источник


Ответы (2)


Источник + полная история

Короче говоря, пакеты — это пакеты символов, а системы описывают отношения между файлами и другими системами.

Итак, используя вашу структуру здесь, мы получаем простое определение системы:

(asdf:defsystem #:spam-filter
  :serial t
  :description "Simple Spam Filter"
  :author "PCL"
  :depends-on (#:cl-ppcre
               #:com.gigamonkeys.pathnames)

  :components ((:file "package")
               (:file "spam")))

Теперь я предположу, что система com.gigamonkeys.pathnames находится в ~/src/lisp/com/gigamonkeys/pathnames/, а спам-фильтр в ~/src/lisp/spam-filter/.

  1. M-xslimeRET
  2. ,cd~/src/lisp/com/gigamonkeys/pathnamesRET
  3. (push (truename ".") asdf:*central-registry*)
  4. ,cd~/src/lisp/spam-filterRET
  5. (push (truename ".") asdf:*central-registry*)
  6. (ql:quickload :spam-filter)

Поскольку Quicklisp полагается на ASDF для загрузки систем, вы должны добавить системные каталоги в путь поиска ASDF.

Вы также можете поместить свои системы в путь поиска Quicklisp, добавив их в ~/quicklisp/local-projects/. Вы можете хранить там свой код или использовать символические ссылки.

PS: вы можете найти здесь слизь -сочетание, которое позволяет мне написать , добавитьRET вместо (push (truename ".") asdf:*central-registry*).

И чуть ниже еще один слайм-ярлык для быстрой загрузки системы. (,qlsome-system-nameRET)

person Daimrod    schedule 18.11.2012
comment
Я прошу прощения за задержку с пометкой этого как правильного, но это именно то, что я искал. Спасибо за понятное объяснение! - person zeptonaut; 03.02.2013

Немного терминологии:

  • Пакет – это стандартная функция Common Lisp. . Пакет — это пространство имен для символов. Больше ничего. Это не файл, не модуль, не библиотека и не привязано ни к чему подобному. Это даже не пространство имен для функций, переменных или классов. Только для символов. Существует соглашение помещать определения, устанавливающие пакет, в отдельный файл. Но это всего лишь условность.

  • Система используется для определения, загрузки и компиляции всех файлов, составляющих программную библиотеку или приложение. Идея системы стара (более тридцати лет). ASDF (еще одна система определения системы) — популярная и бесплатная реализация этой идеи. Кент Питман написал в 1984 году об Описании больших систем.

Частью такого системного средства является реестр, из которого можно найти все системы. Определение системы описывает файлы, из которых она состоит, и все системы, от которых она зависит. Обычно такой реестр представляет собой каталог в файловой системе и/или реестр (переменная,...) в работающем Lisp.

При загрузке конкретной системы системный инструмент просматривает реестр и находит ее, загружает определение, рекурсивно загружает все необходимые системы, а затем загружает все файлы.

См. руководство по ASDF: Настройка ASDF для поиска ваших систем

person Rainer Joswig    schedule 18.11.2012