Clojure 常量值的var或ref/atom/agent?

Clojure 常量值的var或ref/atom/agent?,clojure,var,agent,ref,Clojure,Var,Agent,Ref,我想谦虚地问 问什么,“常量值的var或ref/atom/agent?”? 当然,我确实使用变量来表示常量值 但我一直想知道,如果值的行为类似于常量,但它们应该在运行时分配,而不是在编译时(当读取代码时)分配,我应该使用哪一个 例如,考虑一些写在用户配置文件中的java属性。 它们应该在运行时分配,因为数据不在代码中。 但它们也应该在读取数据之前定义,因为其他代码引用它们 在这种情况下, 何时使用“var”: 我定义“var”,或者只是声明“var”(如果可以的话) 然后我通过读取选项文件的函

我想谦虚地问

问什么,“常量值的var或ref/atom/agent?”? 当然,我确实使用变量来表示常量值

但我一直想知道,如果值的行为类似于常量,但它们应该在运行时分配,而不是在编译时(当读取代码时)分配,我应该使用哪一个

例如,考虑一些写在用户配置文件中的java属性。 它们应该在运行时分配,因为数据不在代码中。 但它们也应该在读取数据之前定义,因为其他代码引用它们

在这种情况下,

何时使用“var”:

  • 我定义“var”,或者只是声明“var”(如果可以的话)
  • 然后我通过读取选项文件的函数重新定义这些变量
  • 但是覆盖“var”感觉很糟糕,或者在函数内部定义“var”感觉很奇怪
何时使用ref/atom/agent?:

  • 我将ref/atom/agents分配给“var”
  • 然后我通过读取选项文件的函数更新这些ref/atom/agents
  • 但是由于这些值在整个程序中都被使用,所以我担心它们的成本
  • 。。。而且使用太多的@macros也有点烦人
我不知道该用什么

在这些情况下你用什么

“瓦尔的?”参考/原子/代理的?甚至是“延迟”

提前感谢。

如果您正在学习的所有或一组“常量”都可以在一个时间点上学习,那么我们将它们称为“属性”

让我们做一个配置来“吸引他们”:

您的属性(例如“常量”)文件“Your.conf”将位于以下行中:

{:db
    {:uri "datomic:mem://dbname"
     :other-property 42}

 :rabbit
        {:host "192.168.1.17"
         :port 5672
         :exchange "xyz-exchange"
         :queue "zq"
         :exchange.type "direct"
         :vhost "/some-broker"
         :username "user"
         :password "strong"}}
随后,在程序/其他名称空间中,您可以通过以下方式访问所有这些属性:

(conf :db :uri)               ;; will "constant"ly return "datomic:mem://dbname"
(conf :rabbit :host)          ;; will "constant"ly return "192.168.1.17"
(conf :db :other-property)    ;; will "constant"ly return 42

在“现实生活”中,上面的“道具”变量可能会检查“-D”路径,具有默认值,并处理异常,但为了说明这一点,它有点简化。

为什么不在程序启动时在第一行同步定义变量?因此,在这种情况下,您不需要在其他地方覆盖该var。另一方面,如果你在任何地方写
@my var
都很烦人,你可以定义一个包装函数,返回
@my var
,谢谢你的回答。如何同步定义var?我想我不明白你的意思。我认为变量不是同步的。您的意思是将ref分配给vars并重置(更新)refs以进行初始化吗?我的意思是在您的命名空间
ns处。使用常量
,第一行代码将是
(def my const(一些计算))
。因此,在这个表达式计算所有试图使用或需要
ns的名称空间之前,with const
不会开始计算它们自己的代码。而且这个型号没有比赛条件。当你的常数被计算出来时,它就被定义了,一切都正常。希望这个解释能让senseLooks成为一个聪明的想法——我应该试一试!也许它不能预先编译,但在大多数情况下都会很有帮助。谢谢
(conf :db :uri)               ;; will "constant"ly return "datomic:mem://dbname"
(conf :rabbit :host)          ;; will "constant"ly return "192.168.1.17"
(conf :db :other-property)    ;; will "constant"ly return 42