我正在尝试使用Clojure代码的标准序列化,忽略空格,注释等。我正在考虑使用EDN。
根据我所读到的,将s表达式序列化为EDN的标准方法是通过pr-str
,这似乎与大多数Clojure的构造很好地协作。但是,对于包含正则表达式的代码(使用哈希字符串阅读器宏,如#"\d+"
),这似乎不太适用。
user=> (pr-str '#"\d")
"#\"\\d\""
user=> (edn/read-string (pr-str '#"\d"))
RuntimeException No dispatch macro for: " Clojure.lang.Util.runtimeException (Util.java:221)
我正在使用Clojure 1.8.0。
有什么建议吗?
谢谢!
修改 感谢您的回答和评论。我之所以想要使用EDN,是因为我想要处理不受信任的代码。
我的想法是我想阅读这段代码(任何语法上有效的Clojure代码),然后通过一些特殊用途的静态分析来确保它符合我认为“安全”的特定Clojure子集,只有符合规定,才会认为执行此代码是安全的。出于这个原因,我想避免load-file
,它会立即加载文件,也可能read-string
,因为these warnings有关它。
答案 0 :(得分:1)
Clojure是EDN的超集,因此并非所有Clojure功能都受支持。 pr-str
的输出是一个有效的Clojure程序,已被转义为String
。 RuntimeException
正在抱怨第一个转发的"
,EDN #
读者宏不支持。
(clojure.core/read-string (pr-str #"\d")) ;=> #"\d"