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
を避けたいと考えています。
ここでは、EDNの焦点は「コード」ではなくデータを格納することです。代わりに、普通の 'read-string'(その落とし穴で)を使うことができます。それが適切な答えを助けるなら、それはここでは無効になっています:https://github.com/clojure/clojure/blame/master/src/jvm/clojure/lang/EdnReader.java#L53 – cfrick
なぜあなたはClojureを保存しないのですか? .cljファイルにコードを記述し、Clojureを使用してロードしますか? –
'read-string'と' load-file'に関する私の編集を見てください。 –