2024 年 Clojure 状况调查!(链接) 中分享您的想法!

欢迎!有关如何使用本网站的信息,请参阅 关于 页面。

0
Clojure
0

0


    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: 无法设置 *set-me*:非绑定线程  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 可用 set! 时才返回 true。

0

评论由:alexmiller撰写

REPL 示例吗?

0

评论由:joegallo撰写

当然,Alex -- 这里是今早刚刚运行的一个repl示例。

`; nREPL 0.1.7
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: Cannot set! set-me from non-binding thread clojure.lang.Var.set (Var.java:230)
user>`

0
参考: https://clojure.atlassian.net/browse/CLJ-1077 (pjstadig报告)
...