34 votes

Porter du code Common Lisp sur Clojure

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?

31voto

Brian Carper Points 40078

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.

8voto

zweiterlinde Points 5984

Je n'ai pas de réponse précise, mais je recommanderais ces ressources:

5voto

Brian Gianforcaro Points 11985

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.

3voto

Rainer Joswig Points 62532

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X