置換によるsexpsのパターンマッチングを使用してelispプログラムをリファクタリングする方法は?


7

一連の書き換えルールを指定して、elispプログラムのソースからソースへの変換を実行できる機能を探しています。たとえば、次のようなルールがあるとします。

(set (make-local-variable (quote ?var) ?value)) => 
   (setq-local ?var ?value)

それはパターンのすべての出現を見つけ、それを置換で置き換えます。歓迎すべき機能は、最小限の変更を行うことです。

編集:私はこれをhttp://www.informatik.uni-bremen.de/st/lehre/Arte-fakt/Seminar/papers/06/Formal/pattern-language-for-refactoring.pdf残念ながら実装していません。

回答:


7

el-searchGNU ELPAリポジトリで入手できるパッケージを探していると思います。pcaseパターンを使用して一致させることができ、説明している検索と置換機能を実装します。

el-search-query-replaceパターンを使用して提供します

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

そしてそれを

`(setq-local ,var ,val)

これはまさに私が考えていたものです。ありがとう。
Gracjan Polak、2016

1

Lisp マクロ展開はまさにそれです:Lisp sexpsからLisp sexpsへのマッピング。これに対するあなたの友達は、defmacroまたは-より特に- macrolet(別名cl-macroletEmacs Lisp)とmacroexpand(またmacroexpand-all)です。

ここでは、マクロ展開に続いて、結果のLispコードの評価に言及していないことに注意してください。これは、Lispマクロが通常使用される方法です。

この場合、マクロ展開の結果を評価する必要はありません。入力Lisp sexp を「拡張」して、別のLisp sexpを生成したいだけです。(コンピュータサイエンスとロジックでは、これは「リダクション」または「リライティング」と呼ばれることもあります。)

(もちろん、リストではないsexpを処理するには、既知のシンボル間のマッピングなども提供する必要があります。しかし、マクロ展開はほとんどのsexpパターンマッピングを処理します。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.