替代使用原子

时间:2016-02-12 11:10:21

标签: clojure clojurescript

我有一个小的Clojurescript程序,它有一个原子。 String被置于这个原子中,该原子是函数(low-level-fn)的配置,该函数几乎被程序中的每个其他函数使用。程序有一个入口点,可以接收所有配置。该程序的运行结构是一个颠倒的树,其中许多叶子实际上是low-level-fn

我的目的总是摆脱这个原子作为完成程序的一部分 - 通过将配置字符串传递给外部函数使其成为更高阶函数。通过添加最左边的参数(即String配置并创建部分函数)来执行相同操作。在任何一种情况下,这还未完成'函数在入口点函数中构造。

我的问题是该程序可能会变得比使用原子更糟糕,因为尚未完成'函数必须通过程序中的几乎所有函数作为参数传递。

我还应该考虑其他任何想法吗?我很可能会摆脱原子,使整个程序成为一个纯粹的功能。 编辑 - 实际上有或没有原子,程序仍然是一个纯函数。 编辑 - 或者是吗?

2 个答案:

答案 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)