URL: https://linuxfr.org/users/dzecniv/journaux/decouvrons-common-lisp-comparaison-avec-l-environnement-python Title: Découvrons Common Lisp. Comparaison avec l'environnement Python. Authors: dzecniv Date: 2017年02月01日T01:50:14+01:00 License: CC By-SA Tags: lisp, common_lisp, développeur, développement, python, guix et guile Score: 30 Salut journal, Je suis de plus en plus frustré par le langage Python, et comme j'aime bien le Emacs Lisp, à la fois le langage et l'environnement de développement, j'ai retenté le coup avec Common Lisp. C'était assez frustrant mais j'ai pris quelques notes qui pourraient servir aux suivants, d'où ce journal (ça fait un paquet d'années qu'on n'a pas parlé de Common Lisp par ici, ni d'aucun Lisp d'ailleurs même ceux à succès comme Clojure (et à part Guix et Guile)). Pour ci-dessous: je suis toujours un noob hein. ## Introduction ### Impressions générales Mes impressions après quelques semaines: - la documentation remontée par google est vieille et moche mais il y a mieux, je vous donne les liens, - le langage a plein de bizarreries mais plein de projets sont là pour les réparer ([cl21](http://cl21.org/) et autres bibliothèques), - l'écosystème est moderne (gestionnaire de paquets, frameworks web, libs pour des trucs modernes), mais il reste des lacunes, - ça bouge. ### Deux liens pour commencer Je n'ai pas découvert ce site de suite, or c'est pour moi de loin le meilleur: présentation du langage, exemples à succès, tutoriaux concis, modernes et clairs, liste de bibliothèques recommandées, sous github, j'ai nommé: - http://lisp-lang.org/ (saviez-vous que CL est plus rapide que NodeJS ?) (petite leçon: je n'avais qu'à cliquer sur *tous* les liens donnés dans [/r/common_lisp](https://www.reddit.com/r/Common_Lisp/)) L'auteur était timide et ne l'avait pas publié «officiellement» mais son soft est super: Portacle, un environnement de développement portable et multiplateforme qui fournit Emacs, l'interface Slime, une implémentation de Common Lisp, Quicklisp le gestionnaire de paquets, et Git. Le plus simple pour tester maintenant, tout de suite, sans installation: - https://shinmera.github.io/portacle/ ### Pourquoi (Common) Lisp ? Vite fait, ce qui m'intéresse: - langage extensible, toujours avec la même syntaxe. Je veux des pipes, du pattern matching, du typage statique, de l'async, plus d'orienté objet, du message passing (Erlang/Elixir),... ? Ok, j'installe une lib, je n'attends pas que le langage évolue via des PEP et des nouvelles versions non rétro-compatibles. Voyez comment [Hy a backporté "yield from" vers Python2](http://dustycloud.org/blog/how-hy-backported-yield-from-to-python2/). C'était possible car Hy est un lisp (un lisp qui transpile en Python). - je veux [débugger en direct du code qui tourne dans l'espace](http://www.gigamonkeys.com/book/lather-rinse-repeat-a-tour-of-the-repl.html) (dernier paragraphe). Pourquoi pas... - Clojure ? Ça a l'air génial, mais pas de stacktraces de 2km de long avec 50 projets java pour moi, merci... - Scheme ? Racket ? Je ne vois pas des trucs de fous sur reddit, je ne vois pas de liste "Awesome Racket", la communauté a l'air encore plus petite, les macros [ont l'air moins puissantes et plus verbeuses à définir](https://www.quora.com/Should-I-learn-Common-Lisp-if-I-know-Scheme-Racket). - Guile ? Le langage d'extension officiel de GNU, utilisé entre autres pour étendre the Gimp, utilisé par Guix. Oui, j'aimerais bien, mais la communauté et l'écosystème est encore plus minus... - Hy ? Je souhaite changer d'environnement. - Elixir ? Je devrais !!! Plus fonctionnel, avec des macros à la lisp... oui, je devrais sûrement, mais voilà j'aime les parenthèses qui sont une syntaxe claire et sont je trouve expressives: ce bloc de parenthèses, c'est un bloc qui va ensemble, que je peux évaluer. (et puis, la dernière fois je n'ai pas vraiment trouvé les libs dont j'avais besoin). - LFE, Joxa (pour du Erlang) ? Pourquoi pas. ### Python, un sous-ensemble de Lisp Lisp a de l'orienté objet plus évolué. On peut créer des méthodes génériques par exemple. Je cherche des explications de Julien Danjou que je ne retrouve pas :] Avec Python on peut construire des context managers (`with ...`) mais: ils ont une syntaxe spéciale et on ne peut pas tout faire. Par exemple, on ne peut pas retourner de variables et c'est dommage, ça me permettrait d'intercepter des exceptions et de retourner un message pour l'utilisateur, bref de factoriser un peu plus mon code. Or, Lisp a les fameuses macros ! Je prends des listes en paramètres, ce peut être des arguments ou des listes qui représentent du code: "code is data". Je peux former du nouveau code, placer tout ou partie du code en paramètre où je veux. C'est ça qui permet d'étendre le langage. Or CL a même des macros pour le "reader", le lecteur du compilateur qui va représenter le code en structure interne: on peut donc modifier des symboles. Ainsi on peut utiliser la syntax `@` pour des décorateurs (à l'œuvre dans un framework web pour définir des routes) ou permettre l'interpolation de strings type `print "hello #{name}"`. Et re-voyez mon point plus haut: Lisp est extensible, avec une syntaxe cohérente. Bon, mon objectif principal est de parler de l'écosystème. ## L'écosystème Common Lisp - gestionnaire de paquets: pip => [Quicklisp](https://www.quicklisp.org/). Re-construit une fois par mois, bien peu. Système qui repose sur une personne. Sinon, marche nickel, facile à installer et à utiliser: `(ql:quickload :project)`. Mais aussi [Roswell](https://github.com/roswell/roswell), qui permet l'installation de libs en ligne de commande, le partage et l'installation de scripts, l'installation d'implémentations (`pyenv`). - CPython => Steel Bank Common Lisp (SBCL), et d'autres implémentations - pyenv => Roswell - virtual envs => [Qlot](https://github.com/fukamachi/qlot) Doc: - Read the docs => [Quickdocs](http://quickdocs.org/) - Sphinx => Sphinx aussi, ou [Common Doc](https://commondoc.github.io/docs/overview.html) - doc officielle => [CL Ultra Specs](http://phoe.tymoon.eu/clus/doku.php?id=start) (en construction, par l'auteur de Portacle) Listes de libs: - http://lisp-lang.org/wiki/article/recommended-libraries à recouper avec https://github.com/CodyReichert/awesome-cl Projets: - frameworks web: [Lucerne](http://eudoxia.me/lucerne/docs/), [Caveman2](http://8arrow.org/caveman/) - WSGI => Clack - ORMs => plusieurs, pour Postrgre, SQLite etc, dont [Crane](https://github.com/eudoxia0/crane) avec des migrations automatiques (pas mal ! mais... ne permet pas encore des allés et retours, comme avec Django qui numérote les fichiers de migration, et ne marche pas pour SQLite). - le système de paquets: setup.py => définition asdf, équivalent. - requests => dexador - tests => prove - et il y a des choses modernes comme un accès à l'api twitter, authentification Oauth2, les web apps dans Électron avec [Ceramic](https://ceramic.github.io/), etc La première chose qui m'a fatiguée, c'est travailler sur des listes de charactères: join, replace, trim, etc. Il fallait utiliser 4-5 librairies ou fonctions différentes avec des constructions bizarres. Trop dingue qu'il n'y ait pas une lib qui donne un tout cohérent. J'ai donc regroupé quelques fonctions dans [cl-str](https://github.com/vindarel/cl-str) puis découvert après (évidemment) [cl-strings](https://github.com/diogoalexandrefranco/cl-strings) (qui cependant a une implémentation un peu bizarre car ne reprend pas les libs existantes). Petite note, pour éviter des critiques faciles: oui écrire est `(caaadr (cddddr...` est possible mais il y a `first`, `second`... `last`, `tail` dans le langage. Alors, où sont les projets géniaux ? Eh bien, chez [Grammarly](http://tech.grammarly.com/blog/posts/Running-Lisp-in-Production.html) par exemple qui fait tourner du CL dans un environnement de production exigeant, chez [OpusModus](http://opusmodus.com/):  chez [Mirai](http://www.izware.com/mirai/modeling.htm) qui a produit la tête de Gollum:  et en [sciences](http://lisp-lang.org/success/science/), on crée toujours des programmes en Lisp, après des essais avec Python, pour de la métaprogrammation moléculaire avec LLVM et C++ ([CLASP](https://www.youtube.com/watch?v=8X69_42Mj-g))... mais les applications libres ? À part [Turtl](https://github.com/turtl) qui sert les framanotes, [Guix](https://www.gnu.org/software/guix/) en Guile (Scheme) ou le navigateur [Lispkit](https://github.com/AeroNotix/lispkit) en construction, je ne vois pas !! ps: une ancienne discussion, [Lisp, pourquoi est-ce différent ?](https://linuxfr.org/users/peetah/journaux/lisp-pourquoi-est-ce-different)