【发布时间】:2014-02-12 06:48:27
【问题描述】:
我想在 Closure 中读入一个(更长的)文件,其中包含正确的 LISP 语法。所以我认为最好的方法是避免使用字符串。我尝试使用以下功能:
(defn my-reader
[filename]
(with-open [r (java.io.PushbackReader. (reader filename))]
(binding [*read-eval* false]
(loop [expr (read r :eof :end)]
(if (= :end expr)
(print "The End")
(do
(println expr)
(recur (read r :eof :end))))))))
但是,这会在读取错误时引发 EOF。
作为一种解决方法,我已经构建了:
(defn my-reader
[filename]
(with-open [r (java.io.PushbackReader. (reader filename))]
(binding [*read-eval* false]
(loop [expr (read r :eof :end)]
(if (= -1 expr)
(print "The End")
(recur (try
(print (read r :eof :end))
(catch Exception e -1))))))))
但这很丑。在How to use clojure.edn/read to get a sequence of objects in a file? 的帮助下,我的尝试是:
(defn my-reader
[filename]
(with-open [r (java.io.PushbackReader. (reader filename))]
(binding [*read-eval* false]
(let [expr (repeatedly (partial read r :eof :theend))]
(dorun (map println (take-while (partial not= :theend) expr)))))))
也没有工作(阅读时EOF)。但是,另一个线程中的解决方案工作正常(edn 似乎是读取文件的首选方式)。不过,我想知道为什么我的尝试不起作用。
【问题讨论】:
标签: clojure