8

根据命令行输入,我需要设置一些下游函数将使用的运行时常量。这些函数中的代码可能在其他线程中执行,所以我不考虑“声明 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))

如果我应该考虑这两个之外的其他选择,我很想知道。

此外,理想情况下,我宁愿不向 atom 提供初始 val,因为我想在其他地方设置默认值(使用 cli 调用),但我可以忍受它,特别是如果使用 atom 与替代方案相比具有优势( s)。

4

3 回答 3

6

一次性写入值正是为用例设计的承诺:

(def dry-run (promise))

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

(defn whatever [f]
  (if @dry-run
    ...))
于 2013-01-14T06:47:03.497 回答
3

AFAIKalter-var-root仅保证同步变量值更改,不保证在此更改期间安全读取。另一方面,它atom真正提供了原子地改变身份的状态。

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

(def *dry-run* (atom nil)) 
于 2013-01-14T05:52:14.120 回答
2

仅使用 var 和 有什么问题alter-var-root?在你真正启动工人之前,你在你的启动函数中设置了新值。所以阅读没有种族。您可以在@任何需要的地方保存价值。

于 2013-01-14T10:45:26.940 回答