wanpeebaw
2020-7-5 10:18:28

Is there any Racket style unfold function instead of the one in srfi/1?


soegaard2
2020-7-5 10:31:55

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)


badkins
2020-7-5 20:42:53

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


badkins
2020-7-5 20:58:02

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.