typedef struct {
string type;
string c_name;
- string lisp_name;
+ string[*] lisp_names;
} builtin_t;
string[string] type_map = {
- "lambda" => "F_LAMBDA",
+ "lambda" => "LAMBDA",
"nlambda" => "NLAMBDA",
- "lexpr" => "F_LEXPR",
+ "lexpr" => "LEXPR",
"macro" => "MACRO",
+ "f_lambda" => "F_LAMBDA",
+ "f_lexpr" => "F_LEXPR",
};
+string[*]
+make_lisp(string[*] tokens)
+{
+ string[...] lisp = {};
+
+ if (dim(tokens) < 3)
+ return (string[1]) { tokens[dim(tokens) - 1] };
+ return (string[dim(tokens)-2]) { [i] = tokens[i+2] };
+}
+
builtin_t
read_builtin(file f) {
string line = File::fgets(f);
return (builtin_t) {
.type = dim(tokens) > 0 ? type_map[tokens[0]] : "#",
.c_name = dim(tokens) > 1 ? tokens[1] : "#",
- .lisp_name = dim(tokens) > 2 ? tokens[2] : tokens[1]
+ .lisp_names = make_lisp(tokens),
};
}
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].c_name);
+ 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");
for (int i = 0; i < dim(builtins); i++) {
printf("\t[builtin_%s] = _ao_lisp_atom_",
builtins[i].c_name);
- cify_lisp(builtins[i].lisp_name);
+ cify_lisp(builtins[i].lisp_names[0]);
printf(",\n");
}
printf("};\n");
printf("#undef AO_LISP_BUILTIN_CONSTS\n");
printf("struct builtin_func funcs[] = {\n");
for (int i = 0; i < dim(builtins); i++) {
- printf ("\t{ .name = \"%s\", .args = AO_LISP_FUNC_%s, .func = builtin_%s },\n",
- builtins[i].lisp_name, builtins[i].type, builtins[i].c_name);
+ 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");
printf("#endif /* AO_LISP_BUILTIN_CONSTS */\n");
}
+void
+dump_atoms(builtin_t[*] builtins) {
+ printf("#ifdef AO_LISP_BUILTIN_ATOMS\n");
+ printf("#undef AO_LISP_BUILTIN_ATOMS\n");
+ for (int i = 0; i < dim(builtins); i++) {
+ for (int j = 0; j < dim(builtins[i].lisp_names); j++) {
+ printf("#define _ao_lisp_atom_");
+ cify_lisp(builtins[i].lisp_names[j]);
+ printf(" _atom(\"%s\")\n", builtins[i].lisp_names[j]);
+ }
+ }
+ printf("#endif /* AO_LISP_BUILTIN_ATOMS */\n");
+}
+
void main() {
if (dim(argv) < 2) {
File::fprintf(stderr, "usage: %s <file>\n", argv[0]);
dump_funcs(builtins);
dump_decls(builtins);
dump_consts(builtins);
+ dump_atoms(builtins);
}
}