utils.scm
(module utils mzscheme
        (provide def-consts
                 while
                 )


        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;;;; defining constants
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        
        (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 ...))))

        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;;;; while loop
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        
        (define-syntax while
          (syntax-rules ()
            ((_ expr body ...)
             (letrec ((wh (lambda ()
                            (if expr
                                (begin
                                  (begin body ...)
                                  (wh))
                                #f))))
               (wh)))))

        )