Оценка карты с помощью ключей с именами, например
{:person/name "Fred" :person/age 50}
в сидре repl печатает следующее возвращаемое значение
#:person{:name "Fred", :age 50}
Это связано с тем, что *print-namespace-maps*
умолчанию равен true
.
Обычно можно изменить значение этой переменной навсегда с помощью set!
таким образом:
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
:
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) от 01.06.2016
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 - похоже, что реализация eval работает правильно, если предположить, что (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 и затем сохраняет свое значение во всех вычислениях в ответе. Я не уверен, как сделать аналог в 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, поскольку @bbatsov считает, что ошибка здесь: https://github.com/nrepl/nREPL/issues/33
Самый полезный комментарий
Я не знаю, является ли это конкретной проблемой CIDER, я могу воспроизвести эту проблему в Leiningen REPL.