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

120

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.

MaiaVictor
la source
3
Je demande un aperçu plus général des différences parce que je pense que cette question peut être utile pour beaucoup d'autres personnes, désolé si cela semble abusif.
MaiaVictor
4
Je ne sais toujours pas quel message doit aller où. C'est une discussion sur les outils, alors est-ce une question pour ici ou pour les programmeurs? Logiquement, je dirais de le déplacer vers les programmeurs, car il ne demande pas de résoudre un problème particulier, mais c'est un bon message avec une bonne réponse à mon humble avis.
octopusgrabbus
1
@octopusgrabbus: la question est beaucoup trop large. La comparaison de trois langages de programmation sur «la syntaxe, les caractéristiques, les fonctionnalités et les ressources» peut facilement remplir un livre ou un site Web. Stackoverflow est destiné aux personnes qui ont des problèmes de programmation, ce n'est pas une encyclopédie (Wikipedia), ce n'est pas un forum de discussion générale (Usenet), ce n'est pas un site de comparaison de langues ( rosettacode.org ). Il est préférable pour un problème de programmation réel où la question a du code et les réponses ont aussi du code. De plus: ne créez pas de problèmes simplement parce que quelqu'un s'ennuie ou que c'est un passe-temps.
Rainer Joswig
3
Ce n'est pas parce que la question est large qu'elle n'a pas sa place ici. C'est une question parfaitement claire , et c'est certainement une "vraie question de programmation". StackOverflow est principalement destiné à être une ressource communautaire [googleable] pour partager des connaissances sur la programmation via le format Q&R.
Dan Burton
@RainerJoswig, je pourrais simplement écrire tout ce que j'ai appris sur ces langues ces derniers jours, je les étudie, mais cela ferait un gros fil. C'est vraiment mauvais quand vous réalisez que les gens vont chercher ce genre de phrase courte sur Google et ne pourront pas obtenir la réponse parce qu'un gros texte les empêche de comprendre rapidement ce qui est demandé. Faire de cette façon garantit que beaucoup plus de personnes seront aidées par une bonne réponse.
MaiaVictor

Réponses:

103

Ils ont tous beaucoup en commun:

  • Langages dynamiques
  • Fortement typé
  • 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 macros puissants qui vous permettent de traiter le code comme des données et de générer du code arbitraire à l'exécution (souvent utilisés pour "étendre le langage" avec une nouvelle syntaxe ou pour créer des DSL)
  • Souvent utilisé dans le style de programmation fonctionnelle, 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 de Common 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és en standard en plus des listes standard ()- en plus de l'utilité générale des vecteurs et des cartes, certains pensent qu'il s'agit d'une innovation qui rend généralement plus lisible
  • Accent accru sur l'immuabilité et la programmation fonctionnelle paresseuse, quelque peu inspiré par Haskell
  • Fortes capacités de concurrence 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 schéma:

  • Sans doute le plus simple et le plus facile à apprendre Lisp
  • Macros hygiéniques (voir http://en.wikipedia.org/wiki/Hygienic_macro ) - évite élégamment les problèmes de capture accidentelle de symboles dans les extensions de macro
Mikera
la source
11
c'est bien, mais peut-être devriez-vous mentionner que la raquette est plus qu'un simple schéma; c'est un système qui prend en charge plusieurs langues (mais liées) (vous pouvez même définir la vôtre). De plus, clojure a différentes façons de faire de la programmation de type oo (à la fois une approche de répartition multiple vaguement similaire à clos et quelque chose de plus proche de java qui est plus efficace sur le jvm). et le schéma se dirige vers des bibliothèques plus standard (qui incluent également oo) avec r6rs, que la raquette prend en charge.
andrew cooke
2
«Un langage dynamique fortement typé» est le marketing. En ce sens, même Python est fortement typé.
ron
16
@ron: Python est fortement typé, tout comme Lisp (contrairement à Javascript ou VB). Vous pensez plutôt "typage statique" vs "typage dynamique", voir en.wikipedia.org/wiki/Type_system pour toutes les variétés. Mais oui, c'est du marketing
Nas Banov
2
Je pense également que Racket serait bon d'être ajouté à cette réponse. Je pense que Racket est encore plus facile à apprendre que Scheme en raison de la communauté et de l'orientation de la langue. Racket (anciennement appelé PLT Scheme) est un langage de programmation multi-paradigmes à usage général de la famille Lisp / Scheme. L'un de ses objectifs de conception est de servir de plate-forme pour la création, la conception et la mise en œuvre du langage.
mtelesha
Clojure a des macros hygiéniques. Plus d'infos ici: xivilization.net/~marek/blog/2013/09/17/…
Christopher Kuttruff
50

Les personnes ci-dessus ont raté quelques choses

  1. Common Lisp 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. Common Lisp a des macros de lecture, qui vous permettent d'utiliser de nouveaux crochets (comme le fait Racket, un descendant de Scheme).

  3. Scheme et Clojure ont des macros hygiéniques, par opposition aux macros non hygiéniques de Common Lisp

  4. Toutes les langues sont soit modernes, soit ont de vastes projets de rénovation. Common Lisp 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. Common Lisp a un système OO intégré, bien qu'il soit assez différent des autres systèmes OO que vous pourriez avoir utilisés. Il est notamment pas appliquée - vous n'avez à écrire du code OO.

  6. Les langages ont des philosophies de conception quelque peu différentes. Scheme a été conçu comme un dialecte minimal pour comprendre le modèle d'acteur; il a ensuite été utilisé pour la pédagogie. Common Lisp a été conçu pour unifier la myriade de dialectes Lisp qui ont 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 indépendant du paradigme (fonctionnel, OO, peu importe), et Clojure de favoriser la programmation fonctionnelle.

Cosman246
la source
4
La raquette n'est pas une implémentation de Scheme, à l'exception des modes de compatibilité. Voir stackoverflow.com/questions/3345397
bug du
Clojure n'a pas de macros hygiéniques, comme je l'ai trouvé à la dure.
pyon du
40

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

Scheme et Clojure sont Lisp-1:
cela signifie que les noms de variables et de fonctions résident dans le même espace de noms.

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

Paul
la source
-4

Gimp est écrit en Scheme :)

En fait, certains logiciels pensent que certains logiciels pourraient être écrits en C ++ a probablement été fait sous l'égide de Lisp, il est difficile de choisir les pommes d'or du groupe. Le fait est que le C ++ n'a pas toujours été populaire, il ne semble l'être qu'aujourd'hui en raison de l'historique des mises à jour. Pendant la moitié du siècle, le C ++ n'a même pas utilisé le multithreading, c'est là que Python est aujourd'hui un cloaque de code buggy glue inutile et non testé. Avancez un peu plus vite et maintenant nous assistons à une augmentation de la programmation fonctionnelle, c'est plus comme adapter ou mourir. Je pense que Java a raison en ce qui concerne la partie adaptation.

Scheme a été conçu pour simplifier le langage Lisp, c'était sa seule intention sauf qu'il n'a jamais vraiment pris de l'ampleur. Je pense que Clojure fait quelque chose de similaire, c'est-à-dire de simplifier Scheme pour la JVM, rien de plus. C'est comme tous les autres langages JVM juste là pour gonfler l'expérience utilisateur, uniquement pour simplifier l'écriture standard dans Java Land.

Meeple
la source
2
"destiné à simplifier le schéma pour la JVM rien de plus" "comme tout autre langage JVM" Ouais, c'est vrai.
oskarkv
4
Gimp est écrit en C et prend en charge Scheme, Python et Perl en tant que langages de script.
lbalazscs