Estoy buscando una funcionalidad que pueda hacer la transformación de fuente a fuente de los programas de elisp dado un conjunto de reglas de reescritura. Por ejemplo, dada una regla como:
(set (make-local-variable (quote ?var) ?value)) =>
(setq-local ?var ?value)
Encontrará todas las apariciones del patrón y lo reemplazará con un reemplazo. Una característica bienvenida sería hacer una cantidad mínima de cambios.
Editar: Encontré esto http://www.informatik.uni-bremen.de/st/lehre/Arte-fakt/Seminar/papers/06/Formal/pattern-language-for-refactoring.pdf lamentablemente sin implementación.
La expansión de macros de Lisp es exactamente eso: un mapeo de sexps de Lisp a sexps de Lisp. Tus amigos para esto son
defmacro
o, más especialmente,macrolet
(también conocidocl-macrolet
como Emacs Lisp) ymacroexpand
(tambiénmacroexpand-all
).Tenga en cuenta que estoy no refiero a la expansión de macros seguido por la evaluación del código Lisp resultante, que es como se suelen utilizar macros Lisp.
En este caso, no desea evaluar el resultado de la expansión de macro. Solo desea "expandir" un sexp Lisp de entrada para producir un sexp Lisp diferente. (En informática y lógica esto a veces se llama "reducción" o "reescritura").
(Por supuesto, para lidiar con sexps que no son listas, también deberá proporcionar asignaciones entre símbolos conocidos y similares. Pero la expansión macro se ocupa de la mayoría de las asignaciones de patrones sexp).
fuente