将此表单放置在 user
命名空间顶层
(set! *default-data-reader-fn* tagged-literal)
在启动 REPL(使用 Clojure 1.11.1)时会产生以下错误
Exception in thread "main" Syntax error macroexpanding at (user.clj:9:1).
at clojure.lang.Compiler.load(Compiler.java:7665)
at clojure.lang.RT.loadResourceScript(RT.java:381)
at clojure.lang.RT.loadResourceScript(RT.java:368)
at clojure.lang.RT.maybeLoadResourceScript(RT.java:364)
at clojure.lang.RT.doInit(RT.java:486)
at clojure.lang.RT.init(RT.java:467)
at clojure.main.main(main.java:38)
Caused by: java.lang.IllegalStateException: Can't change/establish root binding of: *default-data-reader-fn* with set
at clojure.lang.Var.set(Var.java:226)
at user$eval148.invokeStatic(user.clj:13)
at user$eval148.invoke(user.clj:13)
at clojure.lang.Compiler.eval(Compiler.java:7194)
at clojure.lang.Compiler.load(Compiler.java:7653)
... 6 more
不过,REPL 启动后评估相同的形式一切正常。
进一步说明,将此形式放置在 user
顶层仍然可以正常工作
(alter-var-root #'*default-data-reader-fn* (constantly tagged-literal))
为什么这里的 `set!` 不起作用?如果有很好的理由,我建议更新 https://clojure.org/reference/reader#_default_data_reader_function 来提及这一点。