--- stack/stack.c 2002/02/08 13:01:16 1.63 +++ stack/stack.c 2002/02/09 00:20:02 1.65 @@ -496,13 +496,15 @@ return; } + eval_start: + switch(env->head->item->type) { /* if it's a symbol */ case symb: rcl(env); /* get its contents */ if(env->err) return; if(env->head->item->type!=symb){ /* don't recurse symbols */ - return eval(env); /* evaluate the value */ + goto eval_start; } return; @@ -528,7 +530,7 @@ if(env->err) return; if(iterator->next == NULL){ free_val(temp_val); - return eval(env); + goto eval_start; } eval(env); if(env->err) return; @@ -551,7 +553,7 @@ strcat(temp_string, " ]"); stack_read(env, temp_string); free(temp_string); - return eval(env); + goto eval_start; case integer: return; @@ -1190,3 +1192,42 @@ free_val(test); free_val(loop); } + +/* For-loop */ +extern void sx_666f72(environment *env) { + + value *loop, *foo; + stackitem *iterator; + + if((env->head)==NULL || env->head->next==NULL) { + printerr("Too Few Arguments"); + env->err=1; + return; + } + + if(env->head->next->item->type != list) { + printerr("Bad Argument Type"); + env->err=2; + return; + } + + loop= env->head->item; + loop->refcount++; + toss(env); if(env->err) return; + + foo= env->head->item; + foo->refcount++; + toss(env); if(env->err) return; + + iterator= foo->content.ptr; + + while(iterator!=NULL) { + push_val(&(env->head), iterator->item); + push_val(&(env->head), loop); + eval(env); if(env->err) return; + iterator= iterator->next; + } + + free_val(loop); + free_val(foo); +}