- char-set-unfold f p g seed #!optional base-csprocedure
- char-set-unfold! f p g seed base-csprocedure
This is a fundamental constructor for char-sets.
- G is used to generate a series of "seed" values from the initial seed: SEED, (G SEED), (G^2 SEED), (G^3 SEED), ...
- P tells us when to stop -- when it returns true when applied to one of these seed values.
- F maps each seed value to a character. These characters are added to the base character set BASE-CS to form the result; BASE-CS defaults to the empty set. char-set-unfold! adds the characters to BASE-CS in a linear-update -- it is allowed, but not required, to side-effect and use BASE-CS's storage to construct the result.
More precisely, the following definitions hold, ignoring the optional-argument issues:
(define (char-set-unfold p f g seed base-cs) (char-set-unfold! p f g seed (char-set-copy base-cs))) (define (char-set-unfold! p f g seed base-cs) (let lp ((seed seed) (cs base-cs)) (if (p seed) cs ; P says we are done. (lp (g seed) ; Loop on (G SEED). (char-set-adjoin! cs (f seed)))))) ; Add (F SEED) to set.
(Note that the actual implementation may be more efficient.)
Examples:
(port->char-set p) = (char-set-unfold eof-object? values (lambda (x) (read-char p)) (read-char p)) (list->char-set lis) = (char-set-unfold null? car cdr lis)