struct builtin_func {
char *name;
int args;
- int func;
+ enum ao_lisp_builtin_id func;
};
#define AO_LISP_BUILTIN_CONSTS
ao_poly
ao_macro_test_get(ao_poly atom)
{
- ao_poly *ref = ao_lisp_atom_ref(ao_lisp_frame_global, atom);
+ ao_poly *ref = ao_lisp_atom_ref(atom);
if (ref)
return *ref;
return AO_LISP_NIL;
struct ao_lisp_lambda *lambda;
ao_poly ret;
- MACRO_DEBUG(indent(); printf ("is macro "); ao_lisp_poly_print(p); printf("\n"); ++macro_scan_depth);
+ MACRO_DEBUG(indent(); printf ("is macro "); ao_lisp_poly_write(p); printf("\n"); ++macro_scan_depth);
switch (ao_lisp_poly_type(p)) {
case AO_LISP_ATOM:
if (ao_lisp_macro_push(p))
ret = AO_LISP_NIL;
break;
}
- MACRO_DEBUG(--macro_scan_depth; indent(); printf ("... "); ao_lisp_poly_print(ret); printf("\n"));
+ MACRO_DEBUG(--macro_scan_depth; indent(); printf ("... "); ao_lisp_poly_write(ret); printf("\n"));
return ret;
}
if (p == AO_LISP_NIL)
return AO_LISP_NIL;
- MACRO_DEBUG(indent(); printf("has macro "); ao_lisp_poly_print(p); printf("\n"); ++macro_scan_depth);
+ MACRO_DEBUG(indent(); printf("has macro "); ao_lisp_poly_write(p); printf("\n"); ++macro_scan_depth);
switch (ao_lisp_poly_type(p)) {
case AO_LISP_LAMBDA:
lambda = ao_lisp_poly_lambda(p);
p = AO_LISP_NIL;
break;
}
- MACRO_DEBUG(--macro_scan_depth; indent(); printf("... "); ao_lisp_poly_print(p); printf("\n"));
+ MACRO_DEBUG(--macro_scan_depth; indent(); printf("... "); ao_lisp_poly_write(p); printf("\n"));
return p;
}
out = ao_lisp_eval(in);
if (ao_lisp_exception)
return 0;
- ao_lisp_poly_print(out);
+ ao_lisp_poly_write(out);
putchar ('\n');
}
return 1;
int in_atom = 0;
char *out_name = NULL;
int c;
+ enum ao_lisp_builtin_id prev_func;
in = stdin;
out = stdout;
}
}
+ ao_lisp_frame_init();
+
/* Boolean values #f and #t */
ao_lisp_bool_get(0);
ao_lisp_bool_get(1);
+ prev_func = _builtin_last;
for (f = 0; f < (int) N_FUNC; f++) {
- b = ao_lisp_make_builtin(funcs[f].func, funcs[f].args);
+ if (funcs[f].func != prev_func)
+ b = ao_lisp_make_builtin(funcs[f].func, funcs[f].args);
a = ao_lisp_atom_intern(funcs[f].name);
- ao_lisp_atom_set(ao_lisp_atom_poly(a),
+ ao_lisp_atom_def(ao_lisp_atom_poly(a),
ao_lisp_builtin_poly(b));
}
/* end of file value */
a = ao_lisp_atom_intern("eof");
- ao_lisp_atom_set(ao_lisp_atom_poly(a),
+ ao_lisp_atom_def(ao_lisp_atom_poly(a),
ao_lisp_atom_poly(a));
/* 'else' */
ao_lisp_collect(AO_LISP_COLLECT_FULL);
for (f = 0; f < ao_lisp_frame_global->num; f++) {
- val = ao_has_macro(ao_lisp_frame_global->vals[f].val);
+ struct ao_lisp_frame_vals *vals = ao_lisp_poly_frame_vals(ao_lisp_frame_global->vals);
+ val = ao_has_macro(vals->vals[f].val);
if (val != AO_LISP_NIL) {
printf("error: function %s contains unresolved macro: ",
- ao_lisp_poly_atom(ao_lisp_frame_global->vals[f].atom)->name);
- ao_lisp_poly_print(val);
+ ao_lisp_poly_atom(vals->vals[f].atom)->name);
+ ao_lisp_poly_write(val);
printf("\n");
exit(1);
}