以编程方式评估 Clojure 中的函数列表
Programmatically evaluate a list of functions in Clojure
我正在尝试找出如何以编程方式评估函数列表。
假设我有这段代码:
(defn foo
[]
(println "foo"))
(defn bar
[]
(println "bar"))
(def funcs [foo bar] )
我想以编程方式执行 funcs
的所有功能。
我尝试使用 eval
,但没有成功。
感谢您的帮助。
如果您想要 return 值,请使用 for
,并且可以使用惰性求值(在您访问 return 值之前,不能保证调用您的函数),并且doseq
如果您不需要这些值并且这样做是为了立即产生副作用。
(doseq [f [foo bar]]
(f))
(def fs
(for [f [foo bar]]
(f)))
您可以使用 juxt
:
((apply juxt funcs))
您可以通过调用简单地映射函数:
(map #(%) funcs)
doall
and dorun
可以用来强制效果。 doall
保留结果,而 dorun
仅 returns 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
我正在尝试找出如何以编程方式评估函数列表。
假设我有这段代码:
(defn foo
[]
(println "foo"))
(defn bar
[]
(println "bar"))
(def funcs [foo bar] )
我想以编程方式执行 funcs
的所有功能。
我尝试使用 eval
,但没有成功。
感谢您的帮助。
如果您想要 return 值,请使用 for
,并且可以使用惰性求值(在您访问 return 值之前,不能保证调用您的函数),并且doseq
如果您不需要这些值并且这样做是为了立即产生副作用。
(doseq [f [foo bar]]
(f))
(def fs
(for [f [foo bar]]
(f)))
您可以使用 juxt
:
((apply juxt funcs))
您可以通过调用简单地映射函数:
(map #(%) funcs)
doall
and dorun
可以用来强制效果。 doall
保留结果,而 dorun
仅 returns 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