Преобразование списка обратно в карту карт - PullRequest
4 голосов
/ 31 марта 2011

У меня есть функция, которая возвращает структуру с двумя полями: ключ: событие. Поле: event представляет собой карту (разложенный объект Java, извлеченный из кэша). В REPL я вижу возвращаемое значение в виде карты.

Затем я применяю (def events (map #(make-event %) (keys events-cache))), применяя функцию make-event для каждого ключа из кэша, и хочу получить обратно карту, содержащую каждую карту событий, заданную ключом.

То, что я получаю, это то, что есть внутри списка. Поэтому при вызове любых функций карты для поиска и т. Д. Выдается ошибка, clojure.lang.LazySeq не может быть приведен к clojure.lang.IFn .

Я уверен, что я думаю об этом все неправильно, но есть ли способ вытащить карту карт из списка?

Ответы [ 4 ]

7 голосов
/ 31 марта 2011

Может быть, это то, что вы хотите?

(into {} (for [k (keys events-cache)]
           [k (make-event k)]))
1 голос
/ 31 марта 2011

И просто для удовольствия:

(into {} (map (juxt identity make-event) event-keys))
1 голос
/ 31 марта 2011

Если вы не заботитесь о значениях events-cache и хотите получить карту events-cache ключей для вещей, которые вы генерируете с помощью make-event, вы можете сделать:

(def events
  (let [event-keys (keys events-cache)]
    (zipmap event-keys (map make-event event-keys))))

Я не уверен, почему у вас есть кеш, который включает значения, но затем не использует эти значения, но это другой вопрос:)

1 голос
/ 31 марта 2011

Ваши термины расплывчаты, и сообщение об ошибке, которое вы публикуете, предполагает, что проблема совсем другого рода, чем вопрос, который вы задаете.Скорее всего, вы получите дополнительную помощь, если вы напишете некоторый код, и особенно реальная трассировка стека.

Но в целом это сообщение об ошибке гласит: «У вас есть ленивый объект seq, которым вы являетесьпытаюсь вызвать функцию ", например:

(let [m1 (map some-function whatever)
      m2 (...more stuff...)]
  (m1 m2))

Если вы хотите вернуть двухэлементный список m1 и m2, а не , вызывающий m1 как функция с m2 в качестве аргумента, вы хотите использовать функцию list:

(list m1 m2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...