revise generator names in for.ss
svn: r6329
This commit is contained in:
parent
5cd9016cc1
commit
4074eb593a
|
@ -9,55 +9,55 @@
|
||||||
first-for first-for-values first-for* first-for*-values
|
first-for first-for-values first-for* first-for*-values
|
||||||
last-for last-for-values last-for* last-for*-values
|
last-for last-for-values last-for* last-for*-values
|
||||||
|
|
||||||
(rename *range range)
|
(rename *in-range in-range)
|
||||||
(rename *nat-gen nat-gen)
|
(rename *in-nats in-nats)
|
||||||
(rename *list->gen list->gen)
|
(rename *in-list in-list)
|
||||||
(rename *vector->gen vector->gen)
|
(rename *in-vector in-vector)
|
||||||
(rename *string->gen string->gen)
|
(rename *in-string in-string)
|
||||||
(rename *bytes->gen bytes->gen)
|
(rename *in-bytes in-bytes)
|
||||||
input-port->byte-gen
|
in-input-port-bytes
|
||||||
input-port->char-gen
|
in-input-port-chars
|
||||||
|
|
||||||
parallel-gen
|
in-parallel
|
||||||
stop-before-gen
|
stop-before
|
||||||
stop-after-gen
|
stop-after
|
||||||
(rename *index-gen index-gen)
|
(rename *in-indexed in-indexed)
|
||||||
|
|
||||||
generator-run
|
sequence-run
|
||||||
|
|
||||||
define-generator-syntax
|
define-sequence-syntax
|
||||||
make-do-generator
|
make-do-sequence
|
||||||
:do-gen)
|
:do-gen)
|
||||||
|
|
||||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; generator transformers:
|
;; sequence transformers:
|
||||||
|
|
||||||
(begin-for-syntax
|
(begin-for-syntax
|
||||||
(define-values (struct:generator-transformer
|
(define-values (struct:sequence-transformer
|
||||||
make-generator-transformer
|
make-sequence-transformer
|
||||||
generator-transformer?
|
sequence-transformer?
|
||||||
generator-transformer-ref
|
sequence-transformer-ref
|
||||||
generator-transformer-set!)
|
sequence-transformer-set!)
|
||||||
(make-struct-type 'generator-transformer #f
|
(make-struct-type 'sequence-transformer #f
|
||||||
3 0 #f
|
3 0 #f
|
||||||
null (current-inspector)
|
null (current-inspector)
|
||||||
0))
|
0))
|
||||||
|
|
||||||
(define (create-generator-transformer proc1 proc2 cert)
|
(define (create-sequence-transformer proc1 proc2 cert)
|
||||||
(unless (if (identifier? proc1)
|
(unless (if (identifier? proc1)
|
||||||
(and (procedure? proc1)
|
(and (procedure? proc1)
|
||||||
(procedure-arity-includes? proc1 1))
|
(procedure-arity-includes? proc1 1))
|
||||||
(raise-type-error 'define-generator-syntax
|
(raise-type-error 'define-sequence-syntax
|
||||||
"identifier of procedure (arity 1)"
|
"identifier of procedure (arity 1)"
|
||||||
0
|
0
|
||||||
proc1 proc2))
|
proc1 proc2))
|
||||||
(unless (and (procedure? proc2)
|
(unless (and (procedure? proc2)
|
||||||
(procedure-arity-includes? proc2 2))
|
(procedure-arity-includes? proc2 2))
|
||||||
(raise-type-error 'define-generator-syntax
|
(raise-type-error 'define-sequence-syntax
|
||||||
"procedure (arity 1)"
|
"procedure (arity 1)"
|
||||||
1
|
1
|
||||||
proc1 proc2))
|
proc1 proc2))
|
||||||
(make-generator-transformer (if (identifier? proc1)
|
(make-sequence-transformer (if (identifier? proc1)
|
||||||
(lambda (stx)
|
(lambda (stx)
|
||||||
(if (identifier? stx)
|
(if (identifier? stx)
|
||||||
proc1
|
proc1
|
||||||
|
@ -115,7 +115,7 @@
|
||||||
|
|
||||||
(define (expand-clause orig-stx clause)
|
(define (expand-clause orig-stx clause)
|
||||||
(let eloop ([use-transformer? #t])
|
(let eloop ([use-transformer? #t])
|
||||||
(syntax-case clause (values parallel-gen stop-before-gen stop-after-gen :do-gen)
|
(syntax-case clause (values in-parallel stop-before stop-after :do-gen)
|
||||||
[[(id ...) rhs]
|
[[(id ...) rhs]
|
||||||
(let ([ids (syntax->list #'(id ...))])
|
(let ([ids (syntax->list #'(id ...))])
|
||||||
(for-each (lambda (id)
|
(for-each (lambda (id)
|
||||||
|
@ -130,7 +130,7 @@
|
||||||
(when dup
|
(when dup
|
||||||
(raise-syntax-error
|
(raise-syntax-error
|
||||||
#f
|
#f
|
||||||
"duplicate identifier as generator binding"
|
"duplicate identifier as sequence binding"
|
||||||
orig-stx
|
orig-stx
|
||||||
dup)))
|
dup)))
|
||||||
#f)
|
#f)
|
||||||
|
@ -138,11 +138,11 @@
|
||||||
[[(id ...) (form . rest)]
|
[[(id ...) (form . rest)]
|
||||||
(and use-transformer?
|
(and use-transformer?
|
||||||
(identifier? #'form)
|
(identifier? #'form)
|
||||||
(generator-transformer? (syntax-local-value #'form (lambda () #f))))
|
(sequence-transformer? (syntax-local-value #'form (lambda () #f))))
|
||||||
(let ([m (syntax-local-value #'form)])
|
(let ([m (syntax-local-value #'form)])
|
||||||
(let ([xformer (generator-transformer-ref m 1)]
|
(let ([xformer (sequence-transformer-ref m 1)]
|
||||||
[introducer (make-syntax-introducer)]
|
[introducer (make-syntax-introducer)]
|
||||||
[certifier (generator-transformer-ref m 2)])
|
[certifier (sequence-transformer-ref m 2)])
|
||||||
(let ([xformed (xformer orig-stx (introducer (syntax-local-introduce clause)))])
|
(let ([xformed (xformer orig-stx (introducer (syntax-local-introduce clause)))])
|
||||||
(if xformed
|
(if xformed
|
||||||
(expand-clause orig-stx (certify-clause (syntax-local-introduce (introducer xformed))
|
(expand-clause orig-stx (certify-clause (syntax-local-introduce (introducer xformed))
|
||||||
|
@ -162,10 +162,10 @@
|
||||||
[else (raise-syntax-error #f "bad :do-gen clause" orig-stx clause)])]
|
[else (raise-syntax-error #f "bad :do-gen clause" orig-stx clause)])]
|
||||||
[[(id) (values rhs)]
|
[[(id) (values rhs)]
|
||||||
(expand-clause orig-stx #'[(id) rhs])]
|
(expand-clause orig-stx #'[(id) rhs])]
|
||||||
[[(id ...) (parallel-gen rhs ...)]
|
[[(id ...) (in-parallel rhs ...)]
|
||||||
(and (= (length (syntax->list #'(id ...)))
|
(and (= (length (syntax->list #'(id ...)))
|
||||||
(length (syntax->list #'(rhs ...)))))
|
(length (syntax->list #'(rhs ...)))))
|
||||||
;; flatten parallel-gen iterations:
|
;; flatten in-parallel iterations:
|
||||||
(with-syntax ([(((outer-binding ...)
|
(with-syntax ([(((outer-binding ...)
|
||||||
outer-check
|
outer-check
|
||||||
(loop-binding ...)
|
(loop-binding ...)
|
||||||
|
@ -186,7 +186,7 @@
|
||||||
(and pre-guard ...)
|
(and pre-guard ...)
|
||||||
(and post-guard ...)
|
(and post-guard ...)
|
||||||
(loop-arg ... ...)))]
|
(loop-arg ... ...)))]
|
||||||
[[(id ...) (stop-before-gen gen-expr pred)]
|
[[(id ...) (stop-before gen-expr pred)]
|
||||||
(with-syntax ([((outer-binding ...)
|
(with-syntax ([((outer-binding ...)
|
||||||
outer-check
|
outer-check
|
||||||
(loop-binding ...)
|
(loop-binding ...)
|
||||||
|
@ -204,7 +204,7 @@
|
||||||
(and pre-guard (not (pred id ...)))
|
(and pre-guard (not (pred id ...)))
|
||||||
post-guard
|
post-guard
|
||||||
(loop-arg ...)))]
|
(loop-arg ...)))]
|
||||||
[[(id ...) (stop-after-gen gen-expr pred)]
|
[[(id ...) (stop-after gen-expr pred)]
|
||||||
(with-syntax ([((outer-binding ...)
|
(with-syntax ([((outer-binding ...)
|
||||||
outer-check
|
outer-check
|
||||||
(loop-binding ...)
|
(loop-binding ...)
|
||||||
|
@ -228,7 +228,7 @@
|
||||||
(syntax-local-introduce
|
(syntax-local-introduce
|
||||||
(introducer
|
(introducer
|
||||||
#`(([(pos->vals pos-next init pos-cont? val-cont? all-cont?)
|
#`(([(pos->vals pos-next init pos-cont? val-cont? all-cont?)
|
||||||
(#,((syntax-local-certifier #f) #'make-generator) '(id ...) rhs)])
|
(#,((syntax-local-certifier #f) #'make-sequence) '(id ...) rhs)])
|
||||||
(void)
|
(void)
|
||||||
([pos init])
|
([pos init])
|
||||||
(pos-cont? pos)
|
(pos-cont? pos)
|
||||||
|
@ -239,7 +239,7 @@
|
||||||
[_else
|
[_else
|
||||||
(raise-syntax-error
|
(raise-syntax-error
|
||||||
#f
|
#f
|
||||||
"bad generator binding clause"
|
"bad sequence binding clause"
|
||||||
orig-stx
|
orig-stx
|
||||||
clause)]))))
|
clause)]))))
|
||||||
|
|
||||||
|
@ -247,48 +247,48 @@
|
||||||
(raise-syntax-error #f "illegal outside of a loop or comprehension binding" stx))
|
(raise-syntax-error #f "illegal outside of a loop or comprehension binding" stx))
|
||||||
|
|
||||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; generators
|
;; sequences
|
||||||
|
|
||||||
(define-values (prop:generator :generator? :generator-ref)
|
(define-values (prop:sequence :sequence? :sequence-ref)
|
||||||
(make-struct-type-property 'generator
|
(make-struct-type-property 'sequence
|
||||||
(lambda (v sinfo)
|
(lambda (v sinfo)
|
||||||
(unless (and (procedure? v)
|
(unless (and (procedure? v)
|
||||||
(procedure-arity-includes? v 1))
|
(procedure-arity-includes? v 1))
|
||||||
(raise-type-error
|
(raise-type-error
|
||||||
'generator-property-guard
|
'sequence-property-guard
|
||||||
"procedure (arity 1)"
|
"procedure (arity 1)"
|
||||||
v))
|
v))
|
||||||
v)))
|
v)))
|
||||||
|
|
||||||
(define-values (struct:do-generator
|
(define-values (struct:do-sequence
|
||||||
make-do-generator
|
make-do-sequence
|
||||||
do-generator?
|
do-sequence?
|
||||||
do-generator-ref
|
do-sequence-ref
|
||||||
do-generator-set!)
|
do-sequence-set!)
|
||||||
(make-struct-type 'generator #f
|
(make-struct-type 'sequence #f
|
||||||
1 0 #f
|
1 0 #f
|
||||||
(list (cons prop:generator (lambda (v)
|
(list (cons prop:sequence (lambda (v)
|
||||||
((do-generator-ref v 0)))))))
|
((do-sequence-ref v 0)))))))
|
||||||
|
|
||||||
(define-syntax define-generator-syntax
|
(define-syntax define-sequence-syntax
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
[(_ id expr-transformer-expr clause-transformer-expr)
|
[(_ id expr-transformer-expr clause-transformer-expr)
|
||||||
(define-syntax id (create-generator-transformer
|
(define-syntax id (create-sequence-transformer
|
||||||
expr-transformer-expr
|
expr-transformer-expr
|
||||||
clause-transformer-expr
|
clause-transformer-expr
|
||||||
(syntax-local-certifier #f)))]))
|
(syntax-local-certifier #f)))]))
|
||||||
|
|
||||||
(define (generator? v)
|
(define (sequence? v)
|
||||||
(or (:generator? v)
|
(or (:sequence? v)
|
||||||
(list? v)
|
(list? v)
|
||||||
(vector? v)
|
(vector? v)
|
||||||
(string? v)
|
(string? v)
|
||||||
(bytes? v)
|
(bytes? v)
|
||||||
(input-port? v)))
|
(input-port? v)))
|
||||||
|
|
||||||
(define (make-generator who v)
|
(define (make-sequence who v)
|
||||||
(cond
|
(cond
|
||||||
[(:generator? v) ((:generator-ref v) v)]
|
[(:sequence? v) ((:sequence-ref v) v)]
|
||||||
[(list? v) (:list-gen v)]
|
[(list? v) (:list-gen v)]
|
||||||
[(vector? v) (:vector-gen v)]
|
[(vector? v) (:vector-gen v)]
|
||||||
[(string? v) (:string-gen v)]
|
[(string? v) (:string-gen v)]
|
||||||
|
@ -296,22 +296,22 @@
|
||||||
[(input-port? v) (:input-port-gen v)]
|
[(input-port? v) (:input-port-gen v)]
|
||||||
[else (raise
|
[else (raise
|
||||||
(make-exn:fail:contract
|
(make-exn:fail:contract
|
||||||
(format "for: expected a generator for ~a, got something else: ~v"
|
(format "for: expected a sequence for ~a, got something else: ~v"
|
||||||
(if (= 1 (length who))
|
(if (= 1 (length who))
|
||||||
(car who)
|
(car who)
|
||||||
who)
|
who)
|
||||||
v)
|
v)
|
||||||
(current-continuation-marks)))]))
|
(current-continuation-marks)))]))
|
||||||
|
|
||||||
(define range
|
(define in-range
|
||||||
(case-lambda
|
(case-lambda
|
||||||
[(b) (range 0 b 1)]
|
[(b) (in-range 0 b 1)]
|
||||||
[(a b) (range a b 1)]
|
[(a b) (in-range a b 1)]
|
||||||
[(a b step)
|
[(a b step)
|
||||||
(unless (real? a) (raise-type-error 'range "real-number" a))
|
(unless (real? a) (raise-type-error 'in-range "real-number" a))
|
||||||
(unless (real? b) (raise-type-error 'range "real-number" b))
|
(unless (real? b) (raise-type-error 'in-range "real-number" b))
|
||||||
(unless (real? step) (raise-type-error 'range "real-number" step))
|
(unless (real? step) (raise-type-error 'in-range "real-number" step))
|
||||||
(make-do-generator (lambda ()
|
(make-do-sequence (lambda ()
|
||||||
(values
|
(values
|
||||||
(lambda (x) x)
|
(lambda (x) x)
|
||||||
(lambda (x) (+ x step))
|
(lambda (x) (+ x step))
|
||||||
|
@ -322,8 +322,8 @@
|
||||||
(lambda (x) #t)
|
(lambda (x) #t)
|
||||||
(lambda (x y) #t))))]))
|
(lambda (x y) #t))))]))
|
||||||
|
|
||||||
(define (nat-gen)
|
(define (in-nats)
|
||||||
(make-do-generator (lambda ()
|
(make-do-sequence (lambda ()
|
||||||
(values values
|
(values values
|
||||||
add1
|
add1
|
||||||
0
|
0
|
||||||
|
@ -331,16 +331,16 @@
|
||||||
(lambda (x) #t)
|
(lambda (x) #t)
|
||||||
(lambda (x y) #t)))))
|
(lambda (x y) #t)))))
|
||||||
|
|
||||||
(define (list->gen l)
|
(define (in-list l)
|
||||||
(unless (list? l) (raise-type-error 'list->gen "list" l))
|
(unless (list? l) (raise-type-error 'in-list "list" l))
|
||||||
(make-do-generator (lambda () (:list-gen l))))
|
(make-do-sequence (lambda () (:list-gen l))))
|
||||||
|
|
||||||
(define (:list-gen l)
|
(define (:list-gen l)
|
||||||
(values car cdr l pair? (lambda (x) #t) (lambda (p x) #t)))
|
(values car cdr l pair? (lambda (x) #t) (lambda (p x) #t)))
|
||||||
|
|
||||||
(define (vector->gen l)
|
(define (in-vector l)
|
||||||
(unless (vector? l) (raise-type-error 'vector->gen "vector" l))
|
(unless (vector? l) (raise-type-error 'in-vector "vector" l))
|
||||||
(make-do-generator (lambda () (:vector-gen l))))
|
(make-do-sequence (lambda () (:vector-gen l))))
|
||||||
|
|
||||||
(define (:vector-gen v)
|
(define (:vector-gen v)
|
||||||
(let ([len (vector-length v)])
|
(let ([len (vector-length v)])
|
||||||
|
@ -352,9 +352,9 @@
|
||||||
(lambda (x) #t)
|
(lambda (x) #t)
|
||||||
(lambda (x y) #t))))
|
(lambda (x y) #t))))
|
||||||
|
|
||||||
(define (string->gen l)
|
(define (in-string l)
|
||||||
(unless (string? l) (raise-type-error 'string->gen "string" l))
|
(unless (string? l) (raise-type-error 'in-string "string" l))
|
||||||
(make-do-generator (lambda () (:string-gen l))))
|
(make-do-sequence (lambda () (:string-gen l))))
|
||||||
|
|
||||||
(define (:string-gen v)
|
(define (:string-gen v)
|
||||||
(let ([len (string-length v)])
|
(let ([len (string-length v)])
|
||||||
|
@ -366,9 +366,9 @@
|
||||||
(lambda (x) #t)
|
(lambda (x) #t)
|
||||||
(lambda (x y) #t))))
|
(lambda (x y) #t))))
|
||||||
|
|
||||||
(define (bytes->gen l)
|
(define (in-bytes l)
|
||||||
(unless (bytes? l) (raise-type-error 'bytes->gen "bytes" l))
|
(unless (bytes? l) (raise-type-error 'in-bytes "bytes" l))
|
||||||
(make-do-generator (lambda () (:bytes-gen l))))
|
(make-do-sequence (lambda () (:bytes-gen l))))
|
||||||
|
|
||||||
(define (:bytes-gen v)
|
(define (:bytes-gen v)
|
||||||
(let ([len (bytes-length v)])
|
(let ([len (bytes-length v)])
|
||||||
|
@ -380,9 +380,9 @@
|
||||||
(lambda (x) #t)
|
(lambda (x) #t)
|
||||||
(lambda (x y) #t))))
|
(lambda (x y) #t))))
|
||||||
|
|
||||||
(define (input-port->byte-gen l)
|
(define (in-input-port-bytes l)
|
||||||
(unless (input-port? l) (raise-type-error 'input-port->byte-gen "input-port" l))
|
(unless (input-port? l) (raise-type-error 'in-input-port-bytes "input-port" l))
|
||||||
(make-do-generator (lambda () (:input-port-gen l))))
|
(make-do-sequence (lambda () (:input-port-gen l))))
|
||||||
|
|
||||||
(define (:input-port-gen v)
|
(define (:input-port-gen v)
|
||||||
(values (lambda (v) (read-byte v))
|
(values (lambda (v) (read-byte v))
|
||||||
|
@ -392,9 +392,9 @@
|
||||||
(lambda (x) (not (eof-object? x)))
|
(lambda (x) (not (eof-object? x)))
|
||||||
(lambda (x v) #t)))
|
(lambda (x v) #t)))
|
||||||
|
|
||||||
(define (input-port->char-gen v)
|
(define (in-input-port-chars v)
|
||||||
(unless (input-port? v) (raise-type-error 'input-port->char-gen "input-port" v))
|
(unless (input-port? v) (raise-type-error 'in-input-port-chars "input-port" v))
|
||||||
(make-do-generator (lambda ()
|
(make-do-sequence (lambda ()
|
||||||
(values (lambda (v) (read-char v))
|
(values (lambda (v) (read-char v))
|
||||||
(lambda (v) v)
|
(lambda (v) v)
|
||||||
v
|
v
|
||||||
|
@ -402,14 +402,14 @@
|
||||||
(lambda (x) (not (eof-object? x)))
|
(lambda (x) (not (eof-object? x)))
|
||||||
(lambda (x v) #t)))))
|
(lambda (x v) #t)))))
|
||||||
|
|
||||||
(define (stop-before-gen g pred)
|
(define (stop-before g pred)
|
||||||
(unless (generator? g) (raise-type-error 'stop-before-gen "generator" g))
|
(unless (sequence? g) (raise-type-error 'stop-before "sequence" g))
|
||||||
(unless (and (procedure? pred)
|
(unless (and (procedure? pred)
|
||||||
(procedure-arity-includes? pred 1))
|
(procedure-arity-includes? pred 1))
|
||||||
(raise-type-error 'stop-before-gen "procedure (arity 1)" pred))
|
(raise-type-error 'stop-before "procedure (arity 1)" pred))
|
||||||
(make-do-generator (lambda ()
|
(make-do-sequence (lambda ()
|
||||||
(let-values ([(pos->val pos-next init pos-cont? pre-cont? post-cont?)
|
(let-values ([(pos->val pos-next init pos-cont? pre-cont? post-cont?)
|
||||||
(make-generator #f g)])
|
(make-sequence #f g)])
|
||||||
(values pos->val
|
(values pos->val
|
||||||
pos-next
|
pos-next
|
||||||
init
|
init
|
||||||
|
@ -421,14 +421,14 @@
|
||||||
(not (apply pred vals)))])
|
(not (apply pred vals)))])
|
||||||
post-cont?)))))
|
post-cont?)))))
|
||||||
|
|
||||||
(define (stop-after-gen g pred)
|
(define (stop-after g pred)
|
||||||
(unless (generator? g) (raise-type-error 'stop-after-gen "generator" g))
|
(unless (sequence? g) (raise-type-error 'stop-after "sequence" g))
|
||||||
(unless (and (procedure? pred)
|
(unless (and (procedure? pred)
|
||||||
(procedure-arity-includes? pred 1))
|
(procedure-arity-includes? pred 1))
|
||||||
(raise-type-error 'stop-after-gen "procedure (arity 1)" pred))
|
(raise-type-error 'stop-after "procedure (arity 1)" pred))
|
||||||
(make-do-generator (lambda ()
|
(make-do-sequence (lambda ()
|
||||||
(let-values ([(pos->val pos-next init pos-cont? pre-cont? post-cont?)
|
(let-values ([(pos->val pos-next init pos-cont? pre-cont? post-cont?)
|
||||||
(make-generator #f g)])
|
(make-sequence #f g)])
|
||||||
(values pos->val
|
(values pos->val
|
||||||
pos-next
|
pos-next
|
||||||
init
|
init
|
||||||
|
@ -440,11 +440,11 @@
|
||||||
[(pos . vals) (and (apply pos-cont? pos vals)
|
[(pos . vals) (and (apply pos-cont? pos vals)
|
||||||
(not (apply pred vals)))]))))))
|
(not (apply pred vals)))]))))))
|
||||||
|
|
||||||
(define (index-gen g)
|
(define (in-indexed g)
|
||||||
(unless (generator? g) (raise-type-error 'index-gen "generator" g))
|
(unless (sequence? g) (raise-type-error 'in-indexed "sequence" g))
|
||||||
(make-do-generator (lambda ()
|
(make-do-sequence (lambda ()
|
||||||
(let-values ([(pos->val pos-next init pos-cont? pre-cont? post-cont?)
|
(let-values ([(pos->val pos-next init pos-cont? pre-cont? post-cont?)
|
||||||
(make-generator #f g)])
|
(make-sequence #f g)])
|
||||||
(values (lambda (pos) (values (pos->val (car pos)) (cdr pos)))
|
(values (lambda (pos) (values (pos->val (car pos)) (cdr pos)))
|
||||||
(lambda (pos) (cons (pos-next (car pos)) (add1 (cdr pos))))
|
(lambda (pos) (cons (pos-next (car pos)) (add1 (cdr pos))))
|
||||||
(cons init 0)
|
(cons init 0)
|
||||||
|
@ -454,18 +454,18 @@
|
||||||
|
|
||||||
;; ----------------------------------------
|
;; ----------------------------------------
|
||||||
|
|
||||||
(define (parallel-gen . generators)
|
(define (in-parallel . sequences)
|
||||||
(for-each (lambda (g)
|
(for-each (lambda (g)
|
||||||
(unless (generator? g)
|
(unless (sequence? g)
|
||||||
(raise-type-error 'parallel-gen "generator" g)))
|
(raise-type-error 'in-parallel "sequence" g)))
|
||||||
generators)
|
sequences)
|
||||||
(if (= 1 (length generators))
|
(if (= 1 (length sequences))
|
||||||
(car generators)
|
(car sequences)
|
||||||
(make-do-generator
|
(make-do-sequence
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(let-values ([(pos->vals pos-nexts inits pos-cont?s pre-cont?s post-cont?s)
|
(let-values ([(pos->vals pos-nexts inits pos-cont?s pre-cont?s post-cont?s)
|
||||||
(lists-for (p->v p-s i ps? pr? po?) ([g generators])
|
(lists-for (p->v p-s i ps? pr? po?) ([g sequences])
|
||||||
(make-generator #f g))])
|
(make-sequence #f g))])
|
||||||
(values
|
(values
|
||||||
(lambda (poses) (apply values (map (lambda (pos->val pos) (pos->val pos))
|
(lambda (poses) (apply values (map (lambda (pos->val pos) (pos->val pos))
|
||||||
pos->vals
|
pos->vals
|
||||||
|
@ -486,19 +486,19 @@
|
||||||
vals))))))))
|
vals))))))))
|
||||||
|
|
||||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; runnign generators outside of a loop:
|
;; runnign sequences outside of a loop:
|
||||||
|
|
||||||
(define (generator-run g)
|
(define (sequence-run g)
|
||||||
(unless (generator? g)
|
(unless (sequence? g)
|
||||||
(raise-type-error 'generator-run "generator" g))
|
(raise-type-error 'sequence-run "sequence" g))
|
||||||
(let-values ([(pos->val pos-next init pos-cont? pre-cont? post-cont?)
|
(let-values ([(pos->val pos-next init pos-cont? pre-cont? post-cont?)
|
||||||
(make-generator #f g)])
|
(make-sequence #f g)])
|
||||||
(let ([pos init])
|
(let ([pos init])
|
||||||
(letrec ([more? #f]
|
(letrec ([more? #f]
|
||||||
[prep-val! #f]
|
[prep-val! #f]
|
||||||
[next #f])
|
[next #f])
|
||||||
(letrec ([no-more (lambda ()
|
(letrec ([no-more (lambda ()
|
||||||
(error "generator has no more values"))]
|
(error "sequence has no more values"))]
|
||||||
[init-more?
|
[init-more?
|
||||||
(lambda () (prep-val!) (more?))]
|
(lambda () (prep-val!) (more?))]
|
||||||
[init-next
|
[init-next
|
||||||
|
@ -539,10 +539,10 @@
|
||||||
(set! more? init-more?)
|
(set! more? init-more?)
|
||||||
(set! prep-val! init-prep-val!)
|
(set! prep-val! init-prep-val!)
|
||||||
(set! next init-next)
|
(set! next init-next)
|
||||||
(let ([generator-more? (lambda () (more?))]
|
(let ([sequence-more? (lambda () (more?))]
|
||||||
[generator-next (lambda () (next))])
|
[sequence-next (lambda () (next))])
|
||||||
(values generator-more?
|
(values sequence-more?
|
||||||
generator-next)))))))
|
sequence-next)))))))
|
||||||
|
|
||||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; core `fold-for' syntax
|
;; core `fold-for' syntax
|
||||||
|
@ -588,12 +588,12 @@
|
||||||
[(_ [orig-stx . _rest] fold-bind ())
|
[(_ [orig-stx . _rest] fold-bind ())
|
||||||
(raise-syntax-error
|
(raise-syntax-error
|
||||||
#f
|
#f
|
||||||
"missing body expression after generator bindings"
|
"missing body expression after sequence bindings"
|
||||||
#'orig-stx)]
|
#'orig-stx)]
|
||||||
[(_ [orig-stx . _rest] fold-bind () . rest)
|
[(_ [orig-stx . _rest] fold-bind () . rest)
|
||||||
(raise-syntax-error
|
(raise-syntax-error
|
||||||
#f
|
#f
|
||||||
"bad syntax (illegal use of `.') after generator bindings"
|
"bad syntax (illegal use of `.') after sequence bindings"
|
||||||
#'orig-stx)]
|
#'orig-stx)]
|
||||||
;; Guard case, no pending emits:
|
;; Guard case, no pending emits:
|
||||||
[(_ [orig-stx multi? first-multi? nested? #f ()] ([fold-var fold-init] ...) (#:when expr . rest) . body)
|
[(_ [orig-stx multi? first-multi? nested? #f ()] ([fold-var fold-init] ...) (#:when expr . rest) . body)
|
||||||
|
@ -611,7 +611,7 @@
|
||||||
[(_ [orig-stx #f #f nested? #f binds] fold-bind (clause . rest) . body)
|
[(_ [orig-stx #f #f nested? #f binds] fold-bind (clause . rest) . body)
|
||||||
(raise-syntax-error
|
(raise-syntax-error
|
||||||
#f
|
#f
|
||||||
"bad generator binding clause"
|
"bad sequence binding clause"
|
||||||
#'orig-stx
|
#'orig-stx
|
||||||
#'clause)]
|
#'clause)]
|
||||||
;; Expand one multi-value clause, and push it into the results to emit:
|
;; Expand one multi-value clause, and push it into the results to emit:
|
||||||
|
@ -745,19 +745,19 @@
|
||||||
(define-for-variants (and-for and-for-values and-for* and-for*-values)
|
(define-for-variants (and-for and-for-values and-for* and-for*-values)
|
||||||
([result #t])
|
([result #t])
|
||||||
(lambda (x) x)
|
(lambda (x) x)
|
||||||
(lambda (rhs) #`(stop-after-gen #,rhs (lambda x (not result))))
|
(lambda (rhs) #`(stop-after #,rhs (lambda x (not result))))
|
||||||
(lambda (x) x))
|
(lambda (x) x))
|
||||||
|
|
||||||
(define-for-variants (or-for or-for-values or-for* or-for*-values)
|
(define-for-variants (or-for or-for-values or-for* or-for*-values)
|
||||||
([result #f])
|
([result #f])
|
||||||
(lambda (x) x)
|
(lambda (x) x)
|
||||||
(lambda (rhs) #`(stop-after-gen #,rhs (lambda x result)))
|
(lambda (rhs) #`(stop-after #,rhs (lambda x result)))
|
||||||
(lambda (x) x))
|
(lambda (x) x))
|
||||||
|
|
||||||
(define-for-variants (first-for first-for-values first-for* first-for*-values)
|
(define-for-variants (first-for first-for-values first-for* first-for*-values)
|
||||||
([val #f][stop? #f])
|
([val #f][stop? #f])
|
||||||
(lambda (x) #`(let-values ([(val _) #,x]) val))
|
(lambda (x) #`(let-values ([(val _) #,x]) val))
|
||||||
(lambda (rhs) #`(stop-after-gen #,rhs (lambda x stop?)))
|
(lambda (rhs) #`(stop-after #,rhs (lambda x stop?)))
|
||||||
(lambda (x) #`(values #,x #t)))
|
(lambda (x) #`(values #,x #t)))
|
||||||
|
|
||||||
(define-for-variants (last-for last-for-values last-for* last-for*-values)
|
(define-for-variants (last-for last-for-values last-for* last-for*-values)
|
||||||
|
@ -767,10 +767,10 @@
|
||||||
(lambda (x) x))
|
(lambda (x) x))
|
||||||
|
|
||||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; specific generators
|
;; specific sequences
|
||||||
|
|
||||||
(define-generator-syntax *range
|
(define-sequence-syntax *in-range
|
||||||
#'range
|
#'in-range
|
||||||
(lambda (orig-stx stx)
|
(lambda (orig-stx stx)
|
||||||
(let loop ([stx stx])
|
(let loop ([stx stx])
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
|
@ -779,11 +779,9 @@
|
||||||
;; outer bindings:
|
;; outer bindings:
|
||||||
([(start) a] [(end) b] [(inc) step])
|
([(start) a] [(end) b] [(inc) step])
|
||||||
;; outer check:
|
;; outer check:
|
||||||
(void)
|
|
||||||
#;
|
|
||||||
(unless (and (real? a) (real? b) (real? inc))
|
(unless (and (real? a) (real? b) (real? inc))
|
||||||
;; let `range' report the error:
|
;; let `in-range' report the error:
|
||||||
(range start end inc))
|
(in-range start end inc))
|
||||||
;; loop bindings:
|
;; loop bindings:
|
||||||
([pos start])
|
([pos start])
|
||||||
;; pos check
|
;; pos check
|
||||||
|
@ -806,8 +804,8 @@
|
||||||
[[(id) (_ b)] (loop #'[(id) (_ 0 b 1)])]
|
[[(id) (_ b)] (loop #'[(id) (_ 0 b 1)])]
|
||||||
[_else #f]))))
|
[_else #f]))))
|
||||||
|
|
||||||
(define-generator-syntax *nat-gen
|
(define-sequence-syntax *in-nats
|
||||||
#'nat-gen
|
#'in-nats
|
||||||
(lambda (orig-stx stx)
|
(lambda (orig-stx stx)
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
[[(id) (_)] #`[(id)
|
[[(id) (_)] #`[(id)
|
||||||
|
@ -830,8 +828,8 @@
|
||||||
((+ pos 1)))]]
|
((+ pos 1)))]]
|
||||||
[_else #f])))
|
[_else #f])))
|
||||||
|
|
||||||
(define-generator-syntax *list->gen
|
(define-sequence-syntax *in-list
|
||||||
#'list->gen
|
#'in-list
|
||||||
(lambda (orig-stx stx)
|
(lambda (orig-stx stx)
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
[((id) (_ lst-expr))
|
[((id) (_ lst-expr))
|
||||||
|
@ -840,7 +838,7 @@
|
||||||
;;outer bindings
|
;;outer bindings
|
||||||
([(lst) lst-expr])
|
([(lst) lst-expr])
|
||||||
;; outer check
|
;; outer check
|
||||||
(unless (list? lst) (list->gen lst))
|
(unless (list? lst) (in-list lst))
|
||||||
;; loop bindings
|
;; loop bindings
|
||||||
([lst lst])
|
([lst lst])
|
||||||
;; pos check
|
;; pos check
|
||||||
|
@ -857,11 +855,11 @@
|
||||||
|
|
||||||
(define-for-syntax (vector-like-gen vector?-id
|
(define-for-syntax (vector-like-gen vector?-id
|
||||||
vector-length-id
|
vector-length-id
|
||||||
vector->gen-id
|
in-vector-id
|
||||||
vector-ref-id)
|
vector-ref-id)
|
||||||
(lambda (orig-stx stx)
|
(lambda (orig-stx stx)
|
||||||
(with-syntax ([vector? vector?-id]
|
(with-syntax ([vector? vector?-id]
|
||||||
[vector->gen vector->gen-id]
|
[in-vector in-vector-id]
|
||||||
[vector-length vector-length-id]
|
[vector-length vector-length-id]
|
||||||
[vector-ref vector-ref-id])
|
[vector-ref vector-ref-id])
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
|
@ -871,7 +869,7 @@
|
||||||
;;outer bindings
|
;;outer bindings
|
||||||
([(vec len) (let ([vec vec-expr])
|
([(vec len) (let ([vec vec-expr])
|
||||||
(unless (vector? vec)
|
(unless (vector? vec)
|
||||||
(vector->gen vec))
|
(in-vector vec))
|
||||||
(values vec (vector-length vec)))])
|
(values vec (vector-length vec)))])
|
||||||
;; outer check
|
;; outer check
|
||||||
#f
|
#f
|
||||||
|
@ -889,30 +887,30 @@
|
||||||
((add1 pos)))]]
|
((add1 pos)))]]
|
||||||
[_else #f]))))
|
[_else #f]))))
|
||||||
|
|
||||||
(define-generator-syntax *vector->gen
|
(define-sequence-syntax *in-vector
|
||||||
#'vector->gen
|
#'in-vector
|
||||||
(vector-like-gen #'vector?
|
(vector-like-gen #'vector?
|
||||||
#'vector-length
|
#'vector-length
|
||||||
#'vector->gen
|
#'in-vector
|
||||||
#'vector-ref))
|
#'vector-ref))
|
||||||
|
|
||||||
(define-generator-syntax *string->gen
|
(define-sequence-syntax *in-string
|
||||||
#'string->gen
|
#'in-string
|
||||||
(vector-like-gen #'string?
|
(vector-like-gen #'string?
|
||||||
#'string-length
|
#'string-length
|
||||||
#'string->gen
|
#'in-string
|
||||||
#'string-ref))
|
#'string-ref))
|
||||||
|
|
||||||
(define-generator-syntax *bytes->gen
|
(define-sequence-syntax *in-bytes
|
||||||
#'bytes->gen
|
#'in-bytes
|
||||||
(vector-like-gen #'bytes?
|
(vector-like-gen #'bytes?
|
||||||
#'bytes-length
|
#'bytes-length
|
||||||
#'bytes->gen
|
#'in-bytes
|
||||||
#'bytes-ref))
|
#'bytes-ref))
|
||||||
|
|
||||||
(define-generator-syntax *index-gen
|
(define-sequence-syntax *in-indexed
|
||||||
#'index-gen
|
#'in-indexed
|
||||||
(lambda (orig-stx stx)
|
(lambda (orig-stx stx)
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
[((id1 id2) (_ gen-expr))
|
[((id1 id2) (_ gen-expr))
|
||||||
#'[(id1 id2) (parallel-gen gen-expr (*nat-gen))]]))))
|
#'[(id1 id2) (in-parallel gen-expr (*in-nats))]]))))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user