Sind eckige Klammern und geschweifte Klammern in Clojure immer noch S-Ausdrücke?

11

Ich versuche Lisp zu lernen und sehe mir alle Lisps da draußen und ihre Unterschiede an.

Ich sehe, dass Sie in einigen Implementierungen von Scheme eckige Klammern aus Gründen der Lesbarkeit austauschbar mit runden Klammern verwenden können. Da sie also gleich behandelt werden, gehe ich davon aus, dass sie wie alles andere nur S-Ausdrücke sind.

In Clojure sehe ich jedoch, dass eckige Klammern und geschweifte Klammern verwendet werden, um verschiedene Datentypen wie Vektoren usw. darzustellen. Sind diese auch noch gültige S-Ausdrücke oder müssen sie als Atome betrachtet werden? Bricht dies nicht das gesamte Konzept der S-Ausdrücke und macht Clojure dadurch zu einem "unreinen" Lisp?

Mydoghaswürmer
quelle

Antworten:

10

Die wörtliche Notation für Vektoren und Karten (dh eckige Klammern und geschweifte Klammern) ist nur Lesezeitzucker , und alles, was Sie mit dieser Notation darstellen können, kann auch mit S-Ausdrücken dargestellt werden. Infolgedessen gibt es keinen Verlust an Leistung oder Homoikonizität, und tatsächlich sind Lesermakros (von denen ich verstehe, dass sie noch leistungsfähiger sind) in einer Reihe von Lisps verfügbar.

Beachten Sie übrigens, dass Clojure jetzt einen Mechanismus zum Erstellen von benutzerdefinierten "markierten" Literalen bietet, die wie andere Literale in S-Ausdrücke umgewandelt werden, bevor sie kompiliert und interpretiert werden.

tvachon
quelle
1
Mmmm, deine Antwort lässt mich denken, dass ich weniger verstehe, als ich dachte, ich verstehe Lisp. Sie sagen also (glaube ich), dass die eckigen und geschweiften Klammern selbst keine S-Ausdrücke sind. Ich dachte, die ganze Idee mit Lisp-Input ist, dass alles ein S-Ausdruck ist. Sieht so aus, als müsste ich noch etwas graben, bevor ich zurückkomme, um Ihre Antwort erneut zu lesen. Vielen Dank!
Mydoghaswürmer
Das ist richtig - sie sind keine S-Ausdrücke. Die Lisp-Syntax beginnt mit S-Ausdrücken, da alles, was in der Sprache ausgedrückt werden kann, mit S-Ausdrücken ausgedrückt werden kann. Die Lisp-Syntax endet hier jedoch nicht: Viele Lisp-Compiler haben eine explizite Lese-Makro-Phase, in der spezielle Muster im Quellcode in S-Ausdrücke umgewandelt werden. Auf diese Weise können Sprachautoren Programmierern eine benutzerfreundliche Syntax anbieten. Es ist wichtig zu beachten, dass nichts von den Vorteilen der Homoikonizität verloren geht, da alles, was mit diesen speziellen Literalen dargestellt wird, auch in S-Ausdrücken dargestellt werden kann.
TVachon
3

S-Ausdrücke sind eine Textdarstellung für Daten. Zahlen, Symbole, Nachteile, Zellen, Listen, Zeichenfolgen, ... Common Lisp bietet auch Textdarstellungen für Arrays, Vektoren, weitere Zahlentypen, Zeichen, ... Common Lisp bietet auch einen vom Benutzer erweiterbaren Reader, den der Benutzer hinzufügen kann mehr Textdarstellungen für Datentypen. Manchmal wird dieser Mechanismus auch verwendet, um die Syntax der Programmiersprache Lisp zu ändern (z. B. um Infix-Ausdrücke oder Anweisungen aus anderen Programmiersprachen zu unterstützen).

Wenn also ein Lisp-Dialekt Textdarstellungen für zusätzliche Datentypen bietet, passt dies gut zur Idee von S-Ausdrücken.

Rainer Joswig
quelle