elisp宏写一个函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elisp宏写一个函数?相关的知识,希望对你有一定的参考价值。

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

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

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

谢谢!

答案

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

(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)))))

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

(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

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

另一答案

宏可以做到这一点,但有很多模板模块可供emacs做类似的工作。我使用一个名为yasnippet.el的东西来做快速的代码生成。例如,在C源文件中,如果我输入for<TAB>,我会得到一个for循环模板;它允许我填写模板,设置变量名称,限制和内部循环内容。

看起来像这样:

alt text http://i39.tinypic.com/o8tbmq.jpg

您可以为喜欢的任何内容设置模板。函数定义,if语句,switch语句等等。为不同的模式设置不同的模板。 C语言中for循环的模板与C#中for循环的模板不同,依此类推。非常便利。

以上是关于elisp宏写一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

Elisp 03:变量

Elisp 中变量赋值函数 set 与 setq 辨析

Elisp 列表包含一个值

iOS使用宏写单例

Learn X in Y minutes, Where X=elisp

iOS使用宏写单例