【发布时间】:2018-09-09 10:22:22
【问题描述】:
我需要读取文件来映射{:v '[] :f '[]}。我分割每一行,如果第一个元素为“v”,那么我将剩余部分添加到 v-array,与 f-array 相同。
例子:
v 1.234 3.234 4.2345234
v 2.234 4.235235 6.2345
f 1 1 1
预期结果:
{:v [("1.234" "3.234" "4.2345234"), ("2.234" "4.235235" "6.2345")]
:f [("1" "1" "1")]}
我的结果:
{:v [("2.234" "4.235235" "6.2345")]
:f [("1" "1" "1")]}
问题:
- 如何修复错误? (只有最后一行被添加到地图中)
- 我可以避免全局变量(模型)和副作用吗?
代码:
(def model
{:v '[]
:f '[]})
(defn- file-lines
[filename]
(line-seq (io/reader filename)))
(defn- lines-with-data
[filename]
(->>
(file-lines filename)
(filter not-empty)
(filter #(not (str/starts-with? % "#")))))
(defn- to-item [data]
(let [[type & remaining] data]
(case type
"v" [:v (conj (:v model) remaining)]
"f" [:f (conj (:f model) remaining)])))
(defn- fill-model
[lines]
(into model
(for [data lines] (to-item data))))
(defn parse
[filename]
(->>
(lines-with-data filename)
(map #(str/split % #"\s+"))
(fill-model)))
【问题讨论】: