首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行时常量的var与atom

运行时常量的var与atom
EN

Stack Overflow用户
提问于 2013-01-14 12:45:18
回答 3查看 544关注 0票数 8

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

代码语言:javascript
复制
(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))

对比

代码语言:javascript
复制
(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提供了与替代方案相比的优势。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-14 14:47:03

一次写入值正是promises设计的用例:

代码语言:javascript
复制
(def dry-run (promise))

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

(defn whatever [f]
  (if @dry-run
    ...))
票数 6
EN

Stack Overflow用户

发布于 2013-01-14 13:52:14

AFAIK alter-var-root只保证同步的变量值更改,而不保证在此更改期间的安全读取。另一方面,atom确实提供了自动更改身份状态的功能。

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

代码语言:javascript
复制
(def *dry-run* (atom nil)) 
票数 3
EN

Stack Overflow用户

发布于 2013-01-14 18:45:27

只使用var和alter-var-root有什么错?您在启动函数中设置了新值,然后才真正启动工人。因此,阅读并不存在竞赛。您可以将@保存到需要该值的任何位置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14313433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档