--- stack/stack.c 2002/02/08 04:58:23 1.59 +++ stack/stack.c 2002/02/09 00:40:45 1.66 @@ -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; @@ -955,10 +957,72 @@ a=env->head->item->content.val; toss(env); if(env->err) return; - b=env->head->item->content.val; + if(env->head->item->refcount == 1) + env->head->item->content.val += a; + else { + b=env->head->item->content.val; + toss(env); + if(env->err) return; + push_int(&(env->head), a+b); + } +} + +/* - */ +extern void sx_2d(environment *env) { + int a, b; + + if((env->head)==NULL || env->head->next==NULL) { + printerr("Too Few Arguments"); + env->err=1; + return; + } + + if(env->head->item->type!=integer + || env->head->next->item->type!=integer) { + printerr("Bad Argument Type"); + env->err=2; + return; + } + a=env->head->item->content.val; + toss(env); + if(env->err) return; + if(env->head->item->refcount == 1) + env->head->item->content.val -= a; + else { + b=env->head->item->content.val; + toss(env); + if(env->err) return; + push_int(&(env->head), b-a); + } +} + +/* > */ +extern void sx_3e(environment *env) { + int a, b; + + if((env->head)==NULL || env->head->next==NULL) { + printerr("Too Few Arguments"); + env->err=1; + return; + } + + if(env->head->item->type!=integer + || env->head->next->item->type!=integer) { + printerr("Bad Argument Type"); + env->err=2; + return; + } + a=env->head->item->content.val; toss(env); if(env->err) return; - push_int(&(env->head), a+b); + if(env->head->item->refcount == 1) + env->head->item->content.val = (env->head->item->content.val > a); + else { + b=env->head->item->content.val; + toss(env); + if(env->err) return; + push_int(&(env->head), b>a); + } } /* Return copy of a value */ @@ -1087,6 +1151,7 @@ extern void sx_7768696c65(environment *env) { int truth; + value *loop, *test; if((env->head)==NULL || env->head->next==NULL) { printerr("Too Few Arguments"); @@ -1094,10 +1159,17 @@ return; } + loop= env->head->item; + loop->refcount++; + toss(env); if(env->err) return; + + test= env->head->item; + test->refcount++; + toss(env); if(env->err) return; + do { - swap(env); if(env->err) return; - dup(env); if(env->err) return; - eval(env); if(env->err) return; + push_val(&(env->head), test); + eval(env); if(env->head->item->type != integer) { printerr("Bad Argument Type"); @@ -1106,17 +1178,87 @@ } truth= env->head->item->content.val; - toss(env); if(env->err) return; - swap(env); if(env->err) return; if(truth) { - dup(env); + push_val(&(env->head), loop); eval(env); } else { toss(env); - toss(env); } } while(truth); + + 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); +} + +/* 'to' */ +extern void to(environment *env) { + int i, start, ending; + + if((env->head)==NULL || env->head->next==NULL) { + printerr("Too Few Arguments"); + env->err=1; + return; + } + + if(env->head->item->type!=integer + || env->head->next->item->type!=integer) { + printerr("Bad Argument Type"); + env->err=2; + return; + } + + ending= env->head->item->content.val; + toss(env); if(env->err) return; + start= env->head->item->content.val; + toss(env); if(env->err) return; + + push_sym(env, "["); + + for(i= start; i<= ending; i++) + push_int(&(env->head), i); + + push_sym(env, "["); + pack(env); if(env->err) return; }