89 votes

Clojure vs autres Lisps

Le but de ma question est de ne pas commencer une guerre de flammes, mais plutôt de déterminer dans quelles circonstances chaque langue est "le meilleur outil pour le travail."

J'ai lu plusieurs livres sur Clojure (Programmation Clojure, Pratique Clojure, La Joie de Clojure, et les effectifs Accès anticipé édition de Clojure en Action), et je pense que c'est un fantastique langue. Je suis en train de lire le Laisser Sur Lambda qui concernent principalement la Common Lisp macros, et, elle aussi, est très intéressant de langue.

Je suis pas un Lisp expert (plus d'un débutant), mais cette famille de langues qui me fascine, tout comme la programmation fonctionnelle, en général.

Avantages de Clojure (et les inconvénients des "autres"):

  • Tourne sur la JVM.

    • La JVM est une très stable, de haute performance de l'environnement en langue assez bien satisfait du Soleil, rêve de "Écrire une fois, exécuter presque n'importe où". Je peux écrire le code sur mon Macbook Pro, les compiler dans un fichier JAR exécutable, et ensuite l'exécuter sur Linux et Microsoft Windows, avec peu de tests supplémentaires.

    • L' (Hotspot, et d'autres) de la JVM supporte la haute qualité de la collecte des ordures et très performant juste-à-temps de compilation et d'optimisation. Où il y a quelques années, j'ai écrit tout ce qui avait une course rapide en C, maintenant je n'hésite pas à le faire en Java.

    • Standard, simple, multithreading modèle. Ne Common Lisp ont un niveau de multithreading paquet?

    • Rompt la monotonie de toutes ces parenthèses avec [], {}, et #{}, bien que la Common Lisp experts vont probablement me dire qu'avec lecteur de macros, vous pouvez les ajouter à la CL.

Les inconvénients de Clojure:

  • Tourne sur la JVM.
    • Pas de récursion sur la queue ou les suites. Ne Common Lisp soutenir les suites? Schéma nécessite la prise en charge pour les deux, je crois.

Avantages des Autres (Common Lisp, en particulier) (et les inconvénients de Clojure):

  • Définissables par l'utilisateur, lecteur de macros.

  • D'autres avantages?

Pensées? D'autres différences?

48voto

mikera Points 63056

Ma liste personnelle de raisons de préférer Clojure à d'autres Lisps (p.s. Je pense toujours que tous les Lisps sont grands!):

  • Tourne sur la JVM - d'où obtient un accès automatique à la fantastique d'ingénierie dans la JVM elle-même (avancée de la collecte des ordures algorithmes, HotSpot JIT optimisation etc.)

  • Très bon Java interopérabilité, ce qui assure la compatibilité avec la vaste gamme de bibliothèques Java/JVM langue de l'écosystème. J'ai utilisé Clojure comme une "colle" langue de connecter les différentes bibliothèques Java avec un bon effet. Comme je l'ai également de développer beaucoup de code Java, il est utile pour moi qui Clojure s'intègre bien avec l'outillage Java (par exemple, j'utilise Maven, Eclipse avec des aiguilles plugin pour mon Clojure développement)

  • Belle syntaxe pour les vecteurs [1 2 3], des cartes {:bob 10, :jane 15} et définit #{"a", "b", "c"} - je considérer ces jolies outils essentiels pour la programmation moderne (en plus des listes de cours!)

  • Personnellement, j'aime l'utilisation de crochets pour la liaison formes: par exemple, (defn foo [a b] (+ a b)) - je pense que ça rend le code un peu plus clair à lire.

  • L'accent sur les paresseux, la programmation fonctionnelle avec persistants, immuable structures de données - en particulier à tous les Clojure bibliothèque est conçue pour soutenir ce par défaut

  • Excellent STM mise en œuvre pour le multi-core de la simultanéité. Je crois Clojure est le meilleur de la simultanéité histoire d'une langue à l'instant (voir cette vidéo pour plus d'élaboration par Rich Hickey lui-même)

  • C'est un Lisp-1 (comme le Schéma), que je préfère personnellement (je pense que dans un langage fonctionnel il est logique de garder les fonctions et les données dans le même espace de noms)

24voto

Charlie Flowers Points 9145

Une différence importante entre Clojure et Common Lisp est que Clojure est plus normatif sur la programmation fonctionnelle. Clojure de la philosophie, des expressions idiomatiques, et à un certain degré, de la langue/les bibliothèques de fortement encourager et parfois insister pour que vous programme de façon fonctionnelle (pas d'effets secondaires, pas de mutable état).

Common Lisp certainement prend en charge la programmation fonctionnelle, mais elle permet aussi mutable état et de la programmation impérative.

Bien sûr, il y a un certain nombre d'avantages de la programmation fonctionnelle dans le domaine de la simultanéité et de l'autre. Mais toutes choses étant égales par ailleurs, il est également bon d'avoir le choix de l'approche que vous souhaitez utiliser pour chaque situation. Clojure ne pas interdire complètement la programmation impérative, mais il est moins accommodante de ce style de Common Lisp.

24voto

Rainer Joswig Points 62532

Gardez à l'esprit que Clojure est un langage et une mise en œuvre (généralement sur la JVM). Common Lisp est un langage avec plus de dix différentes implémentations. Nous avons donc une catégorie d'incompatibilité de droit ici. Vous pouvez par exemple comparer Clojure avec SBCL.

En général:

  • une version de Common Lisp tourne sur la JVM: ABCL

  • la plupart des autres Common Lisp mise en œuvre n'est pas

  • la plupart des CL implémentations ont des capacités multitâches, une bibliothèque fournit une interface commune

  • Common Lisp a la syntaxe pour les tableaux. La syntaxe pour d'autres types de données peuvent être écrites par l'utilisateur et sont fournis par les différentes bibliothèques.

  • Common Lisp ne prend en charge ni la queue d'appel d'optimisation, ni les suites. Les implémentations de fournir TCO et les bibliothèques fournissent une certaine forme de continuations.

10voto

Daniil Points 362

Voici une bonne vidéo avec une comparaison de Schéma (Raquette pour la plupart) et Clojure.

Pour être juste, la Raquette a la syntaxe de sucre (lecteur supplémentaire stuff) pour les types de données (#hash, #, crochets, etc.)

De Plus, Clojure qu'une seule façon de faire une bonne queue appel est d'utiliser recur, c'est le revers de la médaille de la compilation de la JVM.

Notez que recur est le seul non-pile-consommer construction de boucle en Clojure. Il n'y a pas de queue-appel l'optimisation et l'utilisation de l'auto-appels pour le bouclage de l'inconnu limites est découragé. recur est fonctionnelle et son utilisation dans la queue-position est vérifié par le compilateur. (Formes Spéciales).

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