#ifndef _UCLISP_BUILTINS_H_ #define _UCLISP_BUILTINS_H_ #include "utility.h" #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, 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; \ } \ if (len_obj->integer != 1) { \ return NULL; \ } \ struct ucl_object *arg0 = ucl_car(args); \ return func_name##_impl(state_name, arg0); \ } \ 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, 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; \ } \ if (len_obj->integer != 2) { \ return NULL; \ } \ struct ucl_object *arg0 = ucl_list_nth(args, 0); \ struct ucl_object *arg1 = ucl_list_nth(args, 1); \ return func_name##_impl(state_name, arg0, arg1); \ } \ 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_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_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_state *state, struct ucl_object *args); struct ucl_object *ucl_builtin_let(struct ucl_state *state, struct ucl_object *args); struct ucl_object *ucl_builtin_list(struct ucl_state *state, struct ucl_object *args); struct ucl_object *ucl_builtin_print(struct ucl_state *state, struct ucl_object *args); #endif