summaryrefslogtreecommitdiff
path: root/libguile/eval.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2014-12-06 19:43:24 +0100
committerAndy Wingo <wingo@pobox.com>2014-12-06 19:43:24 +0100
commit99fb07e19bf47b929fbd7e4574f96ea0bff4e641 (patch)
tree7fd89cc614e28d25913cf89b34eae7996317d2c4 /libguile/eval.c
parentcfdc8416a2540e43504a021d4f7c44c7d21a668d (diff)
downloadguile-99fb07e19bf47b929fbd7e4574f96ea0bff4e641.tar.gz
Add capture-env to evaluator
* libguile/eval.c (eval): * libguile/memoize.c (memoized_tags, unmemoize): * libguile/memoize.h (SCM_M_CAPTURE_ENV): * module/ice-9/eval.scm (primitive-eval): Add capture-env memoized expression type.
Diffstat (limited to 'libguile/eval.c')
-rw-r--r--libguile/eval.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/libguile/eval.c b/libguile/eval.c
index d76fbd30d..9f0955748 100644
--- a/libguile/eval.c
+++ b/libguile/eval.c
@@ -280,6 +280,28 @@ eval (SCM x, SCM env)
case SCM_M_LAMBDA:
RETURN_BOOT_CLOSURE (mx, env);
+ case SCM_M_CAPTURE_ENV:
+ {
+ SCM locs = CAR (mx);
+ SCM new_env;
+ int i;
+
+ new_env = make_env (VECTOR_LENGTH (locs), SCM_BOOL_F, env);
+ for (i = 0; i < VECTOR_LENGTH (locs); i++)
+ {
+ SCM loc = VECTOR_REF (locs, i);
+ int depth, width;
+
+ depth = SCM_I_INUM (CAR (loc));
+ width = SCM_I_INUM (CDR (loc));
+ env_set (new_env, 0, i, env_ref (env, depth, width));
+ }
+
+ env = new_env;
+ x = CDR (mx);
+ goto loop;
+ }
+
case SCM_M_QUOTE:
return mx;