Quel dialecte de Lisp dois-je apprendre? [fermé]


89

Je sais qu'il existe différents dialectes de Lisp. Ayant décidé que l'apprentissage de Lisp serait une nouvelle expérience intellectuelle, j'aimerais savoir quel dialecte Lisp apprendre et pourquoi.

Y en a-t-il un qui est plus populaire que les autres? L'un d'entre eux est-il plus «complet», comme dans, mieux documenté et pris en charge? Quels sont les avantages et les inconvénients de ce dialecte?



J'ai fait une recherche là-dessus avant de poser cette question, mais la nature de la question a évolué au fur et à mesure que je la tapais. Je veillerai à ne pas réinventer la roue.
Humphrey Bogart

Alors, quelle est la différence entre cette question et celle que Greg mentionne ci-dessus?
cjs

2
Je pense que ce qu'il essayait de dire était: lorsque j'ai formulé ma question pour la première fois dans mon esprit, elle était complètement différente de la question actuelle, et regarder les questions dans la recherche associée n'en a pas révélé qui correspondait à ce qu'il voulait demander. Mais au moment où il a tapé la question, elle avait changé et est donc arrivée sur SO dans sa forme actuelle, qui avait été posée précédemment.
J.Polfer

Réponses:


76

Vous souhaitez rechercher un équilibre entre simplicité et propreté, des fonctionnalités attrayantes et une plateforme qui vous permettra d'écrire des logiciels intéressants et utiles (pour vous-même) ainsi que de servir d'outil d'apprentissage. (Ce dernier vous permettra de continuer et d'apprendre beaucoup plus longtemps.) Voici quelques possibilités:

  1. Schème. Probablement le plus propre de tous les dialectes. C'est sans aucun doute la raison pour laquelle The Little Schemer a été traduit de LISP en Scheme. La cinquième spécification standard de Scheme, R5RS , est une merveilleuse éducation en soi; c'est peut-être le plus beau langage et la spécification de bibliothèque que j'ai jamais lu, ainsi que le plus court qui soit raisonnablement complet. La plate-forme PLT Scheme (maintenant Racket) comprend un interpréteur et un compilateur assez décents, est bonne pour les scripts et possède également des outils visuels qui la rendent excellente pour l'apprentissage.

  2. Common Lisp. Probablement la variante la plus portable et la plus complète, c'est probablement ce que vous voulez si vous voulez écrire des choses telles que des logiciels commerciaux. Le standard définit des bibliothèques étendues, et beaucoup d'autres sont disponibles au-delà, il a CLOS , qui vous en apprendra probablement plus sur OO que n'importe quel langage OO, et certains des compilateurs sont très bons. Les inconvénients incluent certaines verrues que Scheme n'a pas (comme avoir un espace de noms séparé pour les variables qui font référence à des fonctions), n'étant pas aussi propre et simple (comme c'est le cas avec tout ce qui a dû avoir les extensions et rendre les compromis nécessaires pour les grandes applications dans le monde réel), ne disposant pas de macros hygiéniques et mettant beaucoup moins l'accent sur la récursivité que Scheme.

  3. Clojure.Cela fonctionne sur la JVM, ce qui peut lui donner une longueur d'avance pour les développeurs Java. Il a quelques verrues (par exemple, vous devez explicitement demander l'optimisation des appels de fin, bien que cela puisse changer un jour si TCO est ajouté à la JVM). Les macros, bien que non hygiéniques, ont certaines fonctionnalités pour vous aider à éviter la capture de variables, de sorte que vous pouvez capturer des variables si vous le souhaitez vraiment, tout en courant moins de risque de le faire accidentellement que dans CL. Vous avez un accès facile à toutes les bibliothèques Java; c'est probablement une bonne chose pour le code du «monde réel», et assez inutile en termes d'apprentissage. Il possède un ensemble de bibliothèques pour les structures de données persistantes et la prise en charge de STM, ce qui le rend très intéressant d'un point de vue simultané; cela en fait probablement votre meilleur pari si vous ' souhaitez en savoir plus sur les nouvelles méthodes de gestion de la programmation simultanée et parallèle. Il semble que Clojure soit aussi utilisable pour les grandes applications de production que Java, dans le sens où il aura la capacité de faire les «trucs moche» que vous faites dans les applications de production que vous préférez ne pas faire et ne pas faire lorsque vous apprenez.

  4. Emacs Lisp. En termes de LISP, ce n'est pas l'un des meilleurs exemples. L'un de ses plus gros défauts est la portée dynamique, mais il y en a beaucoup d'autres. Cependant, si vous êtes un utilisateur d'Emacs, c'est peut-être l'outil le plus puissant que vous puissiez apprendre pour améliorer votre utilisation de l'éditeur. Combien vous apprendrez vraiment en apprenant Emacs Lisp, au-delà de la façon d'étendre Emacs, est pour moi une question ouverte cependant; Je ne sais pas à quelle fréquence des techniques intéressantes telles que les fonctions d'ordre élevé sont réellement utilisées dans Emacs Lisp.

Mise à jour 2018

Cela fait presque une décennie que j'ai écrit cet article et la famille de langages Lisp semble maintenant gagner une place importante dans la conscience générale des programmeurs. Une grande partie de cela semble être liée à Clojure qui est non seulement devenu un dialecte correctement séparé de Lisp à part entière, introduisant nombre de ses propres bonnes idées, mais a également maintenant une version presque identique ciblant JavaScript et a inspiré de nombreux autres Lisps ciblant d'autres plates-formes. Par exemple, Hy cible l'AST et le bytecode CPython, visant d'abord l'interopérabilité avec Python, mais utilisant les idées de Clojure «en cas de doute». (Bien qu'à partir des derniers commits, ces derniers peuvent changer un peu.)

Le grand changement que cela apporte dans votre processus de prise de décision est que vous devriez également examiner tous les langages Lisps ou de type Lisp disponibles et interagir avec les langages ou plates-formes que vous utilisez déjà, que ce soit Perl , Ruby , Erlang , Go ou même C ++ sur les microcontrôleurs .


3
Avoir des espaces de noms séparés n'est pas une verrue, c'est juste une décision de conception différente. Gardez à l'esprit qu'il existe déjà plusieurs autres espaces de noms également dans Scheme, donc le débat est plutôt Lisp-5 contre Lisp-6. Outre la commodité que je peux appeler une liste "liste" et une voiture "voiture" en CL, son système de macros est tellement plus pratique et utile, car le compilateur ne confond pas les choses si facilement.
Svante

Clojure n'a pas d'optimisation des appels de fin, et il ne le peut pas, car le bytecode JVM ne le prend pas en charge. Tout ce qu'il a, c'est une forme spéciale "récurrente" qui récurent automatiquement la fonction courante.
Svante

3
Curt: Je dirais que Clojure est le plus portable car il fonctionne sur la machine virtuelle Java.
justinhj

1
Je ne sais pas à ce sujet; si vous excluez les petits périphériques intégrés (tels que les téléphones et les cartes à puce) où vous n'allez pas exécuter de toute façon un programme de bureau / serveur non modifié, elisp fonctionne certainement sur beaucoup plus de processeurs et de plates-formes que la JVM.
cjs

1
Je suis fortement en désaccord. La récursivité a tendance à produire du code a) plus pur, b) plus facile à vérifier, c) plus susceptible d'être correct. Plus en détail: a) il a moins tendance à toucher moins de variables en dehors de la fonction; b) une preuve inductive a tendance à sortir naturellement de la fonction récursive, alors qu'avec les boucles, vous devez vérifier les invariants de boucle, etc. c) la fiabilité vient de a) et que vous avez tendance à être poussé à coder d'une manière qui vous oblige naturellement (peut-être de manière informelle) à faire la preuve inductive de b).
cjs

22

Je dirais Scheme, uniquement à cause du Little Schemer , qui est l'un des livres les plus amusants mais extrêmement difficiles que j'ai jamais essayé de lire.


15
N'oubliez pas le SICP! mitpress.mit.edu/sicp . Ceci est une lecture classique.
Joris Timmermans

7
Il y avait deux ou trois éditions de The Little Lisper avant que The Little Schemer ne paraisse comme une traduction de celles-ci.
cjs

9

Je peux recommander Common Lisp sur SBCL . Cette combinaison est rapide, puissante, mature et bien documentée.


8

Clojure gagne également beaucoup d'esprit de nos jours, et pour une bonne raison. Excellentes structures de données, prise en charge de la concurrence profondément bonne (fait honte à Scheme et CL à cet égard) et une grande communauté. C'est aussi relativement simple, CL est au moins aussi compliqué que C ++.

Cela ne veut pas dire que je n'aime pas CL ou Scheme. J'ai appris Scheme avec SICP. Et CL m'a amené à Clojure. Tout dépend de vos objectifs, je suppose. Si vous voulez apprendre un Lisp extrêmement pratique, optez pour Clojure. Sinon CL ou Scheme sont tous les deux excellents.


Cela semble impliquer que ni CL ni Scheme ne sont "immensément pratiques", alors qu'ils sont tout à fait pratiques en fait. En particulier, la norme CL est née de considérations pratiques.
Leslie P. Polzer

2
Le paysage du langage de programmation a changé depuis 1994, je ne sais pas comment le standard CL va changer / évoluer pour s'adapter à ce qui a été appris depuis lors. Le monde avance et pour autant que je sache, CL reste immobile. J'aime CL, Clojure a du chemin à parcourir pour approcher sa puissance, mais je ne vois pas comment CL va évoluer - si vous allez utiliser un langage standardisé, un chemin d'évolution doit être apparent. Sans cela, une langue n'est probablement pas un choix pratique.
dnolen

4
CL a évolué et évolue à travers de nombreuses bibliothèques très utiles. La langue de base était déjà plus puissante en 1994 que toutes les langues «modernes» d'aujourd'hui.
Svante

5

Je préfère CL, car j'aime la programmation orientée objet, et CLOS est le plus beau système d'objets qui soit.


5
En parlant de CL, je recommanderais ClozureCL ou SBCL. Les deux sont open source, bien documentés, matures, multi-plateformes et fournissent des fonctionnalités non standard essentielles telles que le multithreading.
Daniel Dickison

5

J'ai appris Scheme à l'école. Ce fut une excellente expérience d'apprentissage et je n'oublierai jamais les principes fondamentaux de la programmation fonctionnelle. La version de LISP que vous choisissez n'a probablement pas d'importance, tant que vous comprenez le cœur de son utilité - le calcul lambda sans état.

Voici un article intéressant sur Pourquoi le MIT est passé de Scheme à Python dans son cours d'introduction à la programmation.


3

Je dirais tous, du moins au début. Finalement, vous développerez probablement une préférence pour Scheme ou Common Lisp, mais ils ont tous les deux suffisamment de différences pour qu'il soit préférable de maîtriser tout ce qui existe.

Scheme a des continuations par exemple, et il est bon d'en apprendre davantage sur celles de Scheme, même si elles peuvent être implémentées en Common Lisp.

Apprendre la différence entre la portée lexicale et dynamique est important, et si vous apprenez à la fois Common Lisp et elisp, vous rencontrerez les implications des deux.


0

LFE (Lisp Flavored Erlang) serait bien. Vous pouvez avoir la syntaxe lisp au-dessus de la VM Erlang.


0

C'était une sorte de question «chargée» au départ, mais OP ne le savait probablement pas. Généralement, les lispers Common et Scheme sont comme les "gens" PC et Apple, ils ne se mélangent pas. Lequel est le meilleur n'est probablement pas aussi pertinent que celui "qui fonctionne" pour vous. Vraiment, il n'y a pas tellement de différence. Une préférence pour l'un par rapport à l'autre peut probablement être influencée par celui que vous apprenez en premier. (Pour moi, une liste vide devrait être "rien", connu en CL sous le nom de NIL, et cela fait de moi un Common Lisper.) J'aime l'intégration de SBCL avec Slime en utilisant EMACS, mais SBCL n'est pas pour tout le monde. D'une part, SBCL est très stricte. Si vous voulez juste "vous amuser", le clisp GNU est facile et disponible pour pratiquement toutes les plates-formes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.