]> git.lizzy.rs Git - nothing.git/blobdiff - src/script/repl.c
TODO(#391)
[nothing.git] / src / script / repl.c
index 28d7c981410fbf2dc23896c92637261335b358ca..2e794bbc745efe7e5d2521604cc5df7b428c6aa8 100644 (file)
@@ -1,3 +1,4 @@
+#include <assert.h>
 #include <stdbool.h>
 
 #include "parser.h"
@@ -7,6 +8,17 @@
 
 #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[])
@@ -15,8 +27,11 @@ 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("> ");
@@ -36,16 +51,16 @@ int main(int argc, char *argv[])
         printf("After parse:\t");
         gc_inspect(gc);
 
-        struct EvalResult eval_result = eval(gc, scope, parse_result.expr);
+        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) {