* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-#define DBG_EVAL 0
#include "ao_lisp.h"
int
};
void
-ao_lisp_lambda_print(ao_poly poly)
+ao_lisp_lambda_write(ao_poly poly)
{
struct ao_lisp_lambda *lambda = ao_lisp_poly_lambda(poly);
struct ao_lisp_cons *cons = ao_lisp_poly_cons(lambda->code);
printf("%s", ao_lisp_args_name(lambda->args));
while (cons) {
printf(" ");
- ao_lisp_poly_print(cons->car);
+ ao_lisp_poly_write(cons->car);
cons = ao_lisp_poly_cons(cons->cdr);
}
printf(")");
if (!lambda)
return AO_LISP_NIL;
- if (!ao_lisp_check_argc(_ao_lisp_atom_lambda, code, 2, 2))
- return AO_LISP_NIL;
if (!ao_lisp_check_argt(_ao_lisp_atom_lambda, code, 0, AO_LISP_CONS, 1))
return AO_LISP_NIL;
f = 0;
}
ao_poly
-ao_lisp_lambda(struct ao_lisp_cons *cons)
+ao_lisp_do_lambda(struct ao_lisp_cons *cons)
{
return ao_lisp_lambda_alloc(cons, AO_LISP_FUNC_LAMBDA);
}
ao_poly
-ao_lisp_lexpr(struct ao_lisp_cons *cons)
+ao_lisp_do_lexpr(struct ao_lisp_cons *cons)
{
return ao_lisp_lambda_alloc(cons, AO_LISP_FUNC_LEXPR);
}
ao_poly
-ao_lisp_nlambda(struct ao_lisp_cons *cons)
+ao_lisp_do_nlambda(struct ao_lisp_cons *cons)
{
return ao_lisp_lambda_alloc(cons, AO_LISP_FUNC_NLAMBDA);
}
ao_poly
-ao_lisp_macro(struct ao_lisp_cons *cons)
+ao_lisp_do_macro(struct ao_lisp_cons *cons)
{
return ao_lisp_lambda_alloc(cons, AO_LISP_FUNC_MACRO);
}
int args_wanted;
int args_provided;
int f;
- struct ao_lisp_cons *vals
+ struct ao_lisp_cons *vals;
DBGI("lambda "); DBG_POLY(ao_lisp_lambda_poly(lambda)); DBG("\n");
args = ao_lisp_poly_cons(ao_lisp_arg(code, 0));
vals = ao_lisp_poly_cons(cons->cdr);
+ next_frame->prev = lambda->frame;
+ ao_lisp_frame_current = next_frame;
+ ao_lisp_stack->frame = ao_lisp_frame_poly(ao_lisp_frame_current);
+
switch (lambda->args) {
case AO_LISP_FUNC_LAMBDA:
for (f = 0; f < args_wanted; f++) {
DBGI("bind "); DBG_POLY(args->car); DBG(" = "); DBG_POLY(vals->car); DBG("\n");
- next_frame->vals[f].atom = args->car;
- next_frame->vals[f].val = vals->car;
+ ao_lisp_frame_bind(next_frame, f, args->car, vals->car);
args = ao_lisp_poly_cons(args->cdr);
vals = ao_lisp_poly_cons(vals->cdr);
}
- ao_lisp_cons_free(cons);
+ if (!ao_lisp_stack_marked(ao_lisp_stack))
+ ao_lisp_cons_free(cons);
+ cons = NULL;
break;
case AO_LISP_FUNC_LEXPR:
case AO_LISP_FUNC_NLAMBDA:
case AO_LISP_FUNC_MACRO:
for (f = 0; f < args_wanted - 1; f++) {
DBGI("bind "); DBG_POLY(args->car); DBG(" = "); DBG_POLY(vals->car); DBG("\n");
- next_frame->vals[f].atom = args->car;
- next_frame->vals[f].val = vals->car;
+ ao_lisp_frame_bind(next_frame, f, args->car, vals->car);
args = ao_lisp_poly_cons(args->cdr);
vals = ao_lisp_poly_cons(vals->cdr);
}
- DBGI("bind "); DBG_POLY(args->car); DBG(" = "); DBG_POLY(); DBG("\n");
- next_frame->vals[f].atom = args->car;
- next_frame->vals[f].val = ao_lisp_cons_poly(vals);
+ DBGI("bind "); DBG_POLY(args->car); DBG(" = "); DBG_POLY(ao_lisp_cons_poly(vals)); DBG("\n");
+ ao_lisp_frame_bind(next_frame, f, args->car, ao_lisp_cons_poly(vals));
+ break;
+ default:
break;
}
- next_frame->prev = lambda->frame;
DBGI("eval frame: "); DBG_POLY(ao_lisp_frame_poly(next_frame)); DBG("\n");
- ao_lisp_frame_current = next_frame;
- ao_lisp_stack->frame = ao_lisp_frame_poly(ao_lisp_frame_current);
DBG_STACK();
- return ao_lisp_arg(code, 1);
+ DBGI("eval code: "); DBG_POLY(code->cdr); DBG("\n");
+ return code->cdr;
}