diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lisp/ao_lisp_error.c | 39 | ||||
| -rw-r--r-- | src/lisp/ao_lisp_eval.c | 5 | 
2 files changed, 28 insertions, 16 deletions
| diff --git a/src/lisp/ao_lisp_error.c b/src/lisp/ao_lisp_error.c index 7ad7b2b5..937739e9 100644 --- a/src/lisp/ao_lisp_error.c +++ b/src/lisp/ao_lisp_error.c @@ -16,23 +16,30 @@  #include <stdarg.h>  static void -ao_lisp_error_cons(char *name, struct ao_lisp_cons *cons) +ao_lisp_error_poly(char *name, ao_poly poly)  {  	int first = 1;  	printf("\t\t%s(", name); -	if (cons) { -		while (cons) { -			if (!first) -				printf("\t\t         "); -			else -				first = 0; -			ao_lisp_poly_print(cons->car); -			printf("\n"); -			cons = ao_lisp_poly_cons(cons->cdr); -		} -		printf("\t\t         )\n"); -	} else -		printf(")\n"); +	if (ao_lisp_poly_type(poly) == AO_LISP_CONS) { +		struct ao_lisp_cons *cons = ao_lisp_poly_cons(poly); + +		if (cons) { +			while (cons) { +				if (!first) +					printf("\t\t         "); +				else +					first = 0; +				ao_lisp_poly_print(cons->car); +				printf("\n"); +				cons = ao_lisp_poly_cons(cons->cdr); +			} +			printf("\t\t         )\n"); +		} else +			printf(")\n"); +	} else { +		ao_lisp_poly_print(poly); +		printf("\n"); +	}  }  static void tabs(int indent) @@ -87,8 +94,8 @@ ao_lisp_stack_print(void)  		printf("\t\texpr:   "); ao_lisp_poly_print(s->list); printf("\n");  		printf("\t\tstate:  %s\n", state_names[s->state]);  //		printf("\t\tmacro:  %s\n", s->macro ? "true" : "false"); -		ao_lisp_error_cons ("sexprs: ", ao_lisp_poly_cons(s->sexprs)); -		ao_lisp_error_cons ("values: ", ao_lisp_poly_cons(s->values)); +		ao_lisp_error_poly ("sexprs: ", s->sexprs); +		ao_lisp_error_poly ("values: ", s->values);  		ao_lisp_error_frame(2, "frame:  ", ao_lisp_poly_frame(s->frame));  //		ao_lisp_error_frame(2, "mframe: ", ao_lisp_poly_frame(s->macro_frame));  		printf("\t]\n"); diff --git a/src/lisp/ao_lisp_eval.c b/src/lisp/ao_lisp_eval.c index 5fa9e0ad..ef521605 100644 --- a/src/lisp/ao_lisp_eval.c +++ b/src/lisp/ao_lisp_eval.c @@ -525,6 +525,7 @@ ao_lisp_eval_while(void)  	DBGI(".. frame "); DBG_POLY(ao_lisp_frame_poly(ao_lisp_frame_current)); DBG("\n");  	DBGI(".. saved frame "); DBG_POLY(ao_lisp_stack->frame); DBG("\n"); +	ao_lisp_stack->values = ao_lisp_v;  	if (!ao_lisp_stack->sexprs) {  		ao_lisp_v = AO_LISP_NIL;  		ao_lisp_stack->state = eval_val; @@ -548,6 +549,7 @@ ao_lisp_eval_while_test(void)  	DBGI(".. saved frame "); DBG_POLY(ao_lisp_stack->frame); DBG("\n");  	if (ao_lisp_v) { +		ao_lisp_stack->values = ao_lisp_v;  		ao_lisp_v = ao_lisp_poly_cons(ao_lisp_stack->sexprs)->cdr;  		ao_lisp_stack->state = eval_while;  		if (!ao_lisp_stack_push()) @@ -556,7 +558,10 @@ ao_lisp_eval_while_test(void)  		ao_lisp_stack->sexprs = ao_lisp_v;  	}  	else +	{  		ao_lisp_stack->state = eval_val; +		ao_lisp_v = ao_lisp_stack->values; +	}  	return 1;  } | 
