Mengevaluasi peta dengan kunci dengan spasi nama seperti
{:person/name "Fred" :person/age 50}
di cider repl mencetak nilai pengembalian berikut:
#:person{:name "Fred", :age 50}
Ini karena *print-namespace-maps*
default ke true
.
Biasanya, seharusnya dimungkinkan untuk mengubah nilai var ini secara permanen dengan set!
demikian:
user> (set! *print-namespace-maps* false)
false
user> *print-namespace-maps*
false
Namun, perilaku yang sebenarnya demikian:
user> (set! *print-namespace-maps* false)
false
user> *print-namespace-maps*
true
Demikian pula, mungkin untuk sementara mengubah var dengan binding
:
user> (binding [*print-namespace-maps* false]
[*print-namespace-maps* {:person/name "Fred" :person/age 50}])
[false {:person/name "Fred" :person/age 50}]
Namun, meskipun var tampaknya berubah, perilaku yang diinginkan masih harus dilihat;
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) tahun 2016-06-01
OSX El Capitan, Versi 10.11.6
Saya tidak tahu apakah ini masalah khusus CIDER, saya dapat mereproduksi masalah ini dalam REPL Leiningen.
Itu menunjukkan itu ada hubungannya dengan implementasi nREPL atau REPLY.
https://github.com/cemerick/nREPL/blob/master/src/main/clojure/clojure/tools/nrepl/middleware/interruptible_eval.clj - sepertinya implementasi eval melakukan hal yang benar, dengan asumsi bahwa (get-thread-bindings)
melakukan apa yang seharusnya dilakukan. Implementasi di Clojure 1.9 terlihat baik-baik saja dan melakukan hal yang benar di REPL. Ini menunjukkan bahwa manajemen sesi nREPL atau sesuatu di hulunya tidak menangkap dan memulihkan *print-namespace-maps*
dengan benar.
https://github.com/cemerick/nREPL/blob/master/src/main/clojure/clojure/tools/nrepl/middleware/session.clj#L108 - ini mungkin sedikit mencurigakan, tidak tahu tentang *print-namespace-maps*
tapi itu tidak harus menjadi masalah.
clojure.main/with-bindings
menetapkan pengikatan root untuk apa pun yang melewati clojure.main/repl
, yang mencakup mendorong pengikatan default *print-namespace-maps*
dari true
. Definisi akar dari *print-namespace-maps*
dalam clojure/core_print.clj
adalah false
. Perilaku ini dapat dikonfirmasi dengan clj -e "(get-thread-bindings)"
yang akan melaporkan bahwa {#'clojure.core/*print-namespace-maps* true ...}
.
Itu menunjukkan itu ada hubungannya dengan implementasi nREPL atau REPLY.
Saya ragu bahwa REPLy melakukan sesuatu yang istimewa di atas nREPL, jadi kemungkinan masalah nREPL.
clojure.main mengikat print-namespace-maps dan kemudian mempertahankan nilainya di seluruh evaluasi di repl. Saya tidak yakin bagaimana melakukan yang setara di nrepl, tapi itulah yang dibutuhkan.
Saya menganalisis ini beberapa waktu lalu dalam masalah Kursif yang relevan: cursive-ide/cursive#1541.
Haruskah saya mengulangi masalah di https://github.com/clojure/tools.nrepl dan menutupnya di sini, @bbatsov ?
@Reefersleep Hampir.
https://github.com/clojure/tools.nrepl digantikan oleh https://github.com/nrepl/nrepl. Tolong, kirimkan tiketnya di sana.
Memposting ulang masalah ini di nrepl repo karena @bbatsov yakin kesalahannya ada di sini: https://github.com/nrepl/nREPL/issues/33
Komentar yang paling membantu
Saya tidak tahu apakah ini masalah khusus CIDER, saya dapat mereproduksi masalah ini dalam REPL Leiningen.