将Clojure代码序列化和反序列化为EDN

时间:2017-02-19 09:26:03

标签: clojure edn

我正在尝试使用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有关它。

1 个答案:

答案 0 :(得分:1)

Clojure是EDN的超集,因此并非所有Clojure功能都受支持。 pr-str的输出是一个有效的Clojure程序,已被转义为StringRuntimeException正在抱怨第一个转发的",EDN #读者宏不支持。

(clojure.core/read-string (pr-str #"\d")) ;=> #"\d"