SletScript

by islptng
Version: unknown

This page provides an interactive SletScript REPL in browser.

Type your program in the editor on the right and click Run to execute it. You can also use the REPL.

Read the documentation to learn about the SletScript language.

Please wait until the REPL is fully loaded before typing code. Currently, input is not supported.

Download Interpreter
-->
packages = [] [[fetch]] files = ["sletscript_interpreter.py"] from js import document from sletscript_interpreter import SletScriptEnvironment, SletScriptError, VERSION from pyodide.ffi import create_proxy import js # DOM editor = document.querySelector("#editor") output_div = document.querySelector("#output") input_elem = document.querySelector("#input") prompt_elem = document.querySelector("#prompt") # State env = None is_multiline = False current_code = "" # === Custom I/O === current_output_buffer = "" def custom_stdout(x): global current_output_buffer current_output_buffer += str(x) if "\n" in current_output_buffer: line, current_output_buffer = current_output_buffer.split("\n", 1) log(line, "output") def custom_stderr(x): for line in x.strip().split("\n"): if "ERROR" in line or "Error" in line: log(line, "error") elif line.startswith("#"): log(line, "info") else: log(line, "error") def custom_stdin(): return None # TODO # === Logging === def log(msg, kind="output"): global current_output_buffer if current_output_buffer and kind != "output": log(current_output_buffer, "output") current_output_buffer = "" div = document.createElement("div") div.className = kind if kind == "error": div.style.color = "#f66" elif kind == "info": div.style.color = "#aaa" elif kind == "input": div.style.color = "#fff" else: div.style.color = "#0f0" div.textContent = msg.replace(" "," ") output_div.appendChild(div) console = output_div.parentElement console.scrollTop = console.scrollHeight def show_error(e): msg = str(e) if "<\\\\>" in msg: parts = msg.split("<\\\\>", 2) name = parts[0].strip() text = parts[1].strip() try: pos_info = eval(parts[2].strip()) file, pos = pos_info lines = current_code.split("\n") line_no = sum(1 for i in range(pos) if current_code[i] == "\n") col = pos - (current_code.rfind("\n", 0, pos) + 1 if "\n" in current_code[:pos] else 0) log(f"{name}: {text}", "error") log(f" File {file}, line {line_no + 1}", "error") if line_no < len(lines): log(f" {lines[line_no]}", "code-line") log(" " + " " * col + "^", "arrow") except: log(msg, "error") else: log(msg, "error") # === REPL Core === def process_input(event): global is_multiline, current_code if event.key != "Enter": return code = input_elem.value if not code: input_elem.value = "" return log(("  |" if is_multiline else ("-"+"->")) + " " + code, "input") input_elem.value = "" if not is_multiline: current_code = code else: current_code += "\n" + code try: result = env.exec(current_code, mode=1, fileName="REPL") if str(result) == "Next": is_multiline = True prompt_elem.textContent = "  | " else: is_multiline = False prompt_elem.textContent = "-" + "-> " current_code = "" if result is not None: log("<= " + repr(result), "info") except Exception as e: if "Next" in str(e): is_multiline = True prompt_elem.textContent = "  | " else: show_error(e) is_multiline = False prompt_elem.textContent **= "-" + "-> " current_code = "" def run_editor(event): code = editor.value if not code: log("(empty)", "info") return log("=== Running editor code ===", "info") try: result = env.exec(code, mode=0, fileName="Editor") if result is not None: log("<= " + repr(result), "info") except Exception as e: show_error(e) def clear_console(event): output_div.innerHTML = "" log("Console cleared.", "info") def reset_env(event): global env, is_multiline, current_code env = SletScriptEnvironment( stdin=custom_stdin, stdout=custom_stdout, stderr=custom_stderr ) is_multiline = False current_code = "" prompt_elem.textContent = "-" + "-> " log("Environment reset.", "info") def copy_link(event): # Use Base64 encoding instead of URL encoding encoded_code = js.encodeURIComponent(js.btoa(editor.value)) url = js.window.location.href.split("?")[0] + "?code=" + encoded_code js.navigator.clipboard.writeText(url) log("Sharable link copied to clipboard.", "info") # === Init === def init_env(): global env env = SletScriptEnvironment( stdin=custom_stdin, stdout=custom_stdout, stderr=custom_stderr ) ver = VERSION document.querySelector("#version").innerText = ver log("SletScript REPL ready. Type code and press Enter.") log("Use editor + 'Run' for full programs.") input_elem.focus() # Load code from URL parameter if present url = js.window.location.href if "?code=" in url: try: # Extract the code parameter from URL code_param = url.split("?code=")[1].split("&")[0] # Decode Base64-encoded code decoded_code = js.atob(js.decodeURIComponent(code_param)) # Load code into editor editor.value = decoded_code log("Code loaded from URL.", "info") except Exception as e: log(f"Error loading code from URL: {e}", "error") # === Event Binding === input_elem.addEventListener("keydown", create_proxy(process_input)) document.querySelector("#run").addEventListener("click", create_proxy(run_editor)) document.querySelector("#clear").addEventListener("click", create_proxy(clear_console)) document.querySelector("#reset").addEventListener("click", create_proxy(reset_env)) document.querySelector("#copy").addEventListener("click", create_proxy(copy_link)) # Start init_env()