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?
Réponses:
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:
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.
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.
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.
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 .
la source
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.
la source
Je peux recommander Common Lisp sur SBCL . Cette combinaison est rapide, puissante, mature et bien documentée.
la source
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.
la source
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.
la source
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.
la source
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.
la source
LFE (Lisp Flavored Erlang) serait bien. Vous pouvez avoir la syntaxe lisp au-dessus de la VM Erlang.
la source
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.
la source