};
struct builtin_func funcs[] = {
- "car", AO_LISP_LEXPR, builtin_car,
- "cdr", AO_LISP_LEXPR, builtin_cdr,
- "cons", AO_LISP_LEXPR, builtin_cons,
- "quote", AO_LISP_NLAMBDA,builtin_quote,
- "set", AO_LISP_LEXPR, builtin_set,
- "setq", AO_LISP_MACRO, builtin_setq,
- "print", AO_LISP_LEXPR, builtin_print,
- "+", AO_LISP_LEXPR, builtin_plus,
- "-", AO_LISP_LEXPR, builtin_minus,
- "*", AO_LISP_LEXPR, builtin_times,
- "/", AO_LISP_LEXPR, builtin_divide,
- "%", AO_LISP_LEXPR, builtin_mod
+ "eval", AO_LISP_FUNC_LAMBDA, builtin_eval,
+ "read", AO_LISP_FUNC_LAMBDA, builtin_read,
+ "lambda", AO_LISP_FUNC_NLAMBDA, builtin_lambda,
+ "lexpr", AO_LISP_FUNC_NLAMBDA, builtin_lexpr,
+ "nlambda", AO_LISP_FUNC_NLAMBDA, builtin_nlambda,
+ "macro", AO_LISP_FUNC_NLAMBDA, builtin_macro,
+ "car", AO_LISP_FUNC_LAMBDA, builtin_car,
+ "cdr", AO_LISP_FUNC_LAMBDA, builtin_cdr,
+ "cons", AO_LISP_FUNC_LAMBDA, builtin_cons,
+ "last", AO_LISP_FUNC_LAMBDA, builtin_last,
+ "quote", AO_LISP_FUNC_NLAMBDA, builtin_quote,
+ "set", AO_LISP_FUNC_LAMBDA, builtin_set,
+ "setq", AO_LISP_FUNC_MACRO, builtin_setq,
+ "cond", AO_LISP_FUNC_NLAMBDA, builtin_cond,
+ "progn", AO_LISP_FUNC_NLAMBDA, builtin_progn,
+ "while", AO_LISP_FUNC_NLAMBDA, builtin_while,
+ "print", AO_LISP_FUNC_LEXPR, builtin_print,
+ "patom", AO_LISP_FUNC_LEXPR, builtin_patom,
+ "+", AO_LISP_FUNC_LEXPR, builtin_plus,
+ "-", AO_LISP_FUNC_LEXPR, builtin_minus,
+ "*", AO_LISP_FUNC_LEXPR, builtin_times,
+ "/", AO_LISP_FUNC_LEXPR, builtin_divide,
+ "%", AO_LISP_FUNC_LEXPR, builtin_mod,
+ "=", AO_LISP_FUNC_LEXPR, builtin_equal,
+ "<", AO_LISP_FUNC_LEXPR, builtin_less,
+ ">", AO_LISP_FUNC_LEXPR, builtin_greater,
+ "<=", AO_LISP_FUNC_LEXPR, builtin_less_equal,
+ ">=", AO_LISP_FUNC_LEXPR, builtin_greater_equal,
+ "delay", AO_LISP_FUNC_LAMBDA, builtin_delay,
+ "led", AO_LISP_FUNC_LEXPR, builtin_led,
};
#define N_FUNC (sizeof funcs / sizeof funcs[0])
+struct ao_lisp_frame *globals;
+
+static int
+is_atom(int offset)
+{
+ struct ao_lisp_atom *a;
+
+ for (a = ao_lisp_atoms; a; a = ao_lisp_poly_atom(a->next))
+ if (((uint8_t *) a->name - ao_lisp_const) == offset)
+ return strlen(a->name);
+ return 0;
+}
+
int
main(int argc, char **argv)
{
- int f, o;
- ao_poly atom, val;
+ int f, o, i;
+ ao_poly sexpr, val;
struct ao_lisp_atom *a;
+ struct ao_lisp_builtin *b;
+ int in_atom;
+ printf("/*\n");
+ printf(" * Generated file, do not edit\n");
for (f = 0; f < N_FUNC; f++) {
- struct ao_lisp_builtin *b = ao_lisp_make_builtin(funcs[f].func, funcs[f].args);
- struct ao_lisp_atom *a = ao_lisp_atom_intern(funcs[f].name);
- a->val = ao_lisp_builtin_poly(b);
+ 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_builtin_poly(b));
}
- for (;;) {
- atom = ao_lisp_read();
- if (!atom)
- break;
- val = ao_lisp_read();
- if (!val)
- break;
- if (ao_lisp_poly_type(atom) != AO_LISP_ATOM) {
- fprintf(stderr, "input must be atom val pairs\n");
- exit(1);
- }
- ao_lisp_poly_atom(atom)->val = val;
- }
+ /* boolean constants */
+ ao_lisp_atom_set(ao_lisp_atom_poly(ao_lisp_atom_intern("nil")),
+ AO_LISP_NIL);
+ a = ao_lisp_atom_intern("t");
+ ao_lisp_atom_set(ao_lisp_atom_poly(a),
+ ao_lisp_atom_poly(a));
+
+ /* end of file value */
+ a = ao_lisp_atom_intern("eof");
+ ao_lisp_atom_set(ao_lisp_atom_poly(a),
+ ao_lisp_atom_poly(a));
+
+ ao_lisp_read_eval_print();
+
+ /* Reduce to referenced values */
+ ao_lisp_collect();
+ printf(" */\n");
- printf("/* constant objects, all referenced from atoms */\n\n");
printf("#define AO_LISP_POOL_CONST %d\n", ao_lisp_top);
printf("extern const uint8_t ao_lisp_const[AO_LISP_POOL_CONST] __attribute__((aligned(4)));\n");
printf("#define ao_builtin_atoms 0x%04x\n", ao_lisp_atom_poly(ao_lisp_atoms));
+ printf("#define ao_builtin_frame 0x%04x\n", ao_lisp_frame_poly(ao_lisp_frame_global));
for (a = ao_lisp_atoms; a; a = ao_lisp_poly_atom(a->next)) {
char *n = a->name, c;
else
printf(" ");
c = ao_lisp_const[o];
- if (' ' < c && c <= '~' && c != '\'')
+ if (!in_atom)
+ in_atom = is_atom(o);
+ if (in_atom) {
printf (" '%c',", c);
- else
+ in_atom--;
+ } else {
printf("0x%02x,", c);
+ }
}
printf("\n};\n");
printf("#endif /* AO_LISP_CONST_BITS */\n");