From 88b039a82e166de6ef4e31a60c42092156bf1330 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Sat, 19 Aug 2023 21:36:12 +0800 Subject: [PATCH] :memo: add experimental repl (for fun) --- .gitignore | 1 + tools/repl.nas | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 tools/repl.nas diff --git a/.gitignore b/.gitignore index 5e477ca..7b57570 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,7 @@ nasal.exe .vscode dump fgfs.log +.temp.* # build dir build diff --git a/tools/repl.nas b/tools/repl.nas new file mode 100644 index 0000000..78768c1 --- /dev/null +++ b/tools/repl.nas @@ -0,0 +1,72 @@ +# experimental repl +# 2023/8/19 by ValKmjolnir + +var help = func() { + println(" .help | show help"); + println(" .exit | quit the REPL"); + println(" .quit | quit the REPL"); + println(" .clear | clear the screen"); + println(); +} + +var content = []; +var log_cache = ""; + +println("Nasal: This is experimental REPL"); +help(); + +var count_bracket = func(line) { + var len = size(line); + var count = 0; + for(var i = 0; i < len; i += 1) { + if (line[i] == "{"[0]) { + count += 1; + } elsif (line[i] == "}"[0]) { + count -= 1; + } + } + return count; +} + +while(1) { + var line = readline(">>> "); + if (line == ".exit" or line == ".quit") { + break; + } elsif (line == ".help") { + println(); + help(); + continue; + } elsif (line == ".clear") { + print("\ec"); + continue; + } elsif (line[0] == "."[0]) { + println("no such command \"", line, "\", input \".help\" for help\n"); + continue; + } + var in_bracket_level = count_bracket(line); + while(in_bracket_level > 0) { + var temp_line = readline("... "); + in_bracket_level += count_bracket(temp_line); + line ~= temp_line ~ "\n"; + } + + append(content, line); + + var source = ""; + foreach(var i; content) { + source ~= i ~ ";\n"; + } + + io.fout(".temp.nas", source); + var result = system("nasal .temp.nas > .temp.log"); + if (result != 0) { + pop(content); + continue; + } + + var log = io.readfile(".temp.log"); + if (size(log) and size(log) != size(log_cache)) { + println(substr(log, size(log_cache), size(log)), "\n"); + log_cache = log; + } +} \ No newline at end of file