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.
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.
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 :
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.
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 ;-).
(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