提供可设置的全球变量

时间:2011-07-17 13:02:40

标签: clojure

我需要为我的用户提供可设置的变量,例如clojure AFAIK提供的 warn-on-reflection ,它们没有在clojure方面定义,这就是为什么我们可以设置它们。

问题是我的vars(所有配置)都用在很多紧密的循环中,这就是为什么我不想让它们成为引用因为它们可能在应用程序启动时被设置并且它在运行时没有变化,它们将会被阅读的次数可能是数百万次,所以制作它们似乎就像浪费资源一样。

所以问题是我可以在我的案例中定义可设置的变量吗?

3 个答案:

答案 0 :(得分:2)

如果你想要所有线程都可见的低开销的可设置全局状态,并且不需要任何STM事务来控制变异,我建议只使用原子:

(def some-global-value (atom 1))

对原子的读取和写入非常低开销。

答案 1 :(得分:1)

您可以使用let创建本地绑定,这样参数可以是动态的,您仍然可以快速访问。唯一的问题是,如果有人在循环运行时更改了一个参数,那么循环就不会选择它(IMO无论如何都应该是理想的行为)。

答案 2 :(得分:1)

warn-on-reflection 只是一个var,虽然是在Clojure的Java代码中而不是在core.clj中定义的。但是,除了定义它之外,警告反射没有什么特别之处。它的行为与任何其他var完全相同。

如果您不想使用变量,您可能需要从与“必须使用全局变量”不同的角度来解决您的问题。在函数式编程中,将所有必要的值传递给函数而不是依赖于全局变量是很常见的。也许现在是时候考虑这种方法了。