使用Clojure 1.9-beta2,读者和作者现在支持a compact syntax for maps。在所有键都是具有相同名称空间的限定关键字的情况下,语法避免重复命名空间:
> (pr-str {:a/foo 1 :a/bar 2})
"#:a{:foo 1, :bar 2}"
将这样的序列化地图发送到Clojure 1.8进程时会出现问题:在那里运行的旧阅读器将无法读取它并抛出java.lang.RuntimeException: Reader tag must be a symbol
。
幸运的是,打印机仅在动态变量*print-namespace-maps*
真实时执行此操作,并且默认情况下它是假的,因此我的应用程序继续在生产中工作。但是,REPL将其设置为true,因此当我在REPL中工作并执行最终向Clojure 1.8服务发送请求的操作时,它会失败。 如何在REPL中禁用新语法?
我想也许我可以在我的repl中(set! *print-namespace-maps* false)
或将{:user {:repl-options {:init (set! *print-namespace-maps* false)}}}
添加到我的〜/ .lein / profiles.clj中,但这似乎不起作用。我认为原因可能是REPL使用binding
到create thread-local bindings来获取包括此变量在内的一系列变量,以及set!
does not work for local variable bindings。
答案 0 :(得分:2)
您可以为地图重新定义print-method
,无论环境如何,地图都可以正常工作。
(defmethod print-method clojure.lang.IPersistentMap [m, ^java.io.Writer w]
(#'clojure.core/print-meta m w)
(#'clojure.core/print-map m #'clojure.core/pr-on w))