Wie kann man Elisp-Programme mithilfe von Pattern Matching auf Sexps mit Ersatz umgestalten?


7

Ich suche nach Funktionen, mit denen sich Elisp-Programme bei einer Reihe von Umschreiberegeln von Quelle zu Quelle transformieren lassen. Zum Beispiel mit einer Regel wie:

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

Es werden alle Vorkommen des Musters gefunden und durch Ersetzen ersetzt. Eine willkommene Funktion wäre, möglichst wenige Änderungen vorzunehmen.

Bearbeiten: Ich fand diese http://www.informatik.uni-bremen.de/st/lehre/Arte-fakt/Seminar/papers/06/Formal/pattern-language-for-refactoring.pdf leider keine Implementierung.

Antworten:


7

Ich glaube, Sie suchen nach dem el-searchPaket, das im GNU ELPA-Repository verfügbar ist. Sie können mithilfe von pcaseMustern übereinstimmen und die von Ihnen beschriebene Such- und Ersetzungsfunktion implementieren.

Sie würden el-search-query-replacedas Muster verwenden und bereitstellen

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

und ersetzen Sie es durch

`(setq-local ,var ,val)

Genau das hatte ich mir vorgestellt. Vielen Dank.
Gracjan Polak

1

Die Lisp- Makro-Erweiterung ist genau das: eine Zuordnung von Lisp-Sexps zu Lisp-Sexps. Ihre Freunde dafür sind defmacrooder - insbesondere - macrolet(auch bekannt cl-macroletals Emacs Lisp) und macroexpand(auch macroexpand-all).

Beachten Sie, dass ich mich nicht auf die Makroerweiterung beziehe, gefolgt von der Auswertung des resultierenden Lisp-Codes, wie Lisp-Makros normalerweise verwendet werden.

In diesem Fall möchten Sie das Ergebnis der Makroerweiterung nicht auswerten. Sie möchten nur einen eingegebenen Lisp-Sexp "erweitern" , um einen anderen Lisp-Sexp zu erzeugen. (In der Informatik und Logik wird dies manchmal als "Reduktion" oder "Umschreiben" bezeichnet.)

(Um mit Sexps umzugehen, die keine Listen sind, müssen Sie natürlich auch Zuordnungen zwischen bekannten Symbolen und dergleichen bereitstellen. Die Makroerweiterung kümmert sich jedoch um die meisten Zuordnungen von Sexp-Mustern.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.