Come posso modificare il lettore di Elisp?


12

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.


Attacca le fonti C.
Wasamasa,

3
Emacs Lisp non ha un lettore programmabile Lisp.
Tratto l'

@wasamasa Bene, questa è sempre un'opzione :) Non portatile , ma un'opzione.
Sean Allred,

Penso che "Molti Lisp hanno questo." non è una vera domanda. Preferirei di gran lunga avere una vera domanda. Suggerisco di abbreviare il titolo e riformularlo nel corpo.
YoungFrog

@YoungFrog modifica benvenuta. Non riuscivo a pensare a qualcosa di più diretto o appropriato senza essere eccessivamente prolisso. La domanda è semplice; non deve essere lungo.
Sean Allred,

Risposte:


11

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.


Penso che si tratti del software Common Lisp che utilizza macro di lettori speciali, piuttosto che Elisp. La pagina riguarda il porting del codice CL su Elisp. E sì, ufficialmente il lettore non è personalizzabile, ma vedi la mia risposta qui sotto ...
mishoo

L'altro problema qui è anche se in qualche modo hai introdotto la nuova sintassi del lettore, il resto di Emacs non ne è consapevole, quindi dovrai anche risolvere syntax.c...
wasamasa

9

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


Probabilmente è meglio non pubblicare questo come risposta fino a quando non avrai effettivamente implementato un lettore Lisp completo come hai suggerito (che, immagino, non è un'impresa banale).
Dan

@ Dan È fattibile, è solo che farlo in C è molto più doloroso in quanto fa schifo per l'elaborazione delle stringhe.
Wasamasa,

1
@Dan ha funzionato, ho modificato la risposta per aggiungere il link all'implementazione.
mishoo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.