【发布时间】:2013-11-28 10:56:50
【问题描述】:
我想谦虚地问一下……
什么,“常量值的 var 或 ref/atom/agent?”,我要问吗? 当然,我确实将 vars 用于常量值。
但我一直想知道,当值的行为类似于常量但它们应该在运行时而不是在编译时(读取代码时)分配时,我应该使用哪一个。
例如,考虑一些写在用户配置文件中的 java 属性。 它们应该在运行时分配,因为数据不在代码中。 但是它们也应该在读取数据之前定义,因为其他代码引用它们。
在这种情况下,
什么时候使用'var's?:
- 我定义了 'var's,或者只声明 'var's(如果可以的话)。
- 然后我通过读取选项文件的函数再次重新定义那些 'var's。
- 但是覆盖 'var' 感觉很糟糕,或者在函数内部定义 'var' 感觉很奇怪。
什么时候使用 ref/atom/agent?:
- 我将 ref/atom/agents 分配给 'var's。
- 然后我通过读取选项文件的函数更新这些 ref/atom/agents。
- 但由于这些值在整个程序中使用,所以我担心它们的成本。
- ...而且使用太多@宏有点烦人。
我不知道我应该使用什么。
在这些情况下你会使用什么?
'var's? '参考/原子/代理?甚至是“延迟”?
提前致谢。
【问题讨论】:
-
为什么不在程序启动的第一行同步定义你的var?因此,在这种情况下,您不需要在其他地方覆盖该 var。另一方面,如果您在任何地方都写
@my-var很烦人,您只需定义一个返回@my-var的包装函数 -
感谢您的回答。如何同步定义我的 var?我不认为我明白你的意思。我认为 vars 不是同步的。您的意思是为 vars 分配 refs 并重置(更新) refs 以进行初始化吗?
-
我的意思是在你的命名空间
ns.with-const中,第一行代码是(def my-const (some-computations))。因此,在此表达式评估所有尝试使用或要求ns.with-const的命名空间之前,不会开始评估他们自己的代码。这个模型没有竞争条件。当您的 const 将被计算 - 它变成定义的一切工作正常。希望这个解释有意义 -
看起来是个聪明的主意——我应该试一试!也许它不能被预编译,但在大多数情况下它会有所帮助。谢谢!