Муравей (или нет) в Лиспе - PullRequest
       15

Муравей (или нет) в Лиспе

6 голосов
/ 16 апреля 2009

В своей статье Природа Лиспа Слава Ахмехет знакомит людей с шумихой, используя в качестве примера Ant / NAnt. Есть ли реализация Ant / NAnt в lisp? Где вы можете использовать реальный код lisp вместо xml для определения вещей? Мне приходилось иметь дело с созданием дополнений к NAnt, и я хотел, чтобы был способ обойти систему xml так, как можно было бы показывать Slava.

Ответы [ 4 ]

12 голосов
/ 16 апреля 2009

Ant - это программа, которая интерпретирует команды, написанные на каком-то языке XML. Вы можете, как упомянул Джастинхдж в своем ответе, использовать некоторый синтаксический анализатор XML (например, упомянутый XMLisp) и преобразовать описание XML в некоторые данные Lisp, а затем написать дополнительный код на Lisp. Вам нужно переопределить также некоторые из интерпретации муравья.

Большая часть примитивного материала в Ant не нужна в Лиспе. Некоторые файловые операции встроены в Lisp (delete-file, rename-file, probe-file, ...). Некоторые отсутствуют и должны быть реализованы - в качестве альтернативы вы можете использовать одну из существующих библиотек. Также обратите внимание, что вы можете ЗАГРУЗИТЬ файлы Lisp в Lisp и выполнить код - есть также REPL - так что он уже поставляется с интерактивным интерфейсом (в отличие от Java).

Системы сборки более высокого уровня в Common Lisp обычно реализуют абстракцию под названием ' SYSTEM '. Есть несколько из них. ASDF - популярный выбор, но есть и другие. Система имеет подсистемы и файлы. Система также имеет несколько вариантов. У его компонентов также есть опции. Система имеет либо структурное описание компонентов, либо описание зависимостей, либо описание видов «действий» и их зависимостей. Обычно эти вещи реализуются объектно-ориентированным способом, и вы можете реализовать «действия» в виде лисповских (универсальных) функций. Lisp также предоставляет такие функции, как COMPILE-FILE, которые будут использовать компилятор Lisp для компиляции файла. Если в вашем коде есть, скажем, C-файлы - вам нужно вызывать C-компилятор - обычно через некоторую специфическую для реализации функцию, которая позволяет вызывать внешние программы (здесь C-компилятор).

Как уже упоминалось в dmitry-vk, ASDF является популярным выбором. LispWorks предоставляет Common Defsystem . Allegro CL имеет свою собственную DEFSYSTEM. В руководстве DEFSYSTEM также описано, как его расширить.

Все решения Lisp используют какой-то синтаксис Lisp (не синтаксис XML), обычно реализуемый макросом для описания системы. Когда это считывается в Lisp, оно превращается в представление данных - часто с экземплярами CLOS для системы, модулей и т. Д. Затем действия также являются функциями Lisp. Затем некоторые функции более высокого порядка проходят по графу / дереву компонента и выполняют необходимые действия. Некоторые другие инструменты просматривают график / дерево компонентов и возвращают представление для действий - которое затем является предлагаемым планом - тогда пользователь может позволить Лиспу выполнить весь план или его части.

На Лисп-машине простое описание системы выглядит так:

(sct:defsystem scigraph
    (:default-pathname "sys:scigraph;"
     :required-systems "DWIM")
   (:serial "package" "copy" "dump" "duplicate" "random"
            "menu-tools" "basic-classes" "draw" "mouse"
            "color" "basic-graph" "graph-mixins" "axis"
            "moving-object" "symbol" "graph-data" "legend"
            "graph-classes" "present" "annotations" "annotated-graph"
            "contour" "equation" "popup-accept" "popup-accept-methods"
            "duplicate-methods" "frame" "export" "demo-frame"))

Выше определяется системный SCIGRAPH, и все файлы должны быть скомпилированы и загружены в последовательном порядке.

Теперь я вижу, что машина Lisp сделает для обновления скомпилированного кода:

Command: Compile System (a system [default Scigraph]) Scigraph (keywords)
                        :Simulate (compiling [default Yes]) Yes

  The plan for constructing Scigraph version Newest for the Compile 
      operation is:
  Compile RJNXP:>software>scigraph>scigraph>popup-accept-methods.lisp.newest
  Load RJNXP:>software>scigraph>scigraph>popup-accept-methods.ibin.newest

Это скомпилирует один файл и загрузит его - у меня загружено программное обеспечение и я изменил только этот файл.

Для ASDF см. Документацию, упомянутую на странице CLIKI - она ​​работает немного по-другому.

4 голосов
/ 16 апреля 2009

Предстоящая книга Стюарта Халлоуэя Программирование Clojure проходит через конструкцию Lancet по всей книге в качестве примера приложения. Lancet - это система сборки Clojure, которая (опционально) интегрируется напрямую с Ant. Исходный код и примеры доступны .

Если все, что вам нужно, это генерировать Ant XML-файлы с использованием кода на Лиспе, вы можете использовать что-то вроде clj-html для Clojure или CL-WHO для Common Lisp. Генерация XML из Lisp s-exps - это весело и легко.

1 голос
/ 16 апреля 2009

ASDF Common Lisp (еще одно средство определения системы) аналогично Make / Ant (но не полный аналог - он нацелен на создание программ на lisp, а не универсальных систем, таких как make или ant). Он расширяется с помощью кода на Лиспе (системы подклассов, компоненты, операции добавления в системы). Например, есть расширение asdf-ecs, которое позволяет включать (и компилировать) исходные файлы C в систему.

1 голос
/ 16 апреля 2009

Возможно, вы сможете определить вещи в lisp и преобразовать их в XML в тот момент, когда вы передадите их в NAnt.

Что-то вроде XMLisp облегчает переход от одного представления к другому и обратно.

Редактировать: На самом деле, xml-эмиттер будет иметь больше смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...