aboutsummaryrefslogtreecommitdiff
path: root/lib/tools/repl.nom
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tools/repl.nom')
-rwxr-xr-xlib/tools/repl.nom86
1 files changed, 86 insertions, 0 deletions
diff --git a/lib/tools/repl.nom b/lib/tools/repl.nom
new file mode 100755
index 0000000..2c0d3df
--- /dev/null
+++ b/lib/tools/repl.nom
@@ -0,0 +1,86 @@
+#!/usr/bin/env nomsu -V6.14
+#
+ This file defines a Read-Evaluate-Print-Loop (REPL) for Nomsu
+
+use "consolecolor"
+use "filesystem"
+use "commandline"
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+externally (help) means:
+ say ("
+ This is the Nomsu v\(Nomsu version) interactive console.
+ You can type in Nomsu code here and hit 'enter' twice to run it.
+ To exit, type 'exit' or 'quit' and hit enter twice.
+ ")
+
+command line program with $args:
+ say ("
+
+ \(bright)\(underscore)Welcome to the Nomsu v\(Nomsu version) interactive console!\
+ ..\(reset color)
+ press 'enter' twice to run a command
+
+ ")
+
+ repeat:
+ say (bright (yellow ">> ")) inline
+ $buff = []
+ repeat:
+ say (bright) inline
+ $line = ($io.read "*L")
+ say (reset color) inline
+ if (($line == "\n") or (not $line)):
+ if ((size of $buff) > 0):
+ # clear the line
+ say "\027[1A\027[2K" inline
+ go to (run buffer)
+ $buff, add ($line, with "\t" -> " ")
+ say (dim (yellow ".. ")) inline
+
+ --- (run buffer) ---
+
+ if ((size of $buff) == 0): stop
+ $buff = ($buff, joined)
+ spoof file $buff
+ try:
+ $tree = ($buff parsed)
+ ..if it fails with $err:
+ say $err
+ do next
+
+ unless $tree:
+ do next
+
+ for $chunk in $tree:
+ try:
+ $lua = ($chunk as lua)
+ ..if it fails with $err: say $err
+
+ unless $lua:
+ do next
+
+ # TODO: this is a bit hacky, it just defaults variables to global
+ so that stuff mostly works across multiple lines. It would be
+ nicer if local variables actually worked.
+ $lua, remove free vars
+ try:
+ $ret = (run $lua)
+ ..if it fails with $err: say $err
+ ..if it succeeds:
+ if (type of $ret) is:
+ "nil":
+ do nothing
+
+ "boolean":
+ say "= \("yes" if $ret else "no")"
+
+ "table":
+ if $ret.as_nomsu:
+ say "= \($ret, as nomsu)"
+ ..else:
+ say "= \$ret"
+
+ else:
+ say "= \$ret"