7

我正在开发一个 Emacs Lisp 包,我想添加的一个特殊功能是动态定义函数的能力——它们将遵循相同的命名约定,但这将帮助我不必手动声明它们中的每一个.

举个例子,我有一个名为 exec 的基本函数,它接受一个参数,即要启动的可执行文件的名称:

(def exec (cmd)
    (async-shell-command cmd "buffer"))

同时,在这种特殊情况下,我知道我将要使用的可执行文件的列表——或者更准确地说,我知道如何获取它们的列表,因为它会随着时间而改变。因此,鉴于以下可执行文件列表,我想做的是:

("a" "b" "c")

是对它们进行迭代,并为每一个创建一个名为 exec-[executable] - exec-a、exec-b、exec-c 的函数。

不幸的是,defun 不评估 NAME 参数,所以我不能动态创建函数名。

PS。exec 命令本身就足够好了——它completing-read与提供的可执行文件列表一起使用,但我认为上面的内容会很好。

4

1 回答 1

8

怎么样

(dolist (name name-list)
  (defalias (intern (concat "exec-" name))
   `(lambda () ,(format "Run %s via `exec'." name) (interactive) (exec ,name))))
于 2012-10-03T18:51:21.750 回答