diff options
author | Andy Wingo <wingo@pobox.com> | 2013-10-31 22:16:10 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2013-10-31 22:16:10 +0100 |
commit | ef47c4229c9c19db56bb0c123eba01c71c4a2011 (patch) | |
tree | 4e07c00197b07df63824f4e4a83875929a74a144 /libguile/eval.c | |
parent | 3e248c70e3be268b6ad71c9eee9895519ab0495f (diff) | |
download | guile-ef47c4229c9c19db56bb0c123eba01c71c4a2011.tar.gz |
Be smarter about capturing the environment for memoized code
* libguile/memoize.h (SCM_M_CAPTURE_MODULE)
* libguile/memoize.c (MAKMEMO_CAPTURE_MODULE, capture_env):
(maybe_makmemo_capture_module, memoize): Determine when to capture the
module on the environment chain at compile-time, instead of at
runtime. Introduces a new memoized expression type, capture-module.
(scm_memoized_expression): Start memoizing with #f as the
environment.
(unmemoize): Add unmemoizer.
(scm_memoize_variable_access_x): Cope with #f as module, and treat as
the root module (captured before modules were booted).
* libguile/eval.c (eval):
* module/ice-9/eval.scm (primitive-eval): Adapt.
Diffstat (limited to 'libguile/eval.c')
-rw-r--r-- | libguile/eval.c | 29 |
1 files changed, 8 insertions, 21 deletions
diff --git a/libguile/eval.c b/libguile/eval.c index 43a182a5a..1572c8755 100644 --- a/libguile/eval.c +++ b/libguile/eval.c @@ -245,18 +245,6 @@ truncate_values (SCM x) } #define EVAL1(x, env) (truncate_values (eval ((x), (env)))) -/* the environment: - (VAL ... . MOD) - If MOD is #f, it means the environment was captured before modules were - booted. - If MOD is the literal value '(), we are evaluating at the top level, and so - should track changes to the current module. You have to be careful in this - case, because further lexical contours should capture the current module. -*/ -#define CAPTURE_ENV(env) \ - (scm_is_null (env) ? scm_current_module () : \ - (scm_is_false (env) ? scm_the_root_module () : env)) - static SCM eval (SCM x, SCM env) { @@ -288,8 +276,7 @@ eval (SCM x, SCM env) SCM new_env; int i; - new_env = make_env (VECTOR_LENGTH (inits), SCM_UNDEFINED, - CAPTURE_ENV (env)); + new_env = make_env (VECTOR_LENGTH (inits), SCM_UNDEFINED, env); for (i = 0; i < VECTOR_LENGTH (inits); i++) env_set (new_env, 0, i, EVAL1 (VECTOR_REF (inits, i), env)); env = new_env; @@ -298,7 +285,7 @@ eval (SCM x, SCM env) } case SCM_M_LAMBDA: - RETURN_BOOT_CLOSURE (mx, CAPTURE_ENV (env)); + RETURN_BOOT_CLOSURE (mx, env); case SCM_M_QUOTE: return mx; @@ -307,6 +294,9 @@ eval (SCM x, SCM env) scm_define (CAR (mx), EVAL1 (CDR (mx), env)); return SCM_UNSPECIFIED; + case SCM_M_CAPTURE_MODULE: + return eval (mx, scm_current_module ()); + case SCM_M_APPLY: /* Evaluate the procedure to be applied. */ proc = EVAL1 (CAR (mx), env); @@ -405,8 +395,7 @@ eval (SCM x, SCM env) else { env = env_tail (env); - return SCM_VARIABLE_REF - (scm_memoize_variable_access_x (x, CAPTURE_ENV (env))); + return SCM_VARIABLE_REF (scm_memoize_variable_access_x (x, env)); } case SCM_M_TOPLEVEL_SET: @@ -421,9 +410,7 @@ eval (SCM x, SCM env) else { env = env_tail (env); - SCM_VARIABLE_SET - (scm_memoize_variable_access_x (x, CAPTURE_ENV (env)), - val); + SCM_VARIABLE_SET (scm_memoize_variable_access_x (x, env), val); return SCM_UNSPECIFIED; } } @@ -654,7 +641,7 @@ scm_c_primitive_eval (SCM exp) { if (!SCM_EXPANDED_P (exp)) exp = scm_call_1 (scm_current_module_transformer (), exp); - return eval (scm_memoize_expression (exp), SCM_EOL); + return eval (scm_memoize_expression (exp), SCM_BOOL_F); } static SCM var_primitive_eval; |