有没有办法读取clojure文件中的所有表单?

zca*_*ate 6 clojure

如果我使用

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


Art*_*ldt 7

[]到开始和结束的字符串,使整个文件到一个单一的向量形式:

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)

```

  • 哦,好点!更好地在[和之前]之后添加换行符 (3认同)