Como refatorar programas elisp usando a correspondência de padrões nos sexps com substituição?

7

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.

Gracjan Polak
fonte

Respostas:

7

Acredito que você esteja procurando o el-searchpacote, disponível no repositório GNU ELPA. Permite combinar pcasepadrões usando e implementa a funcionalidade de pesquisa e substituição que você está descrevendo.

Você usaria el-search-query-replacee forneceria o padrão

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

e substitua-o por

`(setq-local ,var ,val)
Stefan
fonte
Isso é exatamente o que eu tinha em mente. Obrigado.
Gracjan Polak
1

A expansão de macro Lisp é exatamente isso: um mapeamento de Lisp sexps para Lisp sexps. Seus amigos são defmacroou - mais especialmente - macrolet(também conhecido cl-macroletpor Emacs Lisp) e macroexpand(também macroexpand-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.)

Desenhou
fonte