基于命令行输入,我需要设置一些运行时常量,许多下游函数将使用这些常量。这些函数中的代码可以在其他线程中执行,因此我不考虑“声明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调用),但我可以忍受它,特别是如果使用原子提供的优势相比替代方案。
答案 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
有什么问题?在真正启动工作人员之前,在启动功能中设置新值。所以没有阅读比赛。并且您可以在需要值的任何地方保存@
。