(defn unfold [step seed]
(if-let [[val new-seed] (step seed)]
(cons val (lazy-seq (unfold step new-seed)))
nil))
Esempio utilizzo:Il Clojure si è "aperto"?
(defn fib-step [[x y]] [x [y (+ x y)]])
(take 10 (unfold fib-step [0 1])) ;=> (0 1 1 2 3 5 8 13 21 34)
(defn decreasing [x] (if (neg? x) nil [x (dec x)]))
(unfold decreasing 5) ;=> (5 4 3 2 1 0)
Fa questo o qualcosa di simile esiste in versione standard clojure (o comunemente usati) librerie? Se no, c'è una ragione per cui? Il più vicino che ho trovato è questo post del blog:
http://www.matlux.net/blog/2014/05/04/anamorphic-adventure-in-clojure
Ho dimenticato cosa mi ha spinto a fare la domanda, ma volevo solo avere un'idea migliore di come scrivere un clojure idiomatico per tali compiti. Penso che la tua risposta faccia un buon lavoro fornendo il tipo di informazioni che stavo cercando. –
groovy, grazie! –