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();
+ }
+ }
+ });
+})();