【问题标题】:(funcall ...) Equivalent for Clojure?(funcall ...) 等价于 Clojure?
【发布时间】:2021-09-05 11:36:07
【问题描述】:

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

(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


【解决方案1】:

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

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

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

然后我们得到

(f1) => 1

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

【讨论】:

  • 如果你把它写出来,我会解构。
猜你喜欢
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
相关资源
最近更新 更多