Je sais qu'il s'agit de dialectes de la même famille de langage appelée lisp, mais quelles sont exactement les différences ? Pourriez-vous me donner un aperçu, si possible, en couvrant des sujets tels que la syntaxe, les caractéristiques, les fonctionnalités et les ressources.
Réponses
Trop de publicités?Ils ont tous beaucoup de choses en commun :
- Langues dynamiques
- Fortement typé
- Compilé
- Syntaxe de style Lisp, c'est-à-dire que le code est écrit comme des structures de données Lisp (formes), le modèle le plus courant étant les appels de fonctions du type :
(function-name arg1 arg2)
- Des systèmes de macro puissants qui permettent de traiter le code comme des données et de générer du code arbitraire au moment de l'exécution (souvent utilisés pour "étendre le langage" avec une nouvelle syntaxe ou créer des DSL).
- Souvent utilisés dans le style de programmation fonctionnelle, bien qu'ils puissent s'adapter à d'autres paradigmes.
- Accent mis sur le développement interactif avec un REPL (c'est-à-dire que vous développez de manière interactive dans une instance du code en cours d'exécution).
Les caractéristiques distinctives de Common Lisp :
- Un puissant sous-système OOP ( Système d'objets Common Lisp )
- Probablement le meilleur compilateur (Common Lisp est le Lisp le plus rapide selon http://shootout.alioth.debian.org/u64q/which-programming-languages-are-fastest.php bien qu'il n'y ait pas grand-chose dedans.....)
Les caractéristiques distinctives de Clojure :
- Le plus grand écosystème de bibliothèques, puisque vous pouvez utiliser directement toutes les bibliothèques Java.
- Vecteurs
[]
et des cartes{}
utilisé comme norme en plus des listes standard()
- outre l'utilité générale des vecteurs et des cartes, certains pensent qu'il s'agit d'une innovation qui rend la lecture générale plus aisée. - Une plus grande importance accordée à l'immuabilité et à la programmation fonctionnelle paresseuse, quelque peu inspirée par Haskell.
- De fortes capacités de concurrence soutenues par une mémoire transactionnelle logicielle au niveau du langage (à surveiller) : http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )
Caractéristiques distinctives du système :
- Sans doute le Lisp le plus simple et le plus facile à apprendre.
- Les macros hygiéniques (voir http://en.wikipedia.org/wiki/Hygienic_macro ) - évite de manière élégante les problèmes de capture accidentelle de symboles dans les expansions de macro.
Les personnes ci-dessus ont oublié quelques éléments
-
Common Lisp possède é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. Scheme possède des vecteurs, je crois
-
Common Lisp possède des macros de lecteur, qui vous permettent d'utiliser de nouvelles parenthèses (tout comme Racket, un descendant de Scheme).
-
Scheme et Clojure ont des macros hygiéniques, par opposition aux macros non hygiéniques de Common Lisp.
-
Toutes les langues sont modernes ou font l'objet de vastes projets de rénovation. Common Lisp s'est doté de bibliothèques étendues au cours des cinq dernières années (principalement grâce à Quicklisp), Scheme dispose de quelques implémentations modernes (Racket, Chicken, Chez Scheme, etc.) et Clojure a été créé relativement récemment.
-
Common Lisp possède un système OO intégré, bien qu'il soit assez différent des autres systèmes OO que vous avez pu utiliser. Notamment, il n'est pas appliqué - on ne peut pas ont pour écrire du code OO.
-
Ces langages ont des philosophies de conception quelque peu différentes. Scheme a été conçu comme un dialecte minimal pour comprendre le modèle de l'acteur ; il a ensuite été utilisé pour la pédagogie. Common Lisp a été conçu pour unifier la myriade de dialectes Lisp qui avaient vu le jour. Clojure a été conçu pour la concurrence. En conséquence, Scheme a la réputation d'être minimal et élégant, Common Lisp d'être puissant et agnostique en termes de paradigme (fonctionnel, OO, peu importe), et Clojure de favoriser la programmation fonctionnelle.
N'oubliez pas les différences entre Lisp-1 et Lisp-2.
Scheme et clojure sont des Lisp-1. Cela signifie que les noms des variables et des fonctions résident dans le même espace de noms.
Common Lisp est Lisp-2 ; les fonctions et les variables ont des espaces de noms différents (en fait, CL a de nombreux espaces de noms).