Clojure заполнить карту, используя в - PullRequest
0 голосов
/ 09 сентября 2018

Мне нужно заполнить карту {:v '[], :f '[]), где v-массив содержит данные из строки, которая начинается с v. Как я могу это сделать?

Пример файла:

# comment
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)] }

Моя попытка:

(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- create-model
  [lines]
  (doseq [data lines]
    (into {:v '[] :f '[]}
          (->>
            (let [[type & remaining] data]
              (case type
                "v" [:v remaining]
                "f" [:f remaining]))))))

(defn parse
  [filename]
  (->>
    (lines-with-data filename)
    (map #(str/split % #"\s+"))
    (create-model)))

Исключение:

user=> (p/parse "test.obj")

IllegalArgumentException Don't know how to create ISeq from: clojure.lang.Keyword  clojure.lang.RT.seqFrom (RT.java:542)

(parse должна быть возвращена карта результатов)

1 Ответ

0 голосов
/ 09 сентября 2018

Я могу повторить ваше сообщение об ошибке так:

(into {:v '[] :f '[]} [:v [:a :b]])

Я могу сделать то, что, по моему мнению, требует программа:

(assoc {:v '[] :f '[]} :v [:a :b])
;; => {:v [:a :b], :f []}

Здесь я просто использовал [:a :b] вместо remaining. В вашем случае remaining - это последовательность чисел, но это не имеет значения.

Что касается сообщения об ошибке, то оно довольно плохое, его не следует использовать в следующих версиях Clojure. Обычно это потому, что вы представляете map с ключевым словом, а не с чем-то, что может вызываться seq. Здесь сообщение приходит откуда-то немного глубже, чем я могу понять.

Еще одна конструкция, которая будет работать, и я думаю, что вы хотели, это:

(into {:v '[] :f '[]} [[:v [:a :b]]])

into карта требует последовательности ввода карты. Вы забыли обернуть одну запись карты, которую вы пытались поместить в карту. Результат из моего REPL:

{:v [:a :b], :f []}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...