2017-02-19 109 views
4

我想使用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把它。

+2

我的_guess_這裏是,EDN的重點是存儲數據,而不是「代碼」。您可以使用常規的「讀取字符串」(具有缺陷)。如果它有助於正確的答案:它在這裏禁用:https://github.com/clojure/clojure/blame/master/src/jvm/clojure/lang/EdnReader.java#L53 – cfrick

+1

你爲什麼不只是保存的Clojure代碼到.clj文件並使用Clojure加載它? –

+0

請參閱我的關於'read-string'和'load-file'的編輯。 –

回答

0

Clojure是EDN的超集,所以不是所有的Clojure功能的支持。 pr-str的輸出是一個有效的Clojure程序,已經被轉義以適合String。該RuntimeException抱怨第一逃脫",這不是由EDN #讀者宏觀支持。

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

參見關於使用'讀string' –

+0

也許使用tools.reader我的編輯? https://github.com/clojure/tools.reader – Jeremy