5

我正在尝试对 Clojure 代码使用标准序列化,它会忽略空格、注释等。我正在考虑为此使用EDN

根据我阅读的内容,将 s 表达式序列化为 EDN 的标准方法是 through 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由于这些警告

4

1 回答 1

1

Clojure 是 EDN 的超集,因此并非所有 Clojure 功能都受支持。的输出pr-str是一个有效的 Clojure 程序,该程序已被转义以适合String. RuntimeException抱怨第一个转义的,EDN阅读器宏"不支持。#

(clojure.core/read-string (pr-str #"\d")) ;=> #"\d"
于 2017-02-19T21:54:57.970 回答