Public make-cont-folder
[bpt/guile.git] / module / language / cps.scm
index 9101aa1..f8b871e 100644 (file)
 
             ;; Misc.
             parse-cps unparse-cps
-            fold-conts fold-local-conts))
+            make-cont-folder fold-conts fold-local-conts))
 
 ;; FIXME: Use SRFI-99, when Guile adds it.
 (define-syntax define-record-type*
     (_
      (error "unexpected cps" exp))))
 
-(define-syntax-rule (make-cont-folder seed ...)
+(define-syntax-rule (make-cont-folder global? seed ...)
   (lambda (proc fun seed ...)
     (define (fold-values proc in seed ...)
       (if (null? in)
 
         (($ $continue k src exp)
          (match exp
-           (($ $fun) (fun-folder exp seed ...))
+           (($ $fun)
+            (if global?
+                (fun-folder exp seed ...)
+                (values seed ...)))
            (_ (values seed ...))))
 
         (($ $letrec names syms funs body)
          (let-values (((seed ...) (term-folder body seed ...)))
-           (fold-values fun-folder funs seed ...)))))
+           (if global?
+               (fold-values fun-folder funs seed ...)
+               (values seed ...))))))
 
     (fun-folder fun seed ...)))
 
 (define (compute-max-label-and-var fun)
-  ((make-cont-folder max-label max-var)
+  ((make-cont-folder #t max-label max-var)
    (lambda (label cont max-label max-var)
      (values (max label max-label)
              (match cont
    -1))
 
 (define (fold-conts proc seed fun)
-  ((make-cont-folder seed) proc fun seed))
+  ((make-cont-folder #t seed) proc fun seed))
 
-(define (fold-local-conts proc seed cont)
-  (define (cont-folder cont seed)
-    (match cont
-      (($ $cont k cont)
-       (let ((seed (proc k cont seed)))
-         (match cont
-           (($ $kargs names syms body)
-            (term-folder body seed))
-
-           (($ $kentry self tail clauses)
-            (fold cont-folder (cont-folder tail seed) clauses))
-
-           (($ $kclause arity body)
-            (cont-folder body seed))
-
-           (_ seed))))))
-
-  (define (term-folder term seed)
-    (match term
-      (($ $letk conts body)
-       (fold cont-folder (term-folder body seed) conts))
-
-      (($ $continue) seed)
-
-      (($ $letrec names syms funs body) (term-folder body seed))))
-
-  (cont-folder cont seed))
+(define (fold-local-conts proc seed fun)
+  ((make-cont-folder #f seed) proc fun seed))