4

我无法理解折叠函数列表并使用特定参数调用它们所需的方法。

这是我假设的工作。我已经尝试了各种变体,使用eval等。任何指针?

(mapcar (lambda (fn) (fn 'utf-8))
        (list #'set-terminal-coding-system
              #'set-keyboard-coding-system
              #'prefer-coding-system))

当我运行它时,我只会得到“符号的函数定义是无效的:fn”。

编辑 | 好的,所以这行得通,但是当上面的示例通过synaxapply传递函数时,需要使用它似乎很奇怪。#'function-name

(mapcar (lambda (fn) (apply fn '(utf-8)))
        '(set-terminal-coding-system
          set-keyboard-coding-system
          prefer-coding-system))
4

2 回答 2

7

在 Emacs lisp 中,符号具有单独的值和函数槽1

函数参数作为参数符号的传入,但是当您评估时,(fn 'utf-8)您使用的是fn符号的函数槽,其中不包含您想要的内容(或者在这种情况下,根本不包含任何内容;因此错误“符号的函数定义是无效:fn")。

因此,要调用保存在变量中的函数,您必须使用funcallapply(或类似方法)。

也可以看看:

1即它是所谓的“lisp-2”,而不是“lisp-1”,两者都有一个单一的名称空间。

于 2013-05-19T10:57:38.363 回答
1

对于副作用,dash列表库具有功能-each及其对应的照应--each

(-each '(fn1 fn2 fn3) (lambda (x) (funcall x YOUR-ARGUMENT)))
(--each '(fn1 fn2 fn3) (funcall it YOUR-ARGUMENT))

如果您想在列表中收集这些函数的结果,请使用-map相反的参数:

(-map (lambda (x) (funcall x YOUR-ARGUMENT)) '(fn1 fn2 fn3))
(--map (funcall it YOUR-ARGUMENT) '(fn1 fn2 fn3))
于 2014-08-06T11:13:59.960 回答