#include #include #include "uclisp.h" #include "builtins.h" #include "internal.h" #include "special.h" #include "state.h" #include "utility.h" int main(int argc, const char **argv) { (void) argc, (void) argv; struct ucl_state *state = ucl_state_create(); 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)); ucl_state_put(state, "quote", ucl_special_create(ucl_special_quote)); // TODO: // - iteration ucl_state_put(state, "print", ucl_builtin_create(ucl_builtin_print)); ucl_state_put(state, "printl", ucl_builtin_create(ucl_builtin_printl)); ucl_state_put(state, "list", ucl_builtin_create(ucl_builtin_list)); // TODO: // - object -> string // - formatted printing? ucl_state_put(state, "+", ucl_builtin_create(ucl_builtin_add)); ucl_state_put(state, "-", ucl_builtin_create(ucl_builtin_sub)); ucl_state_put(state, "*", ucl_builtin_create(ucl_builtin_mul)); ucl_state_put(state, "/", ucl_builtin_create(ucl_builtin_div)); ucl_state_put(state, "%", ucl_builtin_create(ucl_builtin_mod)); // TODO: // - Floats or nah? ucl_state_put(state, "concat", ucl_builtin_create(ucl_builtin_concat)); ucl_state_put(state, "error", ucl_builtin_create(ucl_builtin_error)); ucl_state_put(state, "type", ucl_builtin_create(ucl_builtin_type)); ucl_state_put(state, "symbol-p", ucl_builtin_create(ucl_builtin_symbol_p)); ucl_state_put(state, "string-p", ucl_builtin_create(ucl_builtin_string_p)); ucl_state_put(state, "int-p", ucl_builtin_create(ucl_builtin_int_p)); ucl_state_put(state, "list-p", ucl_builtin_create(ucl_builtin_list_p)); ucl_state_put(state, "car", ucl_builtin_create(ucl_builtin_car)); ucl_state_put(state, "cdr", ucl_builtin_create(ucl_builtin_cdr)); ucl_state_put(state, "nth", ucl_builtin_create(ucl_builtin_nth)); // TODO: // - equality // - map // - reduce // - booleans (e.g. not) if (argc < 2) { while (1) { printf("> "); char *line = NULL; size_t len = 0; ssize_t lineSize = 0; lineSize = getline(&line, &len, stdin); struct ucl_object *sexp = ucl_parse(line); struct ucl_object *result = ucl_evaluate(state, ucl_car(sexp)); ucl_print_obj(result); printf("\n"); free(line); } } else { struct ucl_object *sexp = ucl_parse(argv[1]); struct ucl_object *result = ucl_evaluate(state, ucl_car(sexp)); if (result->type == UCL_TYPE_ERROR) { printf("%s", result->error); return -1; } return 0; } } // '(let (()) (defun foo (a b) (+ a b)) (foo 1 2))'