Le LISP est-il toujours utile dans le monde actuel? Quelle version est la plus utilisée?


117

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:

  1. 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?

  2. 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 ...


10
Je suis très intéressé par cette question. De temps en temps, quand j'ai le temps, je décide d'essayer d'apprendre Lisp. Et chaque fois que je suis contrarié par le même genre de questions et d’incertitudes que vous posez ici. Quelle version de Lisp devrais-je apprendre? Est-ce que quelqu'un (à part Paul Graham) utilise vraiment le Lisp? Devrais-je apprendre Lisp, ou l'un des nouveaux langages de programmation fonctionnels comme Haskell? Quels sont les avantages de Lisp sur Scheme, etc., etc.
Channel72

3
Scheme Scheme / Lisp course du MIT
Joe Internet

Pratique Common Lisp: gigamonkeys.com/book
Joe Internet

"encore"? (Je plaisante!)
rendu le

Je viens de trouver cet autre sujet sur SO: stackoverflow.com/q/1614724/212942
TCSGrad

Réponses:


59

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/


Existe-t-il un dialecte qui fonctionne bien avec C / C ++, car je suis avant tout un gars en C ++? Pourriez-vous également mentionner quelques ressources pour un novice de rang, pour commencer à apprendre ce dialecte?
TCSGrad

10
Les meilleurs livres à apprendre sont "The Little Schemer" et "SICP" mitpress.mit.edu/sicp . Il existe un certain nombre d'implémentations de schémas qui peuvent être intégrées à c / c ++, mais je ne sais pas vraiment lesquelles sont bonnes de nos jours, vous devrez donc peut-être faire des recherches sur Google.
Zachary K

1
Je dois souligner que ce schéma est très simple! vous apprendrez environ 90% de la langue en 2 heures. Bien sûr, cela ne signifie pas que vous l'aurez maîtrisé, vous saurez simplement comment fonctionne la syntaxe.
Zachary K

5
@ shan23 Scheme a été conçu pour l'enseignement. Il pourrait sans doute être utilisé pour enseigner à un étudiant de première année comment programmer, donc je n'ai aucun doute que vous n'aurez aucun problème à l'apprendre. Si vous souhaitez une intégration en C ou C ++, consultez Guile ( en.wikipedia.org/wiki/GNU_Guile ).
Vitor Py

1
Le livre de langage de programmation de Kent Dybvig Scheme n'est peut-être pas si célèbre, mais c'est un très bon livre. scheme.com/tspl4 Si vous utilisez Emacs, apprendre quelques Lisp est pratique.
blispr

68

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

  • Peut-être schéma (tous les dialectes) en raison d' applications éducatives
    • 270 écoles ... 50 élèves / an, 500 lignes de code / étudiant, 10 années consécutives. Plus de 1 000 000 lignes basées sur le calcul de la serviette
    • 500 000 lignes de Racket in Racket et ses outils.
  • Peut-être Common Lisp en raison de l' IA et d'un tas de code source ouvert et de code de production (Voir code de production).
  • Peut-être Emacs Lisp à cause de ...
    • Emacs lui-même: plus d'un million de lignes
    • La quantité d'emacs lisp a été écrite publiquement - 237 modules, environ 200 lignes / modules, c'est plus de 40 000 lignes seulement sur EmacsWiki, probablement beaucoup plus dans ELPA
    • Plus les applications écrites dans emacs Lisp, les fichiers .emacs, etc.
  • Clojure
    • Difficile à estimer. Principalement plus petits. Pourrait être beaucoup.

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

  • Common Lisp
    • Les clients d'ITA Software, y compris Orbitz, Bing Travel et Kayak.com - probablement des millions.
  • Clojure
    • Citigroup (pas de détails), Akamai (pas de détails), simple.com, et bien d’autres. Probablement des millions.
  • Schème
    • Étudiants en CS, chercheurs et amateurs. Moins d'un bazillion.
    • La série Uncharted - Plus de 5 millions
  • Emacs Lisp - Principalement des programmeurs, principalement sur des plateformes Unix. Pourrait être un million.

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.


4
Pas de petites oranges? Ou des citrons pourpres?
Vatine

En effet, le schéma - en particulier le schéma de la raquette - semble être le dialecte lisp le plus récent. Un outils de qualité professionnelle et des bibliothèques.
Bikal Lem

@Bikal Je souhaite que le support OpenGL est pas daté, mais le mode direct est pas le plus grand défaut de mon code Racket ...
Jesse Millikan

Je ne savais pas que Orbitz utilisait CL ... Je sais où chercher mon prochain emploi: D
Rig

2
Beaucoup plus de 100k LOC ont été écrits dans Racket. La bibliothèque standard / IDE / outils de Racket dépasse les 500 Ko et est également utilisé dans des sociétés comme SET, Boeing et Naughty Dog.
Sam Tobin-Hochstadt

43

Est-ce que LISP est toujours pratiqué / utilisé dans le monde actuel ou est-ce un langage hérité

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.

Quel est le dialecte le plus utilisé?

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.

Je ne veux pas investir d'effort excessif dans quelque chose si c'est totalement obsolète - je l'apprendrais encore s'il était professionnellement "mort", mais seulement dans une perspective académique ...

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.


3
La raquette n'est pas un programme R6RS; il y en a une parmi les langues fournies par la distribution Racket. Le langage de la raquette est un schéma qui diffère de RnRS de plusieurs manières importantes (pour lesquelles j'ai des sentiments mitigés).
JasonFruit

27

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:

  • Il insiste beaucoup sur la programmation fonctionnelle (plus que la plupart des autres Lisps). L'auteur et BDFL Rich Hickey a souvent cité Haskell comme l'une de ses inspirations pour la conception du langage, ce qui signifie que vous obtenez des choses comme des structures de données totalement immuables et des séquences infinies paresseuses, etc.
  • Métaprogrammation macro - la philosophie Lisp "le code est une donnée" est difficile à comprendre sans l'avoir réellement expérimenté, mais c'est l'une des raisons pour lesquelles Lisps est si expressif et productif
  • Prise en charge fantastique de la concurrence multi-cœur - je pense en fait que Clojure est le meilleur langage pour la programmation simultanée. Voir http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey pour une présentation éclairante à ce sujet.

Cela semble également être un choix pratique pour une utilisation en production réelle pour les raisons suivantes:

  • L'utilisation de la machine virtuelle Java avec une interopérabilité Java très simple vous donne accès à toutes les bibliothèques et outils de l' écosystème Java.
  • C'est un langage dynamique par défaut, ce qui le rend très pratique pour le développement et le prototypage rapide avec à peu près aucun standard. Cependant, vous pouvez ajouter des astuces de type statique pour obtenir de bonnes performances là où vous en avez besoin.

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 :-)


9

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.

"Lisp vaut la peine d'être étudié pour l'expérience d'illumination profonde que vous obtiendrez quand vous l'obtiendrez enfin; cette expérience fera de vous un meilleur programmeur pour le reste de vos jours, même si vous n'utilisez jamais beaucoup Lisp lui-même." - Eric Raymond, "Comment devenir un hacker"

[/MODIFIER]


7
FWIW, SBCL est une implémentation de Common Lisp, tout comme Allegro CL.
Vatine

@Vatine - vous auriez raison. S'il y avait un visage rougissant, je le ferais maintenant. Je ne sais pas pourquoi j'ai supposé qu'ils étaient différents. Stupide moi compilateur différent! = Dialecte différent :) Merci!
Jetti

@ Jeff: Eh bien, ils étendent le langage dans des directions différentes, tout en laissant le "noyau CL" interopérable.
Vatine

@ Jetti Qu'est-ce que vous utilisiez en premier lieu?
Marc C

Je crois que j'utilisais CLISP, c'était sur une image de machine virtuelle que je n'ai plus. Je pense que mon ignorance m'a fait croire qu'il s'agissait d'un lisp commun. Au moins maintenant je sais mieux.
Jetti

8

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.


3
Le problème avec Scheme est que, lorsque vous commencez à vous exercer, vous ne voulez pas revenir à d’autres langues. Je viens juste de commencer à implémenter des flux (séquences infinies, immuables, éventuellement infinies) en C ++ et c'est bien plus de code que dans Scheme! J'ai été vraiment surpris par la combinaison de simplicité et de puissance de Scheme.
Giorgio

++ pour Racket. C'est vraiment incroyablement complet, ce qui est l'une des critiques des autres régimes. Et cela va au-delà de ce que le système peut faire pour créer vos propres langues.
Scott Klarenbach

7

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.


Que recommanderiez-vous comme livre / compilateur de début pour Scheme? J'utilise Linux, donc s'il y a un éditeur explicitement utile pour les novices (comme Kile pour LaTex), faites le moi savoir ...
TCSGrad

1
@ shan23 Le petit Schemer ( ccs.neu.edu/home/matthias/BTLS ) est votre meilleur pari. Je pense qu'emacs est l'éditeur le plus courant de Scheme, mais il faut un certain temps pour s'y habituer.
Vitor Py

1
Editor pour lisp, c’est facile, utilisez emacs. Il a été écrit par les gars lisp, et dans lisp.
Zachary K

Vous pouvez également utiliser l'IDE Racket ( racket-lang.org ); il ressemble à Emacs mais présente une mise en forme automatique et une interaction avec l'interpréteur de schéma.
Jeremiah Willcock

Lispbox ( common-lisp.net/project/lispbox ) fonctionne immédiatement (certaines expériences emacs sont utiles). Il est basé sur ccl ( ccl.clozure.com ), voir aussi gigamonkeys.com/book/…
Giorgio

4

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?

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.

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.

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. :)


En effet, Land of Lisp est une lecture incroyable.
Chiron

@ 4bu3li Y a-t-il un vote négatif?
Mark C

1
À propos de Naughty Dog: Cela n’est pas tout à fait correct, leurs jeux PS2 ont été écrits en GOAL, un langage qui ressemble à un lisp ... Mais depuis qu’ils sont passés à la PS3, ils ont adopté le C ++. MZScheme est principalement utilisé comme préprocesseur de macros, écrit en ligne avec C ++ et utilisé pour le traitement de certains actifs, et certains de leurs scripts sont écrits en S-exp. Mais aucun code MZScheme ne fonctionne réellement sur la PS3.
Arelius

2

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 ...


1
C'est surtout le premier ... car il est assez évident que si je réussis, cela ne nuira certainement pas à mon CV :). Mais sérieusement, je veux avoir une perspective sur les différents "styles" de programmation, afin d’avoir une bonne idée de celui qui sera utilisé dans différents scénarios (ne voulez pas tomber dans la situation où vous n’êtes équipé que d’un marteau, Je dois traiter tous les problèmes comme des ongles !!)
TCSGrad

2

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 ...


3
Vous pouvez réellement simplifier MAX enMAX(MAX(a b) c)
Andrea

Vous avez raison, c'est ce que je reçois pour répondre peu de temps après le réveil. J'ai ajusté la réponse.
Cervo

2
Le projet de la NASA était Deep Space 1: flownet.com/gat/jpl-lisp.html
Frank Shearar, le

2

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 àerroren 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.


1

À 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.


Vous avez soulevé un point intéressant sur les différences entre Scheme et Common Lisp - pourriez-vous préciser le pourquoi / le comment?
TCSGrad


1

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.


BTW, PLT Racket est un langage qui ressemble plus à un programme, et à l'origine de la communauté de systèmes qui semble essayer d'être utile pour un travail réel. Si je devais écrire du code dans un schéma ces jours-ci, il s'agirait probablement d'un schéma PLT ou d'un schéma poulet, mais le dernier pourrait être dû à un point faible dans mon cœur.
Arelius

0

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.


C'est probablement juste de le mentionner mais je ne le recommanderais pas exactement ... Pas de portée lexicale et pas de modules par exemple - sérieusement? Je ne comprends pas vraiment ce que newLISP essaie d'accomplir.
cji

2
Vous avez raison, c'est différent. Il utilise des contextes et une portée dynamique et, d'après mon expérience, les modules et les contextes sont interdépendants. Il n'essaie pas d'être un autre CL ni Scheme. La lecture de la page sur la différence ( newlisp.org/index.cgi?page=Differences_to_Other_LISPs ) permet de mieux comprendre les problèmes de conception. De même, je ne le recommanderais pas à quiconque souhaite vivre une expérience CL ou Scheme. Mais dans certains cas d'utilisation, cela pourrait être un choix viable. C'est la beauté de l'écosystème open source - beaucoup de choix!
CyberFonic

0

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.


Eh bien, selon ces critères, Clojure ne s'en tire pas trop mal par rapport à SBCL: benchmarksgame.alioth.debian.org/u32/…
AndreasScheinert

Merci Andreas. Vous avez raison. Montre à quel point je sais sur la JVM - pas beaucoup. En partie, j'ai été induit en erreur par ABCL, un CL basé sur une machine virtuelle Java, relativement lent mais par ailleurs agréable.
Mars

Je dirais que si vous voulez un Lisp sur la JVM, optez pour Clojure. Ce n'est pas parfait mais c'est un vrai plaisir (IMHO)
AndreasScheinert
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.