Domanda Porting di codice Lisp comune a Clojure


Quanto è pratico portare una applicazione Lisp comune a Clojure? Per essere più specifici, quali caratteristiche esistono in Common Lisp che non esistono in Clojure e dovrebbero essere riscritte?


34
2018-02-27 16:43


origine


risposte:


C'è un lista su clojure.org delle differenze tra Clojure e altri Lisps. Alcune altre cose che ho notato usando Clojure:

  • Il Clojure idiomatico si appoggia pesantemente a strutture di dati immutabili. Ovunque vedi SETF in CL potrebbe essere necessario cambiare in Clojure per trarne il massimo vantaggio. (Hai sempre la possibilità di utilizzare strutture dati Java mutabili in Clojure, ma la maggior parte delle persone no.)

  • I metodi multimodali di Clojure sono simili a quelli di CL (probabilmente più potenti, perché è possibile inviare cose diverse dal tipo) ma CLOS non è disponibile in Clojure. Clojure utilizza struct invece, 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 Clojure funzionano in modo leggermente diverso rispetto alle macro CL quando si tratta di risoluzione di nomi / simboli. 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 i CL. Hai solo Java try/catch/finally 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.

A seconda dell'app e del modo in cui è stata scritta, può essere pratico e semplice effettuare il porting da CL a Clojure, oppure potrebbe essere più pratico riscriverlo da zero in un modo più funzionale e sicuro per adattarsi meglio allo stile Clojure .


31
2018-02-27 20:45



Non ho una risposta specifica, ma consiglierei queste risorse:

  • Rich Hickey's Due  parte parlare Clojure per i programmatori Lisp
  • Stuart Halloway lavoro sulla traduzione degli esempi da Peter Seibel Lisp comune pratico a Clojure.

8
2018-02-27 16:54



Esistono numerosi account di transizione da CL a Clojure (blog, un altro blog, Thread su HN).

Il problema più grande che hanno molti Cespucci comuni con Clojure quando li controlla è la sua mancanza Ottimizzazione chiamata coda, che non è possibile sulla JVM.


5
2018-02-27 17:05



Per il codice CL idiomatico è una riscrittura.

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

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

Se uno non vuole riscrivere il codice, c'è per esempio ABCL, che è un Common Lisp per JVM.


2
2017-11-27 13:49