¿Cómo refactorizar los programas de elisp usando la coincidencia de patrones en sexps con reemplazo?


7

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.

Respuestas:


7

Creo que está buscando el el-searchpaquete, disponible en el repositorio ELPA de GNU. Le permite hacer coincidir el uso de pcasepatrones e implementa la funcionalidad de búsqueda y reemplazo que está describiendo.

Usarías el-search-query-replacey proporcionarías el patrón

`(set (make-local-variable ',var) ,val)

y reemplazarlo con

`(setq-local ,var ,val)

Esto es exactamente lo que tenía en mente. Gracias.
Gracjan Polak

1

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 defmacroo, más especialmente, macrolet(también conocido cl-macroletcomo Emacs Lisp) y macroexpand(también macroexpand-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).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.