Is there any Racket style unfold function instead of the one in srfi/1?
Maybe for/fold
?
Here us unfold
implemented in terms of for/fold
(without the tail-gen feature):
(define (unfold p f g seed)
(for/fold ([xs '()] [s seed] #:result (reverse xs))
([_ (in-naturals)])
#:break (p s)
(values (cons (f s) xs) (g s))))
(unfold (λ (s) (= s 10))
(λ (s) (* 2 s))
(λ (s) (+ s 1))
0)
Or just a loop perhaps: (define (unfold p f g seed [ tail-gen (λ (s) '()) ])
(let loop ([ s seed ][ result (tail-gen seed) ])
(if (p s)
(reverse result)
(loop (g s) (cons (f s) result)))))
Although, as I learned the other day from Matthew, using an accumulator for efficiency may not be necessary given Racket’s implementation, so: (define (unfold p f g seed [ tail-gen (λ (s) '()) ])
(if (p seed)
(tail-gen seed)
(cons (f seed)
(unfold p f g (g seed) tail-gen))))
may perform just as well. Aesthetically, I don’t like passing p f g.