【问题标题】:elisp macro to write a function?elisp宏写一个函数?
【发布时间】:2011-01-27 02:13:23
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: emacs function macros elisp


    【解决方案1】:

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

    (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 工具来更简洁地编写宏,但所有宏基本上都以与上述示例相同的方式工作。

    【讨论】:

      【解决方案2】:

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

      看起来像这样:

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

      【讨论】:

      • yasn-p 很棒,但不一定是同一回事。宏是模棱两可的,因为 emacs 有 keyboard macros 复制打字或 lisp 宏 改变代码树; yasn-p 主要是在他必须输入一组无法抽象出来的样板时更有帮助(C/C++ 比 Lisp 更正确)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多