From 2344a7d498db24c1997c032ffa7a6a725e52adba Mon Sep 17 00:00:00 2001 From: Max Regan Date: Fri, 4 Nov 2022 21:51:25 -0400 Subject: [PATCH] Add lambda special form --- src/main.c | 3 ++- src/special.c | 14 +++++++++++++- src/special.h | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index e41122e..29c84fc 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, "lambda", ucl_special_create(ucl_special_lambda)); ucl_state_put(state, "setq", ucl_special_create(ucl_special_setq)); ucl_state_put(state, "progn", ucl_special_create(ucl_special_progn)); @@ -23,7 +24,6 @@ int main(int argc, const char **argv) { // - progn // - quote // - iteration - // - lambda ucl_state_put(state, "print", ucl_builtin_create(ucl_builtin_print)); ucl_state_put(state, "list", ucl_builtin_create(ucl_builtin_list)); @@ -55,6 +55,7 @@ int main(int argc, const char **argv) { // - car // - cdr // - nth + // - booleans (e.g. not) if (argc < 2) { while (1) { diff --git a/src/special.c b/src/special.c index 2c68347..d5c1e7b 100644 --- a/src/special.c +++ b/src/special.c @@ -71,12 +71,24 @@ struct ucl_object *ucl_special_defun(struct ucl_state *state, struct ucl_object } +struct ucl_object *ucl_special_lambda(struct ucl_state *state, struct ucl_object *args) { + // TODO: Check arguments + struct ucl_object *fun_args = ucl_list_nth(args, 0); + if (fun_args->type != UCL_TYPE_CELL) { + // TODO: Check that the list contains only symbols + return ucl_error_create("First argument to lambda must be a list of symbols"); + } + + return args; +} + + struct ucl_object *ucl_special_setq(struct ucl_state *state, struct ucl_object *args) { // TODO: Check arguments struct ucl_object *sym = ucl_car(args); struct ucl_state *root_state = ucl_state_get_root(state); if (sym->type != UCL_TYPE_SYMBOL) { - return ucl_error_create("First argument to defun must be a symbol"); + return ucl_error_create("First argument to setq must be a symbol"); } struct ucl_object *value = ucl_evaluate(state, ucl_list_nth(args, 1)); diff --git a/src/special.h b/src/special.h index 4b268b1..2c80359 100644 --- a/src/special.h +++ b/src/special.h @@ -6,6 +6,7 @@ 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_lambda(struct ucl_state *state, struct ucl_object *args); struct ucl_object *ucl_special_setq(struct ucl_state *state, struct ucl_object *args); struct ucl_object *ucl_special_progn(struct ucl_state *state, struct ucl_object *args);