Vars and labels are separate namespaces
authorAndy Wingo <wingo@pobox.com>
Fri, 28 Mar 2014 21:27:48 +0000 (22:27 +0100)
committerAndy Wingo <wingo@pobox.com>
Mon, 31 Mar 2014 16:21:04 +0000 (18:21 +0200)
* module/language/cps.scm (fresh-var, with-fresh-name-state): Vars have
  their own namespace.

module/language/cps.scm

index 1efc0a5..9101aa1 100644 (file)
     (label-counter (1+ count))
     count))
 
-;; FIXME: Currently vars and labels need to be unique, so we use the
-;; label counter.
 (define (fresh-var)
-  (let ((count (or (label-counter)
+  (let ((count (or (var-counter)
                    (error "fresh-var outside with-fresh-name-state"))))
-    (label-counter (1+ count))
+    (var-counter (1+ count))
     count))
 
 (define-syntax-rule (let-fresh (label ...) (var ...) body ...)
         (var (fresh-var)) ...)
     body ...))
 
-;; FIXME: Same FIXME as above.
 (define-syntax-rule (with-fresh-name-state fun body ...)
   (begin
     (when (or (label-counter) (var-counter))
     (call-with-values (lambda ()
                         (compute-max-label-and-var fun))
       (lambda (max-label max-var)
-        (parameterize ((label-counter (1+ (max max-label max-var)))
-                       (var-counter (1+ (max max-label max-var))))
+        (parameterize ((label-counter (1+ max-label))
+                       (var-counter (1+ max-var)))
           body ...)))))
 
 (define-syntax build-arity
     (fun-folder fun seed ...)))
 
 (define (compute-max-label-and-var fun)
-  (define (max* var max-var)
-    (if (number? var)
-        (max var max-var)
-        max-var))
   ((make-cont-folder max-label max-var)
    (lambda (label cont max-label max-var)
      (values (max label max-label)
              (match cont
                (($ $kargs names vars)
-                (fold max* max-var vars))
+                (fold max max-var vars))
                (($ $kentry self)
-                (max* self max-var))
+                (max self max-var))
                (_ max-var))))
    fun
    -1