From d257032ba9c9ad8eaf1e8ac592f88909fc3791ec Mon Sep 17 00:00:00 2001 From: Eric Jiang <321497+erjiang@users.noreply.github.com> Date: Fri, 30 May 2025 15:53:58 -0400 Subject: [PATCH] Add browser REPL example --- web/index.html | 21 +++++++++++++++++++++ web/repl.js | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 web/index.html create mode 100644 web/repl.js diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..198fd02 --- /dev/null +++ b/web/index.html @@ -0,0 +1,21 @@ + + + + + FoxScheme REPL + + + +
+ + + + + diff --git a/web/repl.js b/web/repl.js new file mode 100644 index 0000000..00c283a --- /dev/null +++ b/web/repl.js @@ -0,0 +1,41 @@ +(function() { + const consoleDiv = document.getElementById('console'); + const prompt = document.getElementById('prompt'); + const interpreter = new FoxScheme.Interpreter(); + let buffer = ''; + + function append(text, cls) { + const div = document.createElement('div'); + div.className = 'line ' + cls; + div.textContent = text; + consoleDiv.appendChild(div); + consoleDiv.scrollTop = consoleDiv.scrollHeight; + } + + function evaluate() { + try { + const parser = new FoxScheme.Parser(buffer); + let obj; + while((obj = parser.nextObject()) !== FoxScheme.Parser.EOS) { + const result = interpreter.eval(obj); + append(String(result), 'result'); + } + } catch(err) { + append('Error: ' + err.message, 'error'); + } + buffer = ''; + } + + prompt.addEventListener('keydown', function(e) { + if (e.key === 'Enter') { + e.preventDefault(); + const line = prompt.value; + prompt.value = ''; + buffer += line + '\n'; + append(line, 'input'); + if (FoxScheme.Parser.calculateIndentation(buffer) === 0) { + evaluate(); + } + } + }); +})();