WIP: Hack in support for let binds

This commit is contained in:
2022-11-02 11:10:28 -04:00
parent 5dbe3c67af
commit 6c652b195c
7 changed files with 133 additions and 53 deletions

View File

@@ -3,19 +3,19 @@
#include "utility.h"
#define LISP_FUNC_0(func_name) \
static struct ucl_object *func_name##_impl(); \
struct ucl_object *func_name(struct ucl_object *args) { \
if (args->cell.car != NULL) { \
return NULL; \
} \
return func_name##_impl(); \
} \
static struct ucl_object *func_name##_impl()
#define LISP_FUNC_0(func_name, state_name) \
static struct ucl_object *func_name##_impl(); \
struct ucl_object *func_name(struct ucl_state *state, struct ucl_object *args) { \
if (args->cell.car != NULL) { \
return NULL; \
} \
return func_name##_impl(state_name); \
} \
static struct ucl_object *func_name##_impl(struct ucl_state *state)
#define LISP_FUNC_1(func_name, arg0_name) \
static struct ucl_object *func_name##_impl(struct ucl_object *arg0_name); \
struct ucl_object *func_name(struct ucl_object *args) { \
#define LISP_FUNC_1(func_name, state_name, arg0_name) \
static struct ucl_object *func_name##_impl(struct ucl_state *state, struct ucl_object *arg0_name); \
struct ucl_object *func_name(struct ucl_state *state, struct ucl_object *args) { \
struct ucl_object *len_obj = ucl_list_length(args); \
if (len_obj->type != UCL_TYPE_INT) { \
return NULL; \
@@ -24,14 +24,14 @@
return NULL; \
} \
struct ucl_object *arg0 = ucl_car(args); \
return func_name##_impl(arg0); \
return func_name##_impl(state_name, arg0); \
} \
static struct ucl_object *func_name##_impl(struct ucl_object *arg0_name)
static struct ucl_object *func_name##_impl(struct ucl_state *state, struct ucl_object *arg0_name)
// TODO: Unroll the args more efficiently, this is O(n^2)
#define LISP_FUNC_2(func_name, arg0_name, arg1_name) \
static struct ucl_object *func_name##_impl(struct ucl_object *arg0_name, struct ucl_object *arg1_name); \
struct ucl_object *func_name(struct ucl_object *args) { \
#define LISP_FUNC_2(func_name, state_name, arg0_name, arg1_name) \
static struct ucl_object *func_name##_impl(struct ucl_state *state, struct ucl_object *arg0_name, struct ucl_object *arg1_name); \
struct ucl_object *func_name(struct ucl_state *state, struct ucl_object *args) { \
struct ucl_object *len_obj = ucl_list_length(args); \
if (len_obj->type != UCL_TYPE_INT) { \
return NULL; \
@@ -41,25 +41,27 @@
} \
struct ucl_object *arg0 = ucl_list_nth(args, 0); \
struct ucl_object *arg1 = ucl_list_nth(args, 1); \
return func_name##_impl(arg0, arg1); \
return func_name##_impl(state_name, arg0, arg1); \
} \
static struct ucl_object *func_name##_impl(struct ucl_object *arg0_name, struct ucl_object *arg1_name)
static struct ucl_object *func_name##_impl(struct ucl_state *state, struct ucl_object *arg0_name, struct ucl_object *arg1_name)
struct ucl_object *ucl_builtin_error(struct ucl_object *args);
struct ucl_object *ucl_builtin_type(struct ucl_object *args);
struct ucl_object *ucl_builtin_symbol_p(struct ucl_object *args);
struct ucl_object *ucl_builtin_string_p(struct ucl_object *args);
struct ucl_object *ucl_builtin_int_p(struct ucl_object *args);
struct ucl_object *ucl_builtin_list_p(struct ucl_object *args);
struct ucl_object *ucl_builtin_error(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_type(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_symbol_p(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_string_p(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_int_p(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_list_p(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_add(struct ucl_object *args);
struct ucl_object *ucl_builtin_sub(struct ucl_object *args);
struct ucl_object *ucl_builtin_mul(struct ucl_object *args);
struct ucl_object *ucl_builtin_div(struct ucl_object *args);
struct ucl_object *ucl_builtin_mod(struct ucl_object *args);
struct ucl_object *ucl_builtin_concat(struct ucl_object *args);
struct ucl_object *ucl_builtin_add(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_sub(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_mul(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_div(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_mod(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_concat(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_now_millis_mono(struct ucl_object *args);
struct ucl_object *ucl_builtin_now_millis_mono(struct ucl_state *state, struct ucl_object *args);
struct ucl_object *ucl_builtin_let(struct ucl_state *state, struct ucl_object *args);
#endif