Cider: *print-namespace-maps* ist immer wahr

Erstellt am 2. Mai 2018  ·  8Kommentare  ·  Quelle: clojure-emacs/cider

Erwartetes Verhalten, tatsächliches Verhalten und Schritte zur Reproduktion des Problems

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-Versionsinformationen

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

Emacs-Version

GNU Emacs 24.5.1 (x86_64-apple-darwin15.3.0, NS apple-appkit-1404.34) vom 01.06.2016

Betriebssystem

OSX El Capitan, Version 10.11.6

Hilfreichster Kommentar

Ich weiß nicht, ob dies ein CIDER-spezifisches Problem ist, ich kann dieses Problem in einer Leininger REPL reproduzieren.

Alle 8 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen