summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2012-01-30 03:02:32 -0500
committerMark H Weaver <mhw@netris.org>2012-01-30 03:02:32 -0500
commit2f3e436411b5dbb4f1a1b9d8583b348e221d5b67 (patch)
tree3281cbc41ad0e38dcf271bf74663d70e0113ea83
parent505afe28321654a5e28b0954eeda9d1a58ce2467 (diff)
downloadguile-2f3e436411b5dbb4f1a1b9d8583b348e221d5b67.tar.gz
Fix 'local-eval' when the specified environment is a module
* module/ice-9/local-eval.scm (local-wrap): Fix the (module? e) case, to reference the expression 'x' instead of the non-existent variable 'exp', as was previously done. Also use quasisyntax instead of quasiquote, so that the introduced 'lambda' is an identifier instead of a bare symbol, so that this will work in modules that have rebound 'lambda' to something else. * test-suite/tests/eval.test (local-eval): Make sure to test both 'local-eval' and 'local-compile' when the specified environment is a module.
-rw-r--r--module/ice-9/local-eval.scm2
-rw-r--r--test-suite/tests/eval.test20
2 files changed, 12 insertions, 10 deletions
diff --git a/module/ice-9/local-eval.scm b/module/ice-9/local-eval.scm
index f01a9c655..28f30b991 100644
--- a/module/ice-9/local-eval.scm
+++ b/module/ice-9/local-eval.scm
@@ -235,7 +235,7 @@
(scope (caddr l)))
(within-nested-ellipses (datum->syntax scope name) lvl)))
(lexenv-patterns e))))
- ((module? e) `(lambda () #f ,exp))
+ ((module? e) #`(lambda () #f #,x))
(else (error "invalid lexical environment" e))))
(define (local-eval x e)
diff --git a/test-suite/tests/eval.test b/test-suite/tests/eval.test
index f532059f0..b0bfd4c44 100644
--- a/test-suite/tests/eval.test
+++ b/test-suite/tests/eval.test
@@ -431,9 +431,10 @@
(pass-if "local-eval"
- (let* ((env1 (let ((x 1) (y 2) (z 3))
- (define-syntax-rule (foo x) (quote x))
- (the-environment)))
+ (let* ((env1 (local-eval '(let ((x 1) (y 2) (z 3))
+ (define-syntax-rule (foo x) (quote x))
+ (the-environment))
+ (current-module)))
(env2 (local-eval '(let ((x 111) (a 'a))
(define-syntax-rule (bar x) (quote x))
(the-environment))
@@ -448,9 +449,10 @@
(pass-if "local-compile"
- (let* ((env1 (let ((x 1) (y 2) (z 3))
- (define-syntax-rule (foo x) (quote x))
- (the-environment)))
+ (let* ((env1 (local-compile '(let ((x 1) (y 2) (z 3))
+ (define-syntax-rule (foo x) (quote x))
+ (the-environment))
+ (current-module)))
(env2 (local-compile '(let ((x 111) (a 'a))
(define-syntax-rule (bar x) (quote x))
(the-environment))
@@ -477,9 +479,9 @@
(the-environment))))
module-a)
(module-use! module-b (resolve-interface '(guile)))
- (let ((env (eval `(let ((x 111) (y 222))
- ((@@ ,module-a-name test)))
- module-b)))
+ (let ((env (local-eval `(let ((x 111) (y 222))
+ ((@@ ,module-a-name test)))
+ module-b)))
(equal? (local-eval '(list x y z) env)
'(1 2 3))))))