我无法理解折叠函数列表并使用特定参数调用它们时需要采用的方法。
这是我假设会起作用的。我尝试了各种变体,使用 eval
等。有任何指示吗?
(mapcar (lambda (fn) (fn 'utf-8))
(list #'set-terminal-coding-system
#'set-keyboard-coding-system
#'prefer-coding-system))
当我运行它时,我只得到“Symbol 的函数定义是无效的:fn”。
编辑 |好的,这样可行,但是当上面的示例使用 #'function-name
synax 传递函数时,需要使用 apply
似乎很奇怪。
(mapcar (lambda (fn) (apply fn '(utf-8)))
'(set-terminal-coding-system
set-keyboard-coding-system
prefer-coding-system))
最佳答案
在 Emacs lisp 中,符号具有单独的值槽和函数槽1。
函数参数作为参数符号的 值 传入,但是当您评估 (fn 'utf-8)
时,您使用的是 fn
符号的 function 插槽,它将不包含您想要的内容(或者在本例中,根本不包含任何内容;因此出现错误“Symbol 的函数定义是无效的:fn”)。
要调用保存在变量中的函数,您必须因此funcall
或apply
(或类似的)。
另见:
- In elisp, how do I put a function in a variable?
- C-hig
(elisp) 调用函数
RET - C-hig
(elisp) 函数名
RET
1 即它是所谓的“lisp-2”,而不是“lisp-1”,两者都有一个 namespace 。
关于lisp - Emacs Lisp 映射函数名称列表并使用相同的 arg 调用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16633436/