vlist)) (define (vlist-length vlist) "Return the length of VLIST." (assert-vlist vlist) (let loop ((base (vlist-base vlist)) (len (vlist-offset vlist))) (if (eq? base block-null) len (loop (block-base base) (+ len 1 (block-offset base)))))) (define* (vlist-unfold p f g seed #:optional (tail-gen (lambda (x) vlist-null))) "Return a new vlist. See the description of SRFI-1 `unfold' for details." (let uf ((seed seed)) (if (p seed) (tail-gen seed) (vlist-cons (f seed) (uf (g seed)))))) (define* (vlist-unfold-right p f g seed #:optional (tail vlist-null)) "Return a new vlist. See the description of SRFI-1 `unfold-right' for details." (let uf ((seed seed) (lis tail)) (if (p seed) lis (uf (g seed) (vlist-cons (f seed) lis))))) (define (vlist-append . vlists) "Append the given lists." (if (null? vlists) vlist-null (fold-right (lambda (vlist result) (vlist-fold-right (lambda (e v) (vlist-cons e v)) result vlist)) vlist-null vlists))) (define (vlist-for-each proc vlist) "Call PROC on each element of VLIST. The result is unspecified." (vlist-fold (lambda (item x) (proc item)) (if #f #f) vlist))