J'essaie de m'apprendre un nouveau langage de programmation à intervalles réguliers. Récemment, j'ai lu comment Lisp et ses dialectes se trouvaient à l'opposé des langages comme le C / C ++, ce qui m'a rendu assez curieux pour en savoir plus. Cependant, deux choses ne sont pas claires pour moi et je cherche des conseils à leur sujet:
Le LISP est-il encore pratiqué / utilisé dans le monde actuel ou s'agit-il d'un langage traditionnel tel que le FORTRAN / COBOL? En dehors du maintien du code existant, est-il utilisé pour de nouveaux projets?
Quel est le dialecte le plus utilisé? Je suis tombé sur Scheme et Common Lisp en tant que les 2 dialectes les plus répandus et je voulais connaître votre avis sur le plus favorisé / utile à apprendre. Je serais extrêmement heureux si vous pouviez suggérer des ressources pour un débutant.
Bien que désireux d'apprendre une langue qui soit fondamentalement différente des langues procédurales auxquelles je suis habitué, je ne veux pas investir d'effort indu dans quelque chose si c'est totalement obsolète - je l'apprendrais encore s'il était professionnellement "mort", mais seulement avec une perspective académique ...
Réponses:
J'aime plutôt Scheme. Si vous souhaitez utiliser la JVM, vous devriez jeter un œil à Clojure, un lisp conçu pour fonctionner dans la JVM. Et oui, Lisp vaut toujours la peine d’apprendre à voir à quel point un design aussi minimal peut être puissant! Les personnes qui ont créé Lisp ont obtenu des résultats positifs. C’est incroyable le nombre de nouvelles fonctionnalités des langues modernes que Lisp avait dans les années 60!
Pour un schéma intégré, essayez guile: http://www.gnu.org/s/guile/
la source
En réponse à la question 2, "Dialecte le plus largement utilisé":
Cela dépend de la façon dont vous interprétez "Le plus largement utilisé". Voici quelques exemples de maths de nappe pour déterminer les limites d'utilisation de chacun des dialectes choisis.
La plupart du code brut écrit
Gagnant: Scheme ou Common Lisp. Trop d'inconnues.
La plupart des codes de «production»
Vainqueur: Je devine que Common Lisp . Je pense que nous pouvons répondre "Oui" à la question 1 sur la base de Common Lisp et de Clojure.
La plupart des utilisateurs finaux
Vainqueur: Scheme a la meilleure limite inférieure ici, puisqu'il y a des chiffres de vente sur Uncharted, mais c'est assez discutable.
Conclusion
En conclusion, je trouve que les grosses pommes.
la source
Oui, mais vous devez savoir où regarder. Les personnes qui utilisent LISP n'ont pas tendance à crier trop fort à ce sujet, mais il existe quelques exemples de startups très en vue l'utilisant à bon escient au cours des 20 dernières années. Il est également très populaire auprès des petites entreprises en Europe.
C'est une question valable, mais ce n'est pas facile à répondre. Il se peut également que la réponse ne soit pas particulièrement utile: de nombreuses implémentations ayant un objectif spécifique, elles sont mieux choisies si elles s’adaptent à votre problème particulier plutôt que sur la base de la portée de son utilisation. Au lieu de cela, je vais vous parler un peu de vos options et vous pourrez décider vous-même.
LISP est une famille de langues et chacune de ces langues possède une famille de dialectes et de mises en œuvre. En gros, les dialectes se divisent en deux camps "LISP" et "Schemes".
LISP: Jusqu'à récemment, le LISP commun était roi. C'était une tentative d'unifier tous les LISP disparates et, sans être méchant, c'était le "C ++" du LISP. C'est-à-dire que c'était une langue ÉNORME . Il y avait tout. Clojure est apparu au cours des dernières années. Clojure est un LISP qui s'exécute sur la machine virtuelle Java et tente de s'enraciner dans une philosophie de programmation fonctionnelle. Traditionnellement, les autres LISP étaient strictement multi-paradigmes. Clojure est intéressant car il tire à la fois le meilleur et le pire de LISP et de la JVM. Il y a encore beaucoup de verbosité dans les langages basés sur Java et ils ont été assez simples et faciles avec la syntaxe, ce qui a beaucoup de boutons et de boutons pour différentes choses, mais ils en ont vraimentidées intéressantes sur les types de données, en particulier certaines des manières pratiques qu’elles ont trouvées d’appliquer des idées issues de la programmation fonctionnelle.
Schémas: Les schémas sont un sous-ensemble strict de LISP. Scheme a été inventé par Steele et Sussman et, au début de sa vie, il était connu pour son utilisation dans le cours de conférence MIT Computing 101. Le schéma est défini dans le "Rapport révisé sur le schéma de langage algorithmique (RnRS)". Oui: ils ont une blague de maths dedans. Scheme est un langage standardisé, contrairement aux autres LISP. Cela aide grandement à la portabilité entre les mises en œuvre, mais ce n'est pas une solution miracle. Les efforts de normalisation ont eu tendance à être conservateurs et les innovations dans les implémentations, en particulier autour d'éléments tels que les modules, ont eu tendance à être disparates. Il existe également une série de SRFI (Scheme Requests For Implementation) similaires au processus RFC de l'IETF. Les gens l'utilisent pour normaliser de petites choses au besoin.
Les schémas diffèrent des LISP par le fait qu’ils ont un ensemble d’exigences rigoureuses qu’ils doivent satisfaire, l’une d’elles étant «l’optimisation des appels en aval» qui contribue à rendre la récursivité efficace. Par conséquent, les styles de programmation récursifs sont beaucoup plus populaires dans Scheme que dans LISP. Scheme est, aussi sans être méchant, comme le "C" de LISP. C’est-à-dire qu’il s’agit d’une petite langue et que vous êtes censé pouvoir tout garder en tête en même temps.
Il existe actuellement deux familles de régimes: celles basées sur la 5ème version (R5RS) et celles basées sur la 6ème version (R6RS). La complexité de R6RS était bien supérieure à celle de ses prédécesseurs et de nombreuses implémentations de R5RS ont donc choisi de la ignorer, en espérant que R7RS sera plus similaire à R5RS que R6RS. Le processus de normalisation de R7RS est en cours et a tenté d’intégrer à la fois les désirs des développeurs de R5RS et ceux du peuple R6RS en normalisant une langue de base réduite dans leur premier groupe de travail, puis en chargeant un deuxième groupe de travail de normaliser les fonctionnalités plus larges. Cela permettra au langage d'avoir des implémentations efficaces et utiles à la fois sur le matériel embarqué minuscule et sur des machines plus performantes.
Maintenant je serai plus précis:
PicoLisp est un LISP vraiment très cool. C'est minuscule! Son auteur l’a écrit pour lui-même et, si je comprends bien, il en vit depuis les années 1980. Si jamais vous avez l'occasion d'assister à une conférence de lui, alors vous devriez le faire: il est vraiment intéressant et connaît vraiment son contenu et vous n'obtiendrez même pas le moindre reniflement de quoi que ce soit qui soit ordinaire ou ennuyeux.
Je ne connais pas bien les implémentations de Common Lisp, je ne les commenterai donc pas davantage.
Guile est le schéma officiel de GNU.
Racket est un programme R6RS, mais récemment, il semble avoir élargi le réseau et tente "de servir de plate-forme pour la création, la conception et la mise en œuvre de langages".
Le poulet se veut un programme pratique. Il est basé sur R5RS et compile jusqu’à C. Cela s’avère être un avantage vraiment très important car il est absolument trivial d’utiliser les bibliothèques C existantes. Par conséquent, Chicken est probablement le schéma le plus utile pour remplacer Perl, Python, Ruby, etc., en tant que langage de script quotidien. Plusieurs personnes l'utilisent exclusivement pour tous leurs besoins depuis plusieurs années. Il a un REPL interactif ainsi qu'un compilateur. La communauté (sur la liste de diffusion et sur IRC) est compétente, amicale et serviable.
Recherchez une implémentation avec beaucoup de modules: cela montre que c'est largement utilisable et signifie qu'il y a probablement quelque chose qui aide à la tâche à accomplir.
Recherchez une implémentation avec un compilateur ou, à tout le moins, quelque chose qui ne soit pas strictement basé sur IDE ou REPL. Un grand nombre d'implémentations conçues pour l'enseignement sont très difficiles à utiliser pour les scripts à usage général.
Je recommanderais le poulet comme c'est ce que j'utilise. Je l'ai utilisé dans mes projets personnels et je l'utilise (et je l'utilise actuellement) de manière professionnelle.
Scheme n'est pas professionnellement mort, mais vous devrez peut-être déployer des efforts considérables pour l'utiliser dans ce contexte. Quelque chose comme Chicken est bien plus qu’un travail académique et il peut facilement couvrir la quasi-totalité des bases des langues de haut niveau que vous utilisez actuellement.
la source
Je ne peux pas vraiment parler pour tous les Lisps mais Clojure est définitivement une langue chaude et pertinente à l’heure actuelle. Plus de 100 participants ont participé à un groupe d'utilisateurs Clojure à Londres, auquel j'ai assisté plus tôt cette semaine ....
J'ai découvert l'apprentissage de Lisp sous la forme de Clojure au cours de l'année écoulée (après beaucoup d'expérience avec Java et C #). Les principales raisons en sont:
Cela semble également être un choix pratique pour une utilisation en production réelle pour les raisons suivantes:
Je connais personnellement des gens qui utilisent Clojure dans quelques banques d’investissement et startups. J'ai aussi choisi Clojure comme langage de développement principal pour mon propre démarrage, alors je suis prêt à mettre mon argent là où ma bouche est :-)
la source
J'apprends actuellement Lisp aussi (et j'adore ça). J'utilise Common Lisp, mais j'ai aussi bricolé avec SBCL , Arc (remarque, c'est la version de Lisp de Paul Graham qui, comme mentionné par Vitor Braga, a créé Yahoo store / Viaweb) et Allegro CL, qui est similaire à Visual Studio pour Lisp (peut créer des interfaces graphiques, cependant, je ne l’ai jamais utilisé).
En ce qui concerne les utilisations, Lisp a beaucoup été utilisé dans l'intelligence artificielle, mais je vais être honnête, je ne suis pas sûr du nombre d'autres utilisations "générales" de Lisp. Beaucoup de sites Web qui ont été construits à l'origine dans Lisp ont été ré-écrits dans d'autres langues. Il est donc difficile de dire qu'ils sont utilisés dans le développement Web (ne le dis pas, mais les grands sites qui l'utilisent ne le font plus ). Après une recherche rapide (très rapide), voici une liste de logiciels écrits en Common Lisp depuis Wikipedia .
[EDIT] En ce qui concerne l'utilisation professionnelle de Lisp, il existe des emplois qui vous obligeraient à utiliser Lisp. Ils ne sont pas aussi nombreux que, disons, les emplois Java ou C #, mais ils existent. Je pense que Lisp est l’un de ces langages utilisés pour les applications internes et peut offrir un avantage concurrentiel que les entreprises ne veulent pas abandonner en annonçant qu’ils utilisent Lisp. Je me souviens d'avoir vu un article sur P.SE affirmant que Smalltalk était similaire dans le domaine financier.
En outre, être capable de montrer que vous êtes capable d'apprendre différents paradigmes peut ouvrir davantage de portes, même si vous n'utilisez pas Lisp dans votre travail.
[/MODIFIER]
la source
Si vous voulez apprendre le Lisp aujourd'hui, je regarderais soit le racket, qui est une implémentation rapide du schéma (eh bien, il s'écartait un peu du schéma, donc c'est son propre dialecte maintenant) ou le clojure, qui bénéficie du JVM sur lequel il tourne (ainsi, il existe un nombre incroyable de bibliothèques, vous pouvez également l’interagir avec votre propre code Java).
Même si vous ne l’apprenez pas réellement à l’utiliser, il est toujours bénéfique de l’apprendre: vous apprenez de nouvelles façons de penser et de traiter les problèmes, même dans d’autres langues, une fois que vous avez compris tout à l’esprit Lisp.
la source
Une partie importante du back-end d'Amazon se trouvait dans Lisp, mais a maintenant été réécrite en C ++, c'est ce que j'ai entendu dire (je dois admettre que je n'ai pas de source fiable pour cela).
Yahoo! Stores est l'un des exemples classiques d'applications Web Lisp. De Yahoo! Magasins renommée, vous avez peut-être entendu parler de Paul Graham . Graham est l'un des avocats les plus connus de Lisp et écrit abondamment sur ce sujet. Vous voudrez peut-être lire son site pour connaître ses points.
AutoCAD utilisait auparavant un dialecte Lisp pour son système de macros. Je ne sais pas si c'est toujours le cas.
Scheme est un langage propre et très élégant. C'est probablement mon langage de programmation préféré donc je peux être partial. Si je devais écrire maintenant une application majeure, j'écrirais probablement une application squelette en C, étendreais et définirais les règles de gestion dans Scheme. Cela me permet d’utiliser Scheme et d’exploiter C - pour la rapidité et la disponibilité totale des bibliothèques pour presque tout.
la source
Je connais plusieurs personnes qui travaillent dans Lisps dans certaines startups de la Silicon Valley et je sais qu'Amazon.com l'utilise depuis le début (même si j'ai entendu dire qu'ils le remplaçaient par C ++ pour une raison quelconque?)
Mais une entreprise à surveiller est Naughty Dog . Tous leurs jeux sont écrits avec un dialecte Lisp. À l'origine, ils ont lancé leur propre jeu, mais ils utilisent MZScheme dans la série Uncharted.
Je parierais que Common Lisp, Clojure, Scheme et Emacs Lisp sont les quatre dialectes les plus utilisés. Parmi ceux-ci, je soupçonne que Scheme est le plus couramment utilisé. Bien sûr, je n'ai rien pour le prouver. :)
J'aime assez SICP et le petit Schemer, comme le suggèrent d’autres, mais je suggérerais également Land of Lisp , qui est une lecture plutôt divertissante. :)
la source
Je pense que cela dépend en partie de ce que vous voulez en faire - si vous voulez approfondir votre compréhension des divers concepts de la programmation et vous faire de vous un meilleur programmeur, je dirais qu'il vaut la peine d'apprendre au moins un minimum de Lisp. Si vous recherchez une autre langue à ajouter à votre CV en vue de trouver un emploi dans cette langue, vous voudrez probablement chercher ailleurs. Il n'y a pas beaucoup d'emplois Lisp sur le marché.
J'essaie personnellement d'utiliser SBCL ou plus récemment, Clojure (et certains Lisp d'Emacs, mais htat c'est parce que je suis un utilisateur Emacs à long terme - j'essaierais d'apprendre Emacs Lisp quand j'essayerai d'apprendre Lisp). Il ne me reste plus qu'à trouver le temps de jouer avec ces langues ...
la source
Je ne sais pas s'il y a une tonne d'emplois dans LISP, je ne peux certainement pas les voir. Mais je me souviens d'une longue lecture à propos d'une sonde de la NASA qui exécutait LISP et était capable d'insérer un nouveau code à partir de la Terre.
Également à New York, le groupe de rencontres clojure est énorme. J'imagine que si vous êtes intéressé et que vous vous rendez dans votre groupe de rencontre clojure, vous pourrez peut-être trouver des opportunités de réseautage et de trouver des emplois (pas comme des travaux de clojure, mais des éléments tels que Java / C ++ / etc.). Il semble être absolument énorme dans la région de New York, d'autres zones peuvent varier.
LISP est également une façon de penser différente. De plus, LISP et SQL entraînent tous deux l'utilisation de tonnes d'expressions imbriquées. J'ai utilisé SQL une tonne et puis remarqué que LISP avait plus de sens. Toutefois, si vous rencontrez des difficultés avec SQL pour vous habituer à des parenthèses et des expressions super imbriquées lors de l’utilisation de LISP, il sera probablement beaucoup plus facile de comprendre les expressions SQL.
Un exemple classique est de savoir comment implémenter MAX (a, b, c). Vous pouvez créer une fonction compliquée avec un tas d'instructions if. Ou vous pouvez simplement dire
MAX (MAX (a, b), c)
et utilisez deux appels simples imbriqués du deux élément MAX, qui est pour moi plus facile à lire. Bien que si les performances posent problème, vous souhaiterez peut-être également procéder de la même manière, mais je n'ai pas pris la peine de compter le nombre de comparaisons lors de l'utilisation de chaque méthode ... De plus, si vous implémentez MAX via une macro C ou une autre méthode qui évalue la expressions plusieurs fois, vous risquez de ne pas obtenir le résultat attendu, car l'expression peut être évaluée plusieurs fois. Faites donc attention aux effets secondaires ...
la source
MAX(MAX(a b) c)
Deux points supplémentaires:
Premièrement, Lisp est un excellent langage pour écrire du code dans lequel les interactions entre fonctions ou données sont souvent complexes. Dans de nombreux langages populaires, si vous ne comprenez pas pourquoi votre programme agit comme il le fait, vous devez écrire des fonctions spéciales pour vous permettre d'examiner l'état interne du programme au fur et à mesure de son avancement. Dans certaines langues, vous devez alors attendre que votre code soit recompilé. Bien sûr, il peut y avoir des outils tels que les débogueurs qui aident à cela. En Lisp, toutefois, tout ce dont vous avez besoin est un moyen d'arrêter le programme, puis vous avez généralement accès à tout ce qui se trouve dans Lisp. Dans Common Lisp, parfois je tape simplement ^ C ou jette un appel à
error
en une seule fonction (qui est la seule chose qui doit être recompilée, et vous n'avez rien à faire pour la recompiler). Dès que j'arrête le programme, je suis instantanément jeté dans un débogueur - mais le débogueur me donne toute la puissance de Lisp, et je peux quitter le débogueur, appeler des fonctions spécifiques, etc. Je peux facilement examiner toutes les structures de données. dans mon programme. La plupart des programmes devraient permettre des pratiques similaires. Lisp n’est pas unique à cet égard, mais ce qu’il offre va au-delà de ce que proposent de nombreux langages populaires.Deuxièmement: Si vous voulez expérimenter un dialecte de Lisp, je ne le ferais pas sans (a) utiliser un éditeur qui correspond aux parenthèses et (b) apprendre le bon indentation de Lisp. Ce serait une bonne idée d'utiliser un éditeur qui se rapprochera de l'indentation appropriée pour vous aussi. Le formatage de code de style C / C ++ / Java est conçu pour les langues avec moins de parenthèses / accolades / crochets que Lisp. Le style d’impression Lisp fonctionne bien une fois que vous l’êtes familier et vous ne finissez pas par être confus par les parenthèses ou par perdre la moitié de votre espace en plaçant une parenthèse de fermeture par ligne.
la source
À l'heure actuelle, j'ai l'impression que Lisp est principalement utilisé dans les ateliers de consultation (même si ce n'est pas le cas).
C'est considéré un peu outre pour les logiciels pratiques. Principalement parce que les gens n'y sont pas habitués, je crois.
Traditionnellement, Scheme est un dialecte assez académique de Lisp, et Common Lisp était le dialecte de l’industrie.
Lisp est particulièrement utile pour la manipulation symbolique et les capacités de réflexion.
Par exemple, le code que j'ai écrit pour apprendre Lisp était un programme qui construisait des fonctions lambda aléatoires, les évaluait puis les exploitait, dans le but de minimiser la différence entre une fonction et une fonction cible. Tout cela était une manipulation directe. Dans un langage comme C ++ ou Java, j'aurais dû inventer une représentation des fonctions que l'ordinateur manipulerait.
la source
J'aimerais ajouter un peu de perspective sur Common Lisp et Scheme. J'ai évité la clojure à cause de la JVM, donc je n'ai pas beaucoup de perspective là-dessus.
Scheme est un beau langage concis et bien défini. En raison de son héritage, CL a dû prendre de nombreuses décisions en raison de son héritage et adopté une approche plus pure. Par exemple, les variables et les fonctions se trouvent dans le même espace de noms. La langue par défaut est plus petite et plus concise, ce qui fonctionne bien pour vous expliquer le genre de choses pour lesquelles lisp est doué. Par exemple, il presse l'utilisation de la récursivité au lieu de l'itération, car il n'a par défaut aucune boucle itérative et nécessite une optimisation des appels en aval. . Scheme a un système macro très intéressant en matière d’hygiène, dont l’apprentissage est très utile. Mais IMO, je recommanderais d’apprendre d’abord les macros non hygiéniques de style CL, dont la plupart des dialectes schématiques (?) Offrent au moins une implémentation de, même si cela ne fait pas partie des spécifications. Comme il semble beaucoup que vous souhaitiez apprendre une langue pour apprendre, je suis
Cela dit, la communauté de Scheme est fragmentée et, à part quelques petites poches, elle semble être principalement dédiée à la recherche d'un travail réel ... Par exemple, chaque dialecte a son propre gestionnaire de paquets, et les paquets ne sont généralement pas portables. à travers les dialectes, ce qui est un énorme problème dans la communauté des schémas.
Common Lisp, en revanche, semble être l'approche beaucoup plus pragmatique du développement d'une langue. La norme est telle qu’une grande partie du code lisible est portable entre les mises en œuvre, de nombreux compilateurs sont rapides et bien optimisés. Il existe un grand nombre de packages, dont beaucoup sont portables entre les implémentations. Et apparemment, une quantité relativement importante de produits réels est créée dans la langue. Et avec, par exemple, quicklisp, la gestion des paquets semble assez proche de ce que vous obtiendriez dans une communauté moderne comme Ruby, ou Node. CL, cependant, n’est pas sans défauts, il a une très grande spécification à ce stade comparé au schéma, et même son système d’objets CLOS, quelque chose qui est traditionnellement écrit comme une bibliothèque dans Lisps, fait partie de la spécification IIRC. Et vous pouvez sentir l'héritage enraciné dans une grande partie du système.
Sinon, j'ai dit que je ne pouvais pas parler en clojure, et Emacs Lisp est clairement le choix approprié si votre objectif est d'écrire des extensions Emacs, et il est clair que ce n'est pas le choix approprié pour les autres logiciels.
TLDR; Si votre objectif est d'apprendre, je recommande Scheme. Toutefois, si vous souhaitez créer un logiciel, je vous recommanderais Common Lisp des deux principales variantes de lisp.
la source
J'ai beaucoup appris des réponses. Merci à tous ceux qui ont contribué à cette conversation enrichissante.
Je devrais mentionner newLISP . Bien que différent de CL et Scheme, il implémente de nombreuses fonctions très utiles. Je trouve le serveur http, la fonctionnalité de traitement multiple (Cilk) et les fonctions d’évaluation à distance très propres et faciles à utiliser.
Le fichier exécutable simple est petit, rapide et comprend beaucoup de batteries froides.
la source
Un autre facteur à considérer dans le choix du dialecte de Lisp à apprendre peut être le nombre et la qualité des mises en œuvre. Si un dialecte a seulement une ou deux implémentations, vous êtes bloqué avec ses défauts jusqu'à ce que ces défauts soient corrigés et il y a toujours une chance que les gens arrêtent d'affiner la mise en œuvre. En soi, ce n'est pas une raison pour ne pas utiliser un dialecte de Lisp à implémentation unique, mais c'est quelque chose à prendre en compte. Un avantage de Scheme et Common Lisp est qu'il existe de nombreuses implémentations de ces dialectes. Les deux langages ont publié des normes, de sorte que les implémentations relativement récentes sont susceptibles d'exécuter le même code, principalement. Certaines de ces implémentations existent depuis longtemps, mais elles font encore l’objet d’un développement actif: c’est désormais des implémentations de haute qualité, et elles sont en cours de perfectionnement.
la source