lisp - Alternative way to build a list until predicate is satisfied? -


here way of building fibonacci sequence list values not exceed x:

(define (fibs-upto x)   (for/list ([i (in-naturals)]              #:break (> (fib i) x))             (fib i))) 

is there another, maybe cleaner way of doing without using #:break, , without using #lang lazy build infinite lazy list?

here solution in (fib i) evaluated once.

(define (fibs-upto x)   (for*/list ([i     (in-naturals)]               [fib-i (in-value (fib i))]               #:break (> fib-i x))     fib-i)) 

but might easier read standard loop:

(define (fibs-upto x)   (define (loop i)     (define fib-i (fib i))     (if (> fib-i x)         '()         (cons fib-i (loop (+ 1)))))   (loop 0)) 

that said, important fib cache computed values above solutions o(n).

update

a version using sequence-map:

(define (fibs-upto x)   (for/list ([y (sequence-map fib (in-naturals))]              #:break (> y x))     y)) 

Comments