import { createSignal, Match, Switch } from 'solid-js'; import { useProgram } from 'src/ui/ProgramProvider'; import { eval_start } from 'src/lang/eval/evaluator'; import { Value } from 'src/lang/eval/value'; import { RuntimeError } from 'src/lang/eval/error'; import { SourceRegion, SourceText, sourceText } from 'source-region'; import { ParseError, parseExpr } from 'src/lang/parser/parser'; import { ShowParseError } from 'src/ui/Component/ParseError'; import { Val } from 'src/ui/Component/Value'; import { CodeEditor } from 'src/ui/Component/CodeEditor'; namespace ReplResult { export type Idle = { tag: "idle" } export type Success = { tag: "success", value: Value } export type Parse_Error = { tag: "parse_error", text: SourceRegion, err: ParseError } export type Runtime_Error = { tag: "runtime_error", err: RuntimeError } } type ReplResult = | ReplResult.Idle | ReplResult.Success | ReplResult.Parse_Error | ReplResult.Runtime_Error export function ExprREPL() { const program = useProgram(); const [input, setInput] = createSignal(""); const [result, setResult] = createSignal({ tag: "idle" }); function runExecution() { const raw = input(); if (input().trim() === "") { return; } const text = sourceText(raw).fullRegion(); const parseResult = parseExpr(text); if (parseResult.tag === "error") { setResult({ tag: "parse_error", text: text, err: parseResult.error }); } else { const evalResult = eval_start(program, parseResult.value); if (evalResult.tag === "ok") { setResult({ tag: "success", value: evalResult.value }); } else { setResult({ tag: "runtime_error", err: evalResult.error }); } } } return (
{ "" } {(res) => (
Result
)}
{(res) => ( )} {(res) => (
Runtime Error
{JSON.stringify(res().err, null, 2)}
)}
); }