88 lines
3.1 KiB
C
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))'
|