From 54d12060ec84d5325bf62acc03b19d0c2f398e58 Mon Sep 17 00:00:00 2001 From: "Javier B. Torres" Date: Wed, 21 Jan 2026 14:12:42 -0300 Subject: [PATCH] linenoise repl... --- meson.build | 1 + src/main.c | 29 +++++++---------------------- test.grr | 21 ++++----------------- 3 files changed, 12 insertions(+), 39 deletions(-) diff --git a/meson.build b/meson.build index 77fcf97..8b80012 100644 --- a/meson.build +++ b/meson.build @@ -18,6 +18,7 @@ sources = [ 'src/print.c', 'src/string.c', 'src/vm.c', + 'src/vendor/linenoise.c', 'src/vendor/mpc.c', 'src/vendor/yar.c', ] diff --git a/src/main.c b/src/main.c index 395784d..76ab02a 100644 --- a/src/main.c +++ b/src/main.c @@ -7,6 +7,7 @@ #include "parser.h" #include "vm.h" +#include "vendor/linenoise.h" #include "vendor/mpc.h" #define REPL_BUFFER_SIZE 4096 @@ -15,29 +16,11 @@ I repl(void) { Vm vm = {0}; vm_init(&vm); - char input[REPL_BUFFER_SIZE]; - - for (;;) { - printf("> "); - fflush(stdout); - if (fgets(input, REPL_BUFFER_SIZE, stdin) == NULL) { - printf("\n"); - break; - } - I is_empty = 1; - for (char *p = input; *p; p++) { - if (*p != ' ' && *p != '\t' && *p != '\n' && *p != '\r') { - is_empty = 0; - break; - } - } - if (is_empty) - continue; - if (strncmp(input, "bye", 3) == 0 || strncmp(input, "quit", 4) == 0) - break; + char *line; + while ((line = linenoise("growl> ")) != NULL) { mpc_result_t res; - if (!mpc_parse("", input, Program, &res)) { - mpc_err_print(res.error); + if (!mpc_parse("", line, Program, &res)) { + mpc_err_print_to(res.error, stderr); mpc_err_delete(res.error); continue; } @@ -48,8 +31,10 @@ I repl(void) { if (chunk != NULL) { vm_run(&vm, chunk, 0); chunk_release(chunk); + linenoiseHistoryAdd(line); } compiler_deinit(&cm); + linenoiseFree(line); } vm_deinit(&vm); return 0; diff --git a/test.grr b/test.grr index 7ae9651..4a75336 100644 --- a/test.grr +++ b/test.grr @@ -1,25 +1,12 @@ -def fib/aux { - if: dig dup 0 = - [drop drop] - [bury [swap 1 - swap] dip dup [+] dip swap fib/aux]; -} -def fib { 0 1 fib/aux } - -"50 fib => " type -50 fib . - def times { if: over 0 = [drop drop] [swap over >r >r call r> 1 - r> times]; } -\ We can also calculate the Fibonnaci numbers using the `times' combinator -\ we just implemented: - -def fib-iter { - 0 1 dig times: [dup [+] dip swap]; drop +def fib { + 0 1 dig [dup [+] dip swap] times drop } -"50 fib-iter => " type -50 fib-iter . +"50 fib => " type +50 fib .