2009-02-27 9 views
34

Quanto è pratico eseguire il porting di un'applicazione Lisp comune a Clojure? Per essere più specifici, quali caratteristiche esistono in Common Lisp che non esistono in Clojure e dovrebbero essere riscritte?Porting di codice Lisp comune per Clojure

risposta

31

C'è uno list on clojure.org di differenze tra Clojure e altri Lisps. Alcune altre cose che ho notato con Clojure:

  • Idiomatic Clojure si appoggia pesantemente verso strutture di dati immutabili. Ovunque si veda SETF in CL potrebbe essere necessario modificare in Clojure per sfruttare appieno. (Hai sempre la possibilità di utilizzare strutture dati Java mutabili in Clojure, ma la maggior parte delle persone non lo fa.)

  • I multimetodi di Clojure sono simili a quelli di CL (probabilmente più potenti, perché puoi inviare cose diverse dal tipo) ma un CLOS in piena regola non è disponibile in Clojure. Clojure usa invece struct, che è solo una fantasia di hashmap. Il sistema OOP di Java è anche disponibile, ovviamente. Alcune persone stanno lavorando sul porting di CLOS a Clojure, ma non sono sicuro di quanto siano lontani gli sforzi a questo punto.

  • Le macro di Clojure funzionano in modo leggermente diverso rispetto alle macro CL quando si tratta di risoluzione di simboli/spazi dei nomi. Non sono sicuro se capisco abbastanza bene per chiarire le differenze. Ma non è necessario scherzare con gensyms in Clojure, il che è bello.

  • Clojure non ha un sistema di condizioni come CL. Hai solo Java try/per la gestione delle eccezioni.

  • Clojure non consente macro di lettori definite dall'utente.

  • Clojure non ha più valori di ritorno. La destrutturazione in Clojure è molto bella (supporta elenchi, vettori, hash-map, set ecc.) Ed è incorporata in più posti di CL di default, quindi questo è meno di un problema di quanto potrebbe essere.

seconda dell'applicazione e come è scritto, può essere pratico e diretto alla porta da CL a Clojure, o può essere più pratico riscriverlo da zero in un più funzionale, thread-safe modo per adattarsi meglio con lo stile Clojure.

+9

Anche Clojure è un Lisp 1 (con namespace), mentre CL è un Lisp 2. Questa è una differenza molto importante che influenza notevolmente le macro e, in misura minore, le dichiarazioni di variabili e funzioni. – dsm

+0

Le macro di Clojure sono più vicine a quelle di CL che a quelle di Scheme. I macro Clojure non sono igienici ma rendono molto più facile l'igiene di default. –

+1

I multimetodi CLOS possono essere spediti per tipo o identità. Cos'altro può spedire Clojure? –

8

Non ho una risposta specifica, ma io consiglierei di queste risorse:

  • Rich Hickey twopart parlare Clojure per Lisp programmatori
  • Stuart Halloway di work sulla traduzione degli esempi da Peter Seibel di Practical Common Lisp a Clojure.
+0

Non credo che il lavoro sia di Peter Seibel. Stuart Halloway è quello che porta da CL a Clojure. –

+0

Grazie, Brian. Fisso. Ho appena comprato la ristampa di Stuart, quindi forse mi perdonerà :) – zweiterlinde

5

ci sono un certo numero di conti di passaggio da CL a Clojure (blog, another blog, Thread on HN).

Il problema più grande di un sacco di Lispers comuni hanno con Clojure la prima volta che lo controllano fuori è la sua mancanza di Tail chiamata Optimization, che non è possibile sulla JVM.

+6

Ecco perché usi di nuovo. –

+1

e anche trampolini. Tuttavia, ci sono stati dei progressi nell'ottenere il TCO nella JVM tramite il progetto OpenJDK. – dnolen

+4

Anche molti CL non lo richiedono (non è necessario) e non conosco nessun programma (mers) che dipende da esso. ad esempio, SBCL/CMUCL non funziona a meno che non si utilizzi l'ottimizzazione dello spazio dinamico. – Ken

2

Per codice CL idiomatico è una riscrittura.

  • CL è un imperativo, Clojure è più puramente "funzionale".
  • CL è orientato agli oggetti (CLOS), Clojure not (utilizza oggetti Java e ha alcuni meccanismi OO)
  • Gli identificatori e la sintassi sono per lo più diversi.
  • Le strutture dati sono diverse.
  • CL è principalmente rigido (non pigro), Clojure utilizza il calcolo lazy.

Anche il porting dell'infrastruttura necessaria (CLOS, Error Handling, Streams) a Clojure ha poco senso, poiché Clojure è davvero un linguaggio diverso con uno stile di programmazione diverso.

Se non si desidera riscrivere il codice, esiste ad esempio ABCL, che è un Common Lisp per JVM.

Problemi correlati