(funcall ...) 等同于 Clojure?

(funcall ...) Equivalent for Clojure?

假设我有一组不带参数的函数,例如

(defn f1 [] 1)
(defn f2 [] 2)
(defn f3 [] 3)

然后我列出了这些函数: (list f1 f2 f3)

但是我如何 运行 类似的函数返回的函数 (first (list f1 f2 f3))?

在 Common Lisp 中,我可能会使用 funcall,因为 f1 不带任何参数。在 Clojure 我试过 (apply (first (list f1 f2 f3)) ()),即应用于空参数列表, 这有效,我确实得到 1.

但是有更好的方法吗?即 Clojure 中是否有 funcall 等价物? (这个问题问对了吗?)

正如评论所指出的,在 Clojure 中,您只需将函数对象作为列表中的第一个(也可能是唯一的)项,用括号书写。

为了清楚起见,我通常更喜欢将函数对象分配给一个变量,这样发生的事情就更加明显,并且计算多个嵌套级别的括号并不是那么重要。例如,我会写:

  (let [fns   [f1 f2 f3]
        f1    (first fns)]

然后我们得到

(f1) => 1

您可以在其中选择任何描述性名称来代替 f1