Auswerten einer Karte mit Namespace-Schlüsseln wie
{:person/name "Fred" :person/age 50}
im Apfelwein repl gibt den folgenden Rückgabewert aus
#:person{:name "Fred", :age 50}
Dies liegt daran, dass *print-namespace-maps*
standardmäßig true
.
Normalerweise sollte es möglich sein, den Wert dieser Variablen mit set!
dauerhaft zu ändern, also:
user> (set! *print-namespace-maps* false)
false
user> *print-namespace-maps*
false
Das tatsächliche Verhalten ist jedoch so:
user> (set! *print-namespace-maps* false)
false
user> *print-namespace-maps*
true
Ebenso sollte es möglich sein, die var vorübergehend mit binding
zu ändern:
user> (binding [*print-namespace-maps* false]
[*print-namespace-maps* {:person/name "Fred" :person/age 50}])
[false {:person/name "Fred" :person/age 50}]
Aber obwohl sich die var zu ändern scheint, bleibt das gewünschte Verhalten abzuwarten;
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) vom 01.06.2016
OSX El Capitan, Version 10.11.6
Ich weiß nicht, ob dies ein CIDER-spezifisches Problem ist, ich kann dieses Problem in einer Leininger REPL reproduzieren.
Das deutet darauf hin, dass es etwas mit der Implementierung von nREPL oder REPLY zu tun hat.
https://github.com/cemerick/nREPL/blob/master/src/main/clojure/clojure/tools/nrepl/middleware/interruptible_eval.clj - es sieht so aus, als ob die Implementierung von eval das Richtige tut, vorausgesetzt, dass (get-thread-bindings)
tut was es soll. Die Implementierung in Clojure 1.9 sieht gut aus und macht beim REPL das Richtige. Dies deutet darauf hin, dass die Sitzungsverwaltung von nREPL oder etwas vorgeschaltetes *print-namespace-maps*
korrekt erfasst und wiederherstellt.
https://github.com/cemerick/nREPL/blob/master/src/main/clojure/clojure/tools/nrepl/middleware/session.clj#L108 - das ist vielleicht ein bisschen verdächtig, es weiß nichts darüber *print-namespace-maps*
aber das muss kein Problem sein.
clojure.main/with-bindings
richtet Root-Bindungen für alles ein, was clojure.main/repl
durchläuft, einschließlich des Pushens der *print-namespace-maps*
Standardbindung von true
. Die Wurzeldefinition von *print-namespace-maps*
in clojure/core_print.clj
ist false
. Dieses Verhalten kann mit clj -e "(get-thread-bindings)"
was meldet, dass {#'clojure.core/*print-namespace-maps* true ...}
.
Das deutet darauf hin, dass es etwas mit der Implementierung von nREPL oder REPLY zu tun hat.
Ich bezweifle, dass REPLy zusätzlich zu nREPL etwas Besonderes macht, also wahrscheinlich ein nREPL-Problem.
clojure.main bindet print-namespace-maps und behält dann seinen Wert über Auswertungen hinweg in der Repl. Ich bin mir nicht sicher, wie man das Äquivalent in nrepl macht, aber das ist es, was benötigt wird.
Ich habe dies vor einiger Zeit in der entsprechenden Cursive-Ausgabe analysiert: cursive-ide/cursive#1541.
Soll ich das Problem unter https://github.com/clojure/tools.nrepl wiederholen und hier @bbatsov schließen ?
@Reefersleep Fast.
https://github.com/clojure/tools.nrepl wurde von https://github.com/nrepl/nrepl abgelöst. Bitte reichen Sie das Ticket dort ein.
Habe dieses Problem im nrepl-Repo erneut gepostet , da https://github.com/nrepl/nREPL/issues/33
Hilfreichster Kommentar
Ich weiß nicht, ob dies ein CIDER-spezifisches Problem ist, ich kann dieses Problem in einer Leininger REPL reproduzieren.