我正在开发一个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
和提供的可执行文件列表,但我认为上面的内容会很好。
答案 0 :(得分:5)
怎么'回合
(dolist (name name-list)
(defalias (intern (concat "exec-" name))
`(lambda () ,(format "Run %s via `exec'." name) (interactive) (exec ,name))))