From bf37c22c6cdd4a90117bdc809e5c063a079082ad Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 7 Jan 2018 23:05:02 -0800 Subject: [PATCH] altos/scheme: Allow individual lisp keywords to be feature-conditional This lets us build a smaller lisp that is just missing some aliases for existing functionality to save rom space. Signed-off-by: Keith Packard --- src/scheme/ao_scheme_builtin.txt | 4 +-- src/scheme/ao_scheme_make_builtin | 51 ++++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/scheme/ao_scheme_builtin.txt b/src/scheme/ao_scheme_builtin.txt index 8f9a6381..fd29d607 100644 --- a/src/scheme/ao_scheme_builtin.txt +++ b/src/scheme/ao_scheme_builtin.txt @@ -49,8 +49,8 @@ all f_lambda nullp null? all f_lambda not all f_lambda listp list? all f_lambda pairp pair? -all f_lambda integerp integer? exact? exact-integer? -all f_lambda numberp number? real? +all f_lambda integerp integer? exact?@BIGINT exact-integer?@BIGINT +all f_lambda numberp number? real?@FLOAT all f_lambda booleanp boolean? all f_lambda set_car set-car! all f_lambda set_cdr set-cdr! diff --git a/src/scheme/ao_scheme_make_builtin b/src/scheme/ao_scheme_make_builtin index 5b76944f..a34affce 100644 --- a/src/scheme/ao_scheme_make_builtin +++ b/src/scheme/ao_scheme_make_builtin @@ -1,10 +1,15 @@ #!/usr/bin/nickle +typedef struct { + string name; + string feature; +} lisp_name_t; + typedef struct { string feature; string type; string c_name; - string[*] lisp_names; + lisp_name_t[*] lisp_names; } builtin_t; string[string] type_map = { @@ -16,14 +21,26 @@ string[string] type_map = { "feature" => "feature", }; -string[*] +lisp_name_t +make_one_lisp(string token) +{ + string[*] bits = String::split(token, "@"); + string name = bits[0]; + string feature = "all"; + + if (dim(bits) > 1) + feature = bits[1]; + return (lisp_name_t) {.name = name, .feature = feature }; +} + +lisp_name_t[*] make_lisp(string[*] tokens) { - string[...] lisp = {}; + lisp_name_t[...] lisp = {}; if (dim(tokens) < 4) - return (string[1]) { tokens[dim(tokens) - 1] }; - return (string[dim(tokens)-3]) { [i] = tokens[i+3] }; + return (lisp_name_t[1]) { make_one_lisp(tokens[dim(tokens) - 1]) }; + return (lisp_name_t[dim(tokens)-3]) { [i] = make_one_lisp(tokens[i+3]) }; } builtin_t @@ -98,7 +115,7 @@ dump_casename(builtin_t[*] builtins) { if (is_func(builtins[i])) { dump_ifdef(builtins[i]); printf("\tcase builtin_%s: return ao_scheme_poly_atom(_atom(\"%s\"))->name;\n", - builtins[i].c_name, builtins[i].lisp_names[0]); + builtins[i].c_name, builtins[i].lisp_names[0].name); dump_endif(builtins[i]); } printf("\tdefault: return (char *) \"???\";\n"); @@ -128,7 +145,7 @@ dump_arrayname(builtin_t[*] builtins) { dump_ifdef(builtins[i]); printf("\t[builtin_%s] = _ao_scheme_atom_", builtins[i].c_name); - cify_lisp(builtins[i].lisp_names[0]); + cify_lisp(builtins[i].lisp_names[0].name); printf(",\n"); dump_endif(builtins[i]); } @@ -180,9 +197,12 @@ dump_consts(builtin_t[*] builtins) { if (is_func(builtins[i])) { dump_ifdef(builtins[i]); for (int j = 0; j < dim(builtins[i].lisp_names); j++) { + string feature = builtins[i].feature; + if (builtins[i].lisp_names[j].feature != "all") + feature = builtins[i].lisp_names[j].feature; printf ("\t{ .feature = \"%s\", .name = \"%s\", .args = AO_SCHEME_FUNC_%s, .func = builtin_%s },\n", - builtins[i].feature, - builtins[i].lisp_names[j], + feature, + builtins[i].lisp_names[j].name, builtins[i].type, builtins[i].c_name); } @@ -201,8 +221,8 @@ dump_atoms(builtin_t[*] builtins) { if (!is_feature(builtins[i])) { for (int j = 0; j < dim(builtins[i].lisp_names); j++) { printf("#define _ao_scheme_atom_"); - cify_lisp(builtins[i].lisp_names[j]); - printf(" _atom(\"%s\")\n", builtins[i].lisp_names[j]); + cify_lisp(builtins[i].lisp_names[j].name); + printf(" _atom(\"%s\")\n", builtins[i].lisp_names[j].name); } } } @@ -217,9 +237,12 @@ dump_atom_names(builtin_t[*] builtins) { for (int i = 0; i < dim(builtins); i++) { if (is_atom(builtins[i])) { for (int j = 0; j < dim(builtins[i].lisp_names); j++) { + string feature = builtins[i].feature; + if (builtins[i].lisp_names[j].feature != "all") + feature = builtins[i].lisp_names[j].feature; printf("\t{ .feature = \"%s\", .name = \"%s\" },\n", - builtins[i].feature, - builtins[i].lisp_names[j]); + feature, + builtins[i].lisp_names[j].name); } } } @@ -235,7 +258,7 @@ dump_syntax_atoms(builtin_t[*] builtins) { for (int i = 0; i < dim(builtins); i++) { if (is_atom(builtins[i])) { for (int j = 0; j < dim(builtins[i].lisp_names); j++) { - printf("\t\"%s\",\n", builtins[i].lisp_names[j]); + printf("\t\"%s\",\n", builtins[i].lisp_names[j].name); } } } -- 2.30.2