(-> "<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