¿Cómo puedo modificar el lector de Elisp?

12

La modificación del lector permitiría introducir una nueva sintaxis de lectura (como #(hash table)y '(quoted)). Muchos Lisps tienen esta capacidad, pero no parece existir tal facilidad para elisp.

Sean Allred
fuente
Hackea las fuentes de C.
wasamasa
3
Emacs Lisp no tiene un lector programable Lisp.
Dibujó
@wasamasa Bueno, eso siempre es una opción :) No portátil , sino una opción.
Sean Allred
Creo que "muchos Lisps tienen esto". No es una pregunta real. Preferiría tener una pregunta real. Sugiero acortar el título y reformularlo en el cuerpo.
YoungFrog
@YoungFrog edita bienvenida. No podría pensar en nada más directo o apropiado sin ser demasiado prolijo. La pregunta es simple; No tiene que ser largo.
Sean Allred

Respuestas:

11

Resulta que el manual implica que no puedes hacer macros de lector.

De acuerdo con el Apéndice C Porting Common Lisp :

Lector de macros. Common Lisp incluye un segundo tipo de macro que funciona a nivel de caracteres individuales. Por ejemplo, Common Lisp implementa la notación de citas mediante una macro de lector llamada ', mientras que el analizador de Emacs Lisp solo trata las citas como un caso especial. Algunos paquetes de Lisp usan macros de lector para crear sintaxis especiales para ellos, que el analizador de Emacs no puede leer.

Dan
fuente
Creo que se trata del software Common Lisp que utiliza macros de lectura especiales, en lugar de Elisp. La página trata sobre portar código CL a Elisp. Y sí, oficialmente el lector no es personalizable, pero vea mi respuesta a continuación ...
mishoo
El otro problema aquí es incluso si usted ha introducido alguna manera nueva sintaxis lector, el resto de Emacs no es consciente de ello, por lo que tendrá que fijar syntax.c, también ...
wasamasa
9

Aparentemente se puede hacer, pero prepárate para mucho trabajo. (o no, porque lo abordaré algún fin de semana ;-).

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

Ahora "todo" que queda por hacer es implementar un lector Lisp completo que admita todo lo que Elisp hace y lo que quiera más. Creo que esto podría usarse para proporcionar defpackagesímbolos internos tipo CL y de paquete, como un ejemplo. Además, una sintaxis especial para expresiones regulares es algo que realmente quiero hacer (o más exactamente, alguna sintaxis de cadena que no interpreta barras invertidas).

Editar: aquí hay una implementación de prueba de concepto: https://github.com/mishoo/elisp-reader.el

mishoo
fuente
Probablemente sea mejor no publicar esto como respuesta hasta que haya implementado un lector Lisp completo como sugirió (lo cual, supongo, no es una empresa trivial).
Dan
@Dan Es factible, es solo que hacerlo en C es mucho más doloroso ya que apesta para el procesamiento de cadenas.
wasamasa
1
@Dan lo hizo funcionar, edité la respuesta para agregar el enlace a la implementación.
mishoo