2015-06-12 2 views
2

Я в настоящее время пытаюсь обернуть голову вокруг пакетов, систем & co.Структурирование больших приложений Lisp

Я сейчас несколько раз читал Packages, systems, modules, libraries - WTF?, и я думаю, что у меня все еще есть трудности, чтобы понять это правильно.

Если я просто хочу разбить исходный файл Lisp на два файла, где один должен «использовать» другой - как это сделать? Нужно ли мне строить систему для этого? Должен ли я использовать модуль? ...? Я иду от фона Node.js, и вы можете просто сказать

var foo = require('./foo'); 

, чтобы получить ссылку на то, что экспортируется в файл foo.js. Что самое близкое к этому в Lisp?

Я понимаю, что ASDF для систем, и что она поставляется как часть Quicklisp, по крайней мере, в соответствии с документацией:

ASDF поставляется в комплекте со всеми последними релизами активных реализаций Common Lisp, а также с быстрым доступом [...]

Хорошо, Quicklisp предназначен для библиотек, но каковы их отношения? Является ли Quicklisp чем-то вроде «менеджера пакетов» на других языках? И если да, то что именно предоставляет ASDF?

Извините за эти много вопросов, но я думаю, что это просто показывает, что я должен понять, как структурировать приложения Lisp. Любая помощь была бы принята с благодарностью :-)

ответ

7

Система

Для структурирования больших систем используют инструмент для управления системой. «Свободный» - ASDF.

Вам понадобится системное объявление, в котором перечислены части вашей библиотеки или приложения. Обычно он переходит в собственный файл. Затем вы загрузить a system или compile a system. Как это сделать, должны быть учебные пособия.

Простая Lisp система может иметь следующие файлы:

  • системный файл описания системы, ее части и любой другой материал нужен (другие системы)
  • пакет файлов, который описывает пространства имен, используемые
  • основной инструмент файл (для примеров функций, используемых в макросе)
  • макро-файл, который содержит список макросов (используется для того, чтобы они компилируются/загружены до остальной части программного обеспечения)
  • один или несколько других файлов с функциональностью.

Quicklisp не зависит от этого. Это инструмент для распространения программного обеспечения.

Быстрый хак компилировать и загружать файлы

Но вы также можете компилировать и загружать файлы по старинке без системы инструмент:

(defparameter *files* 
    '("/yourdir/foo.lisp" "/yourdir/bar.lisp")) 

(defun compile-foobar() 
    (mapC#'compile-file *files*)) 

(defun load-foobar() 
    (mapC#'load *files*)) 

(defun compile-and-load() 
    (mapc (lambda (file) 
      (load (compile-file file))) 
     *files*)) 

В действительности может быть больше это, но часто этого достаточно. Вы должны легко написать свой собственный строительный инструмент. Типичная система инструмент предоставит гораздо больше возможностей для построения более сложного программного обеспечения структурированным способом. Многие идеи для этих инструментов охватывают как минимум 35 лет. См. Например, Lisp Machine manual, здесь издание от 1984 года, глава Maintaining Large Systems.

Роль файлов

Обратите внимание, что в простом Common Lisp роль файлов и семантики не являются очень сложными.

Файл является неимен, это не связан с класса/подкласса или объекта, это немодуль. Вы смешиваете Lisp-конструкции в файле, который вам нужен. Файлы могут быть произвольными большими (например, одна сложная библиотека имеет версию, где она поставляется в виде одного исходного файла с 30000 строк). Единственное реальное место в стандартной семантике, где файл играет роль, - это компиляция файла. Какие побочные эффекты компилируют файл? Какие оптимизации может сделать компилятор?

Помимо этого предполагается, что среда разработки предоставляет услуги, такие как загрузка и компиляция групп файлов aka систем, предоставление обзоров ошибок компиляции, местоположения источников записи, определения местоположений и многое другое. Инструмент типа ASDF ручка система часть.

+0

Кроме того, прочитав http://www.flownet.com/gat/packages.pdf и http://www.gigamonkeys.com/book/programming-in- the-large-packages-and-symbols.html помогли понять пакеты. Спасибо :-) –

+0

Rainer, почему вы используете цитаты вокруг «бесплатно», касающиеся ASDF? –

+0

Кроме того, ASDF 3.1 не поддерживает стиль быстрой сборки/faslpath с более легким весом при построении системы, где существует взаимно однозначное соответствие между файлами и пакетами и системами. –

2

В Common Lisp есть функция require, но она устарела. Если вы просто хотите разделить свой код на одну или несколько частей, чтобы интерактивно использовать его в REPL, вы можете поместить код в разные файлы, а затем load каждого из них. Если вместо этого вы хотите написать полный проект lisp, я нашел очень полезным пакет quickproject, который обеспечивает простую отправную точку для создания новых пакетов.

+0

Спасибо за подсказку с quickproject :-) –

 Смежные вопросы

  • Нет связанных вопросов^_^