Cider: * print-namespace-maps * всегда верно

Созданный на 2 мая 2018  ·  8Комментарии  ·  Источник: clojure-emacs/cider

Ожидаемое поведение, фактическое поведение и шаги по воспроизведению проблемы

Оценка карты с помощью ключей с именами, например
{: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

;; 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) от 01.06.2016

Операционная система

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 - похоже, что реализация 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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги