diff options
author | Keith Packard <keithp@keithp.com> | 2017-11-16 18:46:03 -0800 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2017-11-16 18:46:03 -0800 |
commit | 2e58b6c380bc6440490c47650fbf11d45b3f2e72 (patch) | |
tree | fa7711cbb8e94e7bb486395cc8af5a3015c093c5 /src/lisp/ao_lisp_make_builtin | |
parent | 0ced351c8f4449f7086b04e42c822d649f040d1f (diff) |
altos/lisp: More schemisms
Add 'if'.
setq -> set!, but doesn't define new variables
def -> define
Add pair? and list?
Add eq? and eqv? as aliases for =
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_builtin | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/lisp/ao_lisp_make_builtin b/src/lisp/ao_lisp_make_builtin index 5e98516c..b7b17cf4 100644 --- a/src/lisp/ao_lisp_make_builtin +++ b/src/lisp/ao_lisp_make_builtin @@ -3,7 +3,7 @@ typedef struct { string type; string c_name; - string lisp_name; + string[*] lisp_names; } builtin_t; string[string] type_map = { @@ -13,6 +13,16 @@ string[string] type_map = { "macro" => "MACRO", }; +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 +31,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), }; } @@ -84,7 +94,7 @@ dump_arrayname(builtin_t[*] builtins) { 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"); @@ -123,8 +133,10 @@ 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); + 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"); |