Как вы получаете ключи от переходной карты в clojure? - PullRequest
3 голосов
/ 22 февраля 2012

Я пытаюсь получить последовательность всех ключей в переходной карте:

(keys {3 4 5 6 7 8}) дает (3 5 7)

как я ожидаю, но:

(keys (transient {3 4 5 6 7 8}))

1010 * дает *

#<CompilerException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.PersistentArrayMap$TransientArrayMap (NO_SOURCE_FILE:346)>

на той же ноте, как мне обработать карту переходного процесса?

(map identity {3 4 5 6})

дает

([3 4] [5 6])

но

(map identity (transient {3 4 5 6}))

дает

#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.PersistentArrayMap$TransientArrayMap>

Ответы [ 2 ]

6 голосов
/ 22 февраля 2012

Это на самом деле невозможно из-за взаимодействия между ленью и изменчивостью. (keys m) всегда возвращает ленивую последовательность, поддерживаемую неизменной структурой данных m, при необходимости вычисляя элементы. Но если m - переходный процесс, он может измениться в любое время, что разрушит ленивую последовательность клавиш. Вы действительно должны не делать ничего особенного с переходными процессами; и поскольку создавать временные или постоянные версии структуры данных так дешево, не так уж и тяжело несколько раз переходить назад и вперед, если вы действительно хотите сделать что-то необычное.

1 голос
/ 22 февраля 2012

Я не думаю, что есть способ работать с переходными процессами, как вы работаете с постоянными структурами.Вам нужно создать постоянную структуру из ваших переходных процессов с помощью persistence!

user> (map identity (persistent! (transient {3 4 5 6})))
([3 4] [5 6])

Подробнее о переходных процессах можно узнать из Документов Clojure .

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