summaryrefslogtreecommitdiff
path: root/libguile/eval.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-05-07 10:51:28 +0200
committerAndy Wingo <wingo@pobox.com>2010-05-07 22:22:19 +0200
commit4f692ace90f2dc75b83aa9e10d9cd107d2ea924e (patch)
treef01b7c934fe781a95ac5d95f8257d78db35b8e11 /libguile/eval.c
parentb79ba0b01e7dc89d2ba8da2c5cf4e200f4bb5de1 (diff)
downloadguile-4f692ace90f2dc75b83aa9e10d9cd107d2ea924e.tar.gz
macro expanders return memoized expressions
* libguile/eval.c (scm_c_primitive_eval): * module/ice-9/eval.scm (primitive-eval): Rely on the expander to produce a memoized expression. If the expression is already memoized, just pass it through (the equivalent of the old "noexpand" hack). * libguile/memoize.c (scm_init_memoize): Initialize `memoize-expression' as the initial binding of `macroexpand'. * libguile/modules.c (scm_module_transformer): Before modules are booted, look for `macroexpand', not `%pre-modules-transformer'. * module/ice-9/boot-9.scm: No more %pre-modules-transformer. Loading psyntax extends `macroexpand'. (make-module): `macroexpand' is the default transformer. * module/ice-9/psyntax.scm: No more `noexpand'. (top-level-eval-hook, local-eval-hook): Instead of annotating with noexpand, memoize the expression before handing it to primitive-eval. (macroexpand): No more noexpand hack -- in its place we have another hack, to memoize the result when running in eval mode. * module/ice-9/psyntax-pp.scm: Regenerated.
Diffstat (limited to 'libguile/eval.c')
-rw-r--r--libguile/eval.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/libguile/eval.c b/libguile/eval.c
index f775d31b1..f2cbebe64 100644
--- a/libguile/eval.c
+++ b/libguile/eval.c
@@ -844,10 +844,12 @@ scm_for_each (SCM proc, SCM arg1, SCM args)
static SCM
scm_c_primitive_eval (SCM exp)
{
- SCM transformer = scm_current_module_transformer ();
- if (scm_is_true (transformer))
- exp = scm_call_1 (transformer, exp);
- exp = scm_memoize_expression (exp);
+ if (!SCM_MEMOIZED_P (exp))
+ exp = scm_call_1 (scm_current_module_transformer (), exp);
+ if (!SCM_MEMOIZED_P (exp))
+ scm_misc_error ("primitive-eval",
+ "expander did not return a memoized expression",
+ scm_list_1 (exp));
return eval (exp, SCM_EOL);
}