(funcall ...) 相当于 Clojure?

时间:2021-06-21 19:57:46

标签: 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 等价物吗? (这甚至是正确的问题吗?)

1 个答案:

答案 0 :(得分:2)

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

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

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

然后我们得到

(f1) => 1

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