基于命令行输入,我需要设置一些运行时常量,许多下游函数将使用这些常量。这些函数中的代码可能会在其他线程中执行,所以我没有考虑“声明var和使用绑定宏”的组合。使用var (带有alter-var-root)与使用atom相比,其优缺点是什么?那是,
(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提供了与替代方案相比的优势。
发布于 2013-01-14 14:47:03
一次写入值正是promises设计的用例:
(def dry-run (promise))
(defn -main []
(deliver dry-run true))
(defn whatever [f]
(if @dry-run
...))发布于 2013-01-14 13:52:14
AFAIK alter-var-root只保证同步的变量值更改,而不保证在此更改期间的安全读取。另一方面,atom确实提供了自动更改身份状态的功能。
如果不想提供初始值,可以将其设置为nil
(def *dry-run* (atom nil)) 发布于 2013-01-14 18:45:27
只使用var和alter-var-root有什么错?您在启动函数中设置了新值,然后才真正启动工人。因此,阅读并不存在竞赛。您可以将@保存到需要该值的任何位置。
https://stackoverflow.com/questions/14313433
复制相似问题