Files
uclisp/src/main.c
2022-11-04 22:44:17 -04:00

88 lines
3.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
#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))'