Estou procurando uma funcionalidade que possa fazer a transformação fonte-a-fonte de programas elisp, devido a um conjunto de regras de reescrita. Por exemplo, dada uma regra como:
(set (make-local-variable (quote ?var) ?value)) =>
(setq-local ?var ?value)
Ele encontrará todas as ocorrências do padrão e substitui-o por substituição. Um recurso bem-vindo seria fazer a quantidade mínima de alterações.
Edit: Encontrei este http://www.informatik.uni-bremen.de/st/lehre/Arte-fakt/Seminar/papers/06/Formal/pattern-language-for-refactoring.pdf, infelizmente, nenhuma implementação.
A expansão de macro Lisp é exatamente isso: um mapeamento de Lisp sexps para Lisp sexps. Seus amigos são
defmacro
ou - mais especialmente -macrolet
(também conhecidocl-macrolet
por Emacs Lisp) emacroexpand
(tambémmacroexpand-all
).Observe que não estou me referindo à expansão de macros seguida pela avaliação do código Lisp resultante, que é como as macros Lisp são geralmente usadas.
Nesse caso, você não deseja avaliar o resultado da expansão de macro. Você deseja apenas "expandir" um Lisp sexp de entrada para produzir um Lisp sexp diferente. (Em ciência da computação e lógica, isso às vezes é chamado de "redução" ou "reescrita".)
(Obviamente, para lidar com sexps que não são listas, você também precisará fornecer mapeamentos entre símbolos conhecidos e similares. Mas a expansão de macro cuida da maioria dos mapeamentos de padrões de sexp.)
fonte