2012-02-22 3 views
3

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

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

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

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

дает

#<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> 

ответ

6

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

+0

Я поеду с этим на данный момент. Кажется, что переходная карта действительно хороша для 'assoc!', 'Conj!' И этого типа операции. благодаря –

1

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

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

Вы можете узнать больше о переходных от Clojure docs.

Смежные вопросы