var与运动常量的原子

时间:2013-01-14 04:45:18

标签: clojure

基于命令行输入,我需要设置一些运行时常量,许多下游函数将使用这些常量。这些函数中的代码可以在其他线程中执行,因此我不考虑“声明var和使用绑定宏”组合。使用var(使用alter-var-root)与使用原子相比有什么优缺点?也就是说,

(declare *dry-run*) ; one of my constants

(defn -main [& args]
   ; fetch command line option
   ;(cli args ...)
   (alter-var-root #'*dry-run* (constantly ...))
   (do-stuff-in-thread-pool))

(def *dry-run* (atom true))   

(defn -main [& args]
   ; fetch command line option
   ;(cli args ...)
   (reset! *dry-run* ...)
   (do-stuff-in-thread-pool))

如果除了这两个选项之外还有其他选择我应该考虑,很想知道。

另外,理想情况下我宁愿不向原子提供初始值因为我想在别处设置默认值(使用cli调用),但我可以忍受它,特别是如果使用原子提供的优势相比替代方案。

3 个答案:

答案 0 :(得分:6)

一次写入值正是承诺的用例:

(def dry-run (promise))

(defn -main []
  (deliver dry-run true))

(defn whatever [f]
  (if @dry-run
    ...))

答案 1 :(得分:3)

AFAIK alter-var-root仅保证同步变量值的变化,并且不保证在此更改期间安全读取。另一方面,atom确实提供了原子上改变身份的状态。

如果您不想提供初始值,可以将其设置为nil

(def *dry-run* (atom nil)) 

答案 2 :(得分:2)

使用var和alter-var-root有什么问题?在真正启动工作人员之前,在启动功能中设置新值。所以没有阅读比赛。并且您可以在需要值的任何地方保存@