aboutsummaryrefslogtreecommitdiffstats
path: root/csc/loop.csc
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2022-01-24 20:40:33 -0800
committerRose Hogenson <rhogenson@posteo.net>2022-01-24 20:40:33 -0800
commitc36d2a16e06e2f3ca9c9c3f8d969411bc8c28f01 (patch)
treed7d0b5206202d5b4471806c96393cc01a46c4a34 /csc/loop.csc
parentd1c59f340c623eb533f1b59564b0e3cd8f5ca728 (diff)
downloadchromatopelma-c36d2a16e06e2f3ca9c9c3f8d969411bc8c28f01.tar.zst
Finish the loop macro.
I also cleaned everything up a lot. Maybe there are still bugs because the test coverage is awful, but for now I'm happy to be done.
Diffstat (limited to 'csc/loop.csc')
-rw-r--r--csc/loop.csc495
1 files changed, 338 insertions, 157 deletions
diff --git a/csc/loop.csc b/csc/loop.csc
index c7331fe..9c776ca 100644
--- a/csc/loop.csc
+++ b/csc/loop.csc
@@ -1,136 +1,362 @@
(define-library (csc loop)
- (export loop return)
+ (export loop return loop-aux)
(import (scheme base))
(begin
- (define-syntax initial-values
- (syntax-rules (=
- by
- collect
- do
- for
- from
- in
- into
- then
- to)
- ((initial-values loop-name (acc* ...) ((for _ in l temp-name) clause clause* ...) body)
- (initial-values loop-name (acc* ... (temp-name l)) (clause clause* ...) body))
- ((initial-values loop-name (acc* ...) ((for x from start to _ by _) clause clause* ...) body)
- (initial-values loop-name (acc* ... (x start)) (clause clause* ...) body))
- ((initial-values loop-name (acc* ...) ((for x = init then consequent) clause clause* ...) body)
- (initial-values loop-name (acc* ... (x init)) (clause clause* ...) body))
- ((initial-values loop-name (acc* ...) ((collect _ into l last) clause clause* ...) body)
- (initial-values loop-name (acc* ... (l '()) (last #f)) (clause clause* ...) body))
- ((initial-values loop-name (acc* ...) ((collect _ l last)) body)
- (let loop-name (acc* ... (l '()) (last #f))
- body))
- ((initial-values loop-name (acc* ...) ((do _)) body)
- (let loop-name (acc* ...)
- body))))
-
-
- (define-syntax subsequent-values
- (syntax-rules (=
- by
- collect
- do
- for
- from
- in
- into
- then
- to)
- ((subsequent-values loop-name (acc* ...) (for _ in _ l) clause clause* ...)
- (subsequent-values loop-name (acc* ... (cdr l)) clause clause* ...))
- ((subsequent-values loop-name (acc* ...) (for x from _ to _ by inc) clause clause* ...)
- (subsequent-values loop-name (acc* ... (+ x inc)) clause clause* ...))
- ((subsequent-values loop-name (acc* ...) (for x = _ then consequent) clause clause* ...)
- (subsequent-values loop-name (acc* ... consequent) clause clause* ...))
- ((subsequent-values loop-name (acc* ...) (collect expr into l last) clause clause* ...)
- (if last
- (begin
- (set-cdr! last (list expr))
- (subsequent-values loop-name (acc* ... l (cdr last)) clause clause* ...))
- (begin
- (set! l (list expr))
- (subsequent-values loop-name (acc* ... l l) clause clause* ...))))
- ((subsequent-values loop-name (acc* ...) (collect expr l last))
- (if last
- (begin
- (set-cdr! last (list expr))
- (loop-name acc* ... l (cdr last)))
- (begin
- (set! l (list expr))
- (loop-name acc* ... l l))))
- ((subsequent-values loop-name (acc* ...) (do expr))
- (begin
- expr
- (loop-name acc* ...)))))
+ ; Once more, from the top!
- (define-syntax condition
- (syntax-rules (=
- by
- collect
- for
- from
- in
- into
- then
- to)
- ((condition)
- #t)
- ((condition (for _ in _ l) clause* ...)
- (and (pair? l) (condition clause* ...)))
- ((condition (for x from _ to limit by _) clause* ...)
- (and (<= x limit) (condition clause* ...)))
- ((condition (for _ = _ then _) clause* ...)
- (condition clause* ...))
- ((condition (collect _ into _ _) clause* ...)
- (condition clause* ...))))
+ (define (*current-loop-continuation* . args)
+ (error "Can't use return outside of a loop"))
- (define-syntax result
- (syntax-rules (collect)
- ((result (collect _ l _))
- l)
- ((result (do _))
- (if #f #f))))
+ (define-record-type <loop-termination>
+ (make-loop-termination)
+ loop-termination?)
- (define-syntax bindings
+ (define-syntax loop-aux
(syntax-rules (=
+ above
+ across
+ and
+ append
+ below
by
collect
+ count
+ do
+ downfrom
+ downto
+ else
+ end
+ finally
for
from
+ if
in
into
+ maximize
+ minimize
+ on
+ return
+ sum
then
- to)
- ((bindings () body)
- body)
- ((bindings ((for x in _ l) clause* ...) body)
- (let ((x (car l)))
- (bindings (clause* ...)
- body)))
- ((bindings ((for _ from _ to _ by _) clause* ...) body)
- (bindings (clause* ...) body))
- ((bindings ((for _ = _ then _) clause* ...) body)
- (bindings (clause* ...) body))
- ((bindings ((collect _ into _ _) clause* ...) body)
- (bindings (clause* ...) body))))
-
-
- (define (*current-loop-continuation* . args)
- (error "Can't use return outside of a loop"))
+ to
+ unless
+ until
+ when
+ while
+ with)
+ ((loop-aux "variable-clause-collector" args with x = expr and clause* ...)
+ (loop-aux "and-collector" args ((x expr)) and clause* ...))
+ ((loop-aux "variable-clause-collector" args with x = expr clause* ...)
+ (let ((x expr))
+ (loop-aux "variable-clause-collector" args clause* ...)))
+ ((loop-aux "variable-clause-collector" (body (fin ...)) finally (form1 form1* ...) (form2 form2* ...) clause* ...)
+ (loop-aux "variable-clause-collector" (body (fin ... (form1 form1* ...))) finally (form2 form2* ...) clause* ...))
+ ((loop-aux "variable-clause-collector" (body (fin ...)) finally (form form* ...) clause* ...)
+ (loop-aux "variable-clause-collector" (body (fin ... (form form* ...))) clause* ...))
+ ((loop-aux "variable-clause-collector" ((body ...) fin) for x in l clause* ...)
+ (let ((temp l)
+ (x #f))
+ (loop-aux "variable-clause-collector"
+ ((body ... (when (null? temp)
+ (raise (make-loop-termination)))
+ (set! x (car temp))
+ (set! temp (cdr temp)))
+ fin)
+ clause* ...)))
+ ((loop-aux "variable-clause-collector" ((body ...) fin) for x on l clause* ...)
+ (let* ((x l)
+ (next x))
+ (loop-aux "variable-clause-collector"
+ ((body ... (unless (pair? x)
+ (raise (make-loop-termination)))
+ (set! x next)
+ (set! next (cdr x)))
+ fin)
+ clause* ...)))
+ ((loop-aux "variable-clause-collector" ((body ...) fin) for x = init then subseq clause* ...)
+ (let ((first #t)
+ (x #f))
+ (loop-aux "variable-clause-collector"
+ ((body ... (if first
+ (begin
+ (set! first #f)
+ (set! x init))
+ (set! x subseq)))
+ fin)
+ clause* ...)))
+ ((loop-aux "variable-clause-collector" ((body ...) fin) for x across v clause* ...)
+ (let ((temp v)
+ (i 0)
+ (x #f))
+ (loop-aux "variable-clause-collector"
+ ((body ... (unless (< i (vector-length temp))
+ (raise (make-loop-termination)))
+ (set! x (vector-ref temp i))
+ (set! i (+ 1 i)))
+ fin)
+ clause* ...)))
+ ((loop-aux "variable-clause-collector" ((body ...) fin) for x from start to last by inc clause* ...)
+ (let ((x start)
+ (last* last)
+ (inc* inc))
+ (loop-aux "variable-clause-collector"
+ ((body ... (unless (<= x last*)
+ (raise (make-loop-termination)))
+ (set! x (+ x inc*)))
+ fin)
+ clause* ...)))
+ ((loop-aux "variable-clause-collector" ((body ...) fin) for x from start downto last by inc clause* ...)
+ (let ((x start)
+ (last* last)
+ (inc* inc))
+ (loop-aux "variable-clause-collector"
+ ((body ... (unless (>= x last*)
+ (raise (make-loop-termination)))
+ (set! x (+ x inc*)))
+ fin)
+ clause* ...)))
+ ((loop-aux "variable-clause-collector" ((body ...) fin) for x from start below last by inc clause* ...)
+ (let ((x start)
+ (last* last)
+ (inc* inc))
+ (loop-aux "variable-clause-collector"
+ ((body ... (unless (< x last*)
+ (raise (make-loop-termination)))
+ (set! x (+ x inc*)))
+ fin)
+ clause* ...)))
+ ((loop-aux "variable-clause-collector" ((body ...) fin) for x from start above last by inc clause* ...)
+ (let ((x start)
+ (last* last)
+ (inc* inc))
+ (loop-aux "variable-clause-collector"
+ ((body ... (unless (> x last*)
+ (raise (make-loop-termination)))
+ (set! x (+ x inc)))
+ fin)
+ clause* ...)))
+ ((loop-aux "variable-clause-collector" args for x clause* ...)
+ (loop-aux "for-reordering" args for x #f #f #f 1 clause* ...))
+ ((loop-aux "variable-clause-collector" args clause* ...)
+ (loop-aux "main-clause-collector" args clause* ...))
+ ((loop-aux "and-collector" args (and-vars ...) and x = expr and clause* ...)
+ (loop-aux "and-collector" args (and-vars ... (x expr)) and clause* ...))
+ ((loop-aux "and-collector" args (and-vars ...) and x = expr clause* ...)
+ (let (and-vars ... (x expr))
+ (loop-aux "variable-clause-collector" args clause* ...)))
+ ((loop-aux "for-reordering" args for x #f to-clause by-clause stepping from start clause* ...)
+ (let ((start* start))
+ (loop-aux "for-reordering" args for x start* to-clause by-clause stepping clause* ...)))
+ ((loop-aux "for-reordering" args for x #f to-clause by-clause stepping downfrom start clause* ...)
+ (let ((start* start))
+ (loop-aux "for-reordering" args for x start* to-clause by-clause -1 clause* ...)))
+ ((loop-aux "for-reordering" args for x from-clause #f by-clause stepping to last clause* ...)
+ (let ((last* last))
+ (loop-aux "for-reordering" args for x from-clause (to last*) by-clause stepping clause* ...)))
+ ((loop-aux "for-reordering" args for x from-clause #f by-clause stepping downto last clause* ...)
+ (let ((last* last))
+ (loop-aux "for-reordering" args for x from-clause (downto last*) by-clause -1 clause* ...)))
+ ((loop-aux "for-reordering" args for x from-clause #f by-clause 1 below last clause* ...)
+ (let ((last* last))
+ (loop-aux "for-reordering" args for x from-clause (below last*) by-clause 1 clause* ...)))
+ ((loop-aux "for-reordering" args for x from-clause #f by-clause _ above last clause* ...)
+ (let ((last* last))
+ (loop-aux "for-reordering" args for x from-clause (above last*) by-clause -1 clause* ...)))
+ ((loop-aux "for-reordering" args for x from-clause to-clause #f stepping by inc clause* ...)
+ (let ((inc* inc))
+ (loop-aux "for-reordering" args for x from-clause to-clause inc* stepping clause* ...)))
+ ((loop-aux "for-reordering" args for x #f to-clause inc 1 clause* ...)
+ (loop-aux "for-reordering" args for x 0 to-clause inc 1 clause* ...))
+ ((loop-aux "for-reordering" args for x from-clause to-clause #f stepping clause* ...)
+ (loop-aux "for-reordering" args for x from-clause to-clause 1 stepping clause* ...))
+ ((loop-aux "for-reordering" args for x start (to-clause ...) inc stepping clause* ...)
+ (loop-aux "variable-clause-collector" args for x from start to-clause ... by (* stepping inc) clause* ...))
+ ((loop-aux "main-clause-collector" args do clause* ...)
+ (loop-aux "unconditional" ("unconditional-main-continuation" args) () do clause* ...))
+ ((loop-aux "main-clause-collector" args return clause* ...)
+ (loop-aux "unconditional" ("unconditional-main-continuation" args) () return clause* ...))
+ ((loop-aux "main-clause-collector" args collect clause* ...)
+ (loop-aux "accumulation" ("accumulation-main-continuation" args) () collect clause* ...))
+ ((loop-aux "main-clause-collector" args append clause* ...)
+ (loop-aux "accumulation" ("accumulation-main-continuation" args) () append clause* ...))
+ ((loop-aux "main-clause-collector" args count clause* ...)
+ (loop-aux "accumulation" ("accumulation-main-continuation" args) () count clause* ...))
+ ((loop-aux "main-clause-collector" args sum clause* ...)
+ (loop-aux "accumulation" ("accumulation-main-continuation" args) () sum clause* ...))
+ ((loop-aux "main-clause-collector" args maximize clause* ...)
+ (loop-aux "accumulation" ("accumulation-main-continuation" args) () minimize clause* ...))
+ ((loop-aux "main-clause-collector" args if clause* ...)
+ (loop-aux "conditional" ("conditional-main-continuation" args) () if clause* ...))
+ ((loop-aux "main-clause-collector" args when clause* ...)
+ (loop-aux "conditional" ("conditional-main-continuation" args) () if clause* ...))
+ ((loop-aux "main-clause-collector" args unless clause* ...)
+ (loop-aux "conditional" ("conditional-main-continuation" args) () unless clause* ...))
+ ((loop-aux "main-clause-collector" ((body ...) fin) while expr clause* ...)
+ (loop-aux "main-clause-collector"
+ ((body ... (unless expr
+ (raise (make-loop-termination))))
+ fin)
+ clause* ...))
+ ((loop-aux "main-clause-collector" args until expr clause* ...)
+ (loop-aux "main-clause-collector" args while (not expr) clause* ...))
+ ((loop-aux "main-clause-collector" (body (fin ...)) finally (form1 form1* ...) (form2 form2* ...) clause* ...)
+ (loop-aux "main-clause-collector" (body (fin ... (form1 form1* ...))) finally (form2 form2* ...) clause* ...))
+ ((loop-aux "main-clause-collector" (body (fin ...)) finally (form form* ...) clause* ...)
+ (loop-aux "main-clause-collector" (body (fin ... (form form* ...))) clause* ...))
+ ((loop-aux "main-clause-collector" ((body ...) (fin ...)))
+ (let loop-name ()
+ (guard (e ((loop-termination? e) fin ...))
+ body ...
+ (loop-name))))
+ ((loop-aux "unconditional" continuation (compound ...) do (form1 form1* ...) (form2 form2* ...) clause* ...)
+ (loop-aux "unconditional" continuation (compound ... (form1 form1* ...)) do (form2 form2* ...) clause* ...))
+ ((loop-aux "unconditional" (continuation ...) (compound ...) do (form form* ...) clause* ...)
+ (loop-aux continuation ... (compound ... (form form* ...)) clause* ...))
+ ((loop-aux "unconditional" continuation compound return expr (form ...) clause* ...)
+ (syntax-error "unexpected form after return" (form ...)))
+ ((loop-aux "unconditional" continuation compound return expr clause* ...)
+ (loop-aux "unconditional" continuation compound do (return expr) clause* ...))
+ ((loop-aux "unconditional-main-continuation" ((body ...) fin) (compound ...) clause* ...)
+ (loop-aux "main-clause-collector" ((body ... compound ...) fin) clause* ...))
+ ((loop-aux "accumulation" (continuation ...) (compound ...) collect x into l clause* ...)
+ (let ((l '())
+ (last #f))
+ (loop-aux continuation ...
+ (compound ... (let ((p (list x)))
+ (if last
+ (set-cdr! last p)
+ (set! l p))
+ (set! last p)))
+ clause* ...)))
+ ((loop-aux "accumulation" continuation compound collect x (form ...) clause* ...)
+ (syntax-error "unexpected form after collect" (form ...)))
+ ((loop-aux "accumulation" continuation compound collect x clause* ...)
+ (loop-aux "accumulation" continuation compound collect x into l finally (return l) clause* ...))
+ ((loop-aux "accumulation" (continuation ...) (compound ...) append x into l clause* ...)
+ (let ((l '())
+ (last #f))
+ (loop-aux continuation ...
+ (compound ... (let ((p (list-copy x)))
+ (if last
+ (set-cdr! last p)
+ (set! l p))
+ (set! last p)))
+ clause* ...)))
+ ((loop-aux "accumulation" continuation compound append x clause* ...)
+ (loop-aux "accumulation" continuation compound append x into l finally (return l) clause* ...))
+ ((loop-aux "accumulation" (continuation ...) (compound ...) count x into n clause* ...)
+ (let ((n 0))
+ (loop-aux continuation ...
+ (compound ... (when x
+ (set! n (+ 1 n))))
+ clause* ...)))
+ ((loop-aux "accumulation" continuation compound count x clause* ...)
+ (loop-aux "accumulation" continuation compound count x into n finally (return n) clause* ...))
+ ((loop-aux "accumulation" (continuation ...) (compound ...) sum x into n clause* ...)
+ (let ((n 0))
+ (loop-aux continuation ...
+ (compound ... (set! n (+ x n)))
+ clause* ...)))
+ ((loop-aux "accumulation" continuation compound sum x clause* ...)
+ (loop-aux "accumulation" continuation compound sum x into n finally (return n) clause* ...))
+ ((loop-aux "accumulation" (continuation ...) (compound ...) maximize x into n clause* ...)
+ (let ((n #f))
+ (loop-aux continuation ...
+ (compound ... (let ((temp x))
+ (if n
+ (set! n (max temp n))
+ (set! n temp))))
+ clause* ...)))
+ ((loop-aux "accumulation" continuation compound maximize x clause* ...)
+ (loop-aux "accumulation" continuation compound maximize x into n finally (return n) clause* ...))
+ ((loop-aux "accumulation" (continuation ...) (compound ...) minimize x into n clause* ...)
+ (let ((n #f))
+ (loop-aux continuation ...
+ (compound ... (let ((temp x))
+ (if n
+ (set! n (min temp n))
+ (set! n temp))))
+ clause* ...)))
+ ((loop-aux "accumulation" continuation compound minimize x clause* ...)
+ (loop-aux "accumulation" continuation compound minimize x into n finally (return n) clause* ...))
+ ((loop-aux "accumulation-main-continuation" ((body ...) fin) (compound ...) clause* ...)
+ (loop-aux "main-clause-collector" ((body ... compound ...) fin) clause* ...))
+ ((loop-aux "conditional" continuation compound if condition clause* ...)
+ (loop-aux "selectable-clause" ("selectable-clause-if-continuation" continuation compound condition) () clause* ...))
+ ((loop-aux "conditional" continuation compound unless condition clause* ...)
+ (loop-aux "selectable-clause" ("selectable-clause-if-continuation" continuation compound (not condition)) () clause* ...))
+ ((loop-aux "conditional-main-continuation" ((body ...) fin) (compound ...) clause* ...)
+ (loop-aux "main-clause-collector" ((body ... compound ...) fin) clause* ...))
+ ((loop-aux "selectable-clause" continuation compound do clause* ...)
+ (loop-aux "unconditional" continuation compound do clause* ...))
+ ((loop-aux "selectable-clause" continuation compound return clause* ...)
+ (loop-aux "unconditional" continuation compound return clause* ...))
+ ((loop-aux "selectable-clause" continuation compound collect clause* ...)
+ (loop-aux "accumulation" continuation compound collect clause* ...))
+ ((loop-aux "selectable-clause" continuation compound append clause* ...)
+ (loop-aux "accumulation" continuation compound append clause* ...))
+ ((loop-aux "selectable-clause" continuation compound count clause* ...)
+ (loop-aux "accumulation" continuation compound count clause* ...))
+ ((loop-aux "selectable-clause" continuation compound sum clause* ...)
+ (loop-aux "accumulation" continuation compound sum clause* ...))
+ ((loop-aux "selectable-clause" continuation compound maximize clause* ...)
+ (loop-aux "accumulation" continuation compound maximize clause* ...))
+ ((loop-aux "selectable-clause" continuation compound minimize clause* ...)
+ (loop-aux "accumulation" continuation compound minimize clause* ...))
+ ((loop-aux "selectable-clause" continuation compound if clause* ...)
+ (loop-aux "conditional" continuation compound if clause* ...))
+ ((loop-aux "selectable-clause" continuation compound when clause* ...)
+ (loop-aux "conditional" continuation compound if clause* ...))
+ ((loop-aux "selectable-clause" continuation compound unless clause* ...)
+ (loop-aux "conditional" continuation compound unless clause* ...))
+ ((loop-aux "selectable-clause-if-continuation" continuation compound condition body and clause* ...)
+ (loop-aux "selectable-clause"
+ ("selectable-clause-if-continuation" continuation compound condition)
+ body
+ clause* ...))
+ ((loop-aux "selectable-clause-if-continuation" continuation compound condition body else clause* ...)
+ (loop-aux "selectable-clause"
+ ("selectable-clause-else-continuation" continuation compound condition body)
+ ()
+ clause* ...))
+ ((loop-aux "selectable-clause-if-continuation" (continuation ...) (compound ...) condition (body ...) end clause* ...)
+ (loop-aux continuation ...
+ (compound ... (when condition
+ body ...))
+ clause* ...))
+ ((loop-aux "selectable-clause-if-continuation" (continuation ...) (compound ...) condition (body ...) clause* ...)
+ (loop-aux continuation ...
+ (compound ... (when condition
+ body ...))
+ clause* ...))
+ ((loop-aux "selectable-clause-else-continuation" continuation compound condition body1 body2 and clause* ...)
+ (loop-aux "selectable-clause"
+ ("selectable-clause-else-continuation" continuation compound condition body1)
+ body2
+ clause* ...))
+ ((loop-aux "selectable-clause-else-continuation" (continuation ...) (compound ...) condition (body1 ...) (body2 ...) end clause* ...)
+ (loop-aux continuation ...
+ (compound ... (if condition
+ (begin body1 ...)
+ (begin body2 ...)))
+ clause* ...))
+ ((loop-aux "selectable-clause-else-continuation" (continuation ...) (compound ...) condition (body1 ...) (body2 ...) clause* ...)
+ (loop-aux continuation ...
+ (compound ... (if condition
+ (begin body1 ...)
+ (begin body2 ...)))
+ clause* ...))))
- (define-syntax loop-clauses
+ ; loop is a general purpose looping construct cribbed from CL.
+ (define-syntax loop
(syntax-rules ()
- ((loop-clauses (clause* ...) fin body)
+ ((loop clause* ...)
(call/cc
(lambda (k)
(define prev-loop-continuation *current-loop-continuation*)
@@ -138,56 +364,11 @@
(lambda ()
(set! *current-loop-continuation* k))
(lambda ()
- (initial-values loop-name () (clause* ... body)
- (if (condition clause* ...)
- (bindings (clause* ...)
- (subsequent-values loop-name () clause* ... body))
- (begin
- fin
- (result body)))))
+ (loop-aux "variable-clause-collector" (() ()) clause* ...))
(lambda ()
(set! *current-loop-continuation* prev-loop-continuation))))))))
- (define-syntax clause-collector
- (syntax-rules (=
- by
- collect
- do
- finally
- for
- from
- in
- into
- then
- to)
- ((clause-collector (acc ...) fin for x in l clause clause* ...)
- (clause-collector (acc ... (for x in l temp-name)) fin clause clause* ...))
- ((clause-collector (acc ...) fin for x from start to limit by step clause clause* ...)
- (clause-collector (acc ... (for x from start to limit by step)) fin clause clause* ...))
- ((clause-collector (acc ...) fin for x from start to limit clause clause* ...)
- (clause-collector (acc ... (for x from start to limit by 1)) fin clause clause* ...))
- ((clause-collector (acc ...) fin for x = init then subsequent clause clause* ...)
- (clause-collector (acc ... (for x = init then subsequent)) fin clause clause* ...))
- ((clause-collector (acc ...) fin collect x into l clause clause* ...)
- (clause-collector (acc ... (collect x into l temp-name)) fin clause clause* ...))
- ((clause-collector (acc ...) #f finally expr)
- (loop-clauses (acc ...) expr (do (if #f #f))))
- ((clause-collector (acc ...) #f finally expr clause clause* ...)
- (clause-collector (acc ...) expr clause clause* ...))
- ((clause-collector (acc ...) fin collect expr)
- (loop-clauses (acc ...) fin (collect expr temp1 temp2)))
- ((clause-collector (acc ...) fin do body body* ...)
- (loop-clauses (acc ...) fin (do (let () body body* ...))))))
-
-
- ; loop is a general purpose looping construct cribbed from CL.
- (define-syntax loop
- (syntax-rules ()
- ((loop clause clause* ...)
- (clause-collector () #f clause clause* ...))))
-
-
(define-syntax return
(syntax-rules ()
((return expr)