2024 年 Clojure 状态调查! 中分享你的想法。

欢迎!请参阅 关于 页面以了解更多有关该功能的信息。

0 投票
Clojure
{{thread-bound?}} 对于未由当前线程绑定的线程局部绑定返回 true。这与文档说明相矛盾,文档说明如果返回 true,{{set!}} 应该成功。

这是一个示例 REPL 会话,其中线程建立了一个绑定,那些绑定被发送到第二个线程,第二个线程检查 thread-bound? 以查看是否可以设置绑定,thread-bound? 返回 true,表明可以设置绑定,第二个线程尝试设置绑定,并且第二个线程得到一个 IllegalStateException


    Clojure 1.5.1
    user=> (def ^:dynamic *set-me* nil)
    #'user/*set-me*
    user=> (defn try-to-set [] (binding [*set-me* 1] (doall (pcalls #(if (thread-bound? #'*set-me*) (set! *set-me* (inc *set-me*)))))))
    #'user/try-to-set
    user=> (try-to-set)
    IllegalStateException Can't set!: *set-me* from non-binding thread  clojure.lang.Var.set (Var.java:230)
    user=>


*方法:* 当存在绑定且该绑定不是由当前线程建立时,thread-bound? 应返回 false。此补丁向 Var 添加了一个新函数,因为核心函数没有访问非公共 Var$TBox 的可见性。

*补丁:* thread-bound.diff

*筛选者:* Alex Miller

4 答案

0 投票

评论者:pjstadig

我附上了一个补丁,该补丁更改了 clojure.lang.Var 和 clojure.core/thread-bound?,以使其仅在 Var 可设置!时返回 true。

0 投票

评论者:alexmiller

REPL 示例?

0 投票
by

评论者:joegallo

当然,Alex —— 这里是今天早上我刚刚运行的一个repl示例。

`; nREPL 0.1.7
用户> (def ^:dynamic set-me nil)

'用户/set-me

用户> (defn try-to-set [] (binding [*set-me* 1] (doall (pcalls #(if (thread-bound? #'set-me) (set! set-me (inc set-me)))))))

'用户/try-to-set

用户> (try-to-set)
IllegalStateException 无法设置: set-me 来自非绑定线程 clojure.lang.Var.set (Var.java:230)
用户>`

0 投票
by
...