summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_make_const.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-09 09:14:50 -0800
committerKeith Packard <keithp@keithp.com>2016-11-17 22:18:39 -0800
commit71796f4407ebf11251c150dfa368f571ba12db8d (patch)
tree9bdc0d22c719a5745cf8e9632c4f1dd4b316c5d0 /src/lisp/ao_lisp_make_const.c
parent9e58eeb68a293ae94e0672a31a2116fc52c9dd1e (diff)
altos/lisp: working on lexical scoping
Not working yet Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_make_const.c')
-rw-r--r--src/lisp/ao_lisp_make_const.c85
1 files changed, 42 insertions, 43 deletions
diff --git a/src/lisp/ao_lisp_make_const.c b/src/lisp/ao_lisp_make_const.c
index f2e3cea1..501052b9 100644
--- a/src/lisp/ao_lisp_make_const.c
+++ b/src/lisp/ao_lisp_make_const.c
@@ -33,34 +33,32 @@ struct builtin_func {
};
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,
- "cond", AO_LISP_NLAMBDA,builtin_cond,
- "print", AO_LISP_LEXPR, builtin_print,
- "patom", AO_LISP_LEXPR, builtin_patom,
- "+", 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,
- "=", AO_LISP_LEXPR, builtin_equal,
- "<", AO_LISP_LEXPR, builtin_less,
- ">", AO_LISP_LEXPR, builtin_greater,
- "<=", AO_LISP_LEXPR, builtin_less_equal,
- ">=", AO_LISP_LEXPR, builtin_greater_equal,
+ "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,
+ "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,
};
-ao_poly
-ao_lisp_set_cond(struct ao_lisp_cons *c)
-{
- (void) c;
- return AO_LISP_NIL;
-}
-
#define N_FUNC (sizeof funcs / sizeof funcs[0])
/* Syntactic atoms */
@@ -90,19 +88,18 @@ int
main(int argc, char **argv)
{
int f, o, i;
- ao_poly atom, val;
+ 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");
- ao_lisp_root_add(&ao_lisp_frame_type, &globals);
- globals = ao_lisp_frame_new(0);
for (f = 0; f < N_FUNC; f++) {
b = ao_lisp_make_builtin(funcs[f].func, funcs[f].args);
a = ao_lisp_atom_intern(funcs[f].name);
- globals = ao_lisp_frame_add(globals, ao_lisp_atom_poly(a), ao_lisp_builtin_poly(b));
+ ao_lisp_atom_set(ao_lisp_atom_poly(a),
+ ao_lisp_builtin_poly(b));
}
/* atoms for syntax */
@@ -110,23 +107,25 @@ main(int argc, char **argv)
(void) ao_lisp_atom_intern(atoms[i]);
/* boolean constants */
- a = ao_lisp_atom_intern("nil");
- globals = ao_lisp_frame_add(globals, ao_lisp_atom_poly(a), AO_LISP_NIL);
+ ao_lisp_atom_set(ao_lisp_atom_poly(ao_lisp_atom_intern("nil")),
+ AO_LISP_NIL);
a = ao_lisp_atom_intern("t");
- globals = ao_lisp_frame_add(globals, ao_lisp_atom_poly(a), ao_lisp_atom_poly(a));
+ ao_lisp_atom_set(ao_lisp_atom_poly(a),
+ ao_lisp_atom_poly(a));
for (;;) {
- atom = ao_lisp_read();
- if (!atom)
+ sexpr = ao_lisp_read();
+ if (!sexpr)
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");
+ printf ("sexpr: ");
+ ao_lisp_poly_print(sexpr);
+ printf("\n");
+ val = ao_lisp_eval(sexpr);
+ if (ao_lisp_exception)
exit(1);
- }
- globals = ao_lisp_frame_add(globals, atom, val);
+ printf("\t");
+ ao_lisp_poly_print(val);
+ printf("\n");
}
/* Reduce to referenced values */
@@ -136,7 +135,7 @@ main(int argc, char **argv)
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(globals));
+ 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;