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