X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Flisp%2Fao_lisp_make_builtin;h=783ab378a95c9cfe9fbb7db599aa9d7c434938d4;hb=9dbc686ad7d3289dc0f9bcf4a973f71100e02ded;hp=5e98516c7c2b69247c5e4c411580d61c999a54a2;hpb=b3b4731fcb89cb404433f37a7704a503567c43bd;p=fw%2Faltos diff --git a/src/lisp/ao_lisp_make_builtin b/src/lisp/ao_lisp_make_builtin index 5e98516c..783ab378 100644 --- a/src/lisp/ao_lisp_make_builtin +++ b/src/lisp/ao_lisp_make_builtin @@ -3,16 +3,27 @@ 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", "macro" => "MACRO", + "f_lambda" => "F_LAMBDA", + "atom" => "atom", }; +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); @@ -21,7 +32,7 @@ read_builtin(file 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), }; } @@ -38,13 +49,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"); @@ -57,8 +71,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].c_name); + 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"); @@ -82,10 +97,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_name); - 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"); @@ -97,9 +114,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"); @@ -110,9 +128,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"); } @@ -123,13 +143,33 @@ 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++) { - printf ("\t{ .name = \"%s\", .args = AO_LISP_FUNC_%s, .func = builtin_%s },\n", - builtins[i].lisp_name, 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"); 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 \n", argv[0]); @@ -143,6 +183,7 @@ void main() { dump_funcs(builtins); dump_decls(builtins); dump_consts(builtins); + dump_atoms(builtins); } }