Wenn Sie ECMAScript Lisp nennen, behaupten Sie im Grunde, dass jede dynamische Sprache Lisp ist. Da wir bereits eine "dynamische Sprache" haben, reduzieren Sie "Lisp" auf ein nutzloses Synonym dafür, anstatt ihm eine spezifischere Bedeutung zu geben.
Lisp sollte sich korrekt auf eine Sprache mit bestimmten Eigenschaften beziehen.
Eine Sprache ist Lisp, wenn:
-
Sein Quellcode besteht aus baumstrukturierten Daten, die in Form von verschachtelten Listen ausgedruckt werden. Jede mögliche Baumstruktur hat eine Darstellung in der entsprechenden Notation und kann als Konstrukt mit einer Bedeutung versehen werden; die Notation selbst muss nicht erweitert werden, um die Sprache zu erweitern.
-
Die baumstrukturierten Daten sind eine Hauptdatenstruktur in der Sprache selbst, die Programme anfällig für Manipulationen durch Programme macht.
-
Die Sprache hat den Datentyp Symbol. Symbole haben eine gedruckte Darstellung, die interniert Wenn zwei oder mehr Instanzen der gleichen gedruckten Notation für ein Symbol in der Notation erscheinen, bezeichnen sie alle dasselbe Objekt.
- Die Haupttugend eines Symbolobjekts besteht darin, dass es sich von allen anderen Symbolen unterscheidet. Symbole werden in der Semantik von Lisp-Programmen auf unterschiedliche Weise mit verschiedenen anderen Entitäten gepaart und dienen so als Namen für diese Entitäten.
- Ein Lisp-Dialekt hat zum Beispiel typischerweise Variablen, genau wie andere Sprachen. In Lisp werden die Variablen durch Symbole (die Objekte im Speicher) und nicht durch Textnamen bezeichnet. Wenn ein Teil eines Lisp-Programms eine Variable definiert
a
ist die Syntax dafür a
ist ein Symbolobjekt und nicht die Zeichenkette "a"
, was für den Druck nur der Name des Symbols ist. Ein Verweis auf die Variable, der Ausdruck geschrieben als a
an anderer Stelle im Programm, ist ebenfalls ein on-Objekt. Aufgrund der Funktionsweise von Symbolen handelt es sich um dasselbe Objekt; diese Objektgleichheit verbindet dann den Verweis mit der Definition. Objektgleichheit kann implementiert werden als Zeigergleichheit auf der Ebene der Maschine. Wir wissen, dass zwei Symbolwerte gleich sind, weil sie Zeiger auf denselben Speicherplatz im Heap sind (ein Objekt vom Typ Symbol).
- Ein Beispiel dafür ist der NewLisp-Dialekt, der über eine nicht-traditionelle Speicherverwaltung für die meisten Datentypen, einschließlich verschachtelter Listen macht eine Ausnahme für Symbole, indem es sie auf die oben beschriebene Weise verhält. Ohne dies wäre es nicht Lisp. Zitat: "Objekte in newLISP ( ohne Symbole und Kontexte) werden per Wertkopie an andere benutzerdefinierte Funktionen übergeben. Infolgedessen benötigt jedes newLISP-Objekt nur eine Referenz." [Hervorhebung von mir]. Auch die Weitergabe von Symbolen, z. B. durch Wertkopie, würde ihre Identität zerstören: Eine Funktion, die ein Symbol empfängt, würde nicht das ursprüngliche Symbol erhalten und daher dessen Identität nicht korrekt empfangen.
-
Zusammengesetzte Ausdrücke in einer Lisp-Sprache - also solche, die keine einfachen Primärausdrücke wie Zahlen oder Zeichenketten sind - bestehen aus einer einfachen Liste, deren erstes Element ein Symbol ist, das die Operation angibt. Die verbleibenden Elemente, sofern vorhanden, sind Argumentausdrücke. Der Lisp-Dialekt wendet eine Art von Auswertungsstrategie an, um den Ausdruck auf einen Wert zu reduzieren und eventuelle Nebeneffekte hervorzurufen.
-
Ich würde vorläufig argumentieren, dass Listen, die aus binären Zellen bestehen, die Wertepaare enthalten und durch ein spezielles leeres Listenobjekt abgeschlossen werden, wahrscheinlich als Teil der Definition von Lisp betrachtet werden sollten: die ganze Angelegenheit, dass man aus einer bestehenden Liste eine neue Liste machen kann, indem man ein neues Element an den Anfang stellt, und die einfache Rekursion auf den "ersten" und den "Rest" einer Liste und so weiter.
Und dann würde ich genau hier aufhören. Einige Leute glauben, dass Lisp-Systeme interaktiv sein müssen: eine Umgebung mit einem Hörer bereitstellen, in der alles veränderbar ist und jederzeit neu definiert werden kann und so weiter. Manche glauben, dass Lisp erstklassige Funktionen haben muss: dass es eine lambda
Operator und so weiter. Eingefleischte Traditionalisten könnten sogar darauf bestehen, dass es sein muss car
y cdr
Funktionen, die gepunktete Paarnotation, die unzulässige Listen unterstützt, und die Tatsache, dass Listen aus Zellen bestehen müssen und durch das Symbol nil
die die leere Liste bezeichnet, und auch ein boolesches false. Das Bestehen auf car
y cdr
erlaubt es Scheme, ein Lisp zu sein, aber nil
wobei der Listenabschluss und falsche Regeln
Je mehr wir jedoch in die Definition von "Lisp-Dialekt" eindringen, desto politischer wird es; die Leute regen sich darüber auf, dass ihr Lieblingsdialekt (den sie vielleicht selbst entwickelt haben) aufgrund einer Formalität ausgeschlossen wird. Das Beharren auf car
y cdr
erlaubt es Scheme, ein Lisp zu sein, aber nil
als Listenabschluss und falsch schließt es aus. Was, Scheme ist kein Lisp?
Ausgehend von den obigen Ausführungen ist ECMAScript also kein Dialekt von Lisp. Allerdings enthält eine ECMAScript-Implementierung Funktionalität, die als Lisp-Dialekt dargestellt werden kann und zahlreiche solche Dialekte entwickelt worden sind . Jemand, der aus emotionalen Gründen möchte, dass ECMAScript als Lisp angesehen wird, sollte sich vielleicht damit zufrieden geben, dass die Semantik zur Unterstützung von Lisp vorhanden ist und nur eine geeignete Schnittstelle zu dieser Semantik benötigt wird, die in ECMAScript entwickelt werden kann und mit ECMAScript-Code interoperabel ist.