(module utils mzscheme
(provide def-consts
while
)
(define-syntax internal-constants
(syntax-rules ()
((_ prev-val (c v))
(define c v))
((_ prev-val c)
(define c prev-val))
((_ prev-val (c v) . (r1 ...) )
(begin
(define c v)
(internal-constants (+ v 1) r1 ...)))
((_ prev-val c . (r1 ...) )
(begin
(define c prev-val)
(internal-constants (+ prev-val 1) r1 ...)))))
(define-syntax def-consts
(syntax-rules ()
((_ c)
(internal-constants 0 c))
((_ c1 ...)
(internal-constants 0 c1 ...))))
(define-syntax while
(syntax-rules ()
((_ expr body ...)
(letrec ((wh (lambda ()
(if expr
(begin
(begin body ...)
(wh))
#f))))
(wh)))))
)