我試圖讀取一個文件(可以或不可以)YAML frontmatter逐行使用Clojure,並返回一個帶有兩個向量的hashmap包含前線和一個包含所有其他內容(即身體)。在Clojure中更習慣性地逐行處理文件
而例如輸入文件應該是這樣的:
---
key1: value1
key2: value2
---
Body text paragraph 1
Body text paragraph 2
Body text paragraph 3
我已經運行的代碼,這樣做,但我(當然使用Clojure經驗不足)的鼻子,它惡臭碼味的。
(defn process-file [f]
(with-open [rdr (java.io.BufferedReader. (java.io.FileReader. f))]
(loop [lines (line-seq rdr) in-fm 0 frontmatter [] body []]
(if-not (empty? lines)
(let [line (string/trim (first lines))]
(cond
(zero? (count line))
(recur (rest lines) in-fm frontmatter body)
(and (< in-fm 2) (= line "---"))
(recur (rest lines) (inc in-fm) frontmatter body)
(= in-fm 1)
(recur (rest lines) in-fm (conj frontmatter line) body)
:else
(recur (rest lines) in-fm frontmatter (conj body line))))
(hash-map :frontmatter frontmatter :body body)))))
有人能指點我一個更優雅的方式來做到這一點嗎?我將在這個項目中進行大量的逐行解析,如果可能的話,我希望有一種更習慣的方式去解決它。
這太棒了。我知道我只是在錯誤地看問題。謝謝! –