Cider: * print-namespace-maps * é sempre verdadeiro

Criado em 2 mai. 2018  ·  8Comentários  ·  Fonte: clojure-emacs/cider

Comportamento esperado, comportamento real e etapas para reproduzir o problema

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}]

Informação da versão CIDER

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

Versão Emacs

GNU Emacs 24.5.1 (x86_64-apple-darwin15.3.0, NS apple-appkit-1404.34) de 01/06/2016

Sistema operacional

OSX El Capitan, versão 10.11.6

Comentários muito úteis

Não sei se este é um problema específico do CIDER, posso reproduzir esse problema em um REPL de Leiningen.

Todos 8 comentários

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

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

NightMachinary picture NightMachinary  ·  6Comentários

ukriish picture ukriish  ·  6Comentários

geokon-gh picture geokon-gh  ·  9Comentários

mwfogleman picture mwfogleman  ·  3Comentários

MicahElliott picture MicahElliott  ·  7Comentários