La modifica del lettore consentirebbe l'introduzione di una nuova sintassi di lettura (come #(hash table)
e '(quoted)
). Molte Lisp hanno questa capacità, ma non sembra esistere una simile struttura per elisp.
La modifica del lettore consentirebbe l'introduzione di una nuova sintassi di lettura (come #(hash table)
e '(quoted)
). Molte Lisp hanno questa capacità, ma non sembra esistere una simile struttura per elisp.
Risposte:
Si scopre che il manuale implica che in realtà non è possibile eseguire macro di lettori.
Secondo l' appendice C Porting Common Lisp :
Macro Reader. Common Lisp include un secondo tipo di macro che funziona a livello di singoli caratteri. Ad esempio, Common Lisp implementa la notazione delle virgolette con una macro del lettore chiamata ', mentre il parser di Emacs Lisp considera la citazione solo come un caso speciale. Alcuni pacchetti Lisp usano le macro del lettore per creare sintassi speciali per se stessi, che il parser Emacs non è in grado di leggere.
syntax.c
...
Apparentemente si può fare, ma prepararsi a molto lavoro. (o no, perché lo affronterò un fine settimana ;-).
(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))
Ora "tutto" ciò che resta da fare è implementare un lettore Lisp completo che supporti tutto ciò che Elisp fa e qualunque cosa tu voglia di più. Penso che questo potrebbe essere usato per fornire defpackage
simboli interni simili a CL e pacchetti, come esempio. Inoltre, una sintassi speciale per regexps è qualcosa che desidero fortemente fare (o più esattamente, una sintassi di stringa che non interpreta le barre rovesciate).
Modifica: ecco un'implementazione della prova di concetto: https://github.com/mishoo/elisp-reader.el