2009-04-16 11 views
6

, en su artículo The Nature of Lisp, Slava Akhmechet presenta a las personas a ceceo utilizando Ant/NAnt como ejemplo. ¿Hay una implementación de Ant/NAnt en lisp? ¿Dónde puede usar el código de lisp real, en lugar de xml, para definir las cosas? He tenido que lidiar con la creación de adiciones a NAnt, y he deseado una manera de eludir el sistema xml en la forma en que Slava muestra que se podría hacer.Ant (o NAnt) en Lisp

Respuesta

12

Ant es un programa que interpreta comandos escritos en algún lenguaje XML. Usted puede, como acaba de mencionar en su respuesta, usar algún analizador XML (como el XMLisp mencionado) y convertir la descripción XML en algún tipo de datos Lisp y luego escribir código adicional en Lisp. Necesita volver a implementar también algunas de las interpretaciones de Ant.

Gran parte de las cosas primitivas en Ant no son necesarias en Lisp. Algunas operaciones de archivos están incorporadas en Lisp (eliminar-archivo, cambiar nombre-archivo, archivo-sonda, ...). Algunos faltan y deben implementarse; alternativamente puede usar una de las bibliotecas existentes. También tenga en cuenta que puede CARGAR archivos Lisp en Lisp y ejecutar código, también está el REPL, por lo que ya viene con una interfaz interactiva (a diferencia de Java).

Los sistemas de compilación de nivel superior en Common Lisp generalmente implementan una abstracción llamada 'SYSTEM'. Hay varios de esos. ASDF es una opción popular, pero hay otras. Un sistema tiene subsistemas y archivos. Un sistema también tiene algunas opciones. Sus componentes también tienen opciones. Un sistema tiene una descripción estructural de los componentes, una descripción de las dependencias o una descripción de tipo de 'acciones' y sus dependencias. Normalmente, estas cosas se implementan de forma orientada a objetos y puede implementar 'acciones' como funciones Lisp (genéricas). Lisp también trae funciones como COMPILE-FILE, que usará el compilador Lisp para compilar un archivo. Si su código tiene, por ejemplo, archivos C, necesitará llamar a un compilador de C, generalmente a través de alguna función específica de implementación que permite llamar a programas externos (aquí el compilador de C).

As, mencionado por dmitry-vk, ASDF es una opción popular. LispWorks proporciona Common Defsystem. Allegro CL tiene su propio DEFSYSTEM. Su DEFSYSTEM manual describe también cómo extenderlo.

Toda la solución Lisp está utilizando algún tipo de Sintaxis Lisp (sin sintaxis XML), generalmente implementado por una macro para describir el sistema. Una vez que se lee en Lisp, se convierte en una representación de datos, a menudo con instancias CLOS para el sistema, módulos, etc. Las acciones son también funciones Lisp. Algunas funciones de orden superior recorren el gráfico/árbol de componentes y ejecutan las acciones necesarias. Algunas otras herramientas recorren el gráfico/árbol de componentes y devuelven una representación para las acciones, que es entonces un plan propuesto - el usuario puede entonces dejar que Lisp ejecute todo el plan o partes del plan.

en una máquina Lisp una simple descripción del sistema se parece a esto:

(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")) 

define Por encima de una SCIGRAPH sistema y todos los archivos debe ser compilado y la carga con el fin de serie.

Ahora puedo ver lo que la máquina Lisp haría para actualizar el código compilado:

 
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 

sería compilar un archivo y cargarlo - tengo el software cargado y cambiado solamente este archivo hasta el momento.

Para ASDF, consulte la documentación mencionada en la página CLIKI. Funciona de forma un poco diferente.

+0

¡Gracias por pasar el tiempo para responder! Creo que mi mayor problema con Ant es que, dado que usa XML, no puedo usar el poder del lenguaje subyacente directamente para realizar algunas operaciones. Solo están disponibles las operaciones (funciones) que han sido "portadas" al lado xml. La belleza que veo en un sistema implementado con Lisp es que todo lisp estaría disponible, sin necesidad de crear contenedores XML para funciones nativas. – Daniel

1

Quizás pueda definir cosas en lisp y convertirlas a XML en el punto en que las pasa a NAnt.

Algo como XMLisp hace que sea más fácil ir y venir entre las dos representaciones.

Editar: En realidad, xml-emitter tendría más sentido.

+0

Lo que apareció en el artículo fue que xml era un metalenuaje, lo que realmente le impidió usar el lenguaje de implementación. Si Ant/NAnt se implementó usando lisp, podrías usar todo el poder de lisp en cada nodo ... ¡lo cual suena TAN atractivo! – Daniel

+0

Eso es cierto, y supongo que Scons es un ejemplo de esto, ya que puedes ejecutar arbitary python en ese sistema de compilación. Por otro lado, creo que los sistemas de compilación maduros como make y jam, que han desarrollado lenguajes concisos y expresivos para el código de construcción, hacen que la idea de lisp Ant sea menos útil. – justinhj

1

El ASDF de Common Lisp (otra herramienta de definición de sistema) es análogo a Make/Ant (pero no es un análogo completo; está destinado a crear programas lisp, no a sistemas genéricos como make o ant). Es extensible con código Lisp (sistemas de subclases, componentes, operaciones de adición a los sistemas). Por ejemplo, hay una extensión asdf-ecs que permite incluir (y compilar) archivos fuente C en el sistema.

4

El próximo libro de Stuart Halloway Programming Clojure pasa por la construcción de Lancet en todo el libro como una aplicación de ejemplo. Lancet es un sistema de construcción Clojure que (opcionalmente) se integra directamente con Ant. El código fuente y los ejemplos son available.

Si todo lo que quiere hacer es generar archivos Ant XML utilizando el código Lisp, podría usar algo como clj-html para Clojure o CL-WHO para Common Lisp. Generar XML desde Lisp s-exps es divertido y fácil.