Clojure 提供可设置的全局变量

Clojure 提供可设置的全局变量,clojure,Clojure,我需要为我的用户提供可设置的变量,比如clojure AFAIK提供的反射警告,它们没有在clojure端定义,这就是为什么我们可以设置它们 问题是我的VAR(所有配置内容)在很多紧循环中使用,这就是为什么我不想让它们引用的原因,因为它们可能在应用程序启动时被设置,而且在运行时没有变化,它们可能会被读取数百万次,所以让它们引用似乎是在浪费资源 所以问题是,在我的例子中,我可以定义可设置的变量吗?您可以使用let创建本地绑定,这样参数可以是动态的,您仍然可以快速访问。唯一的问题是,如果有人在循环运

我需要为我的用户提供可设置的变量,比如clojure AFAIK提供的反射警告,它们没有在clojure端定义,这就是为什么我们可以设置它们

问题是我的VAR(所有配置内容)在很多紧循环中使用,这就是为什么我不想让它们引用的原因,因为它们可能在应用程序启动时被设置,而且在运行时没有变化,它们可能会被读取数百万次,所以让它们引用似乎是在浪费资源


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

您可以使用
let
创建本地绑定,这样参数可以是动态的,您仍然可以快速访问。唯一的问题是,如果有人在循环运行时更改了参数,循环将不会拾取该参数(我认为这应该是所需的行为)。

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


如果您不想使用vars,您可能需要从不同于“必须使用全局变量”的角度来处理您的问题。在函数式编程中,通常将所有必要的值传递到函数中,而不是依赖于全局变量。也许是时候考虑一下这样的方法了。

< P>如果你想设置一个可在所有线程可见的低开销的可设置全局状态,不需要任何STM事务来控制突变,那么我建议只使用原子:

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

读取和写入atoms的开销非常低。

有什么原因不能使用def吗?我已经使用def了,我需要更改deffed变量您考虑过使用“绑定”吗?是的,强制用户绑定每个配置变量并不是真正的解决方案。let只适用于let块中的代码,我在寻找一个类似于反射警告的东西,当设置它时,它会影响整个库,而不仅仅是一个代码块。它是一个内置的变量,这意味着它没有在core.clj中定义,而是在java代码中定义,这意味着它没有在clojure中定义。很抱歉,我误解了你所说的“没有在clojure中定义”。在任何情况下,我的主要观点是:反射警告是一个变量,除了在Java代码中定义之外,它的行为与任何其他变量一样。没有“具有特殊能力的变量”的概念。它是一个特殊的变量,您可以设置它!信息技术当您使用say def定义变量时,您无法设置!但是你可以设定!反射警告。当前,尝试使用set!设置变量的根绑定是错误的!,i、 e.var分配是线程本地的。Clojure java代码使用线程绑定定义反射时警告。类似地,如果使用“binding”定义变量,则可以使用“set!”。没有“具有特殊权限的VAR”的概念。