假设我有一组不带参数的函数,例如
(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
等价物吗? (这甚至是正确的问题吗?)
答案 0 :(得分:2)
正如评论所指出的,在 Clojure 中,您只需要将函数对象作为列表中的第一个(也可能是唯一一个)项目放置,并用括号编写。
为了清楚起见,我通常更喜欢将函数对象分配给变量,因此发生的事情更明显,并且计算括号的多个嵌套级别并不那么重要。例如,我会写:
(let [fns [f1 f2 f3]
f1 (first fns)]
然后我们得到
(f1) => 1
您可以在其中选择任何描述性名称来代替 f1
。