(-> "<file>.clj"
(slurp)
(read-string))
这只会文件(通常是纳秒声明)在读第一种形式。有没有办法从文件中检索表单列表?
我宁愿如果没有使用外部库。
(-> "<file>.clj"
(slurp)
(read-string))
这只会文件(通常是纳秒声明)在读第一种形式。有没有办法从文件中检索表单列表?
我宁愿如果没有使用外部库。
贴[
和]
到字符串,使整个文件到一个单一的载体形式的起点和终点:
user> (clojure.pprint/pprint
(read-string (str "[" (slurp "/home/arthur/hello/project.clj") "]")))
[(defproject
hello
"0.1.0-SNAPSHOT"
:description
"FIXME: write description"
:url
"http://example.com/FIXME"
:license
{:name "Eclipse Public License",
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies
[[org.clojure/clojure "1.5.1"] [clj-time "0.6.0"]]
:source-paths
["dev"])]
nil
```
该功能打开了Clojure的一个流读取并热切读取该流中的所有表单,直到读取抛出异常(如果存在解析错误或者没有更多表单可读取,则会发生这种情况)。
(import '[java.io PushbackReader])
(require '[clojure.java.io :as io])
(defn read-all
[file]
(let [rdr (-> file io/file io/reader PushbackReader.)]
(loop [forms []]
(let [form (try (read rdr) (catch Exception e nil))]
(if form
(recur (conj forms form))
forms)))))
为什么不使用'load-file'? – ntalbs
@ntalbs这将评估一切。 – Alex