2012-06-27 2 views
85

Je sais que ce sont des dialectes de la même famille de langage appelés 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 caractéristiques et les ressources.Quelles sont les différences entre Clojure, Scheme/Racket et Common Lisp?

+0

Je demande un aperçu plus général des différences parce que je suis tombé comme cette question peut être utile pour beaucoup d'autres personnes, désolé si cela semble abusif. – MaiaVictor

+3

Mauvais site. stackoverflow est le meilleur pour les vraies questions de programmation que vous avez. Voir la FAQ: http://stackoverflow.com/faq#questions –

+2

Je suis toujours confus à propos de quel poste devrait aller où. C'est une discussion sur les outils, alors est-ce une question ici ou pour les programmeurs? Logiquement, je dirais de le déplacer vers des programmeurs, parce qu'il ne demande pas de résoudre un problème particulier, mais c'est un bon poste avec une bonne réponse à mon humble avis. – octopusgrabbus

Répondre

79

Ils ont beaucoup en commun:

  • Les langages dynamiques
  • Strongly typed
  • Compilé
  • syntaxe de style Lisp, à savoir le code est écrit en tant que structures de données Lisp (formulaires) avec le modèle le plus courant étant des appels de fonction comme: (function-name arg1 arg2)
  • Des systèmes de macro 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é pour ei). Ther « étendre le langage » avec une nouvelle syntaxe ou créer DSLs)
  • Souvent utilisé dans le style de programmation fonctionnelle, bien que la capacité d'accueillir d'autres paradigmes
  • L'accent dans le développement interactif avec un REPL (à savoir vous développez de manière interactive dans une instance en cours d'exécution du code)

Particularités du Lisp

Clojure traits distinctifs:

  • plus grand écosystème de la bibliothèque, puisque vous pouvez utiliser directement les bibliothèques Java
  • vecteurs [] et cartes {} utilisées en standard en plus des listes standard () - en plus de la usefullness générale des vecteurs et des cartes certains croient que cela est une innovation qui rend généralement plus lisible
  • davantage l'accent sur l'immuabilité et la programmation fonctionnelle paresseuse, peu inspiré par Haskell
  • capacités d'accès concurrentiel forts pris en charge par le logiciel transactionnel mémoire au niveau de la langue (la peine de regarder: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey)

Scheme Particularités:

  • On peut dire que 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 des symboles accidentels dans l'expansion macro
+7

c'est bon, mais peut-être vous devriez mentionner que la raquette est plus que "juste" schéma; C'est un système qui supporte plusieurs langues (mais liées) (vous pouvez même définir les vôtres). aussi, clojure a diverses 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, qui supporte les raquettes. –

+0

hmmm. Je pense que je me trompe sur r6rs supportant oo, désolé. –

+0

Aucun r6rs n'est pris en charge. – soegaard

30

Ne pas oublier les différences Lisp-1 et Lisp-2. 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.Common Lisp est Lisp-2:
La fonction et les variables ont des espaces de noms différents (en fait, CL a plusieurs espaces de noms).

44

Les personnes ci-dessus manqué quelques choses

  1. Common Lisp a des vecteurs et des tables de hachage ainsi. 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 lecteur, qui vous permettent d'utiliser de nouvelles parenthèses (tout comme Racket, un descendant de Scheme).

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

  4. Toutes les langues sont soit des projets de rénovation moderne, ou vaste. Common Lisp a obtenu de vastes bibliothèques au cours des cinq dernières années (principalement grâce à Quicklisp), Scheme a quelques implémentations modernes (Racket, Poulet, Chez Scheme, etc.), et Clojure a été créé relativement récemment. système OO intégré, bien qu'il soit assez différent des autres systèmes OO que vous pourriez avoir utilisé. Notamment, il n'est pas imposé - vous n'avez avoir pour écrire du code OO.

  5. 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. 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 minime et élégant, Common Lisp d'être puissant et paradigm-agnostique (fonctionnel, OO, peu importe), et Clojure de favoriser la programmation fonctionnelle.

+3

La raquette n'est * pas * une implémentation de Scheme, sauf les modes de compatibilité. Voir http://stackoverflow.com/questions/3345397 – bug

+0

Clojure n'a * pas * de macros hygiéniques, comme je l'ai trouvé à la dure. – pyon

1

Gimp est écrit dans le schéma :)

En fait allot de logiciels certaines personnes pensent peut-être écrit en C++ a probablement été fait sous l'égide Lisp, il est difficile de choisir les pommes d'or de la bouquet. Le fait est que C++ n'était pas toujours populaire, il semble seulement être populaire aujourd'hui en raison d'un historique de mises à jour. Pour la seconde moitié du siècle, C++ n'utilisait même pas le multithreading, mais Python est aujourd'hui un cloaque de code de colle buggy non testé et inutile. Fasterforward un peu 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, ce qui était sa seule intention, sauf qu'il n'a jamais vraiment compris. Je pense que Clojure fait quelque chose de similaire, ce qui signifiait simplifier Scheme pour la JVM rien de plus. C'est juste comme tous les autres langages JVM juste là pour gonfler l'expérience de l'utilisateur, seulement pour simplifier l'écriture de passe-partout en Java.

+0

"destiné à simplifier Scheme pour la JVM rien de plus" "comme tous les autres langages JVM" Ouais, à droite. – oskarkv

Questions connexes