diff options
author | Andy Wingo <wingo@pobox.com> | 2014-12-07 15:52:34 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2014-12-07 15:52:34 +0100 |
commit | e6a42e676528bf56c6535a7e0c79e936a6d2a818 (patch) | |
tree | 82802288051ec1941785bd49bbbbac18e57db6c1 /libguile/eval.c | |
parent | a3cae847d0e6c77494c7cf5f395e8234e3b9b5cf (diff) | |
download | guile-e6a42e676528bf56c6535a7e0c79e936a6d2a818.tar.gz |
Simplify variable resolution in the evaluator
* libguile/expand.c (convert_assignment): Handle creation of the default
lambda-case body here.
* libguile/eval.c (eval):
* module/ice-9/eval.scm (primitive-eval):
* libguile/memoize.h:
* libguile/memoize.c (MAKMEMO_BOX_REF, MAKMEMO_BOX_SET):
(MAKMEMO_TOP_BOX, MAKMEMO_MOD_BOX): Refactor all global var resolution
to go through "resolve". Add "box-ref" and "box-set!". Rename
memoize-variable-access! to %resolve-variable, and don't be
destructive.
Diffstat (limited to 'libguile/eval.c')
-rw-r--r-- | libguile/eval.c | 60 |
1 files changed, 18 insertions, 42 deletions
diff --git a/libguile/eval.c b/libguile/eval.c index 9f0955748..b69b5b2b4 100644 --- a/libguile/eval.c +++ b/libguile/eval.c @@ -305,10 +305,6 @@ eval (SCM x, SCM env) case SCM_M_QUOTE: return mx; - case SCM_M_DEFINE: - scm_define (CAR (mx), EVAL1 (CDR (mx), env)); - return SCM_UNSPECIFIED; - case SCM_M_CAPTURE_MODULE: return eval (mx, scm_current_module ()); @@ -398,51 +394,31 @@ eval (SCM x, SCM env) return SCM_UNSPECIFIED; } - case SCM_M_TOPLEVEL_REF: - if (SCM_VARIABLEP (mx)) - return SCM_VARIABLE_REF (mx); - else - { - env = env_tail (env); - return SCM_VARIABLE_REF (scm_memoize_variable_access_x (x, env)); - } + case SCM_M_BOX_REF: + { + SCM box = mx; - case SCM_M_TOPLEVEL_SET: + return scm_variable_ref (EVAL1 (box, env)); + } + + case SCM_M_BOX_SET: { - SCM var = CAR (mx); - SCM val = EVAL1 (CDR (mx), env); - if (SCM_VARIABLEP (var)) - { - SCM_VARIABLE_SET (var, val); - return SCM_UNSPECIFIED; - } - else - { - env = env_tail (env); - SCM_VARIABLE_SET (scm_memoize_variable_access_x (x, env), val); - return SCM_UNSPECIFIED; - } + SCM box = CAR (mx), val = CDR (mx); + + return scm_variable_set_x (EVAL1 (box, env), EVAL1 (val, env)); } - case SCM_M_MODULE_REF: + case SCM_M_RESOLVE: if (SCM_VARIABLEP (mx)) - return SCM_VARIABLE_REF (mx); - else - return SCM_VARIABLE_REF - (scm_memoize_variable_access_x (x, SCM_BOOL_F)); - - case SCM_M_MODULE_SET: - if (SCM_VARIABLEP (CDR (mx))) - { - SCM_VARIABLE_SET (CDR (mx), EVAL1 (CAR (mx), env)); - return SCM_UNSPECIFIED; - } + return mx; else { - SCM_VARIABLE_SET - (scm_memoize_variable_access_x (x, SCM_BOOL_F), - EVAL1 (CAR (mx), env)); - return SCM_UNSPECIFIED; + SCM mod, var; + + var = scm_sys_resolve_variable (mx, env_tail (env)); + scm_set_cdr_x (x, var); + + return var; } case SCM_M_CALL_WITH_PROMPT: |