summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2010-04-21 23:30:48 +0200
committerLudovic Courtès <ludo@gnu.org>2010-05-07 13:47:52 +0200
commitf9a86f72a6ea7ab480f4bfd6ef61c835620df5eb (patch)
tree4e72d7bdb5486d598f5af5bb3a5dc6cb7363503a
parente6bd58af8fd847dc1e7af2c8d658905ea889edca (diff)
downloadguile-f9a86f72a6ea7ab480f4bfd6ef61c835620df5eb.tar.gz
Add `program-free-variables' to `(system vm program)'.
* module/system/vm/program.scm (program-free-variables): New procedure. * module/language/objcode/spec.scm (program-free-variables): Remove.
-rw-r--r--module/language/objcode/spec.scm5
-rw-r--r--module/system/vm/program.scm14
2 files changed, 12 insertions, 7 deletions
diff --git a/module/language/objcode/spec.scm b/module/language/objcode/spec.scm
index a4cb0621d..bbd745412 100644
--- a/module/language/objcode/spec.scm
+++ b/module/language/objcode/spec.scm
@@ -53,11 +53,6 @@
(lp (acons (binding:index b) (list b) ret)
(cdr locs))))))))
-(define (program-free-variables program)
- (list->vector
- (map (lambda (i) (program-free-variable-ref program i))
- (iota (program-num-free-variables program)))))
-
(define (decompile-value x env opts)
(cond
((program? x)
diff --git a/module/system/vm/program.scm b/module/system/vm/program.scm
index f3892cbb3..30f8c7ecd 100644
--- a/module/system/vm/program.scm
+++ b/module/system/vm/program.scm
@@ -20,7 +20,8 @@
(define-module (system vm program)
#:use-module (system base pmatch)
- #:use-module (ice-9 optargs)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-26)
#:export (make-program
make-binding binding:name binding:boxed? binding:index
@@ -35,10 +36,11 @@
arity:nreq arity:nopt arity:rest? arity:kw arity:allow-other-keys?
program-arguments-alist program-lambda-list
-
+
program-meta
program-objcode program? program-objects
program-module program-base
+ program-free-variables
program-num-free-variables
program-free-variable-ref program-free-variable-set!))
@@ -190,6 +192,14 @@
,@(if (pair? key) (cons #:key key) '())
. ,rest)))
+(define (program-free-variables prog)
+ "Return the list of free variables of PROG."
+ (let ((count (program-num-free-variables prog)))
+ (unfold (lambda (i) (>= i count))
+ (cut program-free-variable-ref prog <>)
+ 1+
+ 0)))
+
(define (write-program prog port)
(format port "#<procedure ~a~a>"
(or (procedure-name prog)