50 |
} |
} |
51 |
|
|
52 |
|
|
53 |
void printerr(environment *env, const char* in_string) |
void printerr(environment *env) |
54 |
{ |
{ |
55 |
|
char *in_string; |
56 |
|
|
57 |
|
switch(env->err) { |
58 |
|
case 0: |
59 |
|
return; |
60 |
|
case 1: |
61 |
|
in_string= "Too Few Arguments"; |
62 |
|
break; |
63 |
|
case 2: |
64 |
|
in_string= "Bad Argument Type"; |
65 |
|
break; |
66 |
|
case 3: |
67 |
|
in_string= "Unbound Variable"; |
68 |
|
break; |
69 |
|
default: |
70 |
|
in_string= "Unknown error"; |
71 |
|
break; |
72 |
|
} |
73 |
|
|
74 |
fprintf(stderr, "\"%s\":\nErr: %s\n", env->errsymb, in_string); |
fprintf(stderr, "\"%s\":\nErr: %s\n", env->errsymb, in_string); |
75 |
} |
} |
76 |
|
|
605 |
{ |
{ |
606 |
value *temp= env->head; |
value *temp= env->head; |
607 |
|
|
608 |
switch(check_args(env, unknown, unknown, empty)) { |
if(check_args(env, unknown, unknown, empty)) |
609 |
case 1: |
return printerr(env); |
|
printerr(env, "Too Few Arguments"); |
|
|
return; |
|
|
case 2: |
|
|
printerr(env, "Bad Argument Type"); |
|
|
return; |
|
|
default: |
|
|
break; |
|
|
} |
|
610 |
|
|
611 |
env->head= CDR(env->head); |
env->head= CDR(env->head); |
612 |
CDR(temp)= CDR(env->head); |
CDR(temp)= CDR(env->head); |
619 |
{ |
{ |
620 |
value *val; |
value *val; |
621 |
|
|
622 |
switch(check_args(env, symb, empty)) { |
if(check_args(env, symb, empty)) |
623 |
case 1: |
return printerr(env); |
|
printerr(env, "Too Few Arguments"); |
|
|
return; |
|
|
case 2: |
|
|
printerr(env, "Bad Argument Type"); |
|
|
return; |
|
|
default: |
|
|
break; |
|
|
} |
|
624 |
|
|
625 |
val= CAR(env->head)->content.sym->val; |
val= CAR(env->head)->content.sym->val; |
626 |
if(val == NULL){ |
if(val == NULL){ |
|
printerr(env, "Unbound Variable"); |
|
627 |
env->err= 3; |
env->err= 3; |
628 |
return; |
return printerr(env); |
629 |
} |
} |
630 |
|
|
631 |
push_val(env, val); /* Return the symbol's bound value */ |
push_val(env, val); /* Return the symbol's bound value */ |
632 |
swap(env); |
swap(env); |
633 |
if(env->err) return; |
if(env->err) return; |
648 |
|
|
649 |
gc_maybe(env); |
gc_maybe(env); |
650 |
|
|
651 |
switch(check_args(env, unknown, empty)) { |
if(check_args(env, unknown, empty)) |
652 |
case 1: |
return printerr(env); |
|
printerr(env, "Too Few Arguments"); |
|
|
return; |
|
|
case 2: |
|
|
printerr(env, "Bad Argument Type"); |
|
|
return; |
|
|
default: |
|
|
break; |
|
|
} |
|
653 |
|
|
654 |
switch(CAR(env->head)->type) { |
switch(CAR(env->head)->type) { |
655 |
/* if it's a symbol */ |
/* if it's a symbol */ |
666 |
case func: |
case func: |
667 |
in_func= CAR(env->head)->content.func; |
in_func= CAR(env->head)->content.func; |
668 |
env->head= CDR(env->head); |
env->head= CDR(env->head); |
669 |
return in_func(env); |
return in_func((void*)env); |
670 |
|
|
671 |
/* If it's a list */ |
/* If it's a list */ |
672 |
case tcons: |
case tcons: |
692 |
if (CDR(iterator)->type == empty || CDR(iterator)->type == tcons) |
if (CDR(iterator)->type == empty || CDR(iterator)->type == tcons) |
693 |
iterator= CDR(iterator); |
iterator= CDR(iterator); |
694 |
else { |
else { |
695 |
printerr(env, "Bad Argument Type"); /* Improper list */ |
env->err= 2; /* Improper list */ |
696 |
env->err= 2; |
return printerr(env); |
|
return; |
|
697 |
} |
} |
698 |
} |
} |
699 |
unprotect(temp_val); |
unprotect(temp_val); |
860 |
if(CAR(env->head)->type==empty) |
if(CAR(env->head)->type==empty) |
861 |
return; /* Don't reverse an empty list */ |
return; /* Don't reverse an empty list */ |
862 |
|
|
863 |
switch(check_args(env, tcons, empty)) { |
if(check_args(env, tcons, empty)) |
864 |
case 1: |
return printerr(env); |
|
printerr(env, "Too Few Arguments"); |
|
|
return; |
|
|
case 2: |
|
|
printerr(env, "Bad Argument Type"); |
|
|
return; |
|
|
default: |
|
|
break; |
|
|
} |
|
865 |
|
|
866 |
old_head= CAR(env->head); |
old_head= CAR(env->head); |
867 |
new_head= new_val(env); |
new_head= new_val(env); |