altos/lisp: Switch to scheme formal syntax for varargs
[fw/altos] / src / lisp / ao_lisp_make_builtin
index 5e98516c7c2b69247c5e4c411580d61c999a54a2..783ab378a95c9cfe9fbb7db599aa9d7c434938d4 100644 (file)
@@ -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 <file>\n", argv[0]);
@@ -143,6 +183,7 @@ void main() {
                dump_funcs(builtins);
                dump_decls(builtins);
                dump_consts(builtins);
+               dump_atoms(builtins);
        }
 }