Cider: *print-namespace-maps* selalu benar

Dibuat pada 2 Mei 2018  ·  8Komentar  ·  Sumber: clojure-emacs/cider

Perilaku yang diharapkan, perilaku aktual dan langkah-langkah untuk mereproduksi masalah

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

Informasi versi CIDER

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

Versi Emacs

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

Sistem operasi

OSX El Capitan, Versi 10.11.6

Komentar yang paling membantu

Saya tidak tahu apakah ini masalah khusus CIDER, saya dapat mereproduksi masalah ini dalam REPL Leiningen.

Semua 8 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat