Durch Ändern des Readers kann eine neue Lesesyntax eingeführt werden (z. B. #(hash table)und '(quoted)). Viele Lisps haben diese Fähigkeit, aber für elisp scheint es keine solche Möglichkeit zu geben.
Emacs Lisp verfügt nicht über einen Lisp-programmierbaren Reader.
Drew
@wasamasa Nun, das ist immer eine Option :) Keine tragbare , aber eine Option.
Sean Allred
Ich denke "Viele Lisps haben das." ist keine eigentliche Frage. Ich hätte viel lieber eine echte Frage. Ich schlage vor, den Titel zu verkürzen und ihn in den Textkörper umzuformulieren.
YoungFrog
@YoungFrog Änderungen sind willkommen. Ich konnte mir nichts Direkteres oder Angemesseneres vorstellen, ohne übermäßig wortreich zu sein. Die Frage ist einfach; es muss nicht lange dauern.
Sean Allred
Antworten:
11
Es stellt sich heraus, dass das Handbuch impliziert, dass Sie keine Reader-Makros ausführen können.
Reader-Makros. Common Lisp enthält einen zweiten Makrotyp, der auf der Ebene der einzelnen Zeichen funktioniert. Beispielsweise implementiert Common Lisp die Anführungszeichen-Notation durch ein Reader-Makro namens ', während Emacs Lisps Parser Anführungszeichen nur als Sonderfall behandelt. Einige Lisp-Pakete verwenden Reader-Makros, um spezielle Syntaxen für sich selbst zu erstellen, die der Emacs-Parser nicht lesen kann.
Ich denke, es geht um Common-Lisp-Software, die spezielle Reader-Makros anstelle von Elisp verwendet. Auf dieser Seite wird CL-Code nach Elisp portiert. Und ja, offiziell ist der Leser nicht anpassbar, aber siehe meine Antwort unten ...
Mischoo
Das andere Problem ist, dass der Rest von Emacs es nicht merkt, auch wenn Sie eine neue syntax.c
Lesersyntax eingeführt haben.
9
Anscheinend kann es getan werden, aber bereiten Sie sich auf eine Menge Arbeit vor. (oder auch nicht, weil ich es irgendwann mal angehen werde ;-).
Jetzt muss nur noch ein vollständiger Lisp-Reader implementiert werden, der alles unterstützt, was Elisp tut, und alles, was Sie mehr wollen. Ich denke, dies könnte verwendet werden, um CL-ähnliche defpackageund paketinterne Symbole als ein Beispiel bereitzustellen . Außerdem möchte ich dringend eine spezielle Syntax für reguläre Ausdrücke verwenden (oder genauer gesagt eine Zeichenfolgensyntax, die keine Backslashes interpretiert).
Wahrscheinlich ist es am besten, dies nicht als Antwort zu veröffentlichen, bevor Sie tatsächlich einen vollständigen Lisp-Reader implementiert haben, wie Sie vorgeschlagen haben (was, wie ich vermute, kein triviales Unternehmen ist).
Dan
@Dan Es ist machbar, es ist nur so, dass es so viel schmerzhafter ist, es in C zu machen, da es für die String-Verarbeitung scheiße ist.
Wasamasa
1
@Dan hat funktioniert, ich habe die Antwort bearbeitet, um den Link zur Implementierung hinzuzufügen.
Antworten:
Es stellt sich heraus, dass das Handbuch impliziert, dass Sie keine Reader-Makros ausführen können.
Laut Anhang C Portierung von Common Lisp :
quelle
syntax.c
Anscheinend kann es getan werden, aber bereiten Sie sich auf eine Menge Arbeit vor. (oder auch nicht, weil ich es irgendwann mal angehen werde ;-).
Jetzt muss nur noch ein vollständiger Lisp-Reader implementiert werden, der alles unterstützt, was Elisp tut, und alles, was Sie mehr wollen. Ich denke, dies könnte verwendet werden, um CL-ähnliche
defpackage
und paketinterne Symbole als ein Beispiel bereitzustellen . Außerdem möchte ich dringend eine spezielle Syntax für reguläre Ausdrücke verwenden (oder genauer gesagt eine Zeichenfolgensyntax, die keine Backslashes interpretiert).Bearbeiten: Hier ist eine Proof-of-Concept-Implementierung: https://github.com/mishoo/elisp-reader.el
quelle