Est-il pratique de porter une application Common Lisp sur Clojure? Pour être plus précis, quelles fonctionnalités de Common Lisp n'existent pas dans Clojure et devraient être réécrites?
Réponses
Trop de publicités?Il y a une liste sur clojure.org des différences entre Clojure et d'autres Lisps. Quelques autres choses que j'ai remarqué à l'aide de Clojure:
Idiomatiques Clojure penche fortement vers l'immuable des structures de données. Partout où vous voyez
SETF
en CL peut être changé en Clojure d'en profiter pleinement. (Vous avez toujours la possibilité d'utiliser mutable Java structures de données en Clojure, mais la plupart des gens ne le font pas.)Clojure est multimethods sont similaires à CL (sans doute le plus puissant, parce que vous pouvez envoyer sur d'autres choses que le type), mais d'une véritable CLOS n'est pas disponible en Clojure. Clojure utilise
struct
au lieu de cela, qui est juste une fantaisie hashmap. Java POO système est également disponible, bien sûr. Certaines personnes sont dans le portage CLOS à Clojure, mais je ne suis pas sûr de combien de temps ces efforts sont à ce point.Clojure macros fonctionnent un peu différemment que CL macros quand il s'agit de symbole/résolution d'espace de noms. Je ne suis pas sûr si je comprends assez bien pour élucider les différences. Vous n'avez pas de gâchis avec gensyms tout autant en Clojure bien, ce qui est agréable.
Clojure ne dispose pas d'un système de climatisation comme CL. Vous n'avez qu'Java
try
/catch
/finally
pour la gestion des exceptions.Clojure ne permet pas définie par l'utilisateur lecteur de macros.
Clojure ne pas avoir plusieurs valeurs de retour. Déstructuration en Clojure est très agréable (prend en charge les listes, vecteurs, hash-cartes, des jeux, etc.) et il est intégré dans plus d'endroits que CL par défaut, donc c'est moins un problème qu'il pourrait l'être.
Selon l'application et la façon dont c'est écrit, il peut être pratique et simple à port de CL à Clojure, ou il peut être plus pratique de le réécrire à partir du sol jusqu'à la plus fonctionnelle, thread-safe manière à s'adapter mieux avec Clojure style.
Je n'ai pas de réponse précise, mais je recommanderais ces ressources:
- Le discours en deux parties de Rich Hickey, Clojure pour les programmeurs Lisp
- Le travail de Stuart Halloway sur la traduction des exemples de Practical Common Lisp de Peter Seibel en Clojure.
Il y a un certain nombre de comptes de la transition de la CL de Clojure (blog, un autre blog, Fil sur HN).
Le plus gros problème, beaucoup de Communes Lispers ont avec Clojure quand ils vérifient d'abord c'est son manque de Queue Appel d'Optimisation, ce qui n'est pas possible sur la JVM.
Pour idiomatiques CL code c'est une réécriture.
- CL est impératif, Clojure est plus purement "fonctionnelle".
- La CL est de l'orienté objet (CLOS), Clojure pas (utilise des objets Java et a quelques OO-mécanismes)
- Les identificateurs et la syntaxe sont la plupart du temps différent.
- Structures de données sont différentes.
- CL est la plupart du temps strict (non-paresseux), Clojure utilise de calcul paresseux.
Même le portage de l'infrastructure nécessaire (CLOS, Erreur de Manipulation, cours d'eau) à Clojure peu de sens, puisque Clojure est vraiment une langue différente, avec un autre style de programmation.
Si l'on ne veut pas réécrire le code, il y a par exemple ABCL, qui est un Common Lisp pour la JVM.