Hat Lisp noch eine Besonderheit, die NICHT von anderen Programmiersprachen übernommen wurde?
Mit Lisp meine ich alle Lisp-Programmiersprachen als Ganzes. Mir wurde gesagt, wie großartig Lisp ist und ich weiß, dass viele Sprachen von Lisp inspiriert wurden. Aber hat Lisp noch ein exklusives Designmerkmal, das in keiner anderen Sprache möglich ist?
Der Grund, warum ich die Frage gestellt habe, ist, dass ich vor kurzem als Amateurprogrammierer angefangen habe, Clojure nur zum Spaß zu lernen , und das Ergebnis ist, dass ich viele Posts und Kommentare zu Lisp gefunden habe, die nur eines sagen: "Lisp ist einzigartig ", aber andere moderne Programmiersprachen haben Lisp bereits viele Ideen abgenommen und gestohlen, darunter Bedingungen, Rekursion und die Funktion als erstklassiger Bürger. Und selbst Metaprogrammierungen können in vielen Sprachen durchgeführt werden.
Habe ich etwas verpasst und ist "Lisp immer noch anders"?
Oder ich habe Glück, weil andere moderne Sprachen alle guten Teile von Lisp gestohlen haben, so dass es nicht notwendig ist, in die Welt von Lisp in Klammern zu graben , und "Lisp war anders".
Antworten:
Eine kanonische Referenz für diese Art von Fragen ist Paul Grahams What Made Lisp Different . Die beiden verbleibenden Hauptmerkmale von Lisp, die laut diesem Artikel zum Zeitpunkt seines Schreibens nicht allgemein verfügbar sind, sind:
Der Kommentar spricht jeden Punkt an und nennt beliebte Sprachen, in denen diese Funktion verfügbar ist.
Beachten Sie, dass dieser Artikel zuletzt im Jahr 2002 überarbeitet wurde und in den letzten 11 Jahren eine Vielzahl neuer Sprachen hinzugekommen ist, von denen einige möglicherweise alle diese Lisp-Funktionen in ihren Entwurf einbeziehen.
quelle
eval
oder ähnliches, und einige können Metaprogramme erstellen , z. B. Haskells Template Haskell. Das (wohl) Einzigartige an Lisp ist, dass die Repräsentation für Daten, Code und Meta-Code identisch ist - nicht nur in der Syntax, sondern es ist wirklich dasselbe.Die Frage ist schwierig zu beantworten, da jemand alle Sprachen beherrschen muss, um zu wissen, dass in Lisp keine andere Sprache über eine bestimmte Funktion verfügt. Daher basiert das Folgende auf den Sprachen, mit denen ich Erfahrung habe.
Aus der Spitze von meinem Kopf, Bedingungen sind etwas , dass ich nicht in einer anderen Sprache , gesehen habe. Denken Sie an "Ausnahmen", bei denen der Aufrufstapel nicht abgewickelt wird und bei denen der Aufrufer einen Wiederherstellungswert an die Ausnahmesite senden kann, ohne den Aufrufstapel zwischen dem Handler und der Quelle der Ausnahme zu stören. Um fair zu sein, das ist wirklich nur eine spezielle Anwendung von Fortsetzungen, so Ruby und Scheme (mindestens) kann dies tun.
Lisps Makrosystem profitiert von Regelmäßigkeit / Homoikonizität, aber Scala plant, sie als stabiles Feature in 2.12 aufzunehmen, und Template Haskell behauptet, ähnliche Features zu haben. Ich würde argumentieren, dass sie syntaktisch komplexer sind als mit Lisp, aber die Generierung von Code während der Kompilierung ist trotzdem vorhanden.
Wenn Sie sich das vorstellen, ist das direkte Bauen von Formularen in Lisp nur eine Art von Makro: Ich habe nirgendwo anders ein Äquivalent von Compiler- oder Reader-Makros gesehen.
Die Fähigkeit einiger Dialekte (z. B. SBCL ), ein vollständiges, wiederaufnahmefähiges Prozessabbild zu speichern, ist cool, aber auch dies ist kein Einzelfall: Smalltalk tut dies seit Jahrzehnten.
In vielen anderen Sprachen ist die Zuweisung von Destrukturierungen bei der Rückgabe von Arrays möglich, aber der Ansatz # 'values und #' multiple-value-bind / let-values scheint immer noch spezifisch für Common Lisp und Scheme zu sein (die auch noch 'reguläre' Destrukturierungen durchführen können ). Perls 'wantarray' ermöglicht es einer Funktion, zu bestimmen, ob sie in einem skalaren, Listen- oder ungültigen Kontext aufgerufen wird, damit ihr Rückgabewert auf ähnliche (-ish) Weise angepasst werden kann, aber ich habe nicht gesehen, dass mehrere Rückgabewerte "wahr" sind of Scheme / CL.
In Bezug auf den Sprachfunktionen, gibt es wahrscheinlich nicht viel , dass Lisp kann tun , dass andere Sprachen nicht (Turing Vollständigkeit zu sein , was es ist). Was es ist , jedoch ist eine Sprache , wo der Code in Bezug auf seine eigenen Datenstrukturen zum Ausdruck kommt, so dass der Big Idea ™ -Das Code Daten etwas , das mit zur Arbeit relativ einfach ist.
quelle
Nach so vielen Jahrzehnten glaube ich, dass es nichts Exklusives für Lisp gibt. Aber auch heute noch gibt es viele interessante Dinge, die außerhalb von Lisps schwer zu finden sind. Ein paar Dinge, die mir einfallen:
Schließlich gibt es noch viel mehr von Lisp zu lernen, das sich nicht mit der Sprache selbst befasst, sondern Teil der Lisp-Geschichte wurde und sich mit der Zeit verirrt hat. ZB Interlisp, Symbolics Genera, etc ... Wenn Sie Genera noch nie in die Finger bekommen haben, lesen Sie diesen Thread in comp.lang.lisp, in dem Kent Pitman beschreibt, wie "Emacs nur ein blasser Schatten von Generas Zmacs ist" Ein leistungsstarkes Lisp-System, an dem Zmacs beteiligt war und das auf einer Lisp-Maschine lief.
quelle
Es ist nicht unbedingt eine bestimmte Funktion . Es ist das gesamte Erscheinungsbild und die Funktionsweise bestimmter Funktionen.
JavaScript oder Java verfügen über zahlreiche Funktionen von Lisp (virtuelle Maschine, Compiler / Evaluator, Garbage Collection usw.). Aber JavaScript zum Beispiel fehlt der symbolische Programmierteil, es fehlen mathematische Fähigkeiten (intern hat es nur Gleitkommazahlen), es fehlt die Fehlerbehandlung und so weiter.
Viele gängige Lisp- Systeme sind für eine Entwicklungsmethode optimiert, bei der neue Software schrittweise erweitert wird, indem die Lisp-Sprache in verschiedenen Dimensionen mithilfe verschiedener Meta-Programmiertechniken erweitert wird - ohne dass die Software für längere Zeit neu gestartet werden muss. Daher muss es flexibel und erweiterbar sein - aber gleichzeitig muss es robust sein. Ändern der Sprache (Makros sind im Grunde eine Möglichkeit für den Benutzer, den Compiler zu erweitern), ohne das Programm zum Absturz zu bringen.
So etwas wie JavaScript wird jetzt auch zum Erweitern eines Programms verwendet, normalerweise eines Webbrowsers. Aber die meiste Zeit macht man nicht viel Metaprogrammierung in JavaScript - abgesehen von einigem OOP- Hackery.
Beispiel:
Eine allgemeine fortgeschrittene Mathematik-Software für den Bereich der Computeralgebra kann auf zwei Arten implementiert werden: Schreiben Sie die Engine in C mit einer speziellen Sprache (wie Mathematica ) oder in einem fortgeschritteneren Lisp-Dialekt. Macsyma / Maxima in Common Lisp, Reduce in Standard Lisp, Axiom in Common Lisp.
(Es gibt auch eine oder mehrere in Python.)
Es gibt nicht viele Systeme, die den Funktionsumfang von Axiom bieten , das auf Common Lisp läuft.
Was Lisp für diese Art von Anwendungen attraktiv gemacht hat, ist eine Mischung aus Funktionen: fortgeschrittene grundlegende Mathematik (Bignums, Verhältnisse, ...), symbolische Berechnung, interaktiver Compiler usw. ebene sprache. Auf diese Weise hat man 50% oder mehr eines typischen Lisp-Systems implementiert.
quelle
Nicht so weit ich weiß. Forth ist leicht so dynamisch wie Lisp, vielleicht umso mehr, als dynamischer Code in Forth wie normaler Forth-Code aussieht, während Lisp-Makros andere Funktionen als normaler Lisp-Code verwenden ( zumindest in Clojure habe ich kein Syntaxzitat außerhalb eines Makros verwendet) und Infolgedessen sehen sie wirklich anders aus als normaler Lisp-Code. Ein Beispiel für die Dynamik von Forth ist die Implementierung von Kommentaren in Forth :
quelle
Lisp hat viele Dialekte und jeder von ihnen hat seine eigenen Funktionen. Mein Lieblingsfeature, das wahrscheinlich von keiner anderen Sprache übernommen wird, ist der "Spaghetti Stack" von Interlisp .
Der Spaghetti-Stapel ist wie ein Verschluss, aber auf Steroiden. Es speichert nicht nur die aktuelle Funktion, sondern den gesamten Kontext bis zum Anfang des Stapels. Eine Art Co-Routine , mit der Ausnahme, dass Sie diese beliebig erstellen können, was zu einer Hierarchie von Stapelkontexten führt.
quelle