2009-04-16 7 views
6

In seinem Artikel The Nature of Lisp, führt Slava Akhmechet Menschen zu Lisp durch Verwendung von Ant/NAnt als ein Beispiel. Gibt es eine Implementierung von Ant/NAnt in Lisp? Wo können Sie tatsächlichen Lisp-Code anstelle von XML verwenden, um Dinge zu definieren? Ich musste mich mit der Erstellung von NAnt-Erweiterungen befassen und habe mir eine Möglichkeit gewünscht, das XML-System auf die Art und Weise zu umgehen, wie Slava es zeigt.Ant (oder NAnt) in Lisp

Antwort

12

Ant ist ein Programm, das in einer XML-Sprache geschriebene Befehle interpretiert. Sie können, wie gerade in seiner Antwort erwähnt, einen XML-Parser verwenden (wie die erwähnte XMLisp) und die XML-Beschreibung in irgendeine Art von Lisp-Daten konvertieren und dann zusätzlichen Code in Lisp schreiben. Sie müssen auch einige der Ant-Interpretation neu implementieren.

Ein Großteil der primitiven Sachen in Ant wird in Lisp nicht benötigt. Einige Dateioperationen sind in Lisp integriert (delete-file, rename-file, probe-file, ...). Einige fehlen und müssen implementiert werden - alternativ können Sie eine der vorhandenen Bibliotheken verwenden. Beachten Sie auch, dass Sie Lisp-Dateien in Lisp laden und Code ausführen können - es gibt auch die REPL -, so dass es bereits mit einem interaktiven Frontend kommt (anders als bei Java).

Höhere Build-Systeme in Common Lisp implementieren normalerweise eine Abstraktion namens 'SYSTEM'. Es gibt mehrere davon. ASDF ist eine beliebte Wahl, aber es gibt andere. Ein System hat Subsysteme und Dateien. Ein System hat auch ein paar Optionen. Seine Komponenten haben auch Optionen. Ein System hat entweder eine strukturelle Beschreibung der Komponenten, eine Beschreibung der Abhängigkeiten oder eine Art Beschreibung von 'Aktionen' und deren Abhängigkeiten. Typischerweise werden diese Dinge objektorientiert implementiert und Sie können 'Aktionen' als Lisp (generische) Funktionen implementieren. Lisp bringt auch Funktionen wie COMPILE-FILE, die den Lisp-Compiler verwenden, um eine Datei zu kompilieren. Wenn Ihr Code zB C-Dateien hat - Sie müssten einen C-Compiler aufrufen - normalerweise durch eine implementierungsspezifische Funktion, die es erlaubt, externe Programme aufzurufen (hier der C-Compiler).

Wie erwähnt, dmitry-vk, ASDF ist eine beliebte Wahl. LispWorks bietet Common Defsystem. Allegro CL hat ein eigenes DEFSYSTEM. Seine DEFSYSTEM manual beschreibt auch, wie man es erweitert.

Alle Lisp-Lösung verwenden eine Art von Lisp-Syntax (nicht XML-Syntax), in der Regel von einem Makro implementiert, um das System zu beschreiben. Sobald das in Lisp gelesen wird, wird es in eine Datendarstellung umgewandelt - oft mit CLOS-Instanzen für das System, Module, etc .. Die Aktionen sind dann auch Lisp-Funktionen. Einige Funktionen höherer Ordnung laufen dann über den Komponentengraphen/Baum und führen die notwendigen Aktionen aus. Einige andere Werkzeuge gehen über den Komponentengraphen/Baum und geben eine Darstellung für Aktionen zurück - was dann ein vorgeschlagener Plan ist - der Benutzer kann dann Lisp veranlassen, den gesamten Plan oder Teile des Plans auszuführen.

Auf einem Lisp-Maschine eine einfache Systembeschreibung sieht wie folgt aus:

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

definiert Über ein System SCIGRAPH und alle Dateien sollten in serieller Reihenfolge zusammengestellt und Last werden.

Jetzt kann ich sehen, was die Lisp-Maschine würde den kompilierten Code zu aktualisieren tun:

 
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 

Es wäre eine Datei kompilieren und laden - ich die Software geladen haben und diese Datei nur so weit geändert.

Für ASDF siehe die Dokumentation auf der CLIKI-Seite - es funktioniert ein bisschen anders.

+0

Vielen Dank für die Zeit zu beantworten! Ich glaube, mein größtes Problem mit Ant ist, dass ich die Leistung der zugrunde liegenden Sprache nicht direkt nutzen kann, um einige Operationen auszuführen, da XML verwendet wird. Es sind nur Operationen (Funktionen) verfügbar, die auf die XML-Seite "portiert" wurden. Die Schönheit, die ich in einem System sehe, das mit Lisp implementiert wird, ist, dass alles Lisp verfügbar wäre, keine Notwendigkeit, XML-Wrapper für native Funktionen zu erstellen. – Daniel

1

Vielleicht könnten Sie Dinge in Lisp definieren und sie in XML konvertieren, wenn Sie sie an NAnt übergeben.

Etwas wie XMLisp macht es einfacher, zwischen den beiden Darstellungen hin und her zu gehen.

Bearbeiten: Eigentlich würde xml-emitter mehr Sinn machen.

+0

Die Sache, die der Artikel brachte, war, dass XML eine Metasprache war, die wirklich verhinderte, dass Sie die Implementierungssprache verwenden konnten. Wenn Ant/NAnt mithilfe von Lisp implementiert wurde, können Sie alle Funktionen von Lisp in jedem Knoten verwenden ... was so ansprechend klingt! – Daniel

+0

Das stimmt, und ich denke, Scons ist ein Beispiel dafür, da Sie in diesem Build-System beliebig Python ausführen können. Auf der anderen Seite denke ich, dass die ausgereiften Build-Systeme wie make und jam, die prägnante und ausdrucksstarke Sprachen für den Code entwickelt haben, die Idee einer Lisp-Ant weniger nützlich machen. – justinhj

1

Gemeinsame Lisp ASDF (eine andere System Definition Facility) ist analog zu Make/Ant (aber nicht eine vollständige Analog - es zielt auf die Erstellung von Lisp-Programmen, nicht generische Systeme wie make oder ant). Es ist mit Lisp-Code erweiterbar (Unterklassensysteme, Komponenten, Hinzufügen von Operationen zu Systemen). Z. B. gibt es eine Erweiterung von asdf-ecs, die es ermöglicht, C-Quellendateien in das System aufzunehmen (und zu kompilieren).

4

Stuart Halloways kommendes Buch Programming Clojure geht durch den Bau von Lancet im ganzen Buch als Beispiel App. Lancet ist ein Clojure-Build-System, das sich (optional) direkt in Ant integriert. Quellcode und Beispiele sind available.

Wenn Sie nur Ant-XML-Dateien mit Lisp-Code generieren möchten, können Sie beispielsweise clj-html für Clojure oder CL-WHO für Common Lisp verwenden. Das Generieren von XML aus Lisp s-exps macht Spaß und ist einfach.