(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
。
假设我有一组不带参数的函数,例如
(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
。