about summary refs log tree commit diff stats
path: root/repl.lua
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2022-05-11 13:12:13 -0700
committerKartik K. Agaram <vc@akkartik.com>2022-05-11 13:12:13 -0700
commitba0d0028eac8cc3eeca74aff7132f1136939591a (patch)
treeda9e6b8b829416d314607533131864d820a62d16 /repl.lua
parentd8e5a1ce1258b788fabc74ab2dda85dce8ab22ad (diff)
downloadview.love-ba0d0028eac8cc3eeca74aff7132f1136939591a.tar.gz
clean up repl functionality
Now we have separate keywords for returning vs drawing something.
Diffstat (limited to 'repl.lua')
-rw-r--r--repl.lua42
1 files changed, 42 insertions, 0 deletions
diff --git a/repl.lua b/repl.lua
new file mode 100644
index 0000000..44bba97
--- /dev/null
+++ b/repl.lua
@@ -0,0 +1,42 @@
+-- beginnings of a repl
+
+function eval(buf)
+  local f = load('return '..buf, 'REPL')
+  if f then
+    return run(f)
+  end
+  local f, err = load(buf, 'REPL')
+  if f then
+    return run(f)
+  else
+    return {err}
+  end
+end
+
+-- you could perform parse and run separately
+-- usually because there's a side-effect like drawing that you want to control the timing of
+function parse_into_exec_payload(buf)
+  local f = load('return '..buf, 'REPL')
+  if f then
+    exec_payload = f
+    return
+  end
+  local f, err = load(buf, 'REPL')
+  if f then
+    exec_payload = f
+    return
+  else
+    return {err}
+  end
+end
+
+-- based on https://github.com/hoelzro/lua-repl
+function run(f)
+  local success, results = gather_results(xpcall(f, function(...) return debug.traceback() end))
+  return results
+end
+
+function gather_results(success, ...)
+  local n = select('#', ...)
+  return success, { n = n, ... }
+end