summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-10-21 19:42:36 -0700
committerKaz Kylheku <kaz@kylheku.com>2014-10-21 19:42:36 -0700
commitfbcb476d1d4cc015fa6afbf9135f5b92c1c1e299 (patch)
treeee22f5e2ea9bc4e21b059a27ac208691537bc0ac
parentf9d4303ea0875da3feba4b5eb0dd372b676b8652 (diff)
downloadtxr-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.
-rw-r--r--ChangeLog6
-rw-r--r--eval.c18
2 files changed, 19 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 3784aa27..9cad9c43 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
12014-10-21 Kaz Kylheku <kaz@kylheku.com> 12014-10-21 Kaz Kylheku <kaz@kylheku.com>
2 2
3 * eval.c (interp_fun): If the function doesn't have
4 specials, then don't bother saving and restoring dynamic
5 env around the argument binding and evaluation.
6
72014-10-21 Kaz Kylheku <kaz@kylheku.com>
8
3 * eval.c (eval_init): Register notf intrinsic function. 9 * eval.c (eval_init): Register notf intrinsic function.
4 10
5 * lib.c (do_not): New static function. 11 * lib.c (do_not): New static 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)
897 val def = cdr(fun); 897 val def = cdr(fun);
898 val params = car(def); 898 val params = car(def);
899 val body = cdr(def); 899 val body = cdr(def);
900 val saved_de = set_dyn_env(make_env(nil, nil, dyn_env)); 900 val firstparam = if2(consp(params), car(params));
901 val fun_env = bind_args(env, params, args, fun); 901
902 val ret = eval_progn(body, fun_env, body); 902 if (!consp(firstparam) || car(firstparam) != special_s)
903 set_dyn_env(saved_de); 903 {
904 return ret; 904 val fun_env = bind_args(env, params, args, fun);
905 return eval_progn(body, fun_env, body);
906 } else {
907 val saved_de = set_dyn_env(make_env(nil, nil, dyn_env));
908 val fun_env = bind_args(env, params, args, fun);
909 val ret = eval_progn(body, fun_env, body);
910 set_dyn_env(saved_de);
911 return ret;
912 }
905} 913}
906 914
907val eval_intrinsic(val form, val env) 915val eval_intrinsic(val form, val env)