1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-23 12:00:21 +02:00

Vars and labels are separate namespaces

* module/language/cps.scm (fresh-var, with-fresh-name-state): Vars have
  their own namespace.
This commit is contained in:
Andy Wingo 2014-03-28 22:27:48 +01:00
parent b9e601d20d
commit 1eda52c8ad

View file

@ -202,12 +202,10 @@
(label-counter (1+ count)) (label-counter (1+ count))
count)) count))
;; FIXME: Currently vars and labels need to be unique, so we use the
;; label counter.
(define (fresh-var) (define (fresh-var)
(let ((count (or (label-counter) (let ((count (or (var-counter)
(error "fresh-var outside with-fresh-name-state")))) (error "fresh-var outside with-fresh-name-state"))))
(label-counter (1+ count)) (var-counter (1+ count))
count)) count))
(define-syntax-rule (let-fresh (label ...) (var ...) body ...) (define-syntax-rule (let-fresh (label ...) (var ...) body ...)
@ -215,7 +213,6 @@
(var (fresh-var)) ...) (var (fresh-var)) ...)
body ...)) body ...))
;; FIXME: Same FIXME as above.
(define-syntax-rule (with-fresh-name-state fun body ...) (define-syntax-rule (with-fresh-name-state fun body ...)
(begin (begin
(when (or (label-counter) (var-counter)) (when (or (label-counter) (var-counter))
@ -223,8 +220,8 @@
(call-with-values (lambda () (call-with-values (lambda ()
(compute-max-label-and-var fun)) (compute-max-label-and-var fun))
(lambda (max-label max-var) (lambda (max-label max-var)
(parameterize ((label-counter (1+ (max max-label max-var))) (parameterize ((label-counter (1+ max-label))
(var-counter (1+ (max max-label max-var)))) (var-counter (1+ max-var)))
body ...))))) body ...)))))
(define-syntax build-arity (define-syntax build-arity
@ -490,18 +487,14 @@
(fun-folder fun seed ...))) (fun-folder fun seed ...)))
(define (compute-max-label-and-var fun) (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) ((make-cont-folder max-label max-var)
(lambda (label cont max-label max-var) (lambda (label cont max-label max-var)
(values (max label max-label) (values (max label max-label)
(match cont (match cont
(($ $kargs names vars) (($ $kargs names vars)
(fold max* max-var vars)) (fold max max-var vars))
(($ $kentry self) (($ $kentry self)
(max* self max-var)) (max self max-var))
(_ max-var)))) (_ max-var))))
fun fun
-1 -1