Nel suo articolo The Nature of Lisp, Slava Akhmechet introduce le persone in lisp utilizzando Ant/NAnt come esempio. Esiste un'implementazione di Ant/NAnt in lisp? Dove puoi usare il vero codice Lisp, invece di xml, per definire le cose? Ho dovuto fare i conti con la creazione di aggiunte a NAnt e ho desiderato un modo per aggirare il sistema xml nel modo in cui gli spettacoli di Slava potevano essere fatti.Ant (o NAnt) in Lisp
risposta
Ant è un programma che interpreta i comandi scritti in un linguaggio XML. È possibile, come appena menzionato nella sua risposta, utilizzare un parser XML (come il citato XMLisp) e convertire la descrizione XML in una sorta di dati Lisp e quindi scrivere codice aggiuntivo in Lisp. È necessario reimplementare anche alcune delle interpretazioni di Ant.
Gran parte della roba primitiva in Ant non è necessaria in Lisp. Alcune operazioni sui file sono integrate in Lisp (delete-file, rename-file, probe-file, ...). Alcuni sono mancanti e devono essere implementati - in alternativa è possibile utilizzare una delle librerie esistenti. Si noti inoltre che è possibile CARICARE file Lisp in Lisp ed eseguire codice - esiste anche il REPL - quindi viene fornito già con un frontend interattivo (diversamente da Java).
I sistemi di generazione di livello superiore in Common Lisp solitamente implementano un'astrazione denominata "SYSTEM". Ce ne sono diversi. ASDF è una scelta popolare, ma ce ne sono altri. Un sistema ha sottosistemi e file. Un sistema ha anche alcune opzioni. I suoi componenti hanno anche opzioni. Un sistema ha una descrizione strutturale dei componenti, una descrizione delle dipendenze o una descrizione gentile delle "azioni" e delle loro dipendenze. In genere queste cose sono implementate in modo orientato agli oggetti e puoi implementare 'azioni' come funzioni Lisp (generiche). Lisp ha anche funzioni come COMPILE-FILE, che userà il compilatore Lisp per compilare un file. Se il tuo codice ha, ad esempio, i file C, dovrai chiamare un compilatore C, in genere tramite una funzione specifica di implementazione che consente di chiamare programmi esterni (qui il compilatore C).
Come, menzionato da dmitry-vk, ASDF è una scelta popolare. LispWorks fornisce Common Defsystem. Allegro CL ha il proprio DEFSYSTEM. Il suo DEFSYSTEM manual descrive anche come estenderlo.
Tutte le soluzioni Lisp utilizzano una sorta di sintassi Lisp (non sintassi XML), in genere implementata da una macro per descrivere il sistema. Una volta letto in Lisp, diventa una rappresentazione di dati, spesso con istanze CLOS per il sistema, i moduli, ecc. Le azioni quindi sono anche funzioni Lisp. Alcune funzioni di ordine superiore quindi passano sopra il grafico/albero del componente ed eseguono le azioni necessarie. Alcuni altri strumenti passano sopra il grafico/albero del componente e restituiscono una rappresentazione per le azioni - che è quindi un piano proposto: - l'utente può quindi consentire a Lisp di eseguire l'intero piano o parti del piano.
su una macchina Lisp una semplice descrizione del sistema assomiglia a questo:
(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"))
definisce Sopra uno SCIGRAPH sistema e di tutti i file devono essere compilate e il carico in ordine seriale.
Ora riesco a vedere ciò che il Lisp macchina avrebbe fatto per aggiornare il codice compilato:
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
sarebbe compilare un file e caricarlo - Ho il software caricato e cambiato solo questo file finora.
Per ASDF vedere la documentazione menzionata nella pagina CLIKI - funziona in modo un po 'diverso.
Forse potresti definire le cose in lisp e convertirle in XML nel punto in cui le passi in NAnt.
Qualcosa come XMLisp rende più facile andare avanti e indietro tra le due rappresentazioni.
Modifica: In realtà, xml-emitter avrebbe più senso.
La cosa che ha sollevato l'articolo era che xml era un linguaggio meta, che in realtà impediva di utilizzare il linguaggio di implementazione. Se Ant/NAnt è stato implementato usando il lisp, puoi usare tutta la potenza del lisp in ogni nodo ... il che suona COSÌ affascinante! – Daniel
È vero, e immagino che Scons ne sia un esempio, dal momento che è possibile eseguire python arbitario in quel sistema di build. D'altra parte penso che i sistemi di compilazione maturi come make e jam, che hanno evoluto linguaggi concisi ed espressivi per costruire codice, rendano meno utile l'idea di un Lisp Ant. – justinhj
Common Lisp's ASDF (Another System Definition Facility) è analogo a Make/Ant (ma non un analogo completo - è finalizzato alla creazione di programmi Lisp, non di sistemi generici come make o form). È estensibile con il codice Lisp (sottoclassi di sistemi, componenti, aggiunta di operazioni ai sistemi). Ad esempio, esiste un'estensione asdf-ecs che consente di includere (e compilare) i file sorgente C nel sistema.
Il prossimo libro di Stuart Halloway Programming Clojure passa attraverso la costruzione di Lancet in tutto il libro come app di esempio. Lancet è un sistema di costruzione Clojure che (facoltativamente) si integra direttamente con Ant. Il codice sorgente e gli esempi sono available.
Se tutto ciò che si vuole fare è generare file XML Ant usando il codice Lisp, si può usare qualcosa come clj-html per Clojure o CL-WHO per Common Lisp. Generare XML da Lisp s-exps è divertente e facile.
Grazie per aver dedicato del tempo a rispondere! Credo che il mio più grande manzo con Ant sia che dal momento che sta usando XML, non posso usare direttamente la potenza del linguaggio sottostante per eseguire alcune operazioni. Sono disponibili solo le operazioni (funzioni) che sono state "trasferite" sul lato xml. La bellezza che vedo in un sistema implementato con Lisp è che tutto il lisp sarebbe disponibile, non è necessario creare wrapper XML per funzioni native. – Daniel