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 | |
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.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | eval.c | 18 |
2 files changed, 19 insertions, 5 deletions
@@ -1,5 +1,11 @@ | |||
1 | 2014-10-21 Kaz Kylheku <kaz@kylheku.com> | 1 | 2014-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 | |||
7 | 2014-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. |
@@ -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 | ||
907 | val eval_intrinsic(val form, val env) | 915 | val eval_intrinsic(val form, val env) |