summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-03-13 21:06:27 +0100
committerAndy Wingo <wingo@pobox.com>2009-03-13 21:06:27 +0100
commit06b04d5b9754ba245e1ee8a93ab2f969423d6b95 (patch)
tree8ba7d07811f2df7db48c6935eba9c5095905ceb2
parent4c558c9603ccc41ba2eb58a6aa6c7fc6fddb0642 (diff)
downloadguile-vm-syncase.tar.gz
temp commitvm-syncase
-rw-r--r--module/system/base/compile.scm25
1 files changed, 25 insertions, 0 deletions
diff --git a/module/system/base/compile.scm b/module/system/base/compile.scm
index 891902367..d4ea49424 100644
--- a/module/system/base/compile.scm
+++ b/module/system/base/compile.scm
@@ -167,6 +167,31 @@ time. Useful for supporting some forms of dynamic compilation. Returns
#f if called from the interpreter."
#f)
+(define* (compile-expressions producer #:key
+ (env #f)
+ (from (current-language))
+ (to 'objcode)
+ (opts '()))
+ (let lp ((in (reverse (or (lookup-compilation-order from to)
+ (error "no way to compile" from "to" to))))
+ (join (ensure-language to))
+ (out '()))
+ (cond ((null? in)
+ (error "don't know how to to the multiple-expr thing"))
+ ((language-begin join)
+ (let ((leaf-passes (map cdr (reverse in)))
+ (join (language-begin join))
+ (trunk-passes (map cdr out)))
+ (receive (exp env)
+ (join (map-in-order (lambda (x)
+ (compile-fold leaf-passes x env opts))
+ exps))
+ (compile-fold trunk-passes exp env opts))))
+ (else
+ (lp (cdr in)
+ (caar in)
+ (cons (car in) out))))))
+
(define* (compile x #:key
(env #f)
(from (current-language))