add for/set

This commit is contained in:
Matthew Flatt 2010-04-23 08:26:20 -06:00
parent 0fe701a837
commit ab7f9acee2
3 changed files with 36 additions and 1 deletions

View File

@ -7,7 +7,9 @@
set-member? set-add set-remove
set-union set-intersect set-subtract
set-map set-for-each
(rename-out [*in-set in-set]))
(rename-out [*in-set in-set])
for/set for/seteq for/seteqv
for*/set for*/seteq for*/seteqv)
(define-struct set (ht)
#:omit-define-syntaxes
@ -206,3 +208,17 @@
#t
;; loop args
((hash-iterate-next ht pos)))]])))
(define-syntax-rule (define-for for/fold/derived for/set set)
(define-syntax (for/set stx)
(syntax-case stx ()
[(_ bindings . body)
(quasisyntax/loc stx
(for/fold/derived #,stx ([s (set)]) bindings (set-add s (let () . body))))])))
(define-for for/fold/derived for/set set)
(define-for for*/fold/derived for*/set set)
(define-for for/fold/derived for/seteq seteq)
(define-for for*/fold/derived for*/seteq seteq)
(define-for for/fold/derived for/seteqv seteqv)
(define-for for*/fold/derived for*/seteqv seteqv)

View File

@ -109,6 +109,7 @@ Applies the procedure @scheme[proc] to each element in
@scheme[set] in an unspecified order, accumulating the results
into a list.}
@defproc[(set-for-each [set set?]
[proc (any/c . -> . any)])
void?]{
@ -116,7 +117,21 @@ into a list.}
Applies @scheme[proc] to each element in @scheme[set] (for the
side-effects of @scheme[proc]) in an unspecified order.}
@defproc[(in-set [set set?]) sequence?]{
Explicitly converts a set to a sequence for use with @scheme[for] and
other forms.}
@deftogether[(
@defform[(for/set (for-clause ...) body ...+)]
@defform[(for/seteq (for-clause ...) body ...+)]
@defform[(for/seteqv (for-clause ...) body ...+)]
@defform[(for*/set (for-clause ...) body ...+)]
@defform[(for*/seteq (for-clause ...) body ...+)]
@defform[(for*/seteqv (for-clause ...) body ...+)]
)]{
Analogous to @scheme[for/list] and @scheme[for*/list], but to
construct a set instead of a list.}

View File

@ -102,4 +102,8 @@
;; ----------------------------------------
(test (set 1 2 3) 'for/set (for/set ([i '(0 1 2)]) (add1 i)))
;; ----------------------------------------
(report-errs)