Como converter preguiçoso sequência para não-preguiçosos em Clojure
-
10-07-2019 - |
Pergunta
Eu tentei o seguinte em Clojure, esperando ter a classe de um não-preguiçosos seqüência retornada:
(.getClass (doall (take 3 (repeatedly rand))))
No entanto, este ainda retorna clojure.lang.LazySeq
.Meu palpite é que doall
não avaliar toda a sequência, mas retorna a seqüência original como ele ainda é útil para memoization.
Então, qual é a idiomáticas meio de criação de um não-preguiçosos sequência de um um preguiçoso?
Solução
DOALL é tudo que você precisa. Só porque o seq tem o tipo LazySeq não significa que ele tem pendente de avaliação. As PDCs preguiçosos armazenar em cache seus resultados, então tudo que você precisa fazer é andar a seq preguiçosa uma vez (como DOALL faz), a fim de forçá-lo tudo, e, assim, torná-lo não preguiçoso. seq não forçar a coleção inteira para ser avaliado.
Outras dicas
Este é, em algum grau, uma questão de taxonomia. um preguiçoso sequência é apenas um tipo de sequência como é uma lista, vetor ou mapa.Portanto, a resposta é, naturalmente, "depende de que tipo de preguiçoso seqüência que você deseja para obter:
Faça a sua escolha a partir de:
- um ex-preguiçosos (avaliadas) preguiçoso sequência
(doall ... )
- uma lista para acesso sequencial
(apply list (my-lazy-seq)) OR (into () ...)
- um vetor para posterior acesso aleatório
(vec (my-lazy-seq))
- um mapa ou de um conjunto se você tem algum propósito especial.
Você pode ter qualquer tipo de sequência a maioria das suites de suas necessidades.
Esse cara rico parece saber sua clojure e é absolutamente certo.
Buth Acho que este trecho de código, usando o seu exemplo, pode ser um complemento útil a esta pergunta:
=> (realized? (take 3 (repeatedly rand)))
false
=> (realized? (doall (take 3 (repeatedly rand))))
true
Na verdade tipo não mudou, mas realização tem
Eu tropecei neste este blogue post sobre doall
não ser recursiva. Para que eu encontrei o primeiro comentário no post fez o truque. Algo ao longo das linhas de:
(use 'closure.walk)
(postwalk identity nested-lazy-thing)
Eu encontrei este útil em um teste de unidade onde eu queria forçar a avaliação de alguns aplicativos aninhados de map
para forçar uma condição de erro.
(.getClass (into '() (take 3 (repeatedly rand))))