X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fscheme%2Fao_scheme_eval.c;h=9536cb91f9ac05dbbe9e3b2a42365c3d010797de;hb=16061947d4376b41e596d87f97ec53ec29d17644;hp=9204ce1a9a379743c26827e0fc3a215da2bca4b9;hpb=fbe5dc9f215e7014aa8f9d325c1fba939816be03;p=fw%2Faltos diff --git a/src/scheme/ao_scheme_eval.c b/src/scheme/ao_scheme_eval.c index 9204ce1a..9536cb91 100644 --- a/src/scheme/ao_scheme_eval.c +++ b/src/scheme/ao_scheme_eval.c @@ -206,7 +206,7 @@ ao_scheme_eval_formal(void) } /* Append formal to list of values */ - formal = ao_scheme__cons(ao_scheme_v, AO_SCHEME_NIL); + formal = ao_scheme_cons(ao_scheme_v, AO_SCHEME_NIL); if (!formal) return 0; @@ -271,8 +271,10 @@ ao_scheme_eval_exec(void) } ao_scheme_v = v; - ao_scheme_stack->values = AO_SCHEME_NIL; - ao_scheme_stack->values_tail = AO_SCHEME_NIL; + if (ao_scheme_stack->state != eval_exec) { + ao_scheme_stack->values = AO_SCHEME_NIL; + ao_scheme_stack->values_tail = AO_SCHEME_NIL; + } DBGI(".. result "); DBG_POLY(ao_scheme_v); DBG ("\n"); DBGI(".. frame "); DBG_POLY(ao_scheme_frame_poly(ao_scheme_frame_current)); DBG("\n"); break; @@ -348,7 +350,7 @@ ao_scheme_eval_cond(void) ao_scheme_stack->state = eval_val; } else { ao_scheme_v = ao_scheme_poly_cons(ao_scheme_stack->sexprs)->car; - if (!ao_scheme_v || !AO_SCHEME_IS_CONS(ao_scheme_v)) { + if (!ao_scheme_is_pair(ao_scheme_v)) { ao_scheme_error(AO_SCHEME_INVALID, "invalid cond clause"); return 0; } @@ -492,7 +494,7 @@ ao_scheme_eval_macro(void) if (ao_scheme_v == AO_SCHEME_NIL) ao_scheme_abort(); - if (AO_SCHEME_IS_CONS(ao_scheme_v)) { + if (ao_scheme_is_cons(ao_scheme_v)) { *ao_scheme_poly_cons(ao_scheme_stack->sexprs) = *ao_scheme_poly_cons(ao_scheme_v); ao_scheme_v = ao_scheme_stack->sexprs; DBGI("sexprs rewritten to: "); DBG_POLY(ao_scheme_v); DBG("\n"); @@ -530,6 +532,7 @@ const char * const ao_scheme_state_names[] = { [eval_macro] = "macro", }; +#ifdef AO_SCHEME_FEATURE_SAVE /* * Called at restore time to reset all execution state */ @@ -547,6 +550,7 @@ ao_scheme_eval_restart(void) { return ao_scheme_stack_push(); } +#endif /* AO_SCHEME_FEATURE_SAVE */ ao_poly ao_scheme_eval(ao_poly _v) @@ -559,12 +563,11 @@ ao_scheme_eval(ao_poly _v) return AO_SCHEME_NIL; while (ao_scheme_stack) { - if (!(*evals[ao_scheme_stack->state])() || ao_scheme_exception) { - ao_scheme_stack_clear(); - return AO_SCHEME_NIL; - } + if (!(*evals[ao_scheme_stack->state])() || ao_scheme_exception) + break; } DBG_DO(if (ao_scheme_frame_current) {DBGI("frame left as "); DBG_POLY(ao_scheme_frame_poly(ao_scheme_frame_current)); DBG("\n");}); + ao_scheme_stack = NULL; ao_scheme_frame_current = NULL; return ao_scheme_v; }