在其他项目中使用Reader Literals

时间:2014-03-01 01:29:52

标签: clojure

我在我的项目的data_readers.clj文件中有我的读者文字,并且工作正常。如果我创建一个新项目,我可以使用我在依赖库中创建的读者文字吗?我没有看到使用/要求读者文字的方法。

例如,如果我有一个data_readers.clj文件:

{ml/foo mylib.core.foo}

我可以从单独的项目中做#ml/foo some-arg吗?

1 个答案:

答案 0 :(得分:1)

在需要库之后,您可以通过多种方式进行操作:

1)绑定*data-readers*

(ns mylib.core)
(def foo identity)
(binding [*data-readers* (assoc *data-readers* 'ml/foo mylib.core/foo)]
  (read-string "#ml/foo arg")) ;;=> arg

此外,您可以为所有标签绑定*default-data-reader-fn*。参见example

Pro:本地影响,建议的方式,因为两个变量均标记为动态。 相反:不适用于clojure.edn

2)更改clojure.core/default-data-readers

(alter-var-root #'clojure.core/default-data-readers assoc 'ml/foo mylib.core/foo)
(clojure.edn/read-string "#ml/foo arg") ;;=> arg
(read-string "#ml/foo arg")             ;;=> arg 

Pro:适用于clojure.edn。 相反:全局突变