elisp宏写一个函数?

Any*_*orn 17 emacs macros elisp function

我写了一些几乎相同的函数,除了它们的名字.例如:

; x is name, such as function/paragraph/line/etc.
(defun my-x-function
 (interactive)
 (mark-x) (do-more-stuff) (modify-x))
Run Code Online (Sandbox Code Playgroud)

有没有办法自动生成这样的功能?我有一种感觉这是宏做的,但我不知道如何使用它们.任何帮助,也许包括一个小例子都会很棒.

谢谢!

Sea*_*ean 21

是的,这正是宏所做的.这是一个简单的宏,它根据您指定的模式构建函数:

(defmacro make-my-function (name)
  (list 'defun (intern (format "my-%s-function" name)) ()
        (list 'interactive)
        (list (intern (format "mark-%s" name)))
        (list 'do-more-stuff)
        (list (intern (format "modify-%s" name)))))
Run Code Online (Sandbox Code Playgroud)

您可以将此宏复制到*scratch*Emacs中的缓冲区并对其进行评估,然后检查它是否像这样工作:

(make-my-function x) ; type control-J here
my-x-function ; <-- Emacs's output
(symbol-function 'my-x-function) ; type control-J here
(lambda nil (interactive) (mark-x) (do-more-stuff) (modify-x)) ; <-- Emacs's output
Run Code Online (Sandbox Code Playgroud)

更常见的是,可以使用引用工具更简洁地编写宏,但是所有宏基本上以与上述示例相同的方式工作.

  • 反引号设施+1.它提高了宏的可读性. (4认同)