web-dev-qa-db-fra.com

Quelles sont les différences entre Clojure, Scheme / Racket et Common Lisp?

Je sais que ce sont des dialectes de la même famille de langues appelée LISP, mais quelles sont exactement les différences? Pourriez-vous donner un aperçu, si possible, couvrant des sujets tels que la syntaxe, les caractéristiques, les fonctionnalités et les ressources.

111
MaiaVictor

Ils ont tous beaucoup en commun:

  • Langages dynamiques
  • Fortement tapé
  • Compilé
  • Syntaxe de style LISP, c'est-à-dire que le code est écrit sous forme de structures de données LISP (formulaires) avec le modèle le plus courant étant des appels de fonction comme: (function-name arg1 arg2)
  • Systèmes de macro puissants qui vous permettent de traiter le code comme des données et de générer du code arbitraire lors de l'exécution (souvent utilisé pour "étendre le langage" avec une nouvelle syntaxe ou créer des DSL)
  • Souvent utilisé dans un style de programmation fonctionnel, bien qu'il ait la capacité de s'adapter à d'autres paradigmes
  • Accent sur le développement interactif avec un REPL (c'est-à-dire que vous développez de manière interactive dans une instance en cours d'exécution du code)

Caractéristiques distinctives communes de LISP:

Caractéristiques distinctives de Clojure:

  • Le plus grand écosystème de bibliothèques, car vous pouvez utiliser directement toutes les bibliothèques Java
  • Vecteurs [] et cartes {} utilisé en standard en plus des listes standard () - en plus de l'utilité générale des vecteurs et des cartes, certains pensent que c'est une innovation qui rend généralement plus lisible
  • Accent accru sur l'immuabilité et la programmation fonctionnelle paresseuse, quelque peu inspiré par Haskell
  • Capacités de concurrence fortes prises en charge par la mémoire transactionnelle logicielle au niveau de la langue (à regarder: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

Caractéristiques distinctives du régime:

  • Sans doute le plus simple et le plus facile à apprendre LISP
  • Macros hygiéniques (voir http://en.wikipedia.org/wiki/Hygienic_macro ) - évite avec élégance les problèmes de capture accidentelle de symboles dans les extensions de macro
94
mikera

Les gens ci-dessus ont raté quelques choses

  1. LISP commun a également des vecteurs et des tables de hachage. La différence est que Common LISP utilise # () pour les vecteurs et aucune syntaxe pour les tables de hachage. Le schéma a des vecteurs, je crois

  2. LISP commun a des macros de lecture, qui vous permettent d'utiliser de nouveaux supports (tout comme Racket, un descendant de Scheme).

  3. Scheme et Clojure ont des macros hygiéniques, par opposition à celles non hygiéniques de LISP commun

  4. Toutes les langues sont modernes ou ont de vastes projets de rénovation. LISP commun a obtenu de vastes bibliothèques au cours des cinq dernières années (grâce principalement à Quicklisp), Scheme a des implémentations modernes (Racket, Chicken, Chez Scheme, etc.), et Clojure a été créé relativement récemment

  5. LISP commun a un système OO intégré, bien qu'il soit assez différent des autres systèmes OO que vous auriez pu utiliser. Notamment, il n'est pas appliqué - vous ne pas avoir pour écrire OO code.

  6. Les langues ont des philosophies de conception quelque peu différentes. Le schéma a été conçu comme un dialecte minimal pour comprendre le modèle d'acteur; il est devenu plus tard utilisé pour la pédagogie. LISP commun a été conçu pour unifier la myriade de dialectes LISP qui avaient vu le jour. Clojure a été conçu pour la simultanéité. En conséquence, Scheme a la réputation d'être minimal et élégant, Common LISP d'être puissant et indépendant du paradigme (fonctionnel, OO, peu importe), et Clojure de favoriser la programmation fonctionnelle.

47
Cosman246

N'oubliez pas les différences LISP-1 et LISP-2.

Le schéma et Clojure sont LISP-1:
Cela signifie que les noms de variables et de fonctions résident dans le même espace de noms.

LISP commun est LISP-2:
La fonction et les variables ont des espaces de noms différents (en fait, CL a de nombreux espaces de noms).

36
paul