Cider: * print-namespace-maps * es siempre verdadero

Creado en 2 may. 2018  ·  8Comentarios  ·  Fuente: clojure-emacs/cider

Comportamiento esperado, comportamiento real y pasos para reproducir el problema.

Evaluar un mapa con claves con espacios de nombres como
{:person/name "Fred" :person/age 50}
en la respuesta de sidra imprime el siguiente valor de retorno
#:person{:name "Fred", :age 50}
Esto se debe a que *print-namespace-maps* predeterminado en true .
Normalmente, debería ser posible cambiar el valor de esta var permanentemente con set! así:

user> (set! *print-namespace-maps* false)
false
user> *print-namespace-maps*
false

Sin embargo, el comportamiento real es así:

user> (set! *print-namespace-maps* false)
false
user> *print-namespace-maps*
true

De manera similar, debería ser posible cambiar temporalmente la var con binding :

user> (binding [*print-namespace-maps* false]
        [*print-namespace-maps* {:person/name "Fred" :person/age 50}])
[false {:person/name "Fred" :person/age 50}]

Pero, aunque la var parece cambiar, queda por ver el comportamiento deseado;

user> (binding [*print-namespace-maps* false]
        [*print-namespace-maps* {:person/name "Fred" :person/age 50}])
[false #:person{:name "Fred", :age 50}]

Información de la versión de CIDER

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

Versión de Emacs

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

Sistema operativo

OSX El Capitan, versión 10.11.6

Comentario más útil

No sé si se trata de un problema específico de CIDER, puedo reproducir este problema en un REPL de Leiningen.

Todos 8 comentarios

No sé si se trata de un problema específico de CIDER, puedo reproducir este problema en un REPL de Leiningen.

Eso sugiere que tiene algo que ver con la implementación de nREPL o REPLY.

https://github.com/cemerick/nREPL/blob/master/src/main/clojure/clojure/tools/nrepl/middleware/interruptible_eval.clj - parece que la implementación de eval hace lo correcto, asumiendo que (get-thread-bindings) hace lo que se supone que debe hacer. La implementación en Clojure 1.9 se ve bien y hace lo correcto en el REPL. Esto sugiere que la administración de sesiones de nREPL o algo anterior no está capturando y restaurando *print-namespace-maps* correctamente.

https://github.com/cemerick/nREPL/blob/master/src/main/clojure/clojure/tools/nrepl/middleware/session.clj#L108 - esto puede ser un poco sospechoso, no sabe *print-namespace-maps* pero eso no tiene por qué ser un problema.

clojure.main/with-bindings establece enlaces de raíz para cualquier cosa que pase por clojure.main/repl , lo que incluye empujar el enlace predeterminado *print-namespace-maps* de true . La definición raíz de *print-namespace-maps* en clojure/core_print.clj es false . Este comportamiento se puede confirmar con clj -e "(get-thread-bindings)" que informará que {#'clojure.core/*print-namespace-maps* true ...} .

Eso sugiere que tiene algo que ver con la implementación de nREPL o REPLY.

Dudo que REPLy esté haciendo algo especial además de nREPL, por lo que probablemente sea un problema de nREPL.

clojure.main enlaza print-namespace-maps y luego retiene su valor en todas las evaluaciones en el repl. No estoy seguro de cómo hacer el equivalente en nrepl, pero eso es lo que se necesita.

Analicé esto hace un tiempo en el número de cursiva relevante: cursive-ide / cursive # 1541.

¿Debo repetir el problema en https://github.com/clojure/tools.nrepl y cerrarlo aquí, @bbatsov ?

@Reefersleep Casi.

https://github.com/clojure/tools.nrepl fue reemplazado por https://github.com/nrepl/nrepl. Por favor, envíe el ticket allí.

Se volvió a publicar este problema en el repositorio de nrepl ya que https://github.com/nrepl/nREPL/issues/33

¿Fue útil esta página
0 / 5 - 0 calificaciones