Ist LISP in der heutigen Welt immer noch nützlich? Welche Version wird am häufigsten verwendet?


117

Ich versuche mir in regelmäßigen Abständen eine neue Programmiersprache beizubringen. Kürzlich habe ich gelesen, dass sich Lisp und seine Dialekte im Gegensatz zu Sprachen wie C / C ++ befinden, was mich neugierig genug machte, mehr darüber zu erfahren. Zwei Dinge sind mir jedoch unklar, und ich suche nach Anleitung dazu:

  1. Wird LISP in der heutigen Welt noch praktiziert / verwendet, oder handelt es sich um eine Legacy-Sprache wie FORTRAN / COBOL? Ich meine, abgesehen von der Beibehaltung des vorhandenen Codes, wird dieser überhaupt für neue Projekte verwendet?

  2. Was ist der am häufigsten verwendete Dialekt? Ich bin auf Scheme und Common Lisp als die 2 am weitesten verbreiteten Dialekte gestoßen und wollte, dass Sie wissen, welche davon am beliebtesten / nützlichsten ist - und wäre sehr erfreut, wenn Sie Ressourcen vorschlagen könnten, mit denen ein Anfänger beginnen kann.

Ich möchte zwar unbedingt eine Sprache lernen, die sich grundlegend von den von mir gewohnten Verfahrenssprachen unterscheidet, aber ich möchte keinen übermäßigen Aufwand in etwas investieren, das völlig veraltet ist - ich würde es trotzdem lernen, wenn es professionell "tot" wäre. aber nur mit einer akademischen Perspektive ...


10
Diese Frage interessiert mich sehr. Von Zeit zu Zeit entscheide ich mich, Lisp zu lernen. Und jedes Mal, wenn ich von denselben Fragen und Unsicherheiten gebremst werde, nach denen Sie hier fragen. Welche Version von Lisp soll ich lernen? Verwendet wirklich jemand (außer Paul Graham) Lisp? Soll ich Lisp oder eine der neueren funktionalen Programmiersprachen wie Haskell lernen? Was sind die Vorteile von Lisp gegenüber Schema usw. usw.
Channel72


Practical Common Lisp: gigamonkeys.com/book
Joe Internet

"immer noch"? (Ich
scherze

Ich habe gerade diesen anderen, verwandten Thread auf SO gefunden: stackoverflow.com/q/1614724/212942
TCSGrad

Antworten:


59

Ich mag Scheme eher, wenn Sie mit der JVM arbeiten möchten, sollten Sie Clojure ausprobieren, ein Lisp, das für die Arbeit in der JVM entwickelt wurde. Und ja, Lisp ist es immer noch wert zu lernen, wie mächtig so ein minimales Design sein kann! Die Leute, die lisp kreiert haben, haben einiges richtig gemacht. Es ist erstaunlich, wie viele der coolen neuen Funktionen moderner Sprachen lisp in den 1960ern hatte!

Für ein eingebettetes Schema versuchen Sie guile: http://www.gnu.org/s/guile/


Gibt es einen Dialekt, der gut mit C / C ++ funktioniert, denn ich bin hauptsächlich ein C ++ - Typ? Könnten Sie auch einige Ressourcen für einen Anfänger erwähnen, um diesen Dialekt zu lernen?
TCSGrad

10
Die besten Bücher, um Schema zu lernen, sind "The Little Schemer" und "SICP" mitpress.mit.edu/sicp . Es gibt eine Reihe von Schema-Implementierungen, die in c / c ++ eingebettet werden können, aber ich weiß nicht wirklich, welche derzeit gut sind, so dass Sie möglicherweise etwas googeln müssen.
Zachary K

1
Ich sollte darauf hinweisen, dass das Schema sehr einfach ist! In 2 Stunden lernst du ungefähr 90% der Sprache. Das heißt natürlich nicht, dass Sie es gemeistert haben, nur, dass Sie wissen, wie die Syntax funktioniert.
Zachary K

5
@ shan23 Schema wurde für den Unterricht entwickelt. Es könnte ohne Zweifel verwendet werden, um einem Neuling das Programmieren beizubringen, so dass ich keinen Zweifel daran habe, dass Sie keine Probleme haben werden, es zu lernen. Wenn Sie eine C- oder C ++ - Integration wünschen, lesen Sie Guile ( en.wikipedia.org/wiki/GNU_Guile ).
Vitor Py

1
Kent Dybvigs Programmiersprachenbuch Scheme ist vielleicht nicht so berühmt, aber ein sehr schönes Buch. scheme.com/tspl4 Wenn Sie Emacs verwenden, ist es praktisch, etwas über Lisp zu lernen.
Blispr

68

In Beantwortung von Frage 2, "Am weitesten verbreiteter Dialekt":

Hängt davon ab, wie Sie "Am häufigsten verwendet" interpretieren. Hier sind einige Servietten-Berechnungen für Untergrenzen, wie viel Gebrauch die einzelnen ausgewählten Dialekte haben.

Der meiste rohe Code geschrieben

  • Möglicherweise Scheme (alle Dialekte) wegen Bildungsanwendungen
    • 270 Schulen ... Lassen Sie uns 50 Schüler / Jahr, 500 Codezeilen / Schüler, 10 Jahre hintereinander erraten. Über 1.000.000 Zeilen basierend auf Serviettenmathematik.
    • 500.000 Racket-Linien in Racket selbst und seinen Werkzeugen.
  • Möglicherweise Common Lisp wegen AI und einer Menge Open Source Code und Production Code (siehe Production Code).
  • Möglicherweise Emacs Lisp wegen ...
    • Emacs selbst: über 1.000.000 Zeilen
    • Die Anzahl der öffentlich geschriebenen Emacs Lisp - 237 Module, ungefähr 200 Zeilen / Module - beträgt mehr als 40.000 Zeilen, wahrscheinlich mehr in ELPA
    • Plus-Anwendungen in Emacs Lisp, .emacs-Dateien usw. geschrieben
  • Clojure
    • Schwer abzuschätzen. Meist kleinere Dotcoms. Könnte viel sein.

Gewinner: Schema oder Common Lisp. Zu viele Unbekannte.

Der meiste 'Produktions'-Code

Gewinner: Ich vermute, Common Lisp . Ich denke, wir können Frage 1 mit "Ja" beantworten, basierend auf der Verwendung von Common Lisp und Clojure.

Die meisten Endbenutzer

  • Common Lisp
    • Kunden von ITA Software, darunter Orbitz, Bing Travel und Kayak.com - wahrscheinlich Millionen.
  • Clojure
    • Citigroup (keine Angaben), Akamai (keine Angaben), simple.com, viele andere. Wahrscheinlich Millionen.
  • Planen
    • CS Studenten, Forscher und Bastler. Weniger als eine Milliarde.
    • Die Uncharted-Serie - Über 5 Millionen
  • Emacs Lisp - Meist Programmierer, meist auf Unix-Plattformen. Könnte eine Million sein.

Gewinner: Schema hat hier die beste Untergrenze, da es Verkaufszahlen auf Uncharted gibt, aber es ist durchaus umstritten.

Fazit

Abschließend finde ich, dass große Äpfel.


4
Keine kleinen Orangen? Oder purpurne Zitronen?
Vatine

Tatsächlich scheint das Schema - insbesondere das Racket-Schema - der aktuellste Lisp-Dialekt zu sein. Professionelle Tools und Bibliotheken.
Bikal Lem

@ Bikal Ich wünschte, die OpenGL-Unterstützung wäre nicht so alt, aber der direkte Modus ist nicht der größte Fehler meines Racket-Codes ...
Jesse Millikan

Hatte keine Ahnung, dass Orbitz CL verwendet ... Ich weiß, wo ich nach meinem nächsten Job suchen soll: D
Rig

2
Es wurden viel mehr als 100.000 LOC in Racket geschrieben. Die Racket-Standardbibliothek / IDE / Tools sind über 500.000 und werden in Unternehmen wie SET, Boeing und Naughty Dog verwendet.
Sam Tobin-Hochstadt

43

Wird LISP in der heutigen Welt noch praktiziert / verwendet oder ist es eine Legacy-Sprache?

Ja, aber Sie müssen wissen, wo Sie suchen müssen. Leute, die LISP verwenden, neigen nicht dazu, zu laut darüber zu schreien, aber es gibt eine Handvoll Beispiele für einige bekannte Startups, die es in den letzten 20 Jahren mit großer Wirkung eingesetzt haben. Es ist auch bei kleinen Unternehmen in Europa sehr beliebt.

Was ist der am häufigsten verwendete Dialekt?

Dies ist eine gültige Frage, die jedoch nicht einfach zu beantworten ist. Die Beantwortung dieser Frage ist möglicherweise auch nicht besonders hilfreich: Viele Implementierungen haben einen bestimmten Schwerpunkt. Daher sollten Sie sie am besten auswählen, wenn sie zu Ihrem speziellen Problem passen, anstatt auf der Grundlage, wie häufig sie anderweitig verwendet werden. Stattdessen erzähle ich Ihnen ein wenig über Ihre Möglichkeiten und Sie können selbst entscheiden.

LISP ist eine Familie von Sprachen und jede dieser Sprachen hat eine Familie von Dialekten und Implementierungen. Im Großen und Ganzen fallen Dialekte in zwei Lager: "LISPs" und "Schemes".

LISPs: Bis vor relativ kurzer Zeit war Common LISP König. Es war ein Versuch, alle unterschiedlichen LISPs zu vereinheitlichen, und ohne unfreundlich zu sein, war es das "C ++" von LISP. Das heißt, es war eine RIESIGE Sprache. Es hatte alles. In den letzten Jahren ist Clojure erschienen. Clojure ist ein LISP, der auf der Java Virtual Machine ausgeführt wird und versucht, sich in einer funktionalen Programmierphilosophie zu verankern. Traditionell waren andere LISPs streng multiparadigmatisch. Clojure ist interessant, weil es sowohl das Beste als auch das Schlechteste von LISP und der JVM liefert. Es gibt immer noch einen Großteil der Ausführlichkeit von Java-basierten Sprachen, und die Syntax war ziemlich frei und einfach, sodass es viele Knöpfe und Schaltflächen für verschiedene Dinge gibt, aber einige davon sind wirklich vorhandeninteressante Ideen rund um Datentypen, insbesondere einige der praktischen Möglichkeiten, um Ideen aus der funktionalen Programmierung anzuwenden.

Schemata: Schemata sind eine strikte Untermenge von LISPs. Das Schema wurde von Steele und Sussman erfunden und war in jungen Jahren für den MIT Computing 101 Lecture Course bekannt. Das Schema ist im "Revised ^ n Report on the Algorithmic Language Scheme (RnRS)" definiert. Ja, sie haben einen Mathe-Witz drin. Schema ist eine standardisierte Sprache in einer Weise, die andere LISPs nicht sind. Dies trägt erheblich zur Portabilität zwischen Implementierungen bei, ist jedoch keine Wunderwaffe. Die Standardisierungsbemühungen waren eher konservativ, und Innovationen bei den Implementierungen, insbesondere in Bezug auf Module, waren eher unterschiedlich. Es gibt auch eine Reihe von SRFIs (Scheme Requests For Implementation), die dem RFC-Prozess der IETF ähneln. Die Leute verwenden es, um kleine Dinge nach Bedarf zu standardisieren.

Schemata unterscheiden sich von LISPs darin, dass sie eine Reihe von strengen Anforderungen erfüllen müssen. Eine davon ist die "Tail-Call-Optimierung", mit deren Hilfe die Rekursion effizienter wird. Daher sind rekursive Programmierstile in Scheme viel beliebter als in LISP. Schema ist, auch ohne unfreundlich zu sein, wie das "C" von LISP. Das heißt, es ist eine kleine Sprache und Sie sollten in der Lage sein, alles auf einmal im Kopf zu behalten.

Derzeit gibt es zwei Systemfamilien: die auf der 5. Version (R5RS) und die auf der 6. Version (R6RS) basierenden. Die Komplexität von R6RS war weitaus größer als die seiner Vorgänger, und so haben sich viele R5RS-Implementierungen dafür entschieden, es zu überspringen, in der Hoffnung, dass R7RS R5RS ähnlicher sein wird als R6RS. Der R7RS-Standardisierungsprozess ist derzeit im Gange und hat versucht, sowohl die Wünsche der R5RS-Implementierer als auch die der R6RS-Leute zu berücksichtigen, indem eine kleine Basissprache in ihrer ersten Arbeitsgruppe standardisiert und dann eine zweite Arbeitsgruppe beauftragt wurde, die größeren Funktionen zu standardisieren. Auf diese Weise kann die Sprache sowohl auf winziger eingebetteter Hardware als auch auf leistungsfähigeren Computern effizient und nützlich implementiert werden.

Jetzt werde ich genauer sein:

PicoLisp ist eine wirklich coole LISP. Es ist winzig! Der Autor hat es für sich selbst geschrieben und, so wie ich es verstehe, lebt er seit den 1980er Jahren davon. Wenn Sie jemals die Gelegenheit haben, an einem Vortrag von ihm teilzunehmen, sollten Sie es tun: Er ist wirklich interessant und kennt sich mit seinen Dingen aus, und Sie werden nicht einmal den geringsten Hauch von Mainstream oder Langeweile bekommen.

Ich bin nicht mit Common-Lisp-Implementierungen vertraut, daher werde ich sie nicht weiter kommentieren.

Guile ist das offizielle GNU-Schema.

Racket ist ein R6RS-Schema, aber in letzter Zeit scheint es das Netz erweitert zu haben und versucht, "als Plattform für die Erstellung, das Design und die Implementierung von Sprachen zu dienen".

Huhn soll ein praktisches Schema sein. Es basiert auf R5RS und wird bis C kompiliert. Dies stellt einen wirklich, wirklich wichtigen Vorteil dar, da es absolut trivial ist, vorhandene C-Bibliotheken zu verwenden. Daher ist Chicken wahrscheinlich das nützlichste Schema, um Perl, Python, Ruby usw. als alltägliche Skriptsprache zu ersetzen. Es gibt mehrere Leute, die es seit mehreren Jahren exklusiv für alle ihre Bedürfnisse verwenden. Es hat eine interaktive REPL sowie einen Compiler. Die Community (sowohl auf der Mailingliste als auch im IRC) ist kompetent, freundlich und hilfsbereit.

Suchen Sie nach einer Implementierung mit vielen Modulen: Dies zeigt, dass sie allgemein einsetzbar ist und dass wahrscheinlich etwas dabei hilft, die Aufgabe zu lösen.

Suchen Sie nach einer Implementierung mit einem Compiler oder zumindest etwas, das nicht ausschließlich auf IDE oder REPL basiert. Viele der Implementierungen, die für den Unterricht entwickelt wurden, sind für allgemeine Skripterstellung sehr schwierig zu verwenden.

Ich würde Chicken empfehlen, da ich es verwende. Ich habe es in meinen persönlichen Projekten verwendet und ich habe es professionell verwendet (und benutze es derzeit).

Ich möchte nicht übermäßig viel Aufwand in etwas investieren, wenn es völlig veraltet ist - ich würde es immer noch lernen, wenn es professionell "tot" wäre, aber nur mit einer akademischen Perspektive ...

Schema ist nicht beruflich tot, aber Sie müssen möglicherweise einige Anstrengungen unternehmen, um es in diesem Kontext zu verwenden. So etwas wie Hühnchen ist weit mehr als ein akademisches Unterfangen. Es kann fast alle Grundlagen von Hochsprachen abdecken, die Sie derzeit verwenden.


3
Racket ist kein R6RS-Schema. Es gibt eine der Sprachen, die die Racket-Distribution anbietet. Die eigentliche Racket-Sprache ist ein Schema, das in einer Reihe von wichtigen Punkten von RnRS abweicht (zu denen ich gemischte Gefühle habe).
JasonFruit

27

Ich kann nicht wirklich für alle Lisps sprechen, aber Clojure ist definitiv eine heiße und relevante Sprache. Eine London Clojure User Group, zu der ich Anfang dieser Woche gegangen bin, hatte über 100 Teilnehmer.

Ich fand es eine sehr aufschlussreiche Erfahrung, Lisp in Form von Clojure im letzten Jahr zu lernen (nach viel Erfahrung mit Java und C #). Hauptgründe dafür sind:

  • Es hat einen starken Schwerpunkt auf funktionale Programmierung (mehr als die meisten anderen Lisps). Der Autor und BDFL Rich Hickey hat Haskell häufig als eine seiner Inspirationen für das Sprachdesign zitiert, was bedeutet, dass Sie Dinge wie vollständig unveränderliche Datenstrukturen und faule unendliche Sequenzen usw. erhalten.
  • Makrometaprogrammierung - Die Lisp-Philosophie "Code ist Daten" ist schwer zu verstehen, es sei denn, Sie haben sie tatsächlich erlebt, aber dies ist einer der Gründe, warum Lisps so ausdrucksstark und produktiv ist
  • Hervorragende Unterstützung für die gleichzeitige Verwendung mehrerer Kerne - Ich denke, Clojure ist derzeit die beste Sprache für die gleichzeitige Programmierung. Eine aufschlussreiche Präsentation hierzu finden Sie unter http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

Es scheint aus folgenden Gründen auch eine praktische Wahl für den realen Einsatz in der Produktion zu sein:

  • Durch die Ausführung auf der JVM mit sehr einfacher Java-Interoperabilität erhalten Sie Zugriff auf alle Bibliotheken und Tools im Java-Ökosystem
  • Standardmäßig handelt es sich um eine dynamische Sprache , die sich für die Entwicklung und das Rapid Prototyping mit kaum einer Kesselplatte eignet. Sie können jedoch statische Typhinweise hinzufügen, um eine gute Leistung dort zu erzielen, wo Sie sie benötigen.

Ich persönlich kenne Leute, die Clojure in einigen Investmentbanken und Startups einsetzen. Ich habe Clojure auch als primäre Entwicklungssprache für mein eigenes Startup ausgewählt, daher bin ich bereit, mein Geld dort unterzubringen, wo mein Mund ist :-)


9

Ich lerne gerade auch Lisp (und ich liebe es). Ich benutze Common Lisp, aber ich habe auch mit SBCL , Arc (beachten Sie, das ist Paul Grahams Version von Lisp, der, wie von Vitor Braga erwähnt, Yahoo Store / Viaweb erstellt hat) und Allegro CL rumgespielt , das Visual Studio für Lisp (can GUIs erstellen (habe ich aber noch nie benutzt).

In Bezug auf Verwendungen wurde Lisp häufig in der künstlichen Intelligenz eingesetzt, aber ich bin mir ehrlich, ich bin mir nicht sicher, wie viele andere "allgemeine" Verwendungen für Lisp es gibt. Viele der Websites, die ursprünglich in Lisp erstellt wurden, wurden in anderen Sprachen neu geschrieben. Es ist daher schwer zu sagen, dass sie für die Webentwicklung verwendet werden (nicht, dass dies nicht der Fall ist, aber die größeren Websites, die sie verwenden, tun dies nicht mehr ). Nach einer schnellen Suche (sehr schnell) finden Sie hier eine Liste von Software, die in Common Lisp von Wikipedia geschrieben wurde .

[EDIT] Was die professionelle Nutzung von Lisp angeht, gibt es Jobs, bei denen Sie Lisp einsetzen müssten. Sie sind nicht so zahlreich wie Java- oder C # -Jobs, aber sie existieren. Ich denke, Lisp ist eine dieser Sprachen, die für interne Anwendungen verwendet wird und möglicherweise einen Wettbewerbsvorteil bietet, auf den Unternehmen nicht verzichten möchten, indem sie Werbung für Lisp schalten. Ich erinnere mich, dass ich einen Post auf P.SE gesehen habe, in dem Smalltalk im Finanzbereich ähnlich war.

Die Fähigkeit zu zeigen, dass Sie in der Lage sind, verschiedene Paradigmen zu lernen, kann auch dann mehr Türen öffnen, wenn Sie Lisp nicht im Job einsetzen.

"Lisp ist es wert, für die tiefgreifende Erleuchtungserfahrung gelernt zu werden, die Sie haben werden, wenn Sie es endlich bekommen. Diese Erfahrung wird Sie für den Rest Ihrer Tage zu einem besseren Programmierer machen, selbst wenn Sie Lisp selbst nie oft benutzen." - Eric Raymond, "Wie man ein Hacker wird"

[/BEARBEITEN]


7
FWIW, SBCL ist eine Implementierung von Common Lisp, ebenso wie Allegro CL.
Vatine

@Vatine - du hättest recht. Wenn es ein rotes Gesicht gäbe, würde ich es jetzt schaffen. Ich weiß nicht, warum ich angenommen habe, dass sie anders sind. Blöd mich anderer Compiler! = Anderer Dialekt :) Danke!
Jetti

@ Jeff: Nun, beide erweitern die Sprache in verschiedene Richtungen, während der "CL-Kern" interoperabel bleibt.
Vatine

@Jetti Was hast du überhaupt benutzt?
Mark C

Ich glaube, ich habe CLISP verwendet. Es befand sich auf einem VM-Image, das ich nicht mehr besitze. Ich glaube, meine Ignoranz hat mich glauben lassen, dass es allgemeines Lispeln war. Zumindest weiß ich es jetzt besser.
Jetti

8

Wenn Sie heute Lisp lernen möchten, sollten Sie sich entweder den Schläger ansehen, bei dem es sich um eine schnelle Schemaimplementierung handelt (nun ja, er weicht ein wenig vom Schema ab, ist also jetzt ein eigener Dialekt), oder die Clojure, die von der Software profitiert JVM, auf der es ausgeführt wird (so stehen Millionen von Bibliotheken zur Verfügung und Sie können es mit Ihrem eigenen Java-Code interagieren lassen).

Auch wenn Sie es nicht lernen, um es tatsächlich zu benutzen, ist es immer von Vorteil, es zu lernen: Sie lernen neue Wege, um Probleme zu denken und damit umzugehen, auch in anderen Sprachen, wenn Sie sich eine Weile um Lisp gekümmert haben.


3
Das Problem mit Scheme ist, dass Sie, wenn Sie anfangen, etwas Übung damit zu haben, nicht zu anderen Sprachen zurückkehren möchten. Ich habe gerade damit begonnen, Streams (möglicherweise unendliche, träge ausgewertete, unveränderliche Sequenzen) in C ++ zu implementieren, und das ist viel mehr Code als in Schema! Ich war wirklich überrascht von der Kombination aus Einfachheit und Kraft von Schema.
Giorgio

++ für Schläger. Es ist wirklich unglaublich VOLLSTÄNDIG, was eine der Kritiken anderer Schemata ist. Und es geht über das hinaus, was Schema in Bezug auf die Erstellung Ihrer eigenen Sprachen tun kann.
Scott Klarenbach

7

Ein wesentlicher Teil des Amazon-Backends befand sich früher in Lisp, wurde aber jetzt in C ++ umgeschrieben, wie ich gehört habe (ich muss zugeben, dass ich keine zuverlässige Quelle dafür habe).

Yahoo! Stores ist eines der klassischen Beispiele für Lisp-Web-Apps. Von der Yahoo! Speichert Ruhm, den Sie vielleicht von Paul Graham gehört haben . Graham ist einer der bekanntesten Verfechter von Lisp und schreibt ausführlich über dieses Thema. Vielleicht möchten Sie seine Website lesen, um seine Punkte zu kennen.

Früher hatte AutoCAD einen Lisp-Dialekt für sein Makrosystem. Ich weiß nicht, ob es immer noch so ist.

Schema ist eine saubere Sprache und sehr elegant. Es ist wahrscheinlich meine Lieblingsprogrammiersprache, daher bin ich möglicherweise voreingenommen. Wenn ich jetzt eine Hauptanwendung schreiben würde, würde ich wahrscheinlich eine Hauptanwendung in C schreiben, Geschäftsregeln in Scheme erweitern und definieren. Dies ermöglicht mir, Scheme und C zu nutzen - für die Geschwindigkeit und die Verfügbarkeit von Bibliotheken für fast alles.


Was würden Sie als Einstiegsbuch / Compiler für Schema empfehlen? Ich benutze Linux. Wenn es also einen Editor gibt, der für Anfänger ausdrücklich nützlich ist (wie Kile für LaTex), lassen Sie es mich wissen ...
TCSGrad

1
@ shan23 Der kleine Schemer ( ccs.neu.edu/home/matthias/BTLS ) ist die beste Wahl . Ich glaube, Emacs ist der gebräuchlichste Editor für Scheme, aber es dauert eine Weile, bis man sich daran gewöhnt hat.
Vitor Py

1
Editor für lisp, das ist einfach, benutze Emacs. Es wurde von lisp Jungs geschrieben und in lisp.
Zachary K

Sie können auch die Racket-IDE ( racket-lang.org ) verwenden. Es ist Emacs-ähnlich, verfügt jedoch über eine automatische Formatierung und Interaktion mit dem Scheme-Interpreter.
Jeremiah Willcock

Lispbox ( common-lisp.net/project/lispbox ) funktioniert sofort (einige Emacs-Erfahrungen sind hilfreich). Es basiert auf ccl ( ccl.clozure.com ), siehe auch gigamonkeys.com/book/…
Giorgio

4

Wird LISP in der heutigen Welt noch praktiziert / verwendet, oder handelt es sich um eine Legacy-Sprache wie FORTRAN / COBOL? Ich meine, abgesehen von der Beibehaltung des vorhandenen Codes, wird dieser überhaupt für neue Projekte verwendet?

Ich kenne einige Leute, die in einigen Startups im Silicon Valley Lisps spielen, und ich weiß, dass Amazon.com Lisp von Anfang an verwendet (obwohl ich gehört habe, dass sie es aus irgendeinem Grund durch C ++ ersetzen?)

Aber eine Firma, die man im Auge behalten sollte, ist Naughty Dog . Alle ihre Spiele sind mit einem Lisp-Dialekt geschrieben. Ursprünglich haben sie ihre eigenen gerollt, aber sie verwenden MZScheme in der Uncharted-Serie.

Was ist der am häufigsten verwendete Dialekt? Ich bin auf Scheme und Common Lisp als die 2 am weitesten verbreiteten Dialekte gestoßen und wollte, dass Sie wissen, welche davon am beliebtesten / nützlichsten ist - und wäre sehr erfreut, wenn Sie Ressourcen vorschlagen könnten, mit denen ein Anfänger beginnen kann.

Ich würde wetten, dass Common Lisp, Clojure, Scheme und Emacs Lisp die vier am häufigsten verwendeten Dialekte sind, und von diesen würde ich vermuten, dass Scheme die am häufigsten verwendete ist. Natürlich habe ich nichts, womit ich das belegen könnte. :)

Ich mag SICP und den kleinen Schemer eher, wie von anderen vorgeschlagen, aber ich würde auch Land of Lisp vorschlagen , was eine ziemlich unterhaltsame Lektüre ist. :)


Land of Lisp ist in der Tat eine erstaunliche Lektüre.
Chiron

@ 4bu3li Hast du keine Gegenstimme?
Mark C

1
Über Naughty Dog: Das ist nicht ganz richtig, ihre PS2-Spiele wurden in GOAL geschrieben, einer lispelhaften Sprache ... Aber seit dem Umstieg auf die PS3 sind sie auf C ++ umgestiegen. MZScheme wird hauptsächlich als Makro-Präprozessor verwendet, der in C ++ geschrieben und für einige Asset-Prozesse verwendet wird. Einige ihrer Skripte sind in S-Exps geschrieben. Auf der PS3 läuft jedoch kein MZScheme-Code.
Arelius

2

Ich denke, es hängt zum Teil davon ab, was Sie damit anfangen wollen - wenn Sie Ihre Einsichten in die verschiedenen Konzepte des Programmierens vertiefen und sich zu einem besseren Programmierer machen wollen, dann würde ich sagen, dass es sich lohnt, zumindest ein bisschen Lisp zu lernen. Wenn Sie nach einer weiteren Sprache suchen, die Sie Ihrem Lebenslauf hinzufügen können, um einen Job in dieser Sprache zu finden, möchten Sie wahrscheinlich woanders suchen. Es gibt nicht so viele Lisp-Jobs.

Ich persönlich versuche, entweder SBCL oder in jüngerer Zeit Clojure zu verwenden (und einige Emacs Lisp, aber das liegt daran, dass ich ein langjähriger Emacs-Benutzer bin - ich würde versuchen, Emacs Lisp zu lernen, wenn ich Lisp zu lernen versuche). Jetzt muss ich nur noch die Zeit finden, um tatsächlich mit diesen Sprachen zu spielen ...


1
Es ist größtenteils das erste ... da es ziemlich offensichtlich ist, dass, wenn mir das gelingt, es meinen Lebenslauf überhaupt nicht verletzen wird :). Aber im Ernst, ich möchte eine Perspektive auf die verschiedenen "Programmierstile" haben, damit ich eine gute Vorstellung davon habe, welchen ich in verschiedenen Szenarien verwenden soll. Ich muss alle Probleme als Nägel behandeln !!)
TCSGrad

2

Ich weiß nicht, dass es in LISP eine Menge Jobs gibt, ich kann sie auf keinen Fall sehen. Aber ich erinnere mich an eine lange Zeit, in der ich über eine NASA-Sonde gelesen habe, auf der LISP ausgeführt wurde und die neuen Code von der Erde einfügen konnte.

Auch in New York ist die Clojure Meetup Gruppe riesig. Ich vermute, wenn Sie interessiert sind und zu Ihrer Clojure-Meetup-Gruppe gehen, finden Sie möglicherweise Möglichkeiten, sich zu vernetzen und Jobs zu finden (keine Clojure-Jobs, sondern Dinge wie Java / C ++ / etc.) Es scheint im Raum New York absolut gewaltig zu sein, andere Gebiete können davon abweichen.

Auch LISP ist eine andere Denkweise. Zusätzlich führen LISP und SQL dazu, dass jede Menge verschachtelter Ausdrücke verwendet werden. Ich habe tonnenweise SQL verwendet und festgestellt, dass LISP sinnvoller ist. Wenn Sie jedoch Probleme mit SQL haben, sich an geschachtelte Klammern und Ausdrücke zu gewöhnen, während Sie LISP verwenden, werden SQL-Ausdrücke wahrscheinlich viel einfacher herauszufinden sein.

Ein klassisches Beispiel ist die Implementierung von MAX (a, b, c). Sie könnten eine verschachtelte Funktion mit einer Reihe von if-Anweisungen erstellen. Oder du könntest einfach sagen

MAX (MAX (a, b), c)

und benutze zwei einfache verschachtelte Aufrufe der beiden Items MAX, die für mich leichter zu lesen sind. Wenn Leistung ein Problem ist, möchten Sie es möglicherweise auch auf die andere Weise ausführen. Ich habe mich jedoch nicht darum gekümmert, die Anzahl der Vergleiche zu ermitteln, wenn Sie die einzelnen Methoden verwenden Ausdrücke mehrere Male erhalten Sie möglicherweise nicht das erwartete Ergebnis, da der Ausdruck möglicherweise mehrere Male ausgewertet wird. Achten Sie also auf Nebenwirkungen ...


3
Sie können MAX tatsächlich vereinfachen durchMAX(MAX(a b) c)
Andrea

Du hast recht, das bekomme ich, wenn ich kurz nach dem Aufwachen antworte. Ich habe die Antwort angepasst.
Cervo

2
Das NASA-Projekt war Deep Space 1: flownet.com/gat/jpl-lisp.html
Frank Shearar

2

Zwei zusätzliche Punkte:

Erstens ist Lisp eine großartige Sprache zum Schreiben von Code, in der Interaktionen zwischen Funktionen oder Daten häufig komplex sind. In vielen gängigen Sprachen müssen Sie, wenn Sie sich nicht sicher sind, warum Ihr Programm das tut, was es tut, spezielle Funktionen schreiben, mit denen Sie den internen Status des Programms überprüfen können. In einigen Sprachen müssen Sie dann warten, bis der Code neu kompiliert wurde. Natürlich kann es Tools wie Debugger geben, die dabei helfen. In Lisp brauchen Sie jedoch nur eine Möglichkeit, das Programm zu stoppen, und dann haben Sie in der Regel Zugriff auf alles in Lisp. In Common Lisp tippe ich manchmal einfach ^ C oder rufe anerrorin eine einzelne Funktion (was das einzige ist, was neu kompiliert werden muss und Sie müssen nichts tun, um es neu zu kompilieren). Sobald ich das Programm stoppe, werde ich sofort in einen Debugger geworfen - aber der Debugger gibt mir alle Möglichkeiten von Lisp und ich kann den Debugger verlassen, bestimmte Funktionen aufrufen usw. Ich kann jede der Datenstrukturen leicht untersuchen in meinem Programm. Die meisten Regelungen sollten ähnliche Praktiken zulassen. Lisp ist in dieser Hinsicht nicht einzigartig, aber was es bietet, geht über das hinaus, was viele populäre Sprachen bieten.

Zweitens: Wenn Sie mit einem Lisp-Dialekt experimentieren möchten, würde ich dies nicht tun, ohne (a) einen Editor zu verwenden, der mit Klammern übereinstimmt, und (b) die richtige Lisp-Einrückung zu erlernen. Es wäre eine gute Idee, einen Editor zu verwenden, der auch für Sie die richtige Einrückung annähert. Die Formatierung von C / C ++ / Java-Code wurde für Sprachen mit weniger Klammern / Klammern / Klammern als Lisp entwickelt. Der hübsche Lisp-Druckstil funktioniert gut, wenn Sie mit ihm vertraut sind, und Sie werden nicht durch Klammern verwirrt oder verschwenden die Hälfte Ihres Platzes, indem Sie eine schließende Klammer pro Zeile setzen.


1

Im Moment habe ich den Eindruck, dass Lisp hauptsächlich in Beratungsgeschäften verwendet wird (nicht, dass Beratungsgeschäfte es meistens verwenden).

Es ist ein bisschen übertrieben für praktische Software. Hauptsächlich, weil die Leute nicht daran gewöhnt sind, glaube ich.

Traditionell ist Scheme ein ziemlich akademischer Dialekt von Lisp, und Common Lisp war der Branchendialekt.

Lisp ist besonders nützlich für symbolische Manipulationen und reflexionsähnliche Fähigkeiten.

Der Code, den ich zum Erlernen von Lisp geschrieben habe, war beispielsweise ein Programm, das zufällige Lambda-Funktionen konstruierte, sie auswertete und dann ausführte, um den Unterschied der Funktion zu einer Zielfunktion zu minimieren. Das alles war direkte Manipulation. In einer Sprache wie C ++ oder Java hätte ich eine Darstellung für die Funktionen erfinden müssen, die der Computer manipulieren würde.


Interessanter Punkt, den Sie zu den Unterschieden zwischen Schema / Common Lisp gemacht haben - können Sie das Warum / Wie darlegen?
TCSGrad


1

Ich möchte eine Perspektive über Common Lisp und Scheme hinzufügen. Ich habe Clojure aufgrund der JVM vermieden, daher habe ich nicht viel Perspektive darauf.

Schema ist eine schöne prägnante, gut definierte Sprache. Es wurden viele Entscheidungen getroffen, die CL aufgrund des Erbes treffen musste, und es wurde ein reinerer Ansatz gewählt. Beispielsweise befinden sich Variablen und Funktionen im selben Namespace. Die Standardsprache ist kleiner und prägnanter, was sich gut eignet, um Ihnen die Dinge beizubringen, in denen lisp gut ist. Beispielsweise wird die Verwendung von Rekursion anstelle von Iteration unter Druck gesetzt, da standardmäßig keine iterativen Schleifen vorhanden sind und eine Optimierung des Tail Calls erforderlich ist . Das Schema hat ein sehr interessantes hygienisches Makrosystem, dessen Lernen von großem Wert ist. Aber IMO würde ich empfehlen, zuerst unhygienische Makros im CL-Stil zu lernen, von denen die meisten (?) Schemadialekte mindestens eine Implementierung bieten, auch wenn sie nicht Teil der Spezifikation sind. Da es sehr wahrscheinlich ist, dass Sie eine Sprache lernen wollen, um zu lernen, warum ich

Abgesehen davon ist die Community von Scheme fragmentiert und scheint, abgesehen von ein paar kleinen Taschen, hauptsächlich der Erforschung der Erledigung echter Aufgaben gewidmet zu sein ... Zum Beispiel hat jeder Dialekt seinen eigenen Paketmanager, und Pakete sind meist nicht portierbar über Dialekte hinweg, was ein großes Problem in der Systemgemeinschaft ist.

Common Lisp hingegen scheint der pragmatischere Ansatz für die Entwicklung einer Sprache zu sein. Der Standard ist so, dass viel Lisp-Code zwischen Implementierungen portierbar ist, viele Compiler sind schnell und gut optimiert. Es gibt eine große Anzahl von Paketen, von denen viele zwischen Implementierungen portierbar sind. Und anscheinend wird eine (vergleichsweise) große Menge echter Produkte in der Sprache erstellt. Und mit say quicklisp kommt das Paketmanagement dem einer modernen Community wie say Ruby oder Node einigermaßen nahe. CL ist jedoch nicht ohne Mängel, es hat zu diesem Zeitpunkt eine sehr große Spezifikation im Vergleich zum Schema, und sogar das Objektsystem CLOS, das traditionell als Bibliothek in Lisps geschrieben wird, ist Teil der Spezifikation IIRC. Und Sie können fühlen, wie das Erbe in einem großen Teil des Systems verankert ist.

Andernfalls könnte ich nicht über Clojure sprechen, und Emacs Lisp ist eindeutig die richtige Wahl, wenn Sie Emacs-Erweiterungen schreiben möchten, und ganz offensichtlich nicht die richtige Wahl für andere Software.

TLDR; Wenn Sie lernen möchten, empfehle ich Schema. Wenn Sie jedoch Software erstellen möchten, empfehle ich Common Lisp der beiden wichtigsten Lisp-Varianten.


Übrigens ist PLT Racket eine Sprache, die eher dem Schema ähnelt und ursprünglich aus der Schema-Community stammt, die scheinbar versucht, für echte Arbeit nützlich zu sein. Wenn ich heutzutage Code in ein Schema schreiben würde, wäre es wahrscheinlich entweder PLT oder Chicken Scheme, aber das letztere könnte auf eine Schwachstelle in meinem Herzen zurückzuführen sein.
Arelius

0

Ich habe viel aus den Antworten gelernt. Vielen Dank an alle, die zu diesem aufschlussreichen Gespräch beigetragen haben.

Ich sollte newLISP erwähnen . Obwohl es sich sowohl von CL als auch von Scheme ein wenig unterscheidet, implementiert es viele sehr nützliche Funktionen. Ich finde den http-Server, die Multi-Processing-Funktionalität (Cilk) und die Remote-Evaluierungsfunktionen sehr sauber und benutzerfreundlich.

Die einzelne ausführbare Datei ist klein, schnell und enthält viele coole Batterien.


Es ist wahrscheinlich fair, es zu erwähnen, aber ich würde es nicht wirklich empfehlen ... Kein lexikalisches Scoping und keine Module zum Beispiel - im Ernst? Ich verstehe nicht wirklich, was newLISP zu erreichen versucht.
cji

2
Du hast recht - es ist anders. Es nutzt Kontexte und dynamisches Scoping und aus meiner Erfahrung sind Module und Kontexte miteinander verbunden. Es wird nicht versucht, ein anderes CL oder Schema zu sein. Das Lesen der Seite über die Unterschiede ( newlisp.org/index.cgi?page=Differences_to_Other_LISPs ) wirft ein Licht auf die Designprobleme. Ebenso würde ich es niemandem empfehlen, der ein CL- oder Scheme-Erlebnis haben möchte. Aber für einige Anwendungsfälle könnte es eine sinnvolle Wahl sein. Das ist das Schöne am Open Source-Ökosystem - viel Auswahl!
CyberFonic

0

Ein weiterer Faktor, der bei der Auswahl des zu lernenden Lisp-Dialekts berücksichtigt werden muss, kann die Anzahl und Qualität der Implementierungen sein. Wenn ein Dialekt nur eine oder zwei Implementierungen enthält, bleiben Sie bei ihren Fehlern, bis diese behoben sind, und es besteht immer die Möglichkeit, dass die Leute aufhören, die Implementierung zu verfeinern. An sich ist das kein Grund, keinen Single-Implementation-Dialekt von Lisp zu verwenden, aber es ist etwas zu berücksichtigen. Ein Vorteil von Scheme und Common Lisp ist, dass es viele Implementierungen dieser Dialekte gibt. Da in beiden Sprachen Standards veröffentlicht wurden, wird bei relativ neuen Implementierungen wahrscheinlich zumeist derselbe Code ausgeführt. Einige dieser Implementierungen gibt es schon seit langer Zeit, sie befinden sich jedoch noch in der aktiven Entwicklung: Sie sind jetzt qualitativ hochwertige Implementierungen und werden noch weiterentwickelt.


Gut, laut diesen Benchmarks
schneidet

Danke Andreas. Du hast recht. Zeigt, wie viel ich über die JVM weiß - nicht viel. Zum Teil wurde ich von ABCL, einem relativ langsamen, aber ansonsten netten JVM-basierten CL, in die Irre geführt.
Mars

Ich würde argumentieren, wenn Sie ein Lisp auf der JVM wollen, gehen Sie für Clojure. Es ist nicht perfekt, aber es ist ein echtes Vergnügen (IMHO)
AndreasScheinert
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.