我有一个小的Clojurescript程序,它有一个原子。 String被置于这个原子中,该原子是函数(low-level-fn
)的配置,该函数几乎被程序中的每个其他函数使用。程序有一个入口点,可以接收所有配置。该程序的运行结构是一个颠倒的树,其中许多叶子实际上是low-level-fn
。
我的目的总是摆脱这个原子作为完成程序的一部分 - 通过将配置字符串传递给外部函数使其成为更高阶函数。通过添加最左边的参数(即String配置并创建部分函数)来执行相同操作。在任何一种情况下,这还未完成'函数在入口点函数中构造。
我的问题是该程序可能会变得比使用原子更糟糕,因为尚未完成'函数必须通过程序中的几乎所有函数作为参数传递。
我还应该考虑其他任何想法吗?我很可能会摆脱原子,使整个程序成为一个纯粹的功能。 编辑 - 实际上有或没有原子,程序仍然是一个纯函数。 编辑 - 或者是吗?
答案 0 :(得分:0)
当我正确理解您的问题时,最简单的方法是使用闭包。
以下内容如何:
(defn myrunner [param]
;; generate closures depending on the parameter
(letfn [(my-fn [x]
(* param x))]
;; now process everything inside the letfn
(my-fn 2)))
(myrunner 2) ;; => 4
(myrunner 6) ;; => 12
;; parallel execution works, too
(pmap myrunner (range 100)) ;; 0, 2, 4,...
编辑:从示例中删除了副作用。
答案 1 :(得分:0)
怎么样:
(defn original-lowlv-fn [cfg param]
;; your lowlevel fun that needs config
(prn cfg param))
(defn init-library [cfg-from-user]
;; init-library must be called before library use
;; your new lowlevel-fn
(def lowlv-fn
(let [cfg {:my-cfg cfg-from-user}]
(partial original-lowlv-fn cfg))))
示例:
(lowlv-fn :foo)