--- stack/stack.c 2002/02/16 00:51:32 1.88 +++ stack/stack.c 2002/02/17 04:03:57 1.89 @@ -87,9 +87,6 @@ value *nval= malloc(sizeof(value)); stackitem *nitem= malloc(sizeof(stackitem)); - if(env->gc_count >= env->gc_limit) - gc_init(env); - nval->content.ptr= NULL; nitem->item= nval; @@ -124,6 +121,9 @@ symbol *tsymb; int i; + if(env->gc_count < env->gc_limit) + return; + while(iterator!=NULL) { iterator->item->gc_garb= 1; iterator= iterator->next; @@ -178,7 +178,7 @@ } } - env->gc_limit= env->gc_count+20; + env->gc_limit= env->gc_count*2; env->gc_ref= new_head; } @@ -534,7 +534,7 @@ in_func= (funcp)(env->head->item->content.ptr); toss(env); if(env->err) return; - return (*in_func)(env); + return in_func(env); /* If it's a list */ case list: @@ -889,6 +889,7 @@ toss(&myenv); /* No error check in main */ eval(&myenv); } + gc_init(&myenv); } quit(&myenv); return EXIT_FAILURE; @@ -1143,8 +1144,54 @@ } while(truth); } -/* "for"; For-loop */ + +/* "for"; for-loop */ extern void sx_666f72(environment *env) { + value *loop; + int foo1, foo2; + + if(env->head==NULL || env->head->next==NULL + || env->head->next->next==NULL) { + printerr("Too Few Arguments"); + env->err= 1; + return; + } + + if(env->head->next->item->type!=integer + || env->head->next->next->item->type!=integer) { + printerr("Bad Argument Type"); + env->err= 2; + return; + } + + loop= env->head->item; + toss(env); if(env->err) return; + + foo2= env->head->item->content.val; + toss(env); if(env->err) return; + + foo1= env->head->item->content.val; + toss(env); if(env->err) return; + + if(foo1<=foo2) { + while(foo1<=foo2) { + push_int(env, foo1); + push_val(env, loop); + eval(env); if(env->err) return; + foo1++; + } + } else { + while(foo1>=foo2) { + push_int(env, foo1); + push_val(env, loop); + eval(env); if(env->err) return; + foo1--; + } + } +} + +/* Variant of for-loop */ +extern void foreach(environment *env) { value *loop, *foo; stackitem *iterator;