Мне нужно прочитать файл для сопоставления {:v '[] :f '[]}
. Я разделяю каждую строку, и если первый элемент "v", то я добавляю оставшуюся часть в v-массив, то же самое для f-массива.
Пример:
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)))