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