什么时候应该在Clojure中使用临时重新绑定-a-special-var成语?

Ray*_*yne 5 clojure dynamic-rebinding

我注意到一些像clojure-twitter这样的库使用特殊的vars(那些用于动态绑定的用星号包围)用于oauth身份验证.您将身份验证保存在var中,然后使用(with-oauth myauth ..).我认为这是解决此类问题的一个非常好的解决方案,因为您可以为应用程序的每个用户重新绑定auth var.

我在一个我写过的电子邮件客户端中采取了类似的路线.我有一个特殊的var命名会话,我使用当前用户的会话和用户信息绑定到一个地图,并且有各种重要的函数使用来自该var的信息.我写了一个宏,with-session暂时在传递给with-session的一组表单的上下文中重新绑定它.事实证明这是一个非常干净的解决方案(对我来说).

所以,我的问题是这样的:我是否'做'它'?这是一个糟糕的设计决定,还是这个特殊变量的预期用法之一?

Mic*_*zyk 7

你似乎完全正确.实际上,有许多内置/ contrib宏可以使用,with-out-str或者说类似clojure.contrib.sql/with-connection.后者是当今Clojure基础设施的一个相当重要的组成部分,所以无论它使用什么成语都被很多人仔细审查.

要记住的重要问题是,在bindings/ with-bindingsform的范围内启动的线程不会继承所讨论的vars的反弹值; 相反,他们看到根绑定.如果要将绑定传播到工作线程/代理,请将它们显式传递(比如函数参数)或使用bound-fn.