summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_make_builtin
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-12-01 10:12:38 +0100
committerKeith Packard <keithp@keithp.com>2017-12-01 11:30:50 +0100
commitcd0bd9791a77868c226d285bf4d57e8c321755d5 (patch)
tree50a96028f0bfd8584663f43d8b286c5bc559e82b /src/lisp/ao_lisp_make_builtin
parent00bf2ca86b60e6501880011897cea073865c5a03 (diff)
altos/lisp: Add quasiquote
This adds read support for quasiquote syntax, and then adds a quasiquote implementation in lisp Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_make_builtin')
-rw-r--r--src/lisp/ao_lisp_make_builtin48
1 files changed, 30 insertions, 18 deletions
diff --git a/src/lisp/ao_lisp_make_builtin b/src/lisp/ao_lisp_make_builtin
index 531e388d..c4ba9d94 100644
--- a/src/lisp/ao_lisp_make_builtin
+++ b/src/lisp/ao_lisp_make_builtin
@@ -13,6 +13,7 @@ string[string] type_map = {
"macro" => "MACRO",
"f_lambda" => "F_LAMBDA",
"f_lexpr" => "F_LEXPR",
+ "atom" => "atom",
};
string[*]
@@ -50,13 +51,16 @@ read_builtins(file f) {
return builtins;
}
+bool is_atom(builtin_t b) = b.type == "atom";
+
void
dump_ids(builtin_t[*] builtins) {
printf("#ifdef AO_LISP_BUILTIN_ID\n");
printf("#undef AO_LISP_BUILTIN_ID\n");
printf("enum ao_lisp_builtin_id {\n");
for (int i = 0; i < dim(builtins); i++)
- printf("\tbuiltin_%s,\n", builtins[i].c_name);
+ if (!is_atom(builtins[i]))
+ printf("\tbuiltin_%s,\n", builtins[i].c_name);
printf("\t_builtin_last\n");
printf("};\n");
printf("#endif /* AO_LISP_BUILTIN_ID */\n");
@@ -69,8 +73,9 @@ dump_casename(builtin_t[*] builtins) {
printf("static char *ao_lisp_builtin_name(enum ao_lisp_builtin_id b) {\n");
printf("\tswitch(b) {\n");
for (int i = 0; i < dim(builtins); i++)
- printf("\tcase builtin_%s: return ao_lisp_poly_atom(_atom(\"%s\"))->name;\n",
- builtins[i].c_name, builtins[i].lisp_names[0]);
+ if (!is_atom(builtins[i]))
+ printf("\tcase builtin_%s: return ao_lisp_poly_atom(_atom(\"%s\"))->name;\n",
+ builtins[i].c_name, builtins[i].lisp_names[0]);
printf("\tdefault: return \"???\";\n");
printf("\t}\n");
printf("}\n");
@@ -94,10 +99,12 @@ dump_arrayname(builtin_t[*] builtins) {
printf("#undef AO_LISP_BUILTIN_ARRAYNAME\n");
printf("static const ao_poly builtin_names[] = {\n");
for (int i = 0; i < dim(builtins); i++) {
- printf("\t[builtin_%s] = _ao_lisp_atom_",
- builtins[i].c_name);
- cify_lisp(builtins[i].lisp_names[0]);
- printf(",\n");
+ if (!is_atom(builtins[i])) {
+ printf("\t[builtin_%s] = _ao_lisp_atom_",
+ builtins[i].c_name);
+ cify_lisp(builtins[i].lisp_names[0]);
+ printf(",\n");
+ }
}
printf("};\n");
printf("#endif /* AO_LISP_BUILTIN_ARRAYNAME */\n");
@@ -109,9 +116,10 @@ dump_funcs(builtin_t[*] builtins) {
printf("#undef AO_LISP_BUILTIN_FUNCS\n");
printf("const ao_lisp_func_t ao_lisp_builtins[] = {\n");
for (int i = 0; i < dim(builtins); i++) {
- printf("\t[builtin_%s] = ao_lisp_do_%s,\n",
- builtins[i].c_name,
- builtins[i].c_name);
+ if (!is_atom(builtins[i]))
+ printf("\t[builtin_%s] = ao_lisp_do_%s,\n",
+ builtins[i].c_name,
+ builtins[i].c_name);
}
printf("};\n");
printf("#endif /* AO_LISP_BUILTIN_FUNCS */\n");
@@ -122,9 +130,11 @@ dump_decls(builtin_t[*] builtins) {
printf("#ifdef AO_LISP_BUILTIN_DECLS\n");
printf("#undef AO_LISP_BUILTIN_DECLS\n");
for (int i = 0; i < dim(builtins); i++) {
- printf("ao_poly\n");
- printf("ao_lisp_do_%s(struct ao_lisp_cons *cons);\n",
- builtins[i].c_name);
+ if (!is_atom(builtins[i])) {
+ printf("ao_poly\n");
+ printf("ao_lisp_do_%s(struct ao_lisp_cons *cons);\n",
+ builtins[i].c_name);
+ }
}
printf("#endif /* AO_LISP_BUILTIN_DECLS */\n");
}
@@ -135,11 +145,13 @@ dump_consts(builtin_t[*] builtins) {
printf("#undef AO_LISP_BUILTIN_CONSTS\n");
printf("struct builtin_func funcs[] = {\n");
for (int i = 0; i < dim(builtins); i++) {
- for (int j = 0; j < dim(builtins[i].lisp_names); j++) {
- printf ("\t{ .name = \"%s\", .args = AO_LISP_FUNC_%s, .func = builtin_%s },\n",
- builtins[i].lisp_names[j],
- builtins[i].type,
- builtins[i].c_name);
+ if (!is_atom(builtins[i])) {
+ for (int j = 0; j < dim(builtins[i].lisp_names); j++) {
+ printf ("\t{ .name = \"%s\", .args = AO_LISP_FUNC_%s, .func = builtin_%s },\n",
+ builtins[i].lisp_names[j],
+ builtins[i].type,
+ builtins[i].c_name);
+ }
}
}
printf("};\n");