5 #include "interpreter.h"
9 #define REPL_BUFFER_MAX 1024
11 static struct EvalResult gc_inspect_adapter(void *param, Gc *gc, struct Scope *scope, struct Expr args)
20 return eval_success(NIL(gc));
23 static struct EvalResult quit(void *param, Gc *gc, struct Scope *scope, struct Expr args)
32 return eval_success(NIL(gc));
35 static struct EvalResult get_scope(void *param, Gc *gc, struct Scope *scope, struct Expr args)
42 return eval_success(scope->expr);
45 static void eval_line(Gc *gc, Scope *scope, const char *line)
47 /* TODO: eval_line could've been implemented with read_all_exprs_from_string */
49 gc_collect(gc, scope->expr);
51 struct ParseResult parse_result = read_expr_from_string(gc, line);
52 if (parse_result.is_error) {
53 print_parse_error(stderr, line, parse_result);
57 struct EvalResult eval_result = eval(gc, scope, parse_result.expr);
58 if (eval_result.is_error) {
59 fprintf(stderr, "Error:\t");
60 print_expr_as_sexpr(stderr, eval_result.expr);
61 fprintf(stderr, "\n");
65 print_expr_as_sexpr(stderr, eval_result.expr);
66 fprintf(stdout, "\n");
68 line = next_token(parse_result.end).begin;
72 int main(int argc, char *argv[])
77 char buffer[REPL_BUFFER_MAX + 1];
80 struct Scope scope = {
81 .expr = CONS(gc, NIL(gc), NIL(gc))
84 set_scope_value(gc, &scope, SYMBOL(gc, "quit"), NATIVE(gc, quit, NULL));
85 set_scope_value(gc, &scope, SYMBOL(gc, "gc-inspect"), NATIVE(gc, gc_inspect_adapter, NULL));
86 set_scope_value(gc, &scope, SYMBOL(gc, "scope"), NATIVE(gc, get_scope, NULL));
91 if (fgets(buffer, REPL_BUFFER_MAX, stdin) == NULL) {
95 eval_line(gc, &scope, buffer);