Emacs Lisp - 使用变量/变量名称声明函数

ppb*_*ppb 5 emacs

我正在研究一个Emacs Lisp软件包,我想添加的一个特殊功能是能够动态定义函数 - 它们将遵循相同的命名约定,但它可以帮助我不必手动声明它们中的每一个.

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

(def exec (cmd)
    (async-shell-command cmd "buffer"))
Run Code Online (Sandbox Code Playgroud)

同时,在这种特殊情况下,我知道我想要使用的可执行文件列表 - 或者更确切地说,我知道如何获取它们的列表,因为它可以随时间变化.所以我想做的是,给出以下可执行文件列表:

("a" "b" "c")
Run Code Online (Sandbox Code Playgroud)

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

不幸的是,defun不会评估NAME参数,因此我无法动态创建函数名称.

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

Ste*_*fan 6

怎么样

(dolist (name name-list)
  (defalias (intern (concat "exec-" name))
   `(lambda () ,(format "Run %s via `exec'." name) (interactive) (exec ,name))))
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用宏来生成函数,但这种defalias/lambda配对非常简洁! (2认同)