From d965ca142dc878775bb1424986c7884f67e7b5b8 Mon Sep 17 00:00:00 2001 From: Max Regan Date: Fri, 25 Nov 2022 21:59:10 -0500 Subject: [PATCH] Minor restructure for platformio compatibility --- SConstruct | 5 +++-- {src => examples/repl}/main.c | 6 ++---- library.json | 26 ++++++++++++++++++++++++++ src/builtins.c | 3 +-- src/evaluate.c | 1 + src/lisp.h | 3 +++ src/parse.c | 5 +++-- src/utility.h | 4 ++-- 8 files changed, 41 insertions(+), 12 deletions(-) rename {src => examples/repl}/main.c (91%) create mode 100644 library.json diff --git a/SConstruct b/SConstruct index 00b3842..665b533 100644 --- a/SConstruct +++ b/SConstruct @@ -7,7 +7,7 @@ from dataclasses import dataclass # File lists # -PROGRAM_SOURCES = ["src/main.c"] +PROGRAM_SOURCES = ["examples/repl/main.c"] LIB_SRCS = [ "src/arena.c", "src/builtins.c", @@ -67,7 +67,8 @@ class BuildVariant: repl_env = self.env.Clone() repl_env.Append(LIBS=[self.static_lib]) self.repl_program = repl_env.Program( - self.built("uclisp"), pgm_objs, + self.built("uclisp"), + pgm_objs, ) def configure_tests(self): diff --git a/src/main.c b/examples/repl/main.c similarity index 91% rename from src/main.c rename to examples/repl/main.c index 01cdd78..ddbf535 100644 --- a/src/main.c +++ b/examples/repl/main.c @@ -51,10 +51,8 @@ int main(int argc, const char **argv) { struct ucl_object *sexp = ucl_parse(ucl, argv[1]); struct ucl_object *result = ucl_evaluate(ucl, ucl_car(ucl, sexp)); - if (result->type == UCL_TYPE_ERROR) { - printf("%s", result->error); - return -1; - } + ucl_print_obj(result); + printf("\n"); return 0; } diff --git a/library.json b/library.json new file mode 100644 index 0000000..9d887e3 --- /dev/null +++ b/library.json @@ -0,0 +1,26 @@ +{ + "name": "ucLISP", + "version": "0.1.0", + "description": "A toy LISP implementation for microcontrollers", + "keywords": "lisp, language, scripting, garbage collector", + "repository": + { + "type": "git", + "url": "https://gitlab.maxregan.me/max/uclisp.git" + }, + "authors": + [ + { + "name": "Max Regan", + "email": "mgregan2@gmail.com", + "url": "https://www.gitlab.maxregan.me/max", + "maintainer": true + } + ], + "license": "MIT", + "homepage": "https://gitlab.maxregan.me/max/uclisp", + "dependencies": { + }, + "frameworks": "*", + "platforms": "*" +} diff --git a/src/builtins.c b/src/builtins.c index 64ca283..0f4b7df 100644 --- a/src/builtins.c +++ b/src/builtins.c @@ -272,8 +272,7 @@ LISP_FUNC_2(ucl_builtin_append, state, scope, list, elem) { return list; } -// TODO: publicize -static void ucl_add_builtin(struct ucl* ucl, const char *name, ucl_lisp fun) { +void ucl_add_builtin(struct ucl* ucl, const char *name, ucl_lisp fun) { ucl_scope_put(ucl, ucl->global_scope, name, ucl_builtin_create(ucl, fun)); } diff --git a/src/evaluate.c b/src/evaluate.c index 4e3fe2f..938ff22 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -68,6 +68,7 @@ struct ucl_object *ucl_evaluate_list(struct ucl* state, struct ucl_scope *scope, return ucl_evaluate_builtin_form(state, scope, list); } else { assert(0); + UCL_COND_OR_RET_ERROR(false, "Unreachable error in ucl_evaluate_list"); } } diff --git a/src/lisp.h b/src/lisp.h index 1bcacf3..659f433 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -5,6 +5,9 @@ #define UNUSED __attribute__((unused)) +void ucl_add_builtin(struct ucl *state, const char *name, ucl_lisp fun); +void ucl_add_special(struct ucl *state, const char *name, ucl_lisp fun); + #define LISP_FUNC_0(func_name, ucl_name, scope_name) \ static struct ucl_object *func_name##_impl(struct ucl* ucl, struct ucl_scope *scope); \ struct ucl_object *func_name(struct ucl* ucl, struct ucl_scope *scope, struct ucl_object *args) { \ diff --git a/src/parse.c b/src/parse.c index 738f725..0b4cf10 100644 --- a/src/parse.c +++ b/src/parse.c @@ -90,10 +90,11 @@ struct ucl_object *ucl_token_next(struct ucl* state, const char **curr_src) { goto symbol_case; } - *curr_src = end; if (!ucl_is_delimiter(*end)) { - return ucl_error_create(state, "Integer value contained non-digits"); + goto symbol_case; + //return ucl_error_create(state, "Integer value contained non-digits"); } + *curr_src = end; return ucl_int_create(state, value); } default: diff --git a/src/utility.h b/src/utility.h index 2dbdbfb..d3ee0cf 100644 --- a/src/utility.h +++ b/src/utility.h @@ -23,9 +23,9 @@ struct ucl_object *ucl_progn(struct ucl* state, struct ucl_scope *scope, struct void ucl_print_obj(struct ucl_object *obj); +struct ucl_object* ucl_evaluate_in_scope(struct ucl *state, struct ucl_scope *scope, struct ucl_object* sexp); + void ucl_add_builtins(struct ucl *state); void ucl_add_specials(struct ucl *state); -struct ucl_object* ucl_evaluate_in_scope(struct ucl *state, struct ucl_scope *scope, struct ucl_object* sexp); - #endif