]> git.lizzy.rs Git - nothing.git/blobdiff - src/script/repl.c
TODO(#391)
[nothing.git] / src / script / repl.c
index da05e620711efcaceb7b579ab480a7d0bcbb1c50..2e794bbc745efe7e5d2521604cc5df7b428c6aa8 100644 (file)
@@ -1,11 +1,24 @@
+#include <assert.h>
 #include <stdbool.h>
 
 #include "parser.h"
 #include "interpreter.h"
 #include "scope.h"
+#include "gc.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[])
@@ -13,7 +26,13 @@ int main(int argc, char *argv[])
     (void) argc;
     (void) argv;
 
-    /* TODO: memory leak */
+    Gc *gc = create_gc();
+    struct Scope scope = {
+        .expr = CONS(gc, NIL(gc), NIL(gc))
+    };
+
+    set_scope_value(gc, &scope, SYMBOL(gc, "quit"), NATIVE(gc, quit, NULL));
+
     while (true) {
         printf("> ");
 
@@ -21,20 +40,38 @@ int main(int argc, char *argv[])
             return -1;
         }
 
-        struct ParseResult parse_result = read_expr_from_string(buffer);
+        printf("Before parse:\t");
+        gc_inspect(gc);
+
+        struct ParseResult parse_result = read_expr_from_string(gc, buffer);
         if (parse_result.is_error) {
             print_parse_error(stderr, buffer, parse_result);
             continue;
         }
+        printf("After parse:\t");
+        gc_inspect(gc);
+
+        struct EvalResult eval_result = eval(gc, &scope, parse_result.expr);
+        printf("After eval:\t");
+        gc_inspect(gc);
+
+        gc_collect(gc, CONS(gc, scope.expr, eval_result.expr));
+        printf("After collect:\t");
+        gc_inspect(gc);
+
+        printf("Scope:\t");
+        print_expr_as_sexpr(scope.expr);
+        printf("\n");
 
-        struct EvalResult eval_result = eval(empty_scope(), parse_result.expr);
         if (eval_result.is_error) {
-            print_eval_error(stderr, eval_result);
-            continue;
+            printf("Error:\t");
         }
 
         print_expr_as_sexpr(eval_result.expr);
+        printf("\n");
     }
 
+    destroy_gc(gc);
+
     return 0;
 }