举个例子:
假如我的代码里有用到这样的结构体:
...
(MyStruct a b)
....
现在我想重构一下,把a b换一下位置:把所有(MyStruct a b)都换成(MyStruct b a),用Elisp有没有什么好办法能做到?
感觉搜索+模式匹配 应该能做到这个功能,就是不知道怎么做。。。
求教。。。
注意:a b 并不是固定的,他们可能是复合表达式,如:
(MyStruct a b) => (MyStruct b a)
(MyStruct (foo bar) (baz)) ==> (MyStruct (baz) (foo bar))
假如是搜索对象是 Emacs Lisp 代码的话,可以用 GNU Elpa 上的 El-search,如:
M-x el-search-query-replace `(MyStruct ,x ,y) -> `(MyStruct ,y ,x)
El-search 里的「模式匹配」指的是 Pcase。
1 个赞
多谢。
刚才测试了一下,很不错。可惜的是,它只能对Elisp代码使用,不能对其他Lisp代码使用(比如:racket)。
说起来也奇怪,都是对s-exp表达式(看成数据)进行模式匹配,换个语言就不行了。
cireu
7
因爲el-search底層用的是read
函數來讀入sexp。對付racket那種可以圓括號方括號混用的當然就不行咯