使用命名空间键评估映射,例如{:person/name "Fred" :person/age 50}
在苹果酒 repl 中打印以下返回值#:person{:name "Fred", :age 50}
这是由于*print-namespace-maps*
默认为true
。
通常,应该可以使用set!
永久更改此 var 的值:
user> (set! *print-namespace-maps* false)
false
user> *print-namespace-maps*
false
然而,实际行为是这样的:
user> (set! *print-namespace-maps* false)
false
user> *print-namespace-maps*
true
同样,应该可以使用binding
临时更改 var :
user> (binding [*print-namespace-maps* false]
[*print-namespace-maps* {:person/name "Fred" :person/age 50}])
[false {:person/name "Fred" :person/age 50}]
但是,尽管 var 似乎发生了变化,但所需的行为仍有待观察;
user> (binding [*print-namespace-maps* false]
[*print-namespace-maps* {:person/name "Fred" :person/age 50}])
[false #:person{:name "Fred", :age 50}]
;; CIDER 0.15.0 (London), nREPL 0.2.13
;; Clojure 1.9.0, Java 1.8.0_92
GNU Emacs 24.5.1 (x86_64-apple-darwin15.3.0, NS apple-appkit-1404.34) of 2016-06-01
OSX El Capitan,版本 10.11.6
我不知道这是否是 CIDER 特定的问题,我可以在 Leiningen REPL 中重现这个问题。
这表明它与 nREPL 或 REPLY 的实现有关。
https://github.com/cemerick/nREPL/blob/master/src/main/clojure/clojure/tools/nrepl/middleware/interruptible_eval.clj - 假设(get-thread-bindings)
做它应该做的事情。 Clojure 1.9 中的实现看起来不错,而且它在 REPL 中做了正确的事情。 这表明 nREPL 的会话管理或它的上游没有正确捕获和恢复*print-namespace-maps*
。
https://github.com/cemerick/nREPL/blob/master/src/main/clojure/clojure/tools/nrepl/middleware/session.clj#L108 - 这可能有点可疑,它不知道*print-namespace-maps*
但这不一定是问题。
clojure.main/with-bindings
任何内容建立根绑定通过去clojure.main/repl
,其包括推动*print-namespace-maps*
默认的结合true
。 的根定义*print-namespace-maps*
在clojure/core_print.clj
是false
。 这种行为可以用clj -e "(get-thread-bindings)"
,它将报告{#'clojure.core/*print-namespace-maps* true ...}
。
这表明它与 nREPL 或 REPLY 的实现有关。
我怀疑 REPLy 在 nREPL 之上做了什么特别的事情,所以很可能是 nREPL 问题。
clojure.main 绑定print-namespace-maps ,然后在 repl 中的评估中保留其值。 我不确定如何在 nrepl 中执行等效操作,但这就是所需要的。
不久前,我在相关的 Cursive 问题中对此进行了分析:cursive-ide/cursive#1541。
我应该在https://github.com/clojure/tools.nrepl重复这个问题并在这里关闭它, @bbatsov吗?
@Reefersleep几乎。
https://github.com/clojure/tools.nrepl由https://github.com/nrepl/nrepl接替
在 nrepl repo 上重新发布了这个问题,因为https :
最有用的评论
我不知道这是否是 CIDER 特定的问题,我可以在 Leiningen REPL 中重现这个问题。