--- stack/stack.c 2002/03/20 17:19:46 1.119 +++ stack/stack.c 2002/03/27 14:45:17 1.121 @@ -1109,7 +1109,7 @@ } if(myenv.interactive) { - printf("Stack version $Revision: 1.119 $\n\ + printf("Stack version $Revision: 1.121 $\n\ Copyright (C) 2002 Mats Alritzson and Teddy Hogeborn\n\ Stack comes with ABSOLUTELY NO WARRANTY; for details type 'warranty;'.\n\ This is free software, and you are welcome to redistribute it\n\ @@ -1670,7 +1670,9 @@ extern void to(environment *env) { int ending, start, i; - value *iterator, *temp; + value *iterator, *temp, *end; + + end= new_val(env); if(env->head->type==empty || CDR(env->head)->type==empty) { printerr("Too Few Arguments"); @@ -1705,11 +1707,11 @@ if(iterator->type==empty || (CAR(iterator)->type==symb && CAR(iterator)->content.sym->id[0]=='[')) { - temp= NULL; + temp= end; toss(env); } else { /* Search for first delimiter */ - while(CDR(iterator)!=NULL + while(CDR(iterator)->type!=empty && (CAR(CDR(iterator))->type!=symb || CAR(CDR(iterator))->content.sym->id[0]!='[')) iterator= CDR(iterator); @@ -1717,9 +1719,9 @@ /* Extract list */ temp= env->head; env->head= CDR(iterator); - CDR(iterator)= NULL; + CDR(iterator)= end; - if(env->head!=NULL) + if(env->head->type!=empty) toss(env); } @@ -2451,6 +2453,13 @@ /* 1: [ [ 1 . 2 ] [ 3 . 4 ] ] => 1: [ 3 . 4 ] */ extern void assq(environment *env) { + assocgen(env, eq); +} + + +/* General assoc function */ +void assocgen(environment *env, funcp eqfunc) +{ value *key, *item; /* Needs two values on the stack, the top one must be an association @@ -2478,13 +2487,32 @@ } push_val(env, key); push_val(env, CAR(CAR(item))); - eq(env); if(env->err) return; - + eqfunc(env); if(env->err) return; + + /* Check the result of 'eqfunc' */ + if(env->head->type==empty) { + printerr("Too Few Arguments"); + env->err= 1; + return; + } + if(CAR(env->head)->type!=integer) { + printerr("Bad Argument Type"); + env->err= 2; + return; + } + if(CAR(env->head)->content.i){ - toss(env); + toss(env); if(env->err) return; break; } - toss(env); + toss(env); if(env->err) return; + + if(item->type!=tcons) { + printerr("Bad Argument Type"); + env->err= 2; + return; + } + item=CDR(item); }