在repl中关闭* print-namespace-maps *

时间:2017-10-20 17:55:08

标签: clojure

使用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使用bindingcreate thread-local bindings来获取包括此变量在内的一系列变量,以及set! does not work for local variable bindings

1 个答案:

答案 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))