From fbcb476d1d4cc015fa6afbf9135f5b92c1c1e299 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 21 Oct 2014 19:42:36 -0700 Subject: * eval.c (interp_fun): If the function doesn't have specials, then don't bother saving and restoring dynamic env around the argument binding and evaluation. --- ChangeLog | 6 ++++++ eval.c | 18 +++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3784aa27..9cad9c43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2014-10-21 Kaz Kylheku + + * eval.c (interp_fun): If the function doesn't have + specials, then don't bother saving and restoring dynamic + env around the argument binding and evaluation. + 2014-10-21 Kaz Kylheku * eval.c (eval_init): Register notf intrinsic function. diff --git a/eval.c b/eval.c index 94736bdb..df8c7eb2 100644 --- a/eval.c +++ b/eval.c @@ -897,11 +897,19 @@ val interp_fun(val env, val fun, val args) val def = cdr(fun); val params = car(def); val body = cdr(def); - val saved_de = set_dyn_env(make_env(nil, nil, dyn_env)); - val fun_env = bind_args(env, params, args, fun); - val ret = eval_progn(body, fun_env, body); - set_dyn_env(saved_de); - return ret; + val firstparam = if2(consp(params), car(params)); + + if (!consp(firstparam) || car(firstparam) != special_s) + { + val fun_env = bind_args(env, params, args, fun); + return eval_progn(body, fun_env, body); + } else { + val saved_de = set_dyn_env(make_env(nil, nil, dyn_env)); + val fun_env = bind_args(env, params, args, fun); + val ret = eval_progn(body, fun_env, body); + set_dyn_env(saved_de); + return ret; + } } val eval_intrinsic(val form, val env) -- cgit v1.2.3