2017-02-19 7 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と、these warningsという理由でread-stringを避けたいと考えています。

+2

ここでは、EDNの焦点は「コード」ではなくデータを格納することです。代わりに、普通の 'read-string'(その落とし穴で)を使うことができます。それが適切な答えを助けるなら、それはここでは無効になっています: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の出力は、Stringに収まるようにエスケープされた有効なClojureプログラムです。 RuntimeExceptionは、最初にエコーされた"がEDN #リーダーマクロによってサポートされていないことに不満を抱いています。

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

'read-string'の使用に関する私の編集を参照してください –

+0

おそらくtools.readerを使用しますか? https://github.com/clojure/tools.reader – Jeremy

関連する問題