Clojure:如何将clojure代码转换为可评估的字符串?它主要工作,但列表被转换为原始的parens,失败

pri*_*ing 5 string list clojure

我有一个像这样的简单结构:

(def example {:bbb "bbb" :xxx [1 2 3] :yyy '(3 5 7)})
Run Code Online (Sandbox Code Playgroud)

如果我把它写到它包含的文件中

{:bbb "bbb" :xxx [1 2 3] :yyy (3 5 7)}
Run Code Online (Sandbox Code Playgroud)

这大多是正确的,但如果我在此加载文件,它会失败,因为它试图将3视为一个函数(不再引用parens,因此尝试将其作为函数进行求值).

这样做的正确方法是什么?谢谢!

Mic*_*zyk 9

如果你想读回先前写入文件,作为一个文字一个Clojure的数据,你需要使用readread-string而不是load-file:

(with-open [fd (java.io.PushbackReader.
                (io/reader (io/file "/path/to/file")))]
  (read fd))
Run Code Online (Sandbox Code Playgroud)

你可以read多次打电话来阅读连续的表格(当然,只要你保持Reader开放状态).

这不涉及评估,除非#=读取器宏出现在输入流中,在这种情况下紧接在它之后的表单在读取时被评估并被read输出的结果替换(例如(read-string "#=(+ 1 2)")返回3).要禁止评价#=前缀的形式绑定*read-eval*false.