Avaliar um mapa com chaves de namespace, como
{:person/name "Fred" :person/age 50}
na cidra repl imprime o seguinte valor de retorno
#:person{:name "Fred", :age 50}
Isso se deve ao fato de *print-namespace-maps*
padronizar para true
.
Normalmente, deve ser possível alterar o valor desta var permanentemente com set!
assim:
user> (set! *print-namespace-maps* false)
false
user> *print-namespace-maps*
false
No entanto, o comportamento real é assim:
user> (set! *print-namespace-maps* false)
false
user> *print-namespace-maps*
true
Da mesma forma, deve ser possível alterar temporariamente a var com binding
:
user> (binding [*print-namespace-maps* false]
[*print-namespace-maps* {:person/name "Fred" :person/age 50}])
[false {:person/name "Fred" :person/age 50}]
Mas, embora a var pareça mudar, o comportamento desejado ainda está para ser visto;
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) de 01/06/2016
OSX El Capitan, versão 10.11.6
Não sei se este é um problema específico do CIDER, posso reproduzir esse problema em um REPL de Leiningen.
Isso sugere que tem algo a ver com a implementação de nREPL ou REPLY.
https://github.com/cemerick/nREPL/blob/master/src/main/clojure/clojure/tools/nrepl/middleware/interruptible_eval.clj - parece que a implementação de eval faz a coisa certa, assumindo que (get-thread-bindings)
faz o que deve fazer. A implementação no Clojure 1.9 parece boa e faz a coisa certa no REPL. Isso sugere que o gerenciamento de sessão do nREPL ou algo acima dele não está capturando e restaurando *print-namespace-maps*
corretamente.
https://github.com/cemerick/nREPL/blob/master/src/main/clojure/clojure/tools/nrepl/middleware/session.clj#L108 - pode ser um pouco suspeito, ele não sabe sobre *print-namespace-maps*
mas isso não precisa ser um problema.
clojure.main/with-bindings
estabelece vínculos de raiz para qualquer coisa que passe por clojure.main/repl
, o que inclui empurrar o vínculo padrão *print-namespace-maps*
de true
. A definição raiz de *print-namespace-maps*
em clojure/core_print.clj
é false
. Este comportamento pode ser confirmado com clj -e "(get-thread-bindings)"
que relatará que {#'clojure.core/*print-namespace-maps* true ...}
.
Isso sugere que tem algo a ver com a implementação de nREPL ou REPLY.
Duvido que o REPLy esteja fazendo algo especial além do nREPL, então provavelmente é um problema do nREPL.
clojure.main vincula mapas de espaço de nomes de impressão e, em seguida, retém seu valor nas avaliações no repl. Não tenho certeza de como fazer o equivalente no nrepl, mas é o que é necessário.
Eu analisei isso há algum tempo na edição relevante do Cursive: cursive-ide / cursive # 1541.
Devo repetir o problema em https://github.com/clojure/tools.nrepl e fechá-lo aqui, @bbatsov ?
@Reefersleep Quase.
https://github.com/clojure/tools.nrepl foi sucedido por https://github.com/nrepl/nrepl. Por favor, envie o tíquete lá.
Postado novamente este problema no repositório nrepl, pois @bbatsov acredita que o erro está aqui: https://github.com/nrepl/nREPL/issues/33
Comentários muito úteis
Não sei se este é um problema específico do CIDER, posso reproduzir esse problema em um REPL de Leiningen.