如果我使用
(-> "<file>.clj"
(slurp)
(read-string))
Run Code Online (Sandbox Code Playgroud)
这只会读取文件中的第一个表单(通常是ns声明).有没有办法从文件中检索表单列表?
如果没有使用外部库,我更喜欢.
noi*_*ith 10
此函数打开一个流,供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)))))
Run Code Online (Sandbox Code Playgroud)
粘[和]到开始和结束的字符串,使整个文件到一个单一的向量形式:
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
Run Code Online (Sandbox Code Playgroud)
```
| 归档时间: |
|
| 查看次数: |
570 次 |
| 最近记录: |