+#include <assert.h>
#include <stdbool.h>
#include "parser.h"
#define REPL_BUFFER_MAX 1024
+static struct EvalResult quit(void *param, Gc *gc, struct Scope *scope, struct Expr args)
+{
+ assert(scope);
+ (void) args;
+ (void) param;
+
+ exit(0);
+
+ return eval_success(NIL(gc));
+}
+
char buffer[REPL_BUFFER_MAX + 1];
int main(int argc, char *argv[])
(void) argv;
Gc *gc = create_gc();
+ struct Scope scope = {
+ .expr = CONS(gc, NIL(gc), NIL(gc))
+ };
- struct Expr scope = NIL(gc);
+ set_scope_value(gc, &scope, SYMBOL(gc, "quit"), NATIVE(gc, quit, NULL));
while (true) {
printf("> ");
printf("After parse:\t");
gc_inspect(gc);
- struct EvalResult eval_result = eval(gc, scope, parse_result.expr);
- scope = eval_result.scope;
+ struct EvalResult eval_result = eval(gc, &scope, parse_result.expr);
printf("After eval:\t");
gc_inspect(gc);
- gc_collect(gc, CONS(gc, scope, eval_result.expr));
+ gc_collect(gc, CONS(gc, scope.expr, eval_result.expr));
printf("After collect:\t");
gc_inspect(gc);
printf("Scope:\t");
- print_expr_as_sexpr(eval_result.scope);
+ print_expr_as_sexpr(scope.expr);
printf("\n");
if (eval_result.is_error) {