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?

Foi útil?

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))))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top