From 4dab281b1f278155462d07c4679849fe73fdfa1d Mon Sep 17 00:00:00 2001 From: Max Regan Date: Fri, 4 Nov 2022 09:34:39 -0400 Subject: [PATCH] Add setq special form --- src/evaluate.c | 2 +- src/main.c | 1 + src/special.c | 14 ++++++++++++++ src/special.h | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/evaluate.c b/src/evaluate.c index c0fbd0c..7c478db 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -10,7 +10,7 @@ #include struct ucl_object *ucl_evaluate_builtin_form(struct ucl_state *state, struct ucl_object *list) { - // TODO: Recursively eval args + // TODO: Reasonably split builtin and non-builtin evaluation struct ucl_object *evaluated_list = ucl_nil_create(); FOREACH_LIST(list, iter, item) { diff --git a/src/main.c b/src/main.c index 66c7bde..8af9982 100644 --- a/src/main.c +++ b/src/main.c @@ -16,6 +16,7 @@ int main(int argc, const char **argv) { ucl_state_put(state, "let", ucl_special_create(ucl_special_let)); ucl_state_put(state, "if", ucl_special_create(ucl_special_if)); ucl_state_put(state, "defun", ucl_special_create(ucl_special_defun)); + ucl_state_put(state, "setq", ucl_special_create(ucl_special_setq)); ucl_state_put(state, "print", ucl_builtin_create(ucl_builtin_print)); ucl_state_put(state, "list", ucl_builtin_create(ucl_builtin_list)); diff --git a/src/special.c b/src/special.c index 1c5c9c7..046f55e 100644 --- a/src/special.c +++ b/src/special.c @@ -76,3 +76,17 @@ struct ucl_object *ucl_special_defun(struct ucl_state *state, struct ucl_object return fun_sym; } + +struct ucl_object *ucl_special_setq(struct ucl_state *state, struct ucl_object *args) { + // TODO: Check arguments + struct ucl_object *sym = ucl_car(args); + if (sym->type != UCL_TYPE_SYMBOL) { + return ucl_error_create("First argument to defun must be a symbol"); + } + + struct ucl_object *value = ucl_evaluate(state, ucl_list_nth(args, 1)); + + ucl_state_put(ucl_state_get_root(state), sym->symbol, value); + + return sym; +} diff --git a/src/special.h b/src/special.h index 6d049a3..b88cd55 100644 --- a/src/special.h +++ b/src/special.h @@ -6,5 +6,6 @@ struct ucl_object *ucl_special_let(struct ucl_state *state, struct ucl_object *args); struct ucl_object *ucl_special_if(struct ucl_state *state, struct ucl_object *args); struct ucl_object *ucl_special_defun(struct ucl_state *state, struct ucl_object *args); +struct ucl_object *ucl_special_setq(struct ucl_state *state, struct ucl_object *args); #endif