commit 8ae197462d5ad56470b72cebfedd8a9e3c9e5938
parent adc5c4e7b834c456ffaabec1ad1e4758d9592dd4
Author: Ed van Bruggen <edvb@uw.edu>
Date: Thu, 15 Mar 2018 23:43:34 -0700
Use recursion instead of a loop for eval
Diffstat:
1 file changed, 2 insertions(+), 15 deletions(-)
diff --git a/tisp.c b/tisp.c
@@ -424,7 +424,7 @@ eval_pair(Hash env, Val v)
}
static Val
-tisp_trampoline(Hash env, Val v, int *continu)
+tisp_eval(Hash env, Val v)
{
Val f, args;
switch (v->t) {
@@ -433,24 +433,20 @@ tisp_trampoline(Hash env, Val v, int *continu)
case INTEGER:
case RATIONAL:
case STRING:
- *continu = 0;
return v;
case SYMBOL:
- *continu = 0;
return hash_get(env, v->v.s);
case PAIR:
f = tisp_eval(env, car(v));
args = eval_pair(env, cdr(v));
switch (f->t) {
case PRIMITIVE:
- *continu = 0;
return (*f->v.pr)(env, args);
case FUNCTION:
/* tail call into the function body with the extended env */
hash_extend(env, f->v.f.args, args);
hash_merge(env, f->v.f.env);
- *continu = 1;
- return f->v.f.body;
+ return tisp_eval(env, f->v.f.body);
default:
die(1, "%s: Attempt to eval non primitive", argv0);
}
@@ -459,15 +455,6 @@ tisp_trampoline(Hash env, Val v, int *continu)
return v;
}
-static Val
-tisp_eval(Hash env, Val v)
-{
- int continu = 1;
- while(continu)
- v = tisp_trampoline(env, v, &continu);
- return v;
-}
-
/* TODO return str for error msgs? */
static void
tisp_print(Val v)