Cider: *print-namespace-maps* 始终为真

创建于 2018-05-02  ·  8评论  ·  资料来源: clojure-emacs/cider

预期行为、实际行为和重现问题的步骤

使用命名空间键评估映射,例如
{: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 版本信息

;; CIDER 0.15.0 (London), nREPL 0.2.13
;; Clojure 1.9.0, Java 1.8.0_92

Emacs 版本

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 中重现这个问题。

所有8条评论

我不知道这是否是 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.cljfalse 。 这种行为可以用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吗?

在 nrepl repo 上重新发布了这个问题,因为https :

此页面是否有帮助?
0 / 5 - 0 等级