Wie kann ich Elisps Reader ändern?

12

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.

Sean Allred
quelle
Hacke die C-Quellen.
Wasamasa
3
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.

Laut Anhang C Portierung von Common Lisp :

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.

Dan
quelle
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 ;-).

(defvar *orig-read* (symbol-function 'read))

(defun read (&optional in)
  (message "reading from %s" load-file-name)
  (funcall *orig-read* in))

(setq load-read-function (symbol-function 'read))

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).

Bearbeiten: Hier ist eine Proof-of-Concept-Implementierung: https://github.com/mishoo/elisp-reader.el

Mischoo
quelle
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.
Mischoo