以编程方式评估Clojure中的函数列表

时间:2015-04-09 23:33:22

标签: clojure

我正在尝试弄清楚如何以编程方式评估函数列表。

让我们说我有这段代码:

(defn foo
  []
  (println "foo"))

(defn bar
  []
  (println "bar"))

(def funcs [foo bar] )

我希望以编程方式执行funcs的所有功能。

我尝试使用eval,但没有成功。

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

如果你想要返回值,可以使用for,并且在进行延迟评估时可以正常使用(在访问返回值之前不能保证调用你的函数),如果你没有&#39则使用doseq ; t需要这些值,并且这样做是为了立即产生副作用。

(doseq [f [foo bar]]
  (f))

(def fs
  (for [f [foo bar]]
    (f)))

答案 1 :(得分:4)

您可以使用juxt

((apply juxt funcs))

答案 2 :(得分:1)

您可以通过调用简单地映射函数:

(map #(%) funcs)

doalldorun可用于强制效果。 doall会保留结果,而dorun只会返回nil

(defn foo [] :foo) ; no side-effects
(doall (map #(%) [foo foo]))
;=> (:foo :foo)

(defn print-foo [] (println (foo))) ; with side-effects
(dorun (map #(%) [print-foo print-foo]))
;=> :foo
;   :foo
;   nil