diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-10-21 19:42:36 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-10-21 19:42:36 -0700 |
commit | fbcb476d1d4cc015fa6afbf9135f5b92c1c1e299 (patch) | |
tree | ee22f5e2ea9bc4e21b059a27ac208691537bc0ac /eval.c | |
parent | f9d4303ea0875da3feba4b5eb0dd372b676b8652 (diff) | |
download | txr-fbcb476d1d4cc015fa6afbf9135f5b92c1c1e299.tar.gz txr-fbcb476d1d4cc015fa6afbf9135f5b92c1c1e299.tar.bz2 txr-fbcb476d1d4cc015fa6afbf9135f5b92c1c1e299.zip |
* 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.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -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) |