From ab660ae7a8cf65e0f1c542f312bec1aed5cbbfd5 Mon Sep 17 00:00:00 2001 From: sfja Date: Tue, 23 Sep 2025 01:07:41 +0200 Subject: [PATCH] self hosted --- compile.phi | 288 +++++---- make_stage1.sh | 0 make_stage2.sh | 0 phi.js | 66 +- runtime.js | 36 +- stage1.js | 1616 +++++++++++++++++++++++++----------------------- stage2.js | 1229 +++++++++++++++++++++++++++++++++++- 7 files changed, 2324 insertions(+), 911 deletions(-) mode change 100644 => 100755 make_stage1.sh mode change 100644 => 100755 make_stage2.sh diff --git a/compile.phi b/compile.phi index d8716f5..7519742 100644 --- a/compile.phi +++ b/compile.phi @@ -1,17 +1,52 @@ +(fn dbg (msg) (do + (if is_phi_compiler (do + (call println "dbg: %" msg) + )) +)) + (fn Emitter (ast filename) (do (let output ()) (let (enter_scope leave_scope define_sym get_sym print_syms) (call Syms)) (let (let_node_reg_count let_node_reg_increment) (call Counter)) + (let (sym_id_count sym_id_increment) (call Counter)) + + (let builtin_syms ( + ("format" "builtinFormat") + ("print" "builtinPrint") + ("println" "builtinPrintln") + ("panic" "builtinPanic") + ("read_text_file" "builtinReadTextFile") + ("write_text_file" "builtinWriteTextFile") + ("push" "builtinPush") + ("at" "builtinAt") + ("set" "builtinSet") + ("len" "builtinLen") + ("string_to_int" "builtinStringToInt") + ("char_code" "builtinCharCode") + ("strings_join" "builtinStringsJoin") + ("get_args" "builtinGetArgs") + )) (fn generate () (do (call emit "#!/usr/bin/env node\n") - (call emit "import { Runtime } from \"./runtime.js\"\n") - (call emit "const runtime = new Runtime(\"") + (call emit "import { Runtime } from \"./runtime.js\";\n") + (call emit "const runtime = new Runtime({ filename: \"") (call emit filename) - (call emit "\")\n") + (call emit "\" });\n") + + (for (ident builtin_id) builtin_syms (do + (call define_builtin ident builtin_id) + )) + + (let is_phi_compiler_sym_id (call define_let "is_phi_compiler" 0)) + (call emit (call format + "let _is_phi_compiler% = { type: \"bool\", value: true };\n" + is_phi_compiler_sym_id + )) + (call discover_syms ast) (call emit_exprs ast) (return (call strings_join output)) @@ -32,8 +67,8 @@ (if (== (call len s) 0) (return)) (let ((_ _ id)) s) (if (== id "fn") (do - (let (_ (_ _ name) (_ _ params) body) s) - (call define_sym name ("fn" name line)) + (let (_ (_ _ ident) (_ _ params) body) s) + (call define_fn ident line) )) )) )) @@ -42,10 +77,10 @@ (let (ty line) expr) (if (== ty "list") (do (call emit_list expr) - ) (if (== ty "int") ( + ) (if (== ty "int") (do (let (_ _ value) expr) (call emit (call format "({ type: \"int\", value: % })" value)) - ) (if (== ty "string") ( + ) (if (== ty "string") (do (let (_ _ value) expr) (call emit (call format "({ type: \"string\", value: \"%\" })" (call string_escape value))) ) (if (== ty "ident") (do @@ -68,16 +103,16 @@ (call panic "undefined symbol '%' on line %" value line) )) - (let (sym_ty) sym) + (let (sym_id sym_ty) sym) (if (== sym_ty "builtin") (do - (let (_ id) sym) + (let (_ _ id) sym) (call emit (call format "((...args) => runtime.%(...args))" id)) ) (if (== sym_ty "fn") (do - (call emit (call format "_%" value)) - ) (if (== sym_ty "param") (do - (call emit (call format "_%" value)) - ) (if (== sym_ty "let") (do - (call emit (call format "_%" value)) + (call emit (call format "_%%" value sym_id)) + ) (if (== sym_ty "param") (do + (call emit (call format "_%%" value sym_id)) + ) (if (== sym_ty "let") (do + (call emit (call format "_%%" value sym_id)) ) (do (call panic "not implemented '%'" sym_ty) ))))) @@ -94,30 +129,33 @@ )) (let ((id_ty _ id)) s) (if (!= id_ty "ident") (do - (call emit "({ type: \"list\", values: [] })") + (call emit_list_literal s) (return) )) (if (== id "fn") (do - (let (_ (_ _ name) (_ _ params) body) s) - (call emit (call format "function _%(" name)) + (let (_ (_ _ ident) (_ _ params) body) s) + + (let sym (call get_sym ident)) + (let (sym_id) sym) + + (call emit (call format "function _%%(" ident sym_id)) (call enter_scope) (let first true) - (for (_ _ name) params (do + (for (_ _ ident) params (do (if (not first) (do (call emit ", ") )) (= first false) - (call emit (call format "_%" name)) - - (call define_sym name ("param" name line)) + (let sym_id (call define_param ident line)) + (call emit (call format "_%%" ident sym_id)) )) - (call emit (call format ") {\n" name)) - (call emit (call format "runtime.pushCall(\"%\");\n" name)) + (call emit ") {\n") + (call emit (call format "runtime.pushCall(\"%\");\n" ident)) (call emit_expr body) (call emit ";\nruntime.popCall();\nreturn { type: \"null\" };\n}") @@ -127,7 +165,7 @@ (let (_ pat expr) s) (let reg (call let_node_reg_count)) (call let_node_reg_increment) - (call emit (call format "let r_% = " reg)) + (call emit (call format "const r_% = " reg)) (call emit_expr expr) (call emit_let_node pat reg) ) (if (== id "do") (do @@ -137,14 +175,22 @@ (call leave_scope) ) (if (== id "for") (do (let (_ pat expr body) s) - (call enter_scope) - (call emit "for (let ") - (call emit_pat pat) - (call emit " of ") + + (let reg (call let_node_reg_count)) + (call let_node_reg_increment) + (call emit (call format "for (const r_% of " reg)) (call emit_expr expr) - (call emit ".values) {\n") + (call emit ".values) {") + + (call enter_scope) + (call emit_let_node pat reg) + (call enter_scope) + + (call emit ";\n") (call emit_expr body) (call emit "}") + + (call leave_scope) (call leave_scope) ) (if (== id "loop") (do (let (_ body) s) @@ -153,9 +199,9 @@ (call emit "}") ) (if (== id "if") (do (let (_ cond truthy falsy) s) - (call emit "if (") + (call emit "if (runtime.truthy(") (call emit_expr cond) - (call emit ") {\n") + (call emit ")) {\n") (call emit_expr truthy) (call emit "}") (if (!= falsy null) (do @@ -205,17 +251,17 @@ ) (if (== id "or") (do (let (_ left right) s) (call emit (call format "(runtime.setLine(%)" line)) - (call emit ", { type: \"bool\", value: this.runtime.truthy(") + (call emit ", { type: \"bool\", value: runtime.truthy(") (call emit_expr left) - (call emit ") || this.runtime.falsy(") + (call emit ") || runtime.truthy(") (call emit_expr right) (call emit ") })") ) (if (== id "and") (do (let (_ left right) s) (call emit (call format "(runtime.setLine(%)" line)) - (call emit ", { type: \"bool\", value: this.runtime.truthy(") + (call emit ", { type: \"bool\", value: runtime.truthy(") (call emit_expr left) - (call emit ") && this.runtime.falsy(") + (call emit ") && runtime.truthy(") (call emit_expr right) (call emit ") })") ) (if (== id "==") (do @@ -240,20 +286,24 @@ (call emit_expr expr) (call emit ")") ) (do - (call emit "({ type: \"list\", values: [") - (let first true) - (for e s (do - (if (not first) (do - (call emit ", ") - )) - (= first false) - - (call emit_expr e) - )) - (call emit "] })") + (call emit_list_literal s) )))))))))))))))))))))))) )) + (fn emit_list_literal (s) (do + (call emit "({ type: \"list\", values: [") + (let first true) + (for e s (do + (if (not first) (do + (call emit ", ") + )) + (= first false) + + (call emit_expr e) + )) + (call emit "] })") + )) + (fn emit_let_node (pat base_reg) (do (let (pat_ty line) pat) (if (== pat_ty "ident") (do @@ -261,16 +311,35 @@ (if (== ident "_") (return)) - (call emit (call format ";\nlet _% = r_%" ident base_reg)) - (call define_sym ident ("let" line)) + (let sym_id (call define_let ident line)) + (call emit (call format ";\nlet _%% = r_%" ident sym_id base_reg)) ) (if (== pat_ty "list") (do (let (_ _ pats) pat) + //(call emit (call format + // (+ ";\nif (r_%.type !== \"list\") {\nruntime.setLine(%);" + // "\nruntime.panic(\"expected list\");\n}\n") + // base_reg + // line + //)) + //(call emit (call format + // (+ ";\nif (% > r_%.values.length) {\nruntime.setLine(%);\nruntime.panic" + // "(`expected % elements, got ${r_%.values.length}`);\n}\n") + // (call len pats) + // base_reg + // line + // (call len pats) + // base_reg + //)) + (let i 0) (for pat pats (do (let reg (call let_node_reg_count)) (call let_node_reg_increment) - (call emit (call format ";\nlet r_% = r_%.values[%]" reg base_reg i)) + (call emit (call format + ";\nconst r_% = r_%.values[%] ?? { type: \"null\"}" + reg base_reg i + )) (call emit_let_node pat reg) (+= i 1) )) @@ -298,59 +367,64 @@ (if (== sym null) (do (call panic "could not find symbol '%' on line %" ident line) )) - (let (sym_type sym_ident _) sym) + (let (sym_id sym_type sym_ident _) sym) (if (== sym_type "let") (do - (call emit (call format "(_% = runtime.assignValue(" sym_ident)) + (call emit (call format "(_%% = " sym_ident sym_id)) (if (== id "=") (do (call emit_expr expr) ) (if (== id "+") (do - (call emit (call format "runtime.opAdd(_%, " sym_ident)) + (call emit (call format "runtime.opAdd(_%%, " sym_ident sym_id)) (call emit_expr expr) (call emit ")") ) (if (== id "-") (do - (call emit (call format "runtime.opSub(_%, " sym_ident)) + (call emit (call format "runtime.opSub(_%%, " sym_ident sym_id)) (call emit_expr expr) (call emit ")") ) (do (call panic "not implemented") )))) - (call emit "))") + (call emit ")") ) (do (call panic "cannot assign to symbol '%' on line %" sym_ident line) )) )) - (fn emit_pat (pat) (do - (let (ty) pat) - (if (== ty "ident") (do - (let (_ line name) pat) - (if (== name "_") (do - (return) - )) - (call emit (call format "_%" name)) - (call define_sym name ("let" name line)) - ) (if (== ty "list") (do - (let (_ _ pats) pat) - (call emit "[") - (let first true) - (for pat pats (do - (if (not first) (do - (call emit ", ") - )) - (= first false) - - (call emit_pat pat) - )) - (call emit "]") - ) (do - (call panic "cannot assign to '%'" pat) - ))) - )) - (fn emit (str) (do (call push output str) )) + (fn define_builtin (ident builtin_id) (do + (let sym_id (call sym_id_count)) + (call sym_id_increment) + + (call define_sym ident (sym_id "builtin" builtin_id)) + (return sym_id) + )) + + (fn define_fn (ident line) (do + (let sym_id (call sym_id_count)) + (call sym_id_increment) + + (call define_sym ident (sym_id "fn" ident line)) + (return sym_id) + )) + + (fn define_param (ident line) (do + (let sym_id (call sym_id_count)) + (call sym_id_increment) + + (call define_sym ident (sym_id "param" ident line)) + (return sym_id) + )) + + (fn define_let (ident line) (do + (let sym_id (call sym_id_count)) + (call sym_id_increment) + + (call define_sym ident (sym_id "let" ident line)) + (return sym_id) + )) + (return (generate)) )) @@ -369,22 +443,7 @@ )) (fn Syms () (do - (let syms (null ( - ("format" ("builtin" "builtinFormat")) - ("print" ("builtin" "builtinPrint")) - ("println" ("builtin" "builtinPrintln")) - ("panic" ("builtin" "builtinPanic")) - ("read_text_file" ("builtin" "builtinReadTextFile")) - ("write_text_file" ("builtin" "builtinWriteTextFile")) - ("push" ("builtin" "builtinPush")) - ("at" ("builtin" "builtinAt")) - ("set" ("builtin" "builtinSet")) - ("len" ("builtin" "builtinLen")) - ("string_to_int" ("builtin" "builtinStringToInt")) - ("char_code" ("builtin" "builtinCharCode")) - ("strings_join" ("builtin" "builtinStringsJoin")) - ("get_args" ("builtin" "builtinGetArgs")) - ))) + (let syms (null ())) (fn enter_scope () (do (= syms (syms ())) @@ -396,18 +455,18 @@ )) (fn define (ident sym) (do - (let (_ syms) syms) + (let (_ map) syms) (let i 0) (loop (do - (if (>= i (call len syms)) (break)) - (let (s_ident _) (call at syms i)) + (if (>= i (call len map)) (break)) + (let (s_ident _) (call at map i)) (if (== ident s_ident) (do - (call set syms i (ident sym)) + (call set map i (ident sym)) (return) )) (+= i 1) )) - (call push syms (ident sym)) + (call push map (ident sym)) )) (fn find_sym (syms ident) (do @@ -706,25 +765,30 @@ (return elems) )) -(let silent true) +(let silent false) (let (input_filename output_filename) (call get_args)) -(if (not silent) (call println "reading file...")) +(if (not silent) (call println "reading file '%'..." input_filename)) (let text (call read_text_file input_filename)) -(call println "=== text ===") +//(call println "=== text ===") // (call println text) -(call println (call len text)) +//(call println (call len text)) (if (not silent) (call println "tokenizing...")) (let tokens (call tokenize text)) -(call println "=== tokens ===") -// (for (tok line value) tokens (do -// (call println "%\t%\t%" line tok (if (!= value null) value "")) -// )) -(call println (call len tokens)) +//(call println "=== tokens ===") +//(for elem tokens (do +// (let (tok line value) elem) +// (if (!= value null) (do +// (call println "%\t%\t%" line tok value) +// ) (do +// (call println "%\t%" line tok) +// )) +//)) +//(call println (call len tokens)) (if (not silent) (call println "parsing...")) (let parser (call Parser tokens)) @@ -744,7 +808,7 @@ // (call println "=== js ===") // (call println js_code) -(if (not silent) (call println "writing file...")) +(if (not silent) (call println "writing file '%'..." output_filename)) (call write_text_file output_filename js_code) diff --git a/make_stage1.sh b/make_stage1.sh old mode 100644 new mode 100755 diff --git a/make_stage2.sh b/make_stage2.sh old mode 100644 new mode 100755 diff --git a/phi.js b/phi.js index 7e2f576..1635f17 100644 --- a/phi.js +++ b/phi.js @@ -46,7 +46,7 @@ class Evaluator { } this.currentLine = expr.line; - this.runtime.setLine(expr.line) + this.runtime.setLine(expr.line); if (expr.type === "list") { return this.evalList(expr, expr.line); } else if (expr.type === "int") { @@ -122,20 +122,29 @@ class Evaluator { return { type: "value", value: { type: "bool", value: true } }; } else { const right = this.evalToValue(s[2]); - return { type: "value", value: { type: "bool", value: this.runtime.truthy(right) } }; + return { + type: "value", + value: { type: "bool", value: this.runtime.truthy(right) }, + }; } } else if (id === "and") { const left = this.evalToValue(s[1]); if (this.runtime.truthy(left)) { const right = this.evalToValue(s[2]); - return { type: "value", value: { type: "bool", value: this.runtime.truthy(right) } }; + return { + type: "value", + value: { type: "bool", value: this.runtime.truthy(right) }, + }; } else { return { type: "value", value: { type: "bool", value: false } }; } } else if (id in this.artithmeticOps) { const left = this.evalToValue(s[1]); const right = this.evalToValue(s[2]); - return { type: "value", value: this.artithmeticOps[id](left, right) }; + return { + type: "value", + value: this.artithmeticOps[id](left, right), + }; } else if (id === "==") { const left = this.evalToValue(s[1]); const right = this.evalToValue(s[2]); @@ -155,7 +164,11 @@ class Evaluator { const right = this.evalToValue(s[2]); return { type: "value", - value: this.runtime.comparisonOperation(left, right, this.comparisonOps[id]), + value: this.runtime.comparisonOperation( + left, + right, + this.comparisonOps[id], + ), }; } else if (id in this.assignOps) { return this.evalAssign(expr); @@ -230,38 +243,43 @@ class Evaluator { ); } - const outerSyms = this.syms; - this.syms = { parent: outerSyms, map: new Map() }; - for (let i = 0; i < value.values.length; ++i) { + this.enterScope(); this.assignPattern(s[1], value.values[i]); + this.enterScope(); + const result = this.eval(s[3]); + + this.leaveScope(); + this.leaveScope(); + if (result.type === "break") { return { type: "value", value: result.value }; } else if (result.type !== "value") { return result; } } - this.syms = outerSyms; return { type: "value", value: { type: "null" } }; } evalDo(expr) { const s = expr.values; - const outerSyms = this.syms; - this.syms = { parent: outerSyms, map: new Map() }; + this.enterScope(); let lastValue = { type: "null" }; for (const expr of s.slice(1)) { const result = this.eval(expr); + if (!result) { + console.log({ expr, result }); + } if (result.type !== "value") { return result; } lastValue = result.value; } - this.syms = outerSyms; + this.leaveScope(); return { type: "value", value: lastValue }; } @@ -291,8 +309,10 @@ class Evaluator { this.syms.map.set(fnValue.params[i], args[i]); } + this.enterScope(); let returnValue = { type: "null" }; const result = this.eval(fnValue.body); + this.leaveScope(); if (result.type === "value" || result.type === "return") { returnValue = result.value; @@ -337,6 +357,11 @@ class Evaluator { if (pattern.value === "_") { return; } + if (this.syms.map.has(pattern.value)) { + throw new Error( + `redeclaration of local symbol '${pattern.value}' on line ${pattern.line}`, + ); + } this.syms.map.set(pattern.value, { type: "local", line: pattern.line, @@ -344,7 +369,7 @@ class Evaluator { }); } else if (pattern.type === "list") { if (value.type !== "list") { - this.panic(`expected list`); + this.panic(`expected list on line ${pattern.line}`); } for (const [i, p] of pattern.values.entries()) { this.assignPattern(p, value.values[i] ?? { type: "null" }); @@ -369,6 +394,14 @@ class Evaluator { this.runtime.panic(msg); } + enterScope() { + this.syms = { parent: this.syms, map: new Map() }; + } + + leaveScope() { + this.syms = this.syms.parent; + } + artithmeticOps = { "+": (left, right) => this.runtime.opAdd(left, right), "-": (left, right) => this.runtime.opSub(left, right), @@ -398,8 +431,10 @@ class Evaluator { "print": (...args) => this.runtime.builtinPrint(...args), "println": (...args) => this.runtime.builtinPrintln(...args), "panic": (...args) => this.runtime.builtinPanic(...args), - "read_text_file": (...args) => this.runtime.builtinReadTextFile(...args), - "write_text_file": (...args) => this.runtime.builtinWriteTextFile(...args), + "read_text_file": (...args) => + this.runtime.builtinReadTextFile(...args), + "write_text_file": (...args) => + this.runtime.builtinWriteTextFile(...args), "push": (...args) => this.runtime.builtinPush(...args), "at": (...args) => this.runtime.builtinAt(...args), "set": (...args) => this.runtime.builtinSet(...args), @@ -414,6 +449,7 @@ class Evaluator { "null": { type: "null" }, "false": { type: "bool", value: false }, "true": { type: "bool", value: true }, + "is_phi_compiler": { type: "bool", value: false }, }; builtins = [ diff --git a/runtime.js b/runtime.js index 35f9485..1dd7c24 100644 --- a/runtime.js +++ b/runtime.js @@ -84,11 +84,11 @@ export class Runtime { } opEq(left, right) { - return { type: "bool", value: this.equalityOperation(left, right) } + return { type: "bool", value: this.equalityOperation(left, right) }; } opNe(left, right) { - return { type: "bool", value: !this.equalityOperation(left, right) } + return { type: "bool", value: !this.equalityOperation(left, right) }; } opNot(expr) { @@ -105,23 +105,31 @@ export class Runtime { return { type: "bool", value: action(left.value, right.value) }; } - opLt(left, right) { return this.comparisonOperation(right, left, (l, r) => l < r); } - opGt(left, right) { return this.comparisonOperation(right, left, (l, r) => l > r); } - opLte(left, right) { return this.comparisonOperation(right, left, (l, r) => l <= r); } - opGte(left, right) { return this.comparisonOperation(right, left, (l, r) => l >= r); } + opLt(left, right) { + return this.comparisonOperation(left, right, (l, r) => l < r); + } + opGt(left, right) { + return this.comparisonOperation(left, right, (l, r) => l > r); + } + opLte(left, right) { + return this.comparisonOperation(left, right, (l, r) => l <= r); + } + opGte(left, right) { + return this.comparisonOperation(left, right, (l, r) => l >= r); + } opAdd(left, right) { if (left.type === "int" && right.type === "int") { - return { type: "int", value: left.value + right.value } + return { type: "int", value: left.value + right.value }; } else if (left.type === "string" && right.type === "string") { - return { type: "string", value: left.value + right.value } + return { type: "string", value: left.value + right.value }; } else { this.panic(`cannot apply '+' on ${left.type} and ${right.type}`); } } opSub(left, right) { if (left.type === "int" && right.type === "int") { - return { type: "int", value: left.value + right.value } + return { type: "int", value: left.value - right.value }; } else { this.panic(`cannot apply '-' on ${left.type} and ${right.type}`); } @@ -226,8 +234,9 @@ export class Runtime { } else if (value.type === "string") { return `${value.value}`; } else if (value.type === "list") { - return `(${value.values.map((v) => Runtime.valueToString(v)).join(" ") - })`; + return `(${ + value.values.map((v) => Runtime.valueToString(v)).join(" ") + })`; } else { throw new Error(`unknown value type ${value.type}`); } @@ -243,8 +252,9 @@ export class Runtime { } else if (value.type === "string") { return `"${value.value}"`; } else if (value.type === "list") { - return `(${value.values.map((v) => Runtime.valueToString(v)).join(" ") - })`; + return `(${ + value.values.map((v) => Runtime.valueToString(v)).join(" ") + })`; } else { throw new Error(`unknown value type ${value.type}`); } diff --git a/stage1.js b/stage1.js index 6ec5240..be32485 100644 --- a/stage1.js +++ b/stage1.js @@ -1,694 +1,771 @@ #!/usr/bin/env node -import { Runtime } from "./runtime.js" -const runtime = new Runtime("compile.phi") -function _Emitter(_ast, _filename) { +import { Runtime } from "./runtime.js"; +const runtime = new Runtime({ filename: "compile.phi" }); +let _is_phi_compiler14 = { type: "bool", value: true }; +function _dbg15(_msg27) { +runtime.pushCall("dbg"); +if (runtime.truthy(_is_phi_compiler14)) { +(runtime.setLine(4), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "dbg: %" }), _msg27)); +}; +; +runtime.popCall(); +return { type: "null" }; +}; +function _Emitter16(_ast28, _filename29) { runtime.pushCall("Emitter"); -let r_0 = ({ type: "list", values: [] }); -let _output = r_0; -let r_1 = (runtime.setLine(5), _Syms()); -let r_2 = r_1.values[0]; -let _enter_scope = r_2; -let r_3 = r_1.values[1]; -let _leave_scope = r_3; -let r_4 = r_1.values[2]; -let _define_sym = r_4; -let r_5 = r_1.values[3]; -let _get_sym = r_5; -let r_6 = r_1.values[4]; -let _print_syms = r_6; -let r_7 = (runtime.setLine(7), _Counter()); -let r_8 = r_7.values[0]; -let _let_node_reg_count = r_8; -let r_9 = r_7.values[1]; -let _let_node_reg_increment = r_9; -function _generate() { +const r_0 = ({ type: "list", values: [] }); +let _output44 = r_0; +const r_1 = (runtime.setLine(11), _Syms18()); +const r_2 = r_1.values[0] ?? { type: "null"}; +let _enter_scope45 = r_2; +const r_3 = r_1.values[1] ?? { type: "null"}; +let _leave_scope46 = r_3; +const r_4 = r_1.values[2] ?? { type: "null"}; +let _define_sym47 = r_4; +const r_5 = r_1.values[3] ?? { type: "null"}; +let _get_sym48 = r_5; +const r_6 = r_1.values[4] ?? { type: "null"}; +let _print_syms49 = r_6; +const r_7 = (runtime.setLine(13), _Counter17()); +const r_8 = r_7.values[0] ?? { type: "null"}; +let _let_node_reg_count50 = r_8; +const r_9 = r_7.values[1] ?? { type: "null"}; +let _let_node_reg_increment51 = r_9; +const r_10 = (runtime.setLine(14), _Counter17()); +const r_11 = r_10.values[0] ?? { type: "null"}; +let _sym_id_count52 = r_11; +const r_12 = r_10.values[1] ?? { type: "null"}; +let _sym_id_increment53 = r_12; +const r_13 = ({ type: "list", values: [({ type: "list", values: [({ type: "string", value: "format" }), ({ type: "string", value: "builtinFormat" })] }), ({ type: "list", values: [({ type: "string", value: "print" }), ({ type: "string", value: "builtinPrint" })] }), ({ type: "list", values: [({ type: "string", value: "println" }), ({ type: "string", value: "builtinPrintln" })] }), ({ type: "list", values: [({ type: "string", value: "panic" }), ({ type: "string", value: "builtinPanic" })] }), ({ type: "list", values: [({ type: "string", value: "read_text_file" }), ({ type: "string", value: "builtinReadTextFile" })] }), ({ type: "list", values: [({ type: "string", value: "write_text_file" }), ({ type: "string", value: "builtinWriteTextFile" })] }), ({ type: "list", values: [({ type: "string", value: "push" }), ({ type: "string", value: "builtinPush" })] }), ({ type: "list", values: [({ type: "string", value: "at" }), ({ type: "string", value: "builtinAt" })] }), ({ type: "list", values: [({ type: "string", value: "set" }), ({ type: "string", value: "builtinSet" })] }), ({ type: "list", values: [({ type: "string", value: "len" }), ({ type: "string", value: "builtinLen" })] }), ({ type: "list", values: [({ type: "string", value: "string_to_int" }), ({ type: "string", value: "builtinStringToInt" })] }), ({ type: "list", values: [({ type: "string", value: "char_code" }), ({ type: "string", value: "builtinCharCode" })] }), ({ type: "list", values: [({ type: "string", value: "strings_join" }), ({ type: "string", value: "builtinStringsJoin" })] }), ({ type: "list", values: [({ type: "string", value: "get_args" }), ({ type: "string", value: "builtinGetArgs" })] })] }); +let _builtin_syms54 = r_13; +function _generate30() { runtime.pushCall("generate"); -(runtime.setLine(10), _emit(({ type: "string", value: "#!/usr/bin/env node\n" }))); -(runtime.setLine(11), _emit(({ type: "string", value: "import { Runtime } from \"./runtime.js\"\n" }))); -(runtime.setLine(12), _emit(({ type: "string", value: "const runtime = new Runtime(\"" }))); -(runtime.setLine(13), _emit(_filename)); -(runtime.setLine(14), _emit(({ type: "string", value: "\")\n" }))); -(runtime.setLine(15), _discover_syms(_ast)); -(runtime.setLine(16), _emit_exprs(_ast)); +(runtime.setLine(34), _emit39(({ type: "string", value: "#!/usr/bin/env node\n" }))); +(runtime.setLine(35), _emit39(({ type: "string", value: "import { Runtime } from \"./runtime.js\";\n" }))); +(runtime.setLine(36), _emit39(({ type: "string", value: "const runtime = new Runtime({ filename: \"" }))); +(runtime.setLine(37), _emit39(_filename29)); +(runtime.setLine(38), _emit39(({ type: "string", value: "\" });\n" }))); +for (const r_14 of _builtin_syms54.values) {; +const r_15 = r_14.values[0] ?? { type: "null"}; +let _ident55 = r_15; +const r_16 = r_14.values[1] ?? { type: "null"}; +let _builtin_id56 = r_16; +(runtime.setLine(41), _define_builtin40(_ident55, _builtin_id56)); +}; +const r_17 = (runtime.setLine(44), _define_let43(({ type: "string", value: "is_phi_compiler" }), ({ type: "int", value: 0 }))); +let _is_phi_compiler_sym_id57 = r_17; +(runtime.setLine(45), _emit39((runtime.setLine(45), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "let _is_phi_compiler% = { type: \"bool\", value: true };\n" }), _is_phi_compiler_sym_id57)))); +(runtime.setLine(50), _discover_syms32(_ast28)); +(runtime.setLine(51), _emit_exprs31(_ast28)); runtime.popCall(); -return (runtime.setLine(17), ((...args) => runtime.builtinStringsJoin(...args))(_output)); +return (runtime.setLine(52), ((...args) => runtime.builtinStringsJoin(...args))(_output44)); ; runtime.popCall(); return { type: "null" }; }; -function _emit_exprs(_exprs) { +function _emit_exprs31(_exprs58) { runtime.pushCall("emit_exprs"); -for (let _expr of _exprs.values) { -(runtime.setLine(22), _emit_expr(_expr)); -(runtime.setLine(23), _emit(({ type: "string", value: ";\n" }))); +for (const r_18 of _exprs58.values) {; +let _expr59 = r_18; +(runtime.setLine(57), _emit_expr33(_expr59)); +(runtime.setLine(58), _emit39(({ type: "string", value: ";\n" }))); }; ; runtime.popCall(); return { type: "null" }; }; -function _discover_syms(_exprs) { +function _discover_syms32(_exprs60) { runtime.pushCall("discover_syms"); -for (let _expr of _exprs.values) { -let r_10 = _expr; -let r_11 = r_10.values[0]; -let _ty = r_11; -let r_12 = r_10.values[1]; -let _line = r_12; -if (runtime.opNe(_ty, ({ type: "string", value: "list" }))) { +for (const r_19 of _exprs60.values) {; +let _expr61 = r_19; +const r_20 = _expr61; +const r_21 = r_20.values[0] ?? { type: "null"}; +let _ty62 = r_21; +const r_22 = r_20.values[1] ?? { type: "null"}; +let _line63 = r_22; +if (runtime.truthy(runtime.opNe(_ty62, ({ type: "string", value: "list" })))) { runtime.popCall(); return { type: "null" }}; -let r_13 = _expr; -let r_14 = r_13.values[0]; -let r_15 = r_13.values[1]; -let r_16 = r_13.values[2]; -let _s = r_16; -if (runtime.opEq((runtime.setLine(32), ((...args) => runtime.builtinLen(...args))(_s)), ({ type: "int", value: 0 }))) { +const r_23 = _expr61; +const r_24 = r_23.values[0] ?? { type: "null"}; +const r_25 = r_23.values[1] ?? { type: "null"}; +const r_26 = r_23.values[2] ?? { type: "null"}; +let _s64 = r_26; +if (runtime.truthy(runtime.opEq((runtime.setLine(67), ((...args) => runtime.builtinLen(...args))(_s64)), ({ type: "int", value: 0 })))) { runtime.popCall(); return { type: "null" }}; -let r_17 = _s; -let r_18 = r_17.values[0]; -let r_19 = r_18.values[0]; -let r_20 = r_18.values[1]; -let r_21 = r_18.values[2]; -let _id = r_21; -if (runtime.opEq(_id, ({ type: "string", value: "fn" }))) { -let r_22 = _s; -let r_23 = r_22.values[0]; -let r_24 = r_22.values[1]; -let r_25 = r_24.values[0]; -let r_26 = r_24.values[1]; -let r_27 = r_24.values[2]; -let _name = r_27; -let r_28 = r_22.values[2]; -let r_29 = r_28.values[0]; -let r_30 = r_28.values[1]; -let r_31 = r_28.values[2]; -let _params = r_31; -let r_32 = r_22.values[3]; -let _body = r_32; -(runtime.setLine(36), _define_sym(_name, ({ type: "list", values: [] }))); +const r_27 = _s64; +const r_28 = r_27.values[0] ?? { type: "null"}; +const r_29 = r_28.values[0] ?? { type: "null"}; +const r_30 = r_28.values[1] ?? { type: "null"}; +const r_31 = r_28.values[2] ?? { type: "null"}; +let _id65 = r_31; +if (runtime.truthy(runtime.opEq(_id65, ({ type: "string", value: "fn" })))) { +const r_32 = _s64; +const r_33 = r_32.values[0] ?? { type: "null"}; +const r_34 = r_32.values[1] ?? { type: "null"}; +const r_35 = r_34.values[0] ?? { type: "null"}; +const r_36 = r_34.values[1] ?? { type: "null"}; +const r_37 = r_34.values[2] ?? { type: "null"}; +let _ident66 = r_37; +const r_38 = r_32.values[2] ?? { type: "null"}; +const r_39 = r_38.values[0] ?? { type: "null"}; +const r_40 = r_38.values[1] ?? { type: "null"}; +const r_41 = r_38.values[2] ?? { type: "null"}; +let _params67 = r_41; +const r_42 = r_32.values[3] ?? { type: "null"}; +let _body68 = r_42; +(runtime.setLine(71), _define_fn41(_ident66, _line63)); }; }; ; runtime.popCall(); return { type: "null" }; }; -function _emit_expr(_expr) { +function _emit_expr33(_expr69) { runtime.pushCall("emit_expr"); -let r_33 = _expr; -let r_34 = r_33.values[0]; -let _ty = r_34; -let r_35 = r_33.values[1]; -let _line = r_35; -if (runtime.opEq(_ty, ({ type: "string", value: "list" }))) { -(runtime.setLine(44), _emit_list(_expr)); +const r_43 = _expr69; +const r_44 = r_43.values[0] ?? { type: "null"}; +let _ty70 = r_44; +const r_45 = r_43.values[1] ?? { type: "null"}; +let _line71 = r_45; +if (runtime.truthy(runtime.opEq(_ty70, ({ type: "string", value: "list" })))) { +(runtime.setLine(79), _emit_list34(_expr69)); } else { -if (runtime.opEq(_ty, ({ type: "string", value: "int" }))) { -({ type: "list", values: [] })} else { -if (runtime.opEq(_ty, ({ type: "string", value: "string" }))) { -({ type: "list", values: [] })} else { -if (runtime.opEq(_ty, ({ type: "string", value: "ident" }))) { -let r_36 = _expr; -let r_37 = r_36.values[0]; -let r_38 = r_36.values[1]; -let r_39 = r_36.values[2]; -let _value = r_39; -if (runtime.opEq(_value, ({ type: "string", value: "null" }))) { -(runtime.setLine(55), _emit(({ type: "string", value: "({ type: \"null\" })" }))); +if (runtime.truthy(runtime.opEq(_ty70, ({ type: "string", value: "int" })))) { +const r_46 = _expr69; +const r_47 = r_46.values[0] ?? { type: "null"}; +const r_48 = r_46.values[1] ?? { type: "null"}; +const r_49 = r_46.values[2] ?? { type: "null"}; +let _value72 = r_49; +(runtime.setLine(82), _emit39((runtime.setLine(82), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "({ type: \"int\", value: % })" }), _value72)))); +} else { +if (runtime.truthy(runtime.opEq(_ty70, ({ type: "string", value: "string" })))) { +const r_50 = _expr69; +const r_51 = r_50.values[0] ?? { type: "null"}; +const r_52 = r_50.values[1] ?? { type: "null"}; +const r_53 = r_50.values[2] ?? { type: "null"}; +let _value73 = r_53; +(runtime.setLine(85), _emit39((runtime.setLine(85), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "({ type: \"string\", value: \"%\" })" }), (runtime.setLine(85), _string_escape19(_value73)))))); +} else { +if (runtime.truthy(runtime.opEq(_ty70, ({ type: "string", value: "ident" })))) { +const r_54 = _expr69; +const r_55 = r_54.values[0] ?? { type: "null"}; +const r_56 = r_54.values[1] ?? { type: "null"}; +const r_57 = r_54.values[2] ?? { type: "null"}; +let _value74 = r_57; +if (runtime.truthy(runtime.opEq(_value74, ({ type: "string", value: "null" })))) { +(runtime.setLine(90), _emit39(({ type: "string", value: "({ type: \"null\" })" }))); runtime.popCall(); return { type: "null" }; } else { -if (runtime.opEq(_value, ({ type: "string", value: "false" }))) { -(runtime.setLine(58), _emit(({ type: "string", value: "({ type: \"bool\", value: false })" }))); +if (runtime.truthy(runtime.opEq(_value74, ({ type: "string", value: "false" })))) { +(runtime.setLine(93), _emit39(({ type: "string", value: "({ type: \"bool\", value: false })" }))); runtime.popCall(); return { type: "null" }; } else { -if (runtime.opEq(_value, ({ type: "string", value: "true" }))) { -(runtime.setLine(61), _emit(({ type: "string", value: "({ type: \"bool\", value: true })" }))); +if (runtime.truthy(runtime.opEq(_value74, ({ type: "string", value: "true" })))) { +(runtime.setLine(96), _emit39(({ type: "string", value: "({ type: \"bool\", value: true })" }))); runtime.popCall(); return { type: "null" }; }}}; -let r_40 = (runtime.setLine(65), _get_sym(_value)); -let _sym = r_40; -if (runtime.opEq(_sym, ({ type: "null" }))) { -(runtime.setLine(67), _print_syms()); -(runtime.setLine(68), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "undefined symbol '%' on line %" }), _value, _line)); +const r_58 = (runtime.setLine(100), _get_sym48(_value74)); +let _sym75 = r_58; +if (runtime.truthy(runtime.opEq(_sym75, ({ type: "null" })))) { +(runtime.setLine(102), _print_syms49()); +(runtime.setLine(103), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "undefined symbol '%' on line %" }), _value74, _line71)); }; -let r_41 = _sym; -let r_42 = r_41.values[0]; -let _sym_ty = r_42; -if (runtime.opEq(_sym_ty, ({ type: "string", value: "builtin" }))) { -let r_43 = _sym; -let r_44 = r_43.values[0]; -let r_45 = r_43.values[1]; -let _id = r_45; -(runtime.setLine(74), _emit((runtime.setLine(74), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "((...args) => runtime.%(...args))" }), _id)))); +const r_59 = _sym75; +const r_60 = r_59.values[0] ?? { type: "null"}; +let _sym_id76 = r_60; +const r_61 = r_59.values[1] ?? { type: "null"}; +let _sym_ty77 = r_61; +if (runtime.truthy(runtime.opEq(_sym_ty77, ({ type: "string", value: "builtin" })))) { +const r_62 = _sym75; +const r_63 = r_62.values[0] ?? { type: "null"}; +const r_64 = r_62.values[1] ?? { type: "null"}; +const r_65 = r_62.values[2] ?? { type: "null"}; +let _id78 = r_65; +(runtime.setLine(109), _emit39((runtime.setLine(109), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "((...args) => runtime.%(...args))" }), _id78)))); } else { -if (runtime.opEq(_sym_ty, ({ type: "string", value: "fn" }))) { -(runtime.setLine(76), _emit((runtime.setLine(76), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%" }), _value)))); +if (runtime.truthy(runtime.opEq(_sym_ty77, ({ type: "string", value: "fn" })))) { +(runtime.setLine(111), _emit39((runtime.setLine(111), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value74, _sym_id76)))); } else { -if (runtime.opEq(_sym_ty, ({ type: "string", value: "param" }))) { -(runtime.setLine(78), _emit((runtime.setLine(78), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%" }), _value)))); +if (runtime.truthy(runtime.opEq(_sym_ty77, ({ type: "string", value: "param" })))) { +(runtime.setLine(113), _emit39((runtime.setLine(113), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value74, _sym_id76)))); } else { -if (runtime.opEq(_sym_ty, ({ type: "string", value: "let" }))) { -(runtime.setLine(80), _emit((runtime.setLine(80), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%" }), _value)))); +if (runtime.truthy(runtime.opEq(_sym_ty77, ({ type: "string", value: "let" })))) { +(runtime.setLine(115), _emit39((runtime.setLine(115), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value74, _sym_id76)))); } else { -(runtime.setLine(82), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented '%'" }), _sym_ty)); +(runtime.setLine(117), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented '%'" }), _sym_ty77)); }}}}; } else { -(runtime.setLine(85), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "unknown expr type '%' on line %" }), _ty, _line)); +(runtime.setLine(120), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "unknown expr type '%' on line %" }), _ty70, _line71)); }}}}; ; runtime.popCall(); return { type: "null" }; }; -function _emit_list(_expr) { +function _emit_list34(_expr79) { runtime.pushCall("emit_list"); -let r_46 = _expr; -let r_47 = r_46.values[0]; -let _ty = r_47; -let r_48 = r_46.values[1]; -let _line = r_48; -let r_49 = r_46.values[2]; -let _s = r_49; -if (runtime.opEq((runtime.setLine(91), ((...args) => runtime.builtinLen(...args))(_s)), ({ type: "int", value: 0 }))) { -(runtime.setLine(92), _emit(({ type: "string", value: "({ type: \"list\", values: [] })" }))); +const r_66 = _expr79; +const r_67 = r_66.values[0] ?? { type: "null"}; +let _ty80 = r_67; +const r_68 = r_66.values[1] ?? { type: "null"}; +let _line81 = r_68; +const r_69 = r_66.values[2] ?? { type: "null"}; +let _s82 = r_69; +if (runtime.truthy(runtime.opEq((runtime.setLine(126), ((...args) => runtime.builtinLen(...args))(_s82)), ({ type: "int", value: 0 })))) { +(runtime.setLine(127), _emit39(({ type: "string", value: "({ type: \"list\", values: [] })" }))); runtime.popCall(); return { type: "null" }; }; -let r_50 = _s; -let r_51 = r_50.values[0]; -let r_52 = r_51.values[0]; -let _id_ty = r_52; -let r_53 = r_51.values[1]; -let r_54 = r_51.values[2]; -let _id = r_54; -if (runtime.opNe(_id_ty, ({ type: "string", value: "ident" }))) { -(runtime.setLine(97), _emit(({ type: "string", value: "({ type: \"list\", values: [] })" }))); +const r_70 = _s82; +const r_71 = r_70.values[0] ?? { type: "null"}; +const r_72 = r_71.values[0] ?? { type: "null"}; +let _id_ty83 = r_72; +const r_73 = r_71.values[1] ?? { type: "null"}; +const r_74 = r_71.values[2] ?? { type: "null"}; +let _id84 = r_74; +if (runtime.truthy(runtime.opNe(_id_ty83, ({ type: "string", value: "ident" })))) { +(runtime.setLine(132), _emit_list_literal35(_s82)); runtime.popCall(); return { type: "null" }; }; -if (runtime.opEq(_id, ({ type: "string", value: "fn" }))) { -let r_55 = _s; -let r_56 = r_55.values[0]; -let r_57 = r_55.values[1]; -let r_58 = r_57.values[0]; -let r_59 = r_57.values[1]; -let r_60 = r_57.values[2]; -let _name = r_60; -let r_61 = r_55.values[2]; -let r_62 = r_61.values[0]; -let r_63 = r_61.values[1]; -let r_64 = r_61.values[2]; -let _params = r_64; -let r_65 = r_55.values[3]; -let _body = r_65; -(runtime.setLine(102), _emit((runtime.setLine(102), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "function _%(" }), _name)))); -(runtime.setLine(104), _enter_scope()); -let r_66 = ({ type: "bool", value: true }); -let _first = r_66; -for (let [, , _name] of _params.values) { -if (runtime.opNot(_first)) { -(runtime.setLine(109), _emit(({ type: "string", value: ", " }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "fn" })))) { +const r_75 = _s82; +const r_76 = r_75.values[0] ?? { type: "null"}; +const r_77 = r_75.values[1] ?? { type: "null"}; +const r_78 = r_77.values[0] ?? { type: "null"}; +const r_79 = r_77.values[1] ?? { type: "null"}; +const r_80 = r_77.values[2] ?? { type: "null"}; +let _ident85 = r_80; +const r_81 = r_75.values[2] ?? { type: "null"}; +const r_82 = r_81.values[0] ?? { type: "null"}; +const r_83 = r_81.values[1] ?? { type: "null"}; +const r_84 = r_81.values[2] ?? { type: "null"}; +let _params86 = r_84; +const r_85 = r_75.values[3] ?? { type: "null"}; +let _body87 = r_85; +const r_86 = (runtime.setLine(138), _get_sym48(_ident85)); +let _sym88 = r_86; +const r_87 = _sym88; +const r_88 = r_87.values[0] ?? { type: "null"}; +let _sym_id89 = r_88; +(runtime.setLine(141), _emit39((runtime.setLine(141), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "function _%%(" }), _ident85, _sym_id89)))); +(runtime.setLine(143), _enter_scope45()); +const r_89 = ({ type: "bool", value: true }); +let _first90 = r_89; +for (const r_90 of _params86.values) {; +const r_91 = r_90.values[0] ?? { type: "null"}; +const r_92 = r_90.values[1] ?? { type: "null"}; +const r_93 = r_90.values[2] ?? { type: "null"}; +let _ident91 = r_93; +if (runtime.truthy(runtime.opNot(_first90))) { +(runtime.setLine(148), _emit39(({ type: "string", value: ", " }))); }; -(_106 = runtime.assignValue(({ type: "bool", value: false }))); -(runtime.setLine(113), _emit((runtime.setLine(113), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%" }), _name)))); -(runtime.setLine(115), _define_sym(_name, ({ type: "list", values: [] }))); +(_first90 = ({ type: "bool", value: false })); +const r_94 = (runtime.setLine(152), _define_param42(_ident91, _line81)); +let _sym_id92 = r_94; +(runtime.setLine(153), _emit39((runtime.setLine(153), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _ident91, _sym_id92)))); }; -(runtime.setLine(119), _emit((runtime.setLine(119), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ") {\n" }), _name)))); -(runtime.setLine(120), _emit((runtime.setLine(120), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.pushCall(\"%\");\n" }), _name)))); -(runtime.setLine(122), _emit_expr(_body)); -(runtime.setLine(123), _emit(({ type: "string", value: ";\nruntime.popCall();\nreturn { type: \"null\" };\n}" }))); -(runtime.setLine(125), _leave_scope()); +(runtime.setLine(157), _emit39(({ type: "string", value: ") {\n" }))); +(runtime.setLine(158), _emit39((runtime.setLine(158), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.pushCall(\"%\");\n" }), _ident85)))); +(runtime.setLine(160), _emit_expr33(_body87)); +(runtime.setLine(161), _emit39(({ type: "string", value: ";\nruntime.popCall();\nreturn { type: \"null\" };\n}" }))); +(runtime.setLine(163), _leave_scope46()); } else { -if (runtime.opEq(_id, ({ type: "string", value: "let" }))) { -let r_67 = _s; -let r_68 = r_67.values[0]; -let r_69 = r_67.values[1]; -let _pat = r_69; -let r_70 = r_67.values[2]; -let _expr = r_70; -let r_71 = (runtime.setLine(128), _let_node_reg_count()); -let _reg = r_71; -(runtime.setLine(129), _let_node_reg_increment()); -(runtime.setLine(130), _emit((runtime.setLine(130), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "let r_% = " }), _reg)))); -(runtime.setLine(131), _emit_expr(_expr)); -(runtime.setLine(132), _emit_let_node(_pat, _reg)); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "let" })))) { +const r_95 = _s82; +const r_96 = r_95.values[0] ?? { type: "null"}; +const r_97 = r_95.values[1] ?? { type: "null"}; +let _pat93 = r_97; +const r_98 = r_95.values[2] ?? { type: "null"}; +let _expr94 = r_98; +const r_99 = (runtime.setLine(166), _let_node_reg_count50()); +let _reg95 = r_99; +(runtime.setLine(167), _let_node_reg_increment51()); +(runtime.setLine(168), _emit39((runtime.setLine(168), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "const r_% = " }), _reg95)))); +(runtime.setLine(169), _emit_expr33(_expr94)); +(runtime.setLine(170), _emit_let_node36(_pat93, _reg95)); } else { -if (runtime.opEq(_id, ({ type: "string", value: "do" }))) { -(runtime.setLine(134), _enter_scope()); -(runtime.setLine(135), _discover_syms((runtime.setLine(135), _slice(_s, ({ type: "int", value: 1 }))))); -(runtime.setLine(136), _emit_exprs((runtime.setLine(136), _slice(_s, ({ type: "int", value: 1 }))))); -(runtime.setLine(137), _leave_scope()); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "do" })))) { +(runtime.setLine(172), _enter_scope45()); +(runtime.setLine(173), _discover_syms32((runtime.setLine(173), _slice26(_s82, ({ type: "int", value: 1 }))))); +(runtime.setLine(174), _emit_exprs31((runtime.setLine(174), _slice26(_s82, ({ type: "int", value: 1 }))))); +(runtime.setLine(175), _leave_scope46()); } else { -if (runtime.opEq(_id, ({ type: "string", value: "for" }))) { -let r_72 = _s; -let r_73 = r_72.values[0]; -let r_74 = r_72.values[1]; -let _pat = r_74; -let r_75 = r_72.values[2]; -let _expr = r_75; -let r_76 = r_72.values[3]; -let _body = r_76; -(runtime.setLine(140), _enter_scope()); -(runtime.setLine(141), _emit(({ type: "string", value: "for (let " }))); -(runtime.setLine(142), _emit_pat(_pat)); -(runtime.setLine(143), _emit(({ type: "string", value: " of " }))); -(runtime.setLine(144), _emit_expr(_expr)); -(runtime.setLine(145), _emit(({ type: "string", value: ".values) {\n" }))); -(runtime.setLine(146), _emit_expr(_body)); -(runtime.setLine(147), _emit(({ type: "string", value: "}" }))); -(runtime.setLine(148), _leave_scope()); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "for" })))) { +const r_100 = _s82; +const r_101 = r_100.values[0] ?? { type: "null"}; +const r_102 = r_100.values[1] ?? { type: "null"}; +let _pat96 = r_102; +const r_103 = r_100.values[2] ?? { type: "null"}; +let _expr97 = r_103; +const r_104 = r_100.values[3] ?? { type: "null"}; +let _body98 = r_104; +const r_105 = (runtime.setLine(179), _let_node_reg_count50()); +let _reg99 = r_105; +(runtime.setLine(180), _let_node_reg_increment51()); +(runtime.setLine(181), _emit39((runtime.setLine(181), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "for (const r_% of " }), _reg99)))); +(runtime.setLine(182), _emit_expr33(_expr97)); +(runtime.setLine(183), _emit39(({ type: "string", value: ".values) {" }))); +(runtime.setLine(185), _enter_scope45()); +(runtime.setLine(186), _emit_let_node36(_pat96, _reg99)); +(runtime.setLine(187), _enter_scope45()); +(runtime.setLine(189), _emit39(({ type: "string", value: ";\n" }))); +(runtime.setLine(190), _emit_expr33(_body98)); +(runtime.setLine(191), _emit39(({ type: "string", value: "}" }))); +(runtime.setLine(193), _leave_scope46()); +(runtime.setLine(194), _leave_scope46()); } else { -if (runtime.opEq(_id, ({ type: "string", value: "loop" }))) { -let r_77 = _s; -let r_78 = r_77.values[0]; -let r_79 = r_77.values[1]; -let _body = r_79; -(runtime.setLine(151), _emit(({ type: "string", value: "while (true) {\n" }))); -(runtime.setLine(152), _emit_expr(_body)); -(runtime.setLine(153), _emit(({ type: "string", value: "}" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "loop" })))) { +const r_106 = _s82; +const r_107 = r_106.values[0] ?? { type: "null"}; +const r_108 = r_106.values[1] ?? { type: "null"}; +let _body100 = r_108; +(runtime.setLine(197), _emit39(({ type: "string", value: "while (true) {\n" }))); +(runtime.setLine(198), _emit_expr33(_body100)); +(runtime.setLine(199), _emit39(({ type: "string", value: "}" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "if" }))) { -let r_80 = _s; -let r_81 = r_80.values[0]; -let r_82 = r_80.values[1]; -let _cond = r_82; -let r_83 = r_80.values[2]; -let _truthy = r_83; -let r_84 = r_80.values[3]; -let _falsy = r_84; -(runtime.setLine(156), _emit(({ type: "string", value: "if (" }))); -(runtime.setLine(157), _emit_expr(_cond)); -(runtime.setLine(158), _emit(({ type: "string", value: ") {\n" }))); -(runtime.setLine(159), _emit_expr(_truthy)); -(runtime.setLine(160), _emit(({ type: "string", value: "}" }))); -if (runtime.opNe(_falsy, ({ type: "null" }))) { -(runtime.setLine(162), _emit(({ type: "string", value: " else {\n" }))); -(runtime.setLine(163), _emit_expr(_falsy)); -(runtime.setLine(164), _emit(({ type: "string", value: "}" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "if" })))) { +const r_109 = _s82; +const r_110 = r_109.values[0] ?? { type: "null"}; +const r_111 = r_109.values[1] ?? { type: "null"}; +let _cond101 = r_111; +const r_112 = r_109.values[2] ?? { type: "null"}; +let _truthy102 = r_112; +const r_113 = r_109.values[3] ?? { type: "null"}; +let _falsy103 = r_113; +(runtime.setLine(202), _emit39(({ type: "string", value: "if (runtime.truthy(" }))); +(runtime.setLine(203), _emit_expr33(_cond101)); +(runtime.setLine(204), _emit39(({ type: "string", value: ")) {\n" }))); +(runtime.setLine(205), _emit_expr33(_truthy102)); +(runtime.setLine(206), _emit39(({ type: "string", value: "}" }))); +if (runtime.truthy(runtime.opNe(_falsy103, ({ type: "null" })))) { +(runtime.setLine(208), _emit39(({ type: "string", value: " else {\n" }))); +(runtime.setLine(209), _emit_expr33(_falsy103)); +(runtime.setLine(210), _emit39(({ type: "string", value: "}" }))); }; } else { -if (runtime.opEq(_id, ({ type: "string", value: "return" }))) { -let r_85 = _s; -let r_86 = r_85.values[0]; -let r_87 = r_85.values[1]; -let _value = r_87; -(runtime.setLine(168), _emit(({ type: "string", value: "runtime.popCall();\n" }))); -(runtime.setLine(169), _emit(({ type: "string", value: "return " }))); -if (runtime.opNe(_value, ({ type: "null" }))) { -(runtime.setLine(171), _emit_expr(_value)); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "return" })))) { +const r_114 = _s82; +const r_115 = r_114.values[0] ?? { type: "null"}; +const r_116 = r_114.values[1] ?? { type: "null"}; +let _value104 = r_116; +(runtime.setLine(214), _emit39(({ type: "string", value: "runtime.popCall();\n" }))); +(runtime.setLine(215), _emit39(({ type: "string", value: "return " }))); +if (runtime.truthy(runtime.opNe(_value104, ({ type: "null" })))) { +(runtime.setLine(217), _emit_expr33(_value104)); } else { -(runtime.setLine(173), _emit(({ type: "string", value: "{ type: \"null\" }" }))); +(runtime.setLine(219), _emit39(({ type: "string", value: "{ type: \"null\" }" }))); }; } else { -if (runtime.opEq(_id, ({ type: "string", value: "break" }))) { -let r_88 = _s; -let r_89 = r_88.values[0]; -let r_90 = r_88.values[1]; -let _value = r_90; -(runtime.setLine(177), _emit(({ type: "string", value: "break" }))); -if (runtime.opNe(_value, ({ type: "null" }))) { -(runtime.setLine(179), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "break" })))) { +const r_117 = _s82; +const r_118 = r_117.values[0] ?? { type: "null"}; +const r_119 = r_117.values[1] ?? { type: "null"}; +let _value105 = r_119; +(runtime.setLine(223), _emit39(({ type: "string", value: "break" }))); +if (runtime.truthy(runtime.opNe(_value105, ({ type: "null" })))) { +(runtime.setLine(225), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" }))); }; } else { -if (runtime.opEq(_id, ({ type: "string", value: "call" }))) { -let r_91 = _s; -let r_92 = r_91.values[0]; -let r_93 = r_91.values[1]; -let _callee = r_93; -let r_94 = (runtime.setLine(183), _slice(_s, ({ type: "int", value: 2 }))); -let _args = r_94; -(runtime.setLine(184), _emit((runtime.setLine(184), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%), " }), _line)))); -(runtime.setLine(185), _emit_expr(_callee)); -(runtime.setLine(186), _emit(({ type: "string", value: "(" }))); -let r_95 = ({ type: "bool", value: true }); -let _first = r_95; -for (let _arg of _args.values) { -if (runtime.opNot(_first)) { -(runtime.setLine(191), _emit(({ type: "string", value: ", " }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "call" })))) { +const r_120 = _s82; +const r_121 = r_120.values[0] ?? { type: "null"}; +const r_122 = r_120.values[1] ?? { type: "null"}; +let _callee106 = r_122; +const r_123 = (runtime.setLine(229), _slice26(_s82, ({ type: "int", value: 2 }))); +let _args107 = r_123; +(runtime.setLine(230), _emit39((runtime.setLine(230), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%), " }), _line81)))); +(runtime.setLine(231), _emit_expr33(_callee106)); +(runtime.setLine(232), _emit39(({ type: "string", value: "(" }))); +const r_124 = ({ type: "bool", value: true }); +let _first108 = r_124; +for (const r_125 of _args107.values) {; +let _arg109 = r_125; +if (runtime.truthy(runtime.opNot(_first108))) { +(runtime.setLine(237), _emit39(({ type: "string", value: ", " }))); }; -(_188 = runtime.assignValue(({ type: "bool", value: false }))); -(runtime.setLine(195), _emit_expr(_arg)); +(_first108 = ({ type: "bool", value: false })); +(runtime.setLine(241), _emit_expr33(_arg109)); }; -(runtime.setLine(198), _emit(({ type: "string", value: "))" }))); +(runtime.setLine(244), _emit39(({ type: "string", value: "))" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "=" }))) { -(runtime.setLine(200), _emit_assign_expr(_s, _line, ({ type: "string", value: "=" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "=" })))) { +(runtime.setLine(246), _emit_assign_expr38(_s82, _line81, ({ type: "string", value: "=" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "+=" }))) { -(runtime.setLine(202), _emit_assign_expr(_s, _line, ({ type: "string", value: "+" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "+=" })))) { +(runtime.setLine(248), _emit_assign_expr38(_s82, _line81, ({ type: "string", value: "+" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "-=" }))) { -(runtime.setLine(204), _emit_assign_expr(_s, _line, ({ type: "string", value: "-" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "-=" })))) { +(runtime.setLine(250), _emit_assign_expr38(_s82, _line81, ({ type: "string", value: "-" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "or" }))) { -let r_96 = _s; -let r_97 = r_96.values[0]; -let r_98 = r_96.values[1]; -let _left = r_98; -let r_99 = r_96.values[2]; -let _right = r_99; -(runtime.setLine(207), _emit((runtime.setLine(207), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line)))); -(runtime.setLine(208), _emit(({ type: "string", value: ", { type: \"bool\", value: this.runtime.truthy(" }))); -(runtime.setLine(209), _emit_expr(_left)); -(runtime.setLine(210), _emit(({ type: "string", value: ") || this.runtime.falsy(" }))); -(runtime.setLine(211), _emit_expr(_right)); -(runtime.setLine(212), _emit(({ type: "string", value: ") })" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "or" })))) { +const r_126 = _s82; +const r_127 = r_126.values[0] ?? { type: "null"}; +const r_128 = r_126.values[1] ?? { type: "null"}; +let _left110 = r_128; +const r_129 = r_126.values[2] ?? { type: "null"}; +let _right111 = r_129; +(runtime.setLine(253), _emit39((runtime.setLine(253), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line81)))); +(runtime.setLine(254), _emit39(({ type: "string", value: ", { type: \"bool\", value: runtime.truthy(" }))); +(runtime.setLine(255), _emit_expr33(_left110)); +(runtime.setLine(256), _emit39(({ type: "string", value: ") || runtime.truthy(" }))); +(runtime.setLine(257), _emit_expr33(_right111)); +(runtime.setLine(258), _emit39(({ type: "string", value: ") })" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "and" }))) { -let r_100 = _s; -let r_101 = r_100.values[0]; -let r_102 = r_100.values[1]; -let _left = r_102; -let r_103 = r_100.values[2]; -let _right = r_103; -(runtime.setLine(215), _emit((runtime.setLine(215), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line)))); -(runtime.setLine(216), _emit(({ type: "string", value: ", { type: \"bool\", value: this.runtime.truthy(" }))); -(runtime.setLine(217), _emit_expr(_left)); -(runtime.setLine(218), _emit(({ type: "string", value: ") && this.runtime.falsy(" }))); -(runtime.setLine(219), _emit_expr(_right)); -(runtime.setLine(220), _emit(({ type: "string", value: ") })" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "and" })))) { +const r_130 = _s82; +const r_131 = r_130.values[0] ?? { type: "null"}; +const r_132 = r_130.values[1] ?? { type: "null"}; +let _left112 = r_132; +const r_133 = r_130.values[2] ?? { type: "null"}; +let _right113 = r_133; +(runtime.setLine(261), _emit39((runtime.setLine(261), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line81)))); +(runtime.setLine(262), _emit39(({ type: "string", value: ", { type: \"bool\", value: runtime.truthy(" }))); +(runtime.setLine(263), _emit_expr33(_left112)); +(runtime.setLine(264), _emit39(({ type: "string", value: ") && runtime.truthy(" }))); +(runtime.setLine(265), _emit_expr33(_right113)); +(runtime.setLine(266), _emit39(({ type: "string", value: ") })" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "==" }))) { -(runtime.setLine(222), _emit_binary_op(_s, ({ type: "string", value: "opEq" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "==" })))) { +(runtime.setLine(268), _emit_binary_op37(_s82, ({ type: "string", value: "opEq" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "!=" }))) { -(runtime.setLine(224), _emit_binary_op(_s, ({ type: "string", value: "opNe" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "!=" })))) { +(runtime.setLine(270), _emit_binary_op37(_s82, ({ type: "string", value: "opNe" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "<" }))) { -(runtime.setLine(226), _emit_binary_op(_s, ({ type: "string", value: "opLt" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "<" })))) { +(runtime.setLine(272), _emit_binary_op37(_s82, ({ type: "string", value: "opLt" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: ">" }))) { -(runtime.setLine(228), _emit_binary_op(_s, ({ type: "string", value: "opGt" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: ">" })))) { +(runtime.setLine(274), _emit_binary_op37(_s82, ({ type: "string", value: "opGt" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "<=" }))) { -(runtime.setLine(230), _emit_binary_op(_s, ({ type: "string", value: "opLte" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "<=" })))) { +(runtime.setLine(276), _emit_binary_op37(_s82, ({ type: "string", value: "opLte" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: ">=" }))) { -(runtime.setLine(232), _emit_binary_op(_s, ({ type: "string", value: "opGte" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: ">=" })))) { +(runtime.setLine(278), _emit_binary_op37(_s82, ({ type: "string", value: "opGte" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "+" }))) { -(runtime.setLine(234), _emit_binary_op(_s, ({ type: "string", value: "opAdd" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "+" })))) { +(runtime.setLine(280), _emit_binary_op37(_s82, ({ type: "string", value: "opAdd" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "-" }))) { -(runtime.setLine(236), _emit_binary_op(_s, ({ type: "string", value: "opSub" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "-" })))) { +(runtime.setLine(282), _emit_binary_op37(_s82, ({ type: "string", value: "opSub" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "not" }))) { -let r_104 = _s; -let r_105 = r_104.values[0]; -let r_106 = r_104.values[1]; -let _expr = r_106; -(runtime.setLine(239), _emit(({ type: "string", value: "runtime.opNot(" }))); -(runtime.setLine(240), _emit_expr(_expr)); -(runtime.setLine(241), _emit(({ type: "string", value: ")" }))); +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "not" })))) { +const r_134 = _s82; +const r_135 = r_134.values[0] ?? { type: "null"}; +const r_136 = r_134.values[1] ?? { type: "null"}; +let _expr114 = r_136; +(runtime.setLine(285), _emit39(({ type: "string", value: "runtime.opNot(" }))); +(runtime.setLine(286), _emit_expr33(_expr114)); +(runtime.setLine(287), _emit39(({ type: "string", value: ")" }))); } else { -(runtime.setLine(243), _emit(({ type: "string", value: "({ type: \"list\", values: [" }))); -let r_107 = ({ type: "bool", value: true }); -let _first = r_107; -for (let _e of _s.values) { -if (runtime.opNot(_first)) { -(runtime.setLine(247), _emit(({ type: "string", value: ", " }))); -}; -(_244 = runtime.assignValue(({ type: "bool", value: false }))); -(runtime.setLine(251), _emit_expr(_e)); -}; -(runtime.setLine(253), _emit(({ type: "string", value: "] })" }))); +(runtime.setLine(289), _emit_list_literal35(_s82)); }}}}}}}}}}}}}}}}}}}}}}}; ; runtime.popCall(); return { type: "null" }; }; -function _emit_let_node(_pat, _base_reg) { +function _emit_list_literal35(_s115) { +runtime.pushCall("emit_list_literal"); +(runtime.setLine(294), _emit39(({ type: "string", value: "({ type: \"list\", values: [" }))); +const r_137 = ({ type: "bool", value: true }); +let _first116 = r_137; +for (const r_138 of _s115.values) {; +let _e117 = r_138; +if (runtime.truthy(runtime.opNot(_first116))) { +(runtime.setLine(298), _emit39(({ type: "string", value: ", " }))); +}; +(_first116 = ({ type: "bool", value: false })); +(runtime.setLine(302), _emit_expr33(_e117)); +}; +(runtime.setLine(304), _emit39(({ type: "string", value: "] })" }))); +; +runtime.popCall(); +return { type: "null" }; +}; +function _emit_let_node36(_pat118, _base_reg119) { runtime.pushCall("emit_let_node"); -let r_108 = _pat; -let r_109 = r_108.values[0]; -let _pat_ty = r_109; -let r_110 = r_108.values[1]; -let _line = r_110; -if (runtime.opEq(_pat_ty, ({ type: "string", value: "ident" }))) { -let r_111 = _pat; -let r_112 = r_111.values[0]; -let r_113 = r_111.values[1]; -let r_114 = r_111.values[2]; -let _ident = r_114; -if (runtime.opEq(_ident, ({ type: "string", value: "_" }))) { +const r_139 = _pat118; +const r_140 = r_139.values[0] ?? { type: "null"}; +let _pat_ty120 = r_140; +const r_141 = r_139.values[1] ?? { type: "null"}; +let _line121 = r_141; +if (runtime.truthy(runtime.opEq(_pat_ty120, ({ type: "string", value: "ident" })))) { +const r_142 = _pat118; +const r_143 = r_142.values[0] ?? { type: "null"}; +const r_144 = r_142.values[1] ?? { type: "null"}; +const r_145 = r_142.values[2] ?? { type: "null"}; +let _ident122 = r_145; +if (runtime.truthy(runtime.opEq(_ident122, ({ type: "string", value: "_" })))) { runtime.popCall(); return { type: "null" }}; -(runtime.setLine(264), _emit((runtime.setLine(264), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nlet _% = r_%" }), _ident, _base_reg)))); -(runtime.setLine(265), _define_sym(_ident, ({ type: "list", values: [] }))); +const r_146 = (runtime.setLine(314), _define_let43(_ident122, _line121)); +let _sym_id123 = r_146; +(runtime.setLine(315), _emit39((runtime.setLine(315), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nlet _%% = r_%" }), _ident122, _sym_id123, _base_reg119)))); } else { -if (runtime.opEq(_pat_ty, ({ type: "string", value: "list" }))) { -let r_115 = _pat; -let r_116 = r_115.values[0]; -let r_117 = r_115.values[1]; -let r_118 = r_115.values[2]; -let _pats = r_118; -let r_119 = ({ type: "int", value: 0 }); -let _i = r_119; -for (let _pat of _pats.values) { -let r_120 = (runtime.setLine(271), _let_node_reg_count()); -let _reg = r_120; -(runtime.setLine(272), _let_node_reg_increment()); -(runtime.setLine(273), _emit((runtime.setLine(273), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nlet r_% = r_%.values[%]" }), _reg, _base_reg, _i)))); -(runtime.setLine(274), _emit_let_node(_pat, _reg)); -(_269 = runtime.assignValue(runtime.opAdd(_269, ({ type: "int", value: 1 })))); +if (runtime.truthy(runtime.opEq(_pat_ty120, ({ type: "string", value: "list" })))) { +const r_147 = _pat118; +const r_148 = r_147.values[0] ?? { type: "null"}; +const r_149 = r_147.values[1] ?? { type: "null"}; +const r_150 = r_147.values[2] ?? { type: "null"}; +let _pats124 = r_150; +const r_151 = ({ type: "int", value: 0 }); +let _i125 = r_151; +for (const r_152 of _pats124.values) {; +let _pat126 = r_152; +const r_153 = (runtime.setLine(337), _let_node_reg_count50()); +let _reg127 = r_153; +(runtime.setLine(338), _let_node_reg_increment51()); +(runtime.setLine(339), _emit39((runtime.setLine(339), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nconst r_% = r_%.values[%] ?? { type: \"null\"}" }), _reg127, _base_reg119, _i125)))); +(runtime.setLine(343), _emit_let_node36(_pat126, _reg127)); +(_i125 = runtime.opAdd(_i125, ({ type: "int", value: 1 }))); }; } else { -(runtime.setLine(278), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "malformed pattern on line %" }), _line)); +(runtime.setLine(347), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "malformed pattern on line %" }), _line121)); }}; ; runtime.popCall(); return { type: "null" }; }; -function _emit_binary_op(_s, _id) { +function _emit_binary_op37(_s128, _id129) { runtime.pushCall("emit_binary_op"); -let r_121 = _s; -let r_122 = r_121.values[0]; -let r_123 = r_121.values[1]; -let _left = r_123; -let r_124 = r_121.values[2]; -let _right = r_124; -(runtime.setLine(284), _emit((runtime.setLine(284), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.%(" }), _id)))); -(runtime.setLine(285), _emit_expr(_left)); -(runtime.setLine(286), _emit(({ type: "string", value: ", " }))); -(runtime.setLine(287), _emit_expr(_right)); -(runtime.setLine(288), _emit(({ type: "string", value: ")" }))); +const r_154 = _s128; +const r_155 = r_154.values[0] ?? { type: "null"}; +const r_156 = r_154.values[1] ?? { type: "null"}; +let _left130 = r_156; +const r_157 = r_154.values[2] ?? { type: "null"}; +let _right131 = r_157; +(runtime.setLine(353), _emit39((runtime.setLine(353), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.%(" }), _id129)))); +(runtime.setLine(354), _emit_expr33(_left130)); +(runtime.setLine(355), _emit39(({ type: "string", value: ", " }))); +(runtime.setLine(356), _emit_expr33(_right131)); +(runtime.setLine(357), _emit39(({ type: "string", value: ")" }))); ; runtime.popCall(); return { type: "null" }; }; -function _emit_assign_expr(_s, _line, _id) { +function _emit_assign_expr38(_s132, _line133, _id134) { runtime.pushCall("emit_assign_expr"); -let r_125 = _s; -let r_126 = r_125.values[0]; -let r_127 = r_125.values[1]; -let r_128 = r_127.values[0]; -let _target_type = r_128; -let r_129 = r_125.values[2]; -let _expr = r_129; -if (runtime.opNe(_target_type, ({ type: "string", value: "ident" }))) { -(runtime.setLine(294), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to expression on line %" }), _line)); +const r_158 = _s132; +const r_159 = r_158.values[0] ?? { type: "null"}; +const r_160 = r_158.values[1] ?? { type: "null"}; +const r_161 = r_160.values[0] ?? { type: "null"}; +let _target_type135 = r_161; +const r_162 = r_158.values[2] ?? { type: "null"}; +let _expr136 = r_162; +if (runtime.truthy(runtime.opNe(_target_type135, ({ type: "string", value: "ident" })))) { +(runtime.setLine(363), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to expression on line %" }), _line133)); }; -let r_130 = _s; -let r_131 = r_130.values[0]; -let r_132 = r_130.values[1]; -let r_133 = r_132.values[0]; -let r_134 = r_132.values[1]; -let r_135 = r_132.values[2]; -let _ident = r_135; -let r_136 = (runtime.setLine(297), _get_sym(_ident)); -let _sym = r_136; -if (runtime.opEq(_sym, ({ type: "null" }))) { -(runtime.setLine(299), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "could not find symbol '%' on line %" }), _ident, _line)); +const r_163 = _s132; +const r_164 = r_163.values[0] ?? { type: "null"}; +const r_165 = r_163.values[1] ?? { type: "null"}; +const r_166 = r_165.values[0] ?? { type: "null"}; +const r_167 = r_165.values[1] ?? { type: "null"}; +const r_168 = r_165.values[2] ?? { type: "null"}; +let _ident137 = r_168; +const r_169 = (runtime.setLine(366), _get_sym48(_ident137)); +let _sym138 = r_169; +if (runtime.truthy(runtime.opEq(_sym138, ({ type: "null" })))) { +(runtime.setLine(368), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "could not find symbol '%' on line %" }), _ident137, _line133)); }; -let r_137 = _sym; -let r_138 = r_137.values[0]; -let _sym_type = r_138; -let r_139 = r_137.values[1]; -let _sym_ident = r_139; -let r_140 = r_137.values[2]; -if (runtime.opEq(_sym_type, ({ type: "string", value: "let" }))) { -(runtime.setLine(303), _emit((runtime.setLine(303), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(_% = runtime.assignValue(" }), _sym_ident)))); -if (runtime.opEq(_id, ({ type: "string", value: "=" }))) { -(runtime.setLine(305), _emit_expr(_expr)); +const r_170 = _sym138; +const r_171 = r_170.values[0] ?? { type: "null"}; +let _sym_id139 = r_171; +const r_172 = r_170.values[1] ?? { type: "null"}; +let _sym_type140 = r_172; +const r_173 = r_170.values[2] ?? { type: "null"}; +let _sym_ident141 = r_173; +const r_174 = r_170.values[3] ?? { type: "null"}; +if (runtime.truthy(runtime.opEq(_sym_type140, ({ type: "string", value: "let" })))) { +(runtime.setLine(372), _emit39((runtime.setLine(372), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(_%% = " }), _sym_ident141, _sym_id139)))); +if (runtime.truthy(runtime.opEq(_id134, ({ type: "string", value: "=" })))) { +(runtime.setLine(374), _emit_expr33(_expr136)); } else { -if (runtime.opEq(_id, ({ type: "string", value: "+" }))) { -(runtime.setLine(307), _emit((runtime.setLine(307), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opAdd(_%, " }), _sym_ident)))); -(runtime.setLine(308), _emit_expr(_expr)); -(runtime.setLine(309), _emit(({ type: "string", value: ")" }))); +if (runtime.truthy(runtime.opEq(_id134, ({ type: "string", value: "+" })))) { +(runtime.setLine(376), _emit39((runtime.setLine(376), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opAdd(_%%, " }), _sym_ident141, _sym_id139)))); +(runtime.setLine(377), _emit_expr33(_expr136)); +(runtime.setLine(378), _emit39(({ type: "string", value: ")" }))); } else { -if (runtime.opEq(_id, ({ type: "string", value: "-" }))) { -(runtime.setLine(311), _emit((runtime.setLine(311), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opSub(_%, " }), _sym_ident)))); -(runtime.setLine(312), _emit_expr(_expr)); -(runtime.setLine(313), _emit(({ type: "string", value: ")" }))); +if (runtime.truthy(runtime.opEq(_id134, ({ type: "string", value: "-" })))) { +(runtime.setLine(380), _emit39((runtime.setLine(380), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opSub(_%%, " }), _sym_ident141, _sym_id139)))); +(runtime.setLine(381), _emit_expr33(_expr136)); +(runtime.setLine(382), _emit39(({ type: "string", value: ")" }))); } else { -(runtime.setLine(315), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" }))); +(runtime.setLine(384), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" }))); }}}; -(runtime.setLine(317), _emit(({ type: "string", value: "))" }))); +(runtime.setLine(386), _emit39(({ type: "string", value: ")" }))); } else { -(runtime.setLine(319), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to symbol '%' on line %" }), _sym_ident, _line)); +(runtime.setLine(388), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to symbol '%' on line %" }), _sym_ident141, _line133)); }; ; runtime.popCall(); return { type: "null" }; }; -function _emit_pat(_pat) { -runtime.pushCall("emit_pat"); -let r_141 = _pat; -let r_142 = r_141.values[0]; -let _ty = r_142; -if (runtime.opEq(_ty, ({ type: "string", value: "ident" }))) { -let r_143 = _pat; -let r_144 = r_143.values[0]; -let r_145 = r_143.values[1]; -let _line = r_145; -let r_146 = r_143.values[2]; -let _name = r_146; -if (runtime.opEq(_name, ({ type: "string", value: "_" }))) { -runtime.popCall(); -return { type: "null" }; -}; -(runtime.setLine(330), _emit((runtime.setLine(330), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%" }), _name)))); -(runtime.setLine(331), _define_sym(_name, ({ type: "list", values: [] }))); -} else { -if (runtime.opEq(_ty, ({ type: "string", value: "list" }))) { -let r_147 = _pat; -let r_148 = r_147.values[0]; -let r_149 = r_147.values[1]; -let r_150 = r_147.values[2]; -let _pats = r_150; -(runtime.setLine(334), _emit(({ type: "string", value: "[" }))); -let r_151 = ({ type: "bool", value: true }); -let _first = r_151; -for (let _pat of _pats.values) { -if (runtime.opNot(_first)) { -(runtime.setLine(338), _emit(({ type: "string", value: ", " }))); -}; -(_335 = runtime.assignValue(({ type: "bool", value: false }))); -(runtime.setLine(342), _emit_pat(_pat)); -}; -(runtime.setLine(344), _emit(({ type: "string", value: "]" }))); -} else { -(runtime.setLine(346), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to '%'" }), _pat)); -}}; -; -runtime.popCall(); -return { type: "null" }; -}; -function _emit(_str) { +function _emit39(_str142) { runtime.pushCall("emit"); -(runtime.setLine(351), ((...args) => runtime.builtinPush(...args))(_output, _str)); +(runtime.setLine(393), ((...args) => runtime.builtinPush(...args))(_output44, _str142)); +; +runtime.popCall(); +return { type: "null" }; +}; +function _define_builtin40(_ident143, _builtin_id144) { +runtime.pushCall("define_builtin"); +const r_175 = (runtime.setLine(397), _sym_id_count52()); +let _sym_id145 = r_175; +(runtime.setLine(398), _sym_id_increment53()); +(runtime.setLine(400), _define_sym47(_ident143, ({ type: "list", values: [_sym_id145, ({ type: "string", value: "builtin" }), _builtin_id144] }))); +runtime.popCall(); +return _sym_id145; +; +runtime.popCall(); +return { type: "null" }; +}; +function _define_fn41(_ident146, _line147) { +runtime.pushCall("define_fn"); +const r_176 = (runtime.setLine(405), _sym_id_count52()); +let _sym_id148 = r_176; +(runtime.setLine(406), _sym_id_increment53()); +(runtime.setLine(408), _define_sym47(_ident146, ({ type: "list", values: [_sym_id148, ({ type: "string", value: "fn" }), _ident146, _line147] }))); +runtime.popCall(); +return _sym_id148; +; +runtime.popCall(); +return { type: "null" }; +}; +function _define_param42(_ident149, _line150) { +runtime.pushCall("define_param"); +const r_177 = (runtime.setLine(413), _sym_id_count52()); +let _sym_id151 = r_177; +(runtime.setLine(414), _sym_id_increment53()); +(runtime.setLine(416), _define_sym47(_ident149, ({ type: "list", values: [_sym_id151, ({ type: "string", value: "param" }), _ident149, _line150] }))); +runtime.popCall(); +return _sym_id151; +; +runtime.popCall(); +return { type: "null" }; +}; +function _define_let43(_ident152, _line153) { +runtime.pushCall("define_let"); +const r_178 = (runtime.setLine(421), _sym_id_count52()); +let _sym_id154 = r_178; +(runtime.setLine(422), _sym_id_increment53()); +(runtime.setLine(424), _define_sym47(_ident152, ({ type: "list", values: [_sym_id154, ({ type: "string", value: "let" }), _ident152, _line153] }))); +runtime.popCall(); +return _sym_id154; ; runtime.popCall(); return { type: "null" }; }; runtime.popCall(); -return ({ type: "list", values: [_generate] }); +return ({ type: "list", values: [_generate30] }); ; runtime.popCall(); return { type: "null" }; }; -function _Counter() { +function _Counter17() { runtime.pushCall("Counter"); -let r_152 = ({ type: "int", value: 0 }); -let _counter = r_152; -function _count() { +const r_179 = ({ type: "int", value: 0 }); +let _counter157 = r_179; +function _count155() { runtime.pushCall("count"); runtime.popCall(); -return _counter; +return _counter157; ; runtime.popCall(); return { type: "null" }; }; -function _increment() { +function _increment156() { runtime.pushCall("increment"); -(_358 = runtime.assignValue(runtime.opAdd(_358, ({ type: "int", value: 1 })))); +(_counter157 = runtime.opAdd(_counter157, ({ type: "int", value: 1 }))); ; runtime.popCall(); return { type: "null" }; }; runtime.popCall(); -return ({ type: "list", values: [_count, _increment] }); +return ({ type: "list", values: [_count155, _increment156] }); ; runtime.popCall(); return { type: "null" }; }; -function _Syms() { +function _Syms18() { runtime.pushCall("Syms"); -let r_153 = ({ type: "list", values: [({ type: "null" }), ({ type: "list", values: [] })] }); -let _syms = r_153; -function _enter_scope() { +const r_180 = ({ type: "list", values: [({ type: "null" }), ({ type: "list", values: [] })] }); +let _syms165 = r_180; +function _enter_scope158() { runtime.pushCall("enter_scope"); -(_372 = runtime.assignValue(({ type: "list", values: [_syms, ({ type: "list", values: [] })] }))); +(_syms165 = ({ type: "list", values: [_syms165, ({ type: "list", values: [] })] })); ; runtime.popCall(); return { type: "null" }; }; -function _leave_scope() { +function _leave_scope159() { runtime.pushCall("leave_scope"); -let r_154 = _syms; -let r_155 = r_154.values[0]; -let _parent = r_155; -let r_156 = r_154.values[1]; -(_372 = runtime.assignValue(_parent)); +const r_181 = _syms165; +const r_182 = r_181.values[0] ?? { type: "null"}; +let _parent166 = r_182; +const r_183 = r_181.values[1] ?? { type: "null"}; +(_syms165 = _parent166); ; runtime.popCall(); return { type: "null" }; }; -function _define(_ident, _sym) { +function _define160(_ident167, _sym168) { runtime.pushCall("define"); -let r_157 = _syms; -let r_158 = r_157.values[0]; -let r_159 = r_157.values[1]; -let _syms = r_159; -let r_160 = ({ type: "int", value: 0 }); -let _i = r_160; +const r_184 = _syms165; +const r_185 = r_184.values[0] ?? { type: "null"}; +const r_186 = r_184.values[1] ?? { type: "null"}; +let _map169 = r_186; +const r_187 = ({ type: "int", value: 0 }); +let _i170 = r_187; while (true) { -if (runtime.opGte(_i, (runtime.setLine(402), ((...args) => runtime.builtinLen(...args))(_syms)))) { +if (runtime.truthy(runtime.opGte(_i170, (runtime.setLine(461), ((...args) => runtime.builtinLen(...args))(_map169))))) { break}; -let r_161 = (runtime.setLine(403), ((...args) => runtime.builtinAt(...args))(_syms, _i)); -let r_162 = r_161.values[0]; -let _s_ident = r_162; -let r_163 = r_161.values[1]; -if (runtime.opEq(_ident, _s_ident)) { -(runtime.setLine(405), ((...args) => runtime.builtinSet(...args))(_syms, _i, ({ type: "list", values: [_ident, _sym] }))); +const r_188 = (runtime.setLine(462), ((...args) => runtime.builtinAt(...args))(_map169, _i170)); +const r_189 = r_188.values[0] ?? { type: "null"}; +let _s_ident171 = r_189; +const r_190 = r_188.values[1] ?? { type: "null"}; +if (runtime.truthy(runtime.opEq(_ident167, _s_ident171))) { +(runtime.setLine(464), ((...args) => runtime.builtinSet(...args))(_map169, _i170, ({ type: "list", values: [_ident167, _sym168] }))); runtime.popCall(); return { type: "null" }; }; -(_400 = runtime.assignValue(runtime.opAdd(_400, ({ type: "int", value: 1 })))); +(_i170 = runtime.opAdd(_i170, ({ type: "int", value: 1 }))); }; -(runtime.setLine(410), ((...args) => runtime.builtinPush(...args))(_syms, ({ type: "list", values: [_ident, _sym] }))); +(runtime.setLine(469), ((...args) => runtime.builtinPush(...args))(_map169, ({ type: "list", values: [_ident167, _sym168] }))); ; runtime.popCall(); return { type: "null" }; }; -function _find_sym(_syms, _ident) { +function _find_sym161(_syms172, _ident173) { runtime.pushCall("find_sym"); -let r_164 = _syms; -let r_165 = r_164.values[0]; -let _parent = r_165; -let r_166 = r_164.values[1]; -let _map = r_166; -let r_167 = ({ type: "int", value: 0 }); -let _i = r_167; +const r_191 = _syms172; +const r_192 = r_191.values[0] ?? { type: "null"}; +let _parent174 = r_192; +const r_193 = r_191.values[1] ?? { type: "null"}; +let _map175 = r_193; +const r_194 = ({ type: "int", value: 0 }); +let _i176 = r_194; while (true) { -if (runtime.opGte(_i, (runtime.setLine(417), ((...args) => runtime.builtinLen(...args))(_map)))) { +if (runtime.truthy(runtime.opGte(_i176, (runtime.setLine(476), ((...args) => runtime.builtinLen(...args))(_map175))))) { break}; -let r_168 = (runtime.setLine(418), ((...args) => runtime.builtinAt(...args))(_map, _i)); -let r_169 = r_168.values[0]; -let _s_ident = r_169; -let r_170 = r_168.values[1]; -let _s_sym = r_170; -if (runtime.opEq(_ident, _s_ident)) { +const r_195 = (runtime.setLine(477), ((...args) => runtime.builtinAt(...args))(_map175, _i176)); +const r_196 = r_195.values[0] ?? { type: "null"}; +let _s_ident177 = r_196; +const r_197 = r_195.values[1] ?? { type: "null"}; +let _s_sym178 = r_197; +if (runtime.truthy(runtime.opEq(_ident173, _s_ident177))) { runtime.popCall(); -return _s_sym; +return _s_sym178; }; -(_415 = runtime.assignValue(runtime.opAdd(_415, ({ type: "int", value: 1 })))); +(_i176 = runtime.opAdd(_i176, ({ type: "int", value: 1 }))); }; -if (runtime.opNe(_parent, ({ type: "null" }))) { +if (runtime.truthy(runtime.opNe(_parent174, ({ type: "null" })))) { runtime.popCall(); -return (runtime.setLine(425), _find_sym(_parent, _ident)); +return (runtime.setLine(484), _find_sym161(_parent174, _ident173)); }; runtime.popCall(); return ({ type: "null" }); @@ -696,325 +773,329 @@ return ({ type: "null" }); runtime.popCall(); return { type: "null" }; }; -function _get(_ident) { +function _get162(_ident179) { runtime.pushCall("get"); runtime.popCall(); -return (runtime.setLine(431), _find_sym(_syms, _ident)); +return (runtime.setLine(490), _find_sym161(_syms165, _ident179)); ; runtime.popCall(); return { type: "null" }; }; -function _print_syms_node(_syms, _depth) { +function _print_syms_node163(_syms180, _depth181) { runtime.pushCall("print_syms_node"); -let r_171 = _syms; -let r_172 = r_171.values[0]; -let _parent = r_172; -let r_173 = r_171.values[1]; -let _map = r_173; -for (let [_ident, _sym] of _map.values) { -(runtime.setLine(437), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%- %: %" }), (runtime.setLine(437), _indent(_depth)), _ident, _sym)); +const r_198 = _syms180; +const r_199 = r_198.values[0] ?? { type: "null"}; +let _parent182 = r_199; +const r_200 = r_198.values[1] ?? { type: "null"}; +let _map183 = r_200; +for (const r_201 of _map183.values) {; +const r_202 = r_201.values[0] ?? { type: "null"}; +let _ident184 = r_202; +const r_203 = r_201.values[1] ?? { type: "null"}; +let _sym185 = r_203; +(runtime.setLine(496), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%- %: %" }), (runtime.setLine(496), _indent25(_depth181)), _ident184, _sym185)); }; -if (runtime.opNe(_parent, ({ type: "null" }))) { -(runtime.setLine(440), _print_syms_node(_parent, runtime.opAdd(_depth, ({ type: "int", value: 1 })))); +if (runtime.truthy(runtime.opNe(_parent182, ({ type: "null" })))) { +(runtime.setLine(499), _print_syms_node163(_parent182, runtime.opAdd(_depth181, ({ type: "int", value: 1 })))); }; ; runtime.popCall(); return { type: "null" }; }; -function _print_syms() { +function _print_syms164() { runtime.pushCall("print_syms"); -(runtime.setLine(445), _print_syms_node(_syms, ({ type: "int", value: 0 }))); +(runtime.setLine(504), _print_syms_node163(_syms165, ({ type: "int", value: 0 }))); ; runtime.popCall(); return { type: "null" }; }; runtime.popCall(); -return ({ type: "list", values: [_enter_scope, _leave_scope, _define, _get, _print_syms] }); +return ({ type: "list", values: [_enter_scope158, _leave_scope159, _define160, _get162, _print_syms164] }); ; runtime.popCall(); return { type: "null" }; }; -function _string_escape(_str) { +function _string_escape19(_str186) { runtime.pushCall("string_escape"); -let r_174 = (runtime.setLine(459), ((...args) => runtime.builtinLen(...args))(_str)); -let _str_len = r_174; -let r_175 = ({ type: "int", value: 0 }); -let _i = r_175; -let r_176 = ({ type: "string", value: "" }); -let _result = r_176; +const r_204 = (runtime.setLine(518), ((...args) => runtime.builtinLen(...args))(_str186)); +let _str_len187 = r_204; +const r_205 = ({ type: "int", value: 0 }); +let _i188 = r_205; +const r_206 = ({ type: "string", value: "" }); +let _result189 = r_206; while (true) { -if (runtime.opGte(_i, _str_len)) { +if (runtime.truthy(runtime.opGte(_i188, _str_len187))) { break}; -let r_177 = (runtime.setLine(464), ((...args) => runtime.builtinAt(...args))(_str, _i)); -let _ch = r_177; -if (runtime.opEq(_ch, ({ type: "string", value: "\\" }))) { -(_461 = runtime.assignValue(runtime.opAdd(_461, ({ type: "string", value: "\\\\" })))); +const r_207 = (runtime.setLine(523), ((...args) => runtime.builtinAt(...args))(_str186, _i188)); +let _ch190 = r_207; +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\\" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\\\" }))); } else { -if (runtime.opEq(_ch, ({ type: "string", value: "\"" }))) { -(_461 = runtime.assignValue(runtime.opAdd(_461, ({ type: "string", value: "\\\"" })))); +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\"" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\\"" }))); } else { -if (runtime.opEq(_ch, ({ type: "string", value: "\t" }))) { -(_461 = runtime.assignValue(runtime.opAdd(_461, ({ type: "string", value: "\\t" })))); +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\t" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\t" }))); } else { -if (runtime.opEq(_ch, ({ type: "string", value: "\r" }))) { -(_461 = runtime.assignValue(runtime.opAdd(_461, ({ type: "string", value: "\\r" })))); +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\r" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\r" }))); } else { -if (runtime.opEq(_ch, ({ type: "string", value: "\n" }))) { -(_461 = runtime.assignValue(runtime.opAdd(_461, ({ type: "string", value: "\\n" })))); +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\n" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\n" }))); } else { -if (runtime.opEq(_ch, ({ type: "string", value: "\n" }))) { -(_461 = runtime.assignValue(runtime.opAdd(_461, ({ type: "string", value: "\\0" })))); +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\n" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\0" }))); } else { -(_461 = runtime.assignValue(runtime.opAdd(_461, _ch))); +(_result189 = runtime.opAdd(_result189, _ch190)); }}}}}}; -(_460 = runtime.assignValue(runtime.opAdd(_460, ({ type: "int", value: 1 })))); +(_i188 = runtime.opAdd(_i188, ({ type: "int", value: 1 }))); }; runtime.popCall(); -return _result; +return _result189; ; runtime.popCall(); return { type: "null" }; }; -function _Parser(_tokens) { +function _Parser20(_tokens191) { runtime.pushCall("Parser"); -let r_178 = ({ type: "int", value: 0 }); -let _i = r_178; -let r_179 = (runtime.setLine(487), ((...args) => runtime.builtinAt(...args))(_tokens, _i)); -let _tok = r_179; -function _parse() { +const r_208 = ({ type: "int", value: 0 }); +let _i198 = r_208; +const r_209 = (runtime.setLine(546), ((...args) => runtime.builtinAt(...args))(_tokens191, _i198)); +let _tok199 = r_209; +function _parse192() { runtime.pushCall("parse"); -let r_180 = ({ type: "list", values: [] }); -let _exprs = r_180; +const r_210 = ({ type: "list", values: [] }); +let _exprs200 = r_210; while (true) { -if ((runtime.setLine(492), _done())) { +if (runtime.truthy((runtime.setLine(551), _done197()))) { break}; -(runtime.setLine(493), ((...args) => runtime.builtinPush(...args))(_exprs, (runtime.setLine(493), _parse_expr()))); +(runtime.setLine(552), ((...args) => runtime.builtinPush(...args))(_exprs200, (runtime.setLine(552), _parse_expr193()))); }; runtime.popCall(); -return _exprs; +return _exprs200; ; runtime.popCall(); return { type: "null" }; }; -function _parse_expr() { +function _parse_expr193() { runtime.pushCall("parse_expr"); -let r_181 = _tok; -let r_182 = r_181.values[0]; -let _ty = r_182; -let r_183 = r_181.values[1]; -let _line = r_183; -let r_184 = r_181.values[2]; -let _value = r_184; -if ((runtime.setLine(500), _eat(({ type: "string", value: "(" })))) { -let r_185 = ({ type: "list", values: [] }); -let _values = r_185; +const r_211 = _tok199; +const r_212 = r_211.values[0] ?? { type: "null"}; +let _ty201 = r_212; +const r_213 = r_211.values[1] ?? { type: "null"}; +let _line202 = r_213; +const r_214 = r_211.values[2] ?? { type: "null"}; +let _value203 = r_214; +if (runtime.truthy((runtime.setLine(559), _eat194(({ type: "string", value: "(" }))))) { +const r_215 = ({ type: "list", values: [] }); +let _values204 = r_215; while (true) { -if ((runtime.setLine(503), _test(({ type: "string", value: ")" })))) { +if (runtime.truthy((runtime.setLine(562), _test196(({ type: "string", value: ")" }))))) { break}; -(runtime.setLine(504), ((...args) => runtime.builtinPush(...args))(_values, (runtime.setLine(504), _parse_expr()))); +(runtime.setLine(563), ((...args) => runtime.builtinPush(...args))(_values204, (runtime.setLine(563), _parse_expr193()))); }; -if (runtime.opNot((runtime.setLine(506), _eat(({ type: "string", value: ")" }))))) { -(runtime.setLine(507), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected ')' on line %" }), (runtime.setLine(507), ((...args) => runtime.builtinAt(...args))(_tok, ({ type: "int", value: 1 }))))); +if (runtime.truthy(runtime.opNot((runtime.setLine(565), _eat194(({ type: "string", value: ")" })))))) { +(runtime.setLine(566), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected ')' on line %" }), (runtime.setLine(566), ((...args) => runtime.builtinAt(...args))(_tok199, ({ type: "int", value: 1 }))))); }; runtime.popCall(); -return ({ type: "list", values: [] }); +return ({ type: "list", values: [({ type: "string", value: "list" }), _line202, _values204] }); } else { -if ((runtime.setLine(510), _eat(({ type: "string", value: "string" })))) { +if (runtime.truthy((runtime.setLine(569), _eat194(({ type: "string", value: "string" }))))) { runtime.popCall(); -return ({ type: "list", values: [] }); +return ({ type: "list", values: [({ type: "string", value: "string" }), _line202, _value203] }); } else { -if ((runtime.setLine(512), _eat(({ type: "string", value: "int" })))) { +if (runtime.truthy((runtime.setLine(571), _eat194(({ type: "string", value: "int" }))))) { runtime.popCall(); -return ({ type: "list", values: [] }); +return ({ type: "list", values: [({ type: "string", value: "int" }), _line202, (runtime.setLine(572), ((...args) => runtime.builtinStringToInt(...args))(_value203))] }); } else { -if ((runtime.setLine(514), _eat(({ type: "string", value: "ident" })))) { +if (runtime.truthy((runtime.setLine(573), _eat194(({ type: "string", value: "ident" }))))) { runtime.popCall(); -return ({ type: "list", values: [] }); +return ({ type: "list", values: [({ type: "string", value: "ident" }), _line202, _value203] }); } else { -(runtime.setLine(517), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected expression, got '%' on line %" }), _ty, _line)); +(runtime.setLine(576), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected expression, got '%' on line %" }), _ty201, _line202)); }}}}; ; runtime.popCall(); return { type: "null" }; }; -function _eat(_pat) { +function _eat194(_pat205) { runtime.pushCall("eat"); -if (runtime.opNot((runtime.setLine(522), _test(_pat)))) { +if (runtime.truthy(runtime.opNot((runtime.setLine(581), _test196(_pat205))))) { runtime.popCall(); return ({ type: "bool", value: false })}; -(runtime.setLine(523), _step()); +(runtime.setLine(582), _step195()); runtime.popCall(); return ({ type: "bool", value: true }); ; runtime.popCall(); return { type: "null" }; }; -function _step() { +function _step195() { runtime.pushCall("step"); -(_486 = runtime.assignValue(runtime.opAdd(_486, ({ type: "int", value: 1 })))); -if (runtime.opNot((runtime.setLine(529), _done()))) { -let r_186 = (runtime.setLine(530), ((...args) => runtime.builtinAt(...args))(_tokens, _i)); -let _new_tok = r_186; -(_487 = runtime.assignValue(_new_tok)); +(_i198 = runtime.opAdd(_i198, ({ type: "int", value: 1 }))); +if (runtime.truthy(runtime.opNot((runtime.setLine(588), _done197())))) { +const r_216 = (runtime.setLine(589), ((...args) => runtime.builtinAt(...args))(_tokens191, _i198)); +let _new_tok206 = r_216; +(_tok199 = _new_tok206); }; ; runtime.popCall(); return { type: "null" }; }; -function _test(_pat) { +function _test196(_pat207) { runtime.pushCall("test"); -if ((runtime.setLine(536), _done())) { +if (runtime.truthy((runtime.setLine(595), _done197()))) { runtime.popCall(); return ({ type: "bool", value: false })}; -let r_187 = _tok; -let r_188 = r_187.values[0]; -let _ty = r_188; +const r_217 = _tok199; +const r_218 = r_217.values[0] ?? { type: "null"}; +let _ty208 = r_218; runtime.popCall(); -return runtime.opEq(_pat, _ty); +return runtime.opEq(_pat207, _ty208); ; runtime.popCall(); return { type: "null" }; }; -function _done() { +function _done197() { runtime.pushCall("done"); runtime.popCall(); -return runtime.opGte(_i, (runtime.setLine(542), ((...args) => runtime.builtinLen(...args))(_tokens))); +return runtime.opGte(_i198, (runtime.setLine(601), ((...args) => runtime.builtinLen(...args))(_tokens191))); ; runtime.popCall(); return { type: "null" }; }; runtime.popCall(); -return ({ type: "list", values: [_parse] }); +return ({ type: "list", values: [_parse192] }); ; runtime.popCall(); return { type: "null" }; }; -function _tokenize(_text) { +function _tokenize21(_text209) { runtime.pushCall("tokenize"); -let r_189 = (runtime.setLine(549), ((...args) => runtime.builtinLen(...args))(_text)); -let _text_len = r_189; -let r_190 = ({ type: "list", values: [] }); -let _tokens = r_190; -let r_191 = ({ type: "int", value: 0 }); -let _i = r_191; -let r_192 = ({ type: "int", value: 1 }); -let _line = r_192; -let r_193 = runtime.opAdd(({ type: "string", value: "abcdefghijklmnopqrstuvwxyz" }), ({ type: "string", value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-*/%&|=?!<>'_" })); -let _ident_chars = r_193; +const r_219 = (runtime.setLine(608), ((...args) => runtime.builtinLen(...args))(_text209)); +let _text_len210 = r_219; +const r_220 = ({ type: "list", values: [] }); +let _tokens211 = r_220; +const r_221 = ({ type: "int", value: 0 }); +let _i212 = r_221; +const r_222 = ({ type: "int", value: 1 }); +let _line213 = r_222; +const r_223 = runtime.opAdd(({ type: "string", value: "abcdefghijklmnopqrstuvwxyz" }), ({ type: "string", value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-*/%&|=?!<>'_" })); +let _ident_chars214 = r_223; while (true) { -if (runtime.opGte(_i, _text_len)) { +if (runtime.truthy(runtime.opGte(_i212, _text_len210))) { break}; -let r_194 = (runtime.setLine(561), ((...args) => runtime.builtinAt(...args))(_text, _i)); -let _ch = r_194; -if ((runtime.setLine(563), _contains(({ type: "string", value: " \t\r\n" }), _ch))) { -if (runtime.opEq(_ch, ({ type: "string", value: "\n" }))) { -(_553 = runtime.assignValue(runtime.opAdd(_553, ({ type: "int", value: 1 })))); +const r_224 = (runtime.setLine(620), ((...args) => runtime.builtinAt(...args))(_text209, _i212)); +let _ch215 = r_224; +if (runtime.truthy((runtime.setLine(622), _contains22(({ type: "string", value: " \t\r\n" }), _ch215)))) { +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\n" })))) { +(_line213 = runtime.opAdd(_line213, ({ type: "int", value: 1 }))); }; -(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 })))); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); } else { -if ((runtime.setLine(568), _slice_eq(_text, _i, ({ type: "string", value: "//" })))) { +if (runtime.truthy((runtime.setLine(627), _slice_eq23(_text209, _i212, ({ type: "string", value: "//" }))))) { while (true) { -if ((runtime.setLine(570), { type: "bool", value: this.runtime.truthy(runtime.opGte(_i, _text_len)) || this.runtime.falsy(runtime.opEq((runtime.setLine(570), ((...args) => runtime.builtinAt(...args))(_text, _i)), ({ type: "string", value: "\n" }))) })) { +if (runtime.truthy((runtime.setLine(629), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opEq((runtime.setLine(629), ((...args) => runtime.builtinAt(...args))(_text209, _i212)), ({ type: "string", value: "\n" }))) }))) { break; }; -(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 })))); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); }; } else { -if ((runtime.setLine(575), _contains(({ type: "string", value: "()" }), _ch))) { -(runtime.setLine(576), ((...args) => runtime.builtinPush(...args))(_tokens, ({ type: "list", values: [_ch, _line] }))); -(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 })))); +if (runtime.truthy((runtime.setLine(634), _contains22(({ type: "string", value: "()" }), _ch215)))) { +(runtime.setLine(635), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [_ch215, _line213] }))); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); } else { -if (runtime.opEq(_ch, ({ type: "string", value: "\"" }))) { -let r_195 = ({ type: "string", value: "" }); -let _value = r_195; -(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 })))); -(_561 = runtime.assignValue((runtime.setLine(581), ((...args) => runtime.builtinAt(...args))(_text, _i)))); +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\"" })))) { +const r_225 = ({ type: "string", value: "" }); +let _value216 = r_225; +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +(_ch215 = (runtime.setLine(640), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); while (true) { -if ((runtime.setLine(583), { type: "bool", value: this.runtime.truthy(runtime.opGte(_i, _text_len)) || this.runtime.falsy(runtime.opEq(_ch, ({ type: "string", value: "\"" }))) })) { +if (runtime.truthy((runtime.setLine(642), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\"" }))) }))) { break; }; -if (runtime.opEq(_ch, ({ type: "string", value: "\\" }))) { -(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 })))); -if (runtime.opGte(_i, _text_len)) { +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\\" })))) { +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +if (runtime.truthy(runtime.opGte(_i212, _text_len210))) { break; }; -(_561 = runtime.assignValue((runtime.setLine(591), ((...args) => runtime.builtinAt(...args))(_text, _i)))); -if (runtime.opEq(_ch, ({ type: "string", value: "t" }))) { -(_579 = runtime.assignValue(runtime.opAdd(_579, ({ type: "string", value: "\t" })))); +(_ch215 = (runtime.setLine(650), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "t" })))) { +(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\t" }))); } else { -if (runtime.opEq(_ch, ({ type: "string", value: "r" }))) { -(_579 = runtime.assignValue(runtime.opAdd(_579, ({ type: "string", value: "\r" })))); +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "r" })))) { +(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\r" }))); } else { -if (runtime.opEq(_ch, ({ type: "string", value: "n" }))) { -(_579 = runtime.assignValue(runtime.opAdd(_579, ({ type: "string", value: "\n" })))); +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "n" })))) { +(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\n" }))); } else { -if (runtime.opEq(_ch, ({ type: "string", value: "0" }))) { -(_579 = runtime.assignValue(runtime.opAdd(_579, ({ type: "string", value: "\n" })))); +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "0" })))) { +(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\n" }))); } else { -(_579 = runtime.assignValue(runtime.opAdd(_579, _ch))); +(_value216 = runtime.opAdd(_value216, _ch215)); }}}}; } else { -(_579 = runtime.assignValue(runtime.opAdd(_579, _ch))); +(_value216 = runtime.opAdd(_value216, _ch215)); }; -(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 })))); -(_561 = runtime.assignValue((runtime.setLine(607), ((...args) => runtime.builtinAt(...args))(_text, _i)))); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +(_ch215 = (runtime.setLine(666), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); }; -if ((runtime.setLine(609), { type: "bool", value: this.runtime.truthy(runtime.opGte(_i, _text_len)) || this.runtime.falsy(runtime.opNe(_ch, ({ type: "string", value: "\"" }))) })) { -(runtime.setLine(610), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected '\"' on line %" }), _line)); +if (runtime.truthy((runtime.setLine(668), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opNe(_ch215, ({ type: "string", value: "\"" }))) }))) { +(runtime.setLine(669), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected '\"' on line %" }), _line213)); }; -(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 })))); -(runtime.setLine(613), ((...args) => runtime.builtinPush(...args))(_tokens, ({ type: "list", values: [] }))); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +(runtime.setLine(672), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [({ type: "string", value: "string" }), _line213, _value216] }))); } else { -if ((runtime.setLine(614), _contains(({ type: "string", value: "0123456789" }), _ch))) { -let r_196 = ({ type: "string", value: "" }); -let _value = r_196; +if (runtime.truthy((runtime.setLine(673), _contains22(({ type: "string", value: "0123456789" }), _ch215)))) { +const r_226 = ({ type: "string", value: "" }); +let _value217 = r_226; while (true) { -(_561 = runtime.assignValue((runtime.setLine(617), ((...args) => runtime.builtinAt(...args))(_text, _i)))); -if ((runtime.setLine(618), { type: "bool", value: this.runtime.truthy(runtime.opGte(_i, _text_len)) || this.runtime.falsy(runtime.opNot((runtime.setLine(618), _contains(({ type: "string", value: "0123456789" }), _ch)))) })) { +(_ch215 = (runtime.setLine(676), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); +if (runtime.truthy((runtime.setLine(677), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opNot((runtime.setLine(677), _contains22(({ type: "string", value: "0123456789" }), _ch215)))) }))) { break; }; -(_615 = runtime.assignValue(runtime.opAdd(_615, _ch))); -(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 })))); +(_value217 = runtime.opAdd(_value217, _ch215)); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); }; -(runtime.setLine(624), ((...args) => runtime.builtinPush(...args))(_tokens, ({ type: "list", values: [] }))); +(runtime.setLine(683), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [({ type: "string", value: "int" }), _line213, _value217] }))); } else { -if ((runtime.setLine(625), _contains(_ident_chars, _ch))) { -let r_197 = ({ type: "string", value: "" }); -let _value = r_197; +if (runtime.truthy((runtime.setLine(684), _contains22(_ident_chars214, _ch215)))) { +const r_227 = ({ type: "string", value: "" }); +let _value218 = r_227; while (true) { -(_561 = runtime.assignValue((runtime.setLine(628), ((...args) => runtime.builtinAt(...args))(_text, _i)))); -if ((runtime.setLine(629), { type: "bool", value: this.runtime.truthy(runtime.opGte(_i, _text_len)) || this.runtime.falsy(runtime.opNot((runtime.setLine(629), _contains(_ident_chars, _ch)))) })) { +(_ch215 = (runtime.setLine(687), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); +if (runtime.truthy((runtime.setLine(688), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opNot((runtime.setLine(688), _contains22(_ident_chars214, _ch215)))) }))) { break; }; -(_626 = runtime.assignValue(runtime.opAdd(_626, _ch))); -(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 })))); +(_value218 = runtime.opAdd(_value218, _ch215)); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); }; -(runtime.setLine(635), ((...args) => runtime.builtinPush(...args))(_tokens, ({ type: "list", values: [] }))); +(runtime.setLine(694), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [({ type: "string", value: "ident" }), _line213, _value218] }))); } else { -(runtime.setLine(637), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "illegal char '%'" }), _ch)); -(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 })))); +(runtime.setLine(696), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "illegal char '%'" }), _ch215)); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); }}}}}}; }; runtime.popCall(); -return _tokens; +return _tokens211; ; runtime.popCall(); return { type: "null" }; }; -function _contains(_text, _ch) { +function _contains22(_text219, _ch220) { runtime.pushCall("contains"); -let r_198 = (runtime.setLine(645), ((...args) => runtime.builtinLen(...args))(_text)); -let _text_len = r_198; -let r_199 = ({ type: "int", value: 0 }); -let _i = r_199; +const r_228 = (runtime.setLine(704), ((...args) => runtime.builtinLen(...args))(_text219)); +let _text_len221 = r_228; +const r_229 = ({ type: "int", value: 0 }); +let _i222 = r_229; while (true) { -if (runtime.opGte(_i, _text_len)) { +if (runtime.truthy(runtime.opGte(_i222, _text_len221))) { break}; -if (runtime.opEq((runtime.setLine(649), ((...args) => runtime.builtinAt(...args))(_text, _i)), _ch)) { +if (runtime.truthy(runtime.opEq((runtime.setLine(708), ((...args) => runtime.builtinAt(...args))(_text219, _i222)), _ch220))) { runtime.popCall(); return ({ type: "bool", value: true }); }; -(_646 = runtime.assignValue(runtime.opAdd(_646, ({ type: "int", value: 1 })))); +(_i222 = runtime.opAdd(_i222, ({ type: "int", value: 1 }))); }; runtime.popCall(); return ({ type: "bool", value: false }); @@ -1022,25 +1103,25 @@ return ({ type: "bool", value: false }); runtime.popCall(); return { type: "null" }; }; -function _slice_eq(_str, _slice_idx, _substr) { +function _slice_eq23(_str223, _slice_idx224, _substr225) { runtime.pushCall("slice_eq"); -let r_200 = (runtime.setLine(658), ((...args) => runtime.builtinLen(...args))(_str)); -let _str_len = r_200; -let r_201 = (runtime.setLine(659), ((...args) => runtime.builtinLen(...args))(_substr)); -let _substr_len = r_201; -let r_202 = ({ type: "int", value: 0 }); -let _i = r_202; +const r_230 = (runtime.setLine(717), ((...args) => runtime.builtinLen(...args))(_str223)); +let _str_len226 = r_230; +const r_231 = (runtime.setLine(718), ((...args) => runtime.builtinLen(...args))(_substr225)); +let _substr_len227 = r_231; +const r_232 = ({ type: "int", value: 0 }); +let _i228 = r_232; while (true) { -if (runtime.opGte(_i, _substr_len)) { +if (runtime.truthy(runtime.opGte(_i228, _substr_len227))) { runtime.popCall(); return ({ type: "bool", value: true })}; -if (runtime.opGte(runtime.opAdd(_slice_idx, _i), _str_len)) { +if (runtime.truthy(runtime.opGte(runtime.opAdd(_slice_idx224, _i228), _str_len226))) { runtime.popCall(); return ({ type: "bool", value: false })}; -if (runtime.opNe((runtime.setLine(666), ((...args) => runtime.builtinAt(...args))(_str, runtime.opAdd(_slice_idx, _i))), (runtime.setLine(666), ((...args) => runtime.builtinAt(...args))(_substr, _i)))) { +if (runtime.truthy(runtime.opNe((runtime.setLine(725), ((...args) => runtime.builtinAt(...args))(_str223, runtime.opAdd(_slice_idx224, _i228))), (runtime.setLine(725), ((...args) => runtime.builtinAt(...args))(_substr225, _i228))))) { runtime.popCall(); return ({ type: "bool", value: false })}; -(_660 = runtime.assignValue(runtime.opAdd(_660, ({ type: "int", value: 1 })))); +(_i228 = runtime.opAdd(_i228, ({ type: "int", value: 1 }))); }; runtime.popCall(); return ({ type: "bool", value: true }); @@ -1048,103 +1129,100 @@ return ({ type: "bool", value: true }); runtime.popCall(); return { type: "null" }; }; -function _print_expr(_expr, _depth) { +function _print_expr24(_expr229, _depth230) { runtime.pushCall("print_expr"); -let r_203 = _expr; -let r_204 = r_203.values[0]; -let _ty = r_204; -let r_205 = r_203.values[1]; -let _line = r_205; -let r_206 = r_203.values[2]; -let _value = r_206; -if (runtime.opEq(_ty, ({ type: "string", value: "list" }))) { -(runtime.setLine(676), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%(% %" }), (runtime.setLine(676), _indent(_depth)), _ty, _line)); -for (let _e of _value.values) { -(runtime.setLine(678), _print_expr(_e, runtime.opAdd(_depth, ({ type: "int", value: 1 })))); +const r_233 = _expr229; +const r_234 = r_233.values[0] ?? { type: "null"}; +let _ty231 = r_234; +const r_235 = r_233.values[1] ?? { type: "null"}; +let _line232 = r_235; +const r_236 = r_233.values[2] ?? { type: "null"}; +let _value233 = r_236; +if (runtime.truthy(runtime.opEq(_ty231, ({ type: "string", value: "list" })))) { +(runtime.setLine(735), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%(% %" }), (runtime.setLine(735), _indent25(_depth230)), _ty231, _line232)); +for (const r_237 of _value233.values) {; +let _e234 = r_237; +(runtime.setLine(737), _print_expr24(_e234, runtime.opAdd(_depth230, ({ type: "int", value: 1 })))); }; -(runtime.setLine(680), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%)" }), (runtime.setLine(680), _indent(_depth)))); +(runtime.setLine(739), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%)" }), (runtime.setLine(739), _indent25(_depth230)))); } else { -(runtime.setLine(682), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%%" }), (runtime.setLine(682), _indent(_depth)), _expr)); +(runtime.setLine(741), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%%" }), (runtime.setLine(741), _indent25(_depth230)), _expr229)); }; ; runtime.popCall(); return { type: "null" }; }; -function _indent(_depth) { +function _indent25(_depth235) { runtime.pushCall("indent"); -let r_207 = ({ type: "string", value: "" }); -let _space = r_207; -let r_208 = ({ type: "int", value: 0 }); -let _i = r_208; +const r_238 = ({ type: "string", value: "" }); +let _space236 = r_238; +const r_239 = ({ type: "int", value: 0 }); +let _i237 = r_239; while (true) { -if (runtime.opGte(_i, _depth)) { +if (runtime.truthy(runtime.opGte(_i237, _depth235))) { break}; -(_687 = runtime.assignValue(runtime.opAdd(_687, ({ type: "string", value: " " })))); -(_688 = runtime.assignValue(runtime.opAdd(_688, ({ type: "int", value: 1 })))); +(_space236 = runtime.opAdd(_space236, ({ type: "string", value: " " }))); +(_i237 = runtime.opAdd(_i237, ({ type: "int", value: 1 }))); }; runtime.popCall(); -return _space; +return _space236; ; runtime.popCall(); return { type: "null" }; }; -function _slice(_list, _idx) { +function _slice26(_list238, _idx239) { runtime.pushCall("slice"); -let r_209 = (runtime.setLine(698), ((...args) => runtime.builtinLen(...args))(_list)); -let _list_len = r_209; -let r_210 = ({ type: "list", values: [] }); -let _elems = r_210; -let r_211 = _idx; -let _i = r_211; +const r_240 = (runtime.setLine(757), ((...args) => runtime.builtinLen(...args))(_list238)); +let _list_len240 = r_240; +const r_241 = ({ type: "list", values: [] }); +let _elems241 = r_241; +const r_242 = _idx239; +let _i242 = r_242; while (true) { -if (runtime.opGte(_i, _list_len)) { +if (runtime.truthy(runtime.opGte(_i242, _list_len240))) { break}; -(runtime.setLine(703), ((...args) => runtime.builtinPush(...args))(_elems, (runtime.setLine(703), ((...args) => runtime.builtinAt(...args))(_list, _i)))); -(_700 = runtime.assignValue(runtime.opAdd(_700, ({ type: "int", value: 1 })))); +(runtime.setLine(762), ((...args) => runtime.builtinPush(...args))(_elems241, (runtime.setLine(762), ((...args) => runtime.builtinAt(...args))(_list238, _i242)))); +(_i242 = runtime.opAdd(_i242, ({ type: "int", value: 1 }))); }; runtime.popCall(); -return _elems; +return _elems241; ; runtime.popCall(); return { type: "null" }; }; -let r_212 = ({ type: "bool", value: true }); -let _silent = r_212; -let r_213 = (runtime.setLine(711), ((...args) => runtime.builtinGetArgs(...args))()); -let r_214 = r_213.values[0]; -let _input_filename = r_214; -let r_215 = r_213.values[1]; -let _output_filename = r_215; -if (runtime.opNot(_silent)) { -(runtime.setLine(713), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "reading file..." })))}; -let r_216 = (runtime.setLine(714), ((...args) => runtime.builtinReadTextFile(...args))(_input_filename)); -let _text = r_216; -(runtime.setLine(716), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "=== text ===" }))); -(runtime.setLine(718), ((...args) => runtime.builtinPrintln(...args))((runtime.setLine(718), ((...args) => runtime.builtinLen(...args))(_text)))); -if (runtime.opNot(_silent)) { -(runtime.setLine(720), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "tokenizing..." })))}; -let r_217 = (runtime.setLine(721), _tokenize(_text)); -let _tokens = r_217; -(runtime.setLine(723), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "=== tokens ===" }))); -(runtime.setLine(727), ((...args) => runtime.builtinPrintln(...args))((runtime.setLine(727), ((...args) => runtime.builtinLen(...args))(_tokens)))); -if (runtime.opNot(_silent)) { -(runtime.setLine(729), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "parsing..." })))}; -let r_218 = (runtime.setLine(730), _Parser(_tokens)); -let _parser = r_218; -let r_219 = _parser; -let r_220 = r_219.values[0]; -let _parse = r_220; -let r_221 = (runtime.setLine(732), _parse()); -let _ast = r_221; -if (runtime.opNot(_silent)) { -(runtime.setLine(739), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "emitting..." })))}; -let r_222 = (runtime.setLine(740), _Emitter(_ast, _input_filename)); -let _emitter = r_222; -let r_223 = _emitter; -let r_224 = r_223.values[0]; -let _emit = r_224; -let r_225 = (runtime.setLine(742), _emit()); -let _js_code = r_225; -if (runtime.opNot(_silent)) { -(runtime.setLine(747), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "writing file..." })))}; -(runtime.setLine(748), ((...args) => runtime.builtinWriteTextFile(...args))(_output_filename, _js_code)); +const r_243 = ({ type: "bool", value: false }); +let _silent243 = r_243; +const r_244 = (runtime.setLine(770), ((...args) => runtime.builtinGetArgs(...args))()); +const r_245 = r_244.values[0] ?? { type: "null"}; +let _input_filename244 = r_245; +const r_246 = r_244.values[1] ?? { type: "null"}; +let _output_filename245 = r_246; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(772), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "reading file '%'..." }), _input_filename244))}; +const r_247 = (runtime.setLine(773), ((...args) => runtime.builtinReadTextFile(...args))(_input_filename244)); +let _text246 = r_247; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(779), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "tokenizing..." })))}; +const r_248 = (runtime.setLine(780), _tokenize21(_text246)); +let _tokens247 = r_248; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(793), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "parsing..." })))}; +const r_249 = (runtime.setLine(794), _Parser20(_tokens247)); +let _parser248 = r_249; +const r_250 = _parser248; +const r_251 = r_250.values[0] ?? { type: "null"}; +let _parse249 = r_251; +const r_252 = (runtime.setLine(796), _parse249()); +let _ast250 = r_252; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(803), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "emitting..." })))}; +const r_253 = (runtime.setLine(804), _Emitter16(_ast250, _input_filename244)); +let _emitter251 = r_253; +const r_254 = _emitter251; +const r_255 = r_254.values[0] ?? { type: "null"}; +let _emit252 = r_255; +const r_256 = (runtime.setLine(806), _emit252()); +let _js_code253 = r_256; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(811), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "writing file '%'..." }), _output_filename245))}; +(runtime.setLine(812), ((...args) => runtime.builtinWriteTextFile(...args))(_output_filename245, _js_code253)); diff --git a/stage2.js b/stage2.js index 5274bff..be32485 100644 --- a/stage2.js +++ b/stage2.js @@ -1,3 +1,1228 @@ #!/usr/bin/env node -import { Runtime } from "./runtime.js" -const runtime = new Runtime("compile.phi") +import { Runtime } from "./runtime.js"; +const runtime = new Runtime({ filename: "compile.phi" }); +let _is_phi_compiler14 = { type: "bool", value: true }; +function _dbg15(_msg27) { +runtime.pushCall("dbg"); +if (runtime.truthy(_is_phi_compiler14)) { +(runtime.setLine(4), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "dbg: %" }), _msg27)); +}; +; +runtime.popCall(); +return { type: "null" }; +}; +function _Emitter16(_ast28, _filename29) { +runtime.pushCall("Emitter"); +const r_0 = ({ type: "list", values: [] }); +let _output44 = r_0; +const r_1 = (runtime.setLine(11), _Syms18()); +const r_2 = r_1.values[0] ?? { type: "null"}; +let _enter_scope45 = r_2; +const r_3 = r_1.values[1] ?? { type: "null"}; +let _leave_scope46 = r_3; +const r_4 = r_1.values[2] ?? { type: "null"}; +let _define_sym47 = r_4; +const r_5 = r_1.values[3] ?? { type: "null"}; +let _get_sym48 = r_5; +const r_6 = r_1.values[4] ?? { type: "null"}; +let _print_syms49 = r_6; +const r_7 = (runtime.setLine(13), _Counter17()); +const r_8 = r_7.values[0] ?? { type: "null"}; +let _let_node_reg_count50 = r_8; +const r_9 = r_7.values[1] ?? { type: "null"}; +let _let_node_reg_increment51 = r_9; +const r_10 = (runtime.setLine(14), _Counter17()); +const r_11 = r_10.values[0] ?? { type: "null"}; +let _sym_id_count52 = r_11; +const r_12 = r_10.values[1] ?? { type: "null"}; +let _sym_id_increment53 = r_12; +const r_13 = ({ type: "list", values: [({ type: "list", values: [({ type: "string", value: "format" }), ({ type: "string", value: "builtinFormat" })] }), ({ type: "list", values: [({ type: "string", value: "print" }), ({ type: "string", value: "builtinPrint" })] }), ({ type: "list", values: [({ type: "string", value: "println" }), ({ type: "string", value: "builtinPrintln" })] }), ({ type: "list", values: [({ type: "string", value: "panic" }), ({ type: "string", value: "builtinPanic" })] }), ({ type: "list", values: [({ type: "string", value: "read_text_file" }), ({ type: "string", value: "builtinReadTextFile" })] }), ({ type: "list", values: [({ type: "string", value: "write_text_file" }), ({ type: "string", value: "builtinWriteTextFile" })] }), ({ type: "list", values: [({ type: "string", value: "push" }), ({ type: "string", value: "builtinPush" })] }), ({ type: "list", values: [({ type: "string", value: "at" }), ({ type: "string", value: "builtinAt" })] }), ({ type: "list", values: [({ type: "string", value: "set" }), ({ type: "string", value: "builtinSet" })] }), ({ type: "list", values: [({ type: "string", value: "len" }), ({ type: "string", value: "builtinLen" })] }), ({ type: "list", values: [({ type: "string", value: "string_to_int" }), ({ type: "string", value: "builtinStringToInt" })] }), ({ type: "list", values: [({ type: "string", value: "char_code" }), ({ type: "string", value: "builtinCharCode" })] }), ({ type: "list", values: [({ type: "string", value: "strings_join" }), ({ type: "string", value: "builtinStringsJoin" })] }), ({ type: "list", values: [({ type: "string", value: "get_args" }), ({ type: "string", value: "builtinGetArgs" })] })] }); +let _builtin_syms54 = r_13; +function _generate30() { +runtime.pushCall("generate"); +(runtime.setLine(34), _emit39(({ type: "string", value: "#!/usr/bin/env node\n" }))); +(runtime.setLine(35), _emit39(({ type: "string", value: "import { Runtime } from \"./runtime.js\";\n" }))); +(runtime.setLine(36), _emit39(({ type: "string", value: "const runtime = new Runtime({ filename: \"" }))); +(runtime.setLine(37), _emit39(_filename29)); +(runtime.setLine(38), _emit39(({ type: "string", value: "\" });\n" }))); +for (const r_14 of _builtin_syms54.values) {; +const r_15 = r_14.values[0] ?? { type: "null"}; +let _ident55 = r_15; +const r_16 = r_14.values[1] ?? { type: "null"}; +let _builtin_id56 = r_16; +(runtime.setLine(41), _define_builtin40(_ident55, _builtin_id56)); +}; +const r_17 = (runtime.setLine(44), _define_let43(({ type: "string", value: "is_phi_compiler" }), ({ type: "int", value: 0 }))); +let _is_phi_compiler_sym_id57 = r_17; +(runtime.setLine(45), _emit39((runtime.setLine(45), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "let _is_phi_compiler% = { type: \"bool\", value: true };\n" }), _is_phi_compiler_sym_id57)))); +(runtime.setLine(50), _discover_syms32(_ast28)); +(runtime.setLine(51), _emit_exprs31(_ast28)); +runtime.popCall(); +return (runtime.setLine(52), ((...args) => runtime.builtinStringsJoin(...args))(_output44)); +; +runtime.popCall(); +return { type: "null" }; +}; +function _emit_exprs31(_exprs58) { +runtime.pushCall("emit_exprs"); +for (const r_18 of _exprs58.values) {; +let _expr59 = r_18; +(runtime.setLine(57), _emit_expr33(_expr59)); +(runtime.setLine(58), _emit39(({ type: "string", value: ";\n" }))); +}; +; +runtime.popCall(); +return { type: "null" }; +}; +function _discover_syms32(_exprs60) { +runtime.pushCall("discover_syms"); +for (const r_19 of _exprs60.values) {; +let _expr61 = r_19; +const r_20 = _expr61; +const r_21 = r_20.values[0] ?? { type: "null"}; +let _ty62 = r_21; +const r_22 = r_20.values[1] ?? { type: "null"}; +let _line63 = r_22; +if (runtime.truthy(runtime.opNe(_ty62, ({ type: "string", value: "list" })))) { +runtime.popCall(); +return { type: "null" }}; +const r_23 = _expr61; +const r_24 = r_23.values[0] ?? { type: "null"}; +const r_25 = r_23.values[1] ?? { type: "null"}; +const r_26 = r_23.values[2] ?? { type: "null"}; +let _s64 = r_26; +if (runtime.truthy(runtime.opEq((runtime.setLine(67), ((...args) => runtime.builtinLen(...args))(_s64)), ({ type: "int", value: 0 })))) { +runtime.popCall(); +return { type: "null" }}; +const r_27 = _s64; +const r_28 = r_27.values[0] ?? { type: "null"}; +const r_29 = r_28.values[0] ?? { type: "null"}; +const r_30 = r_28.values[1] ?? { type: "null"}; +const r_31 = r_28.values[2] ?? { type: "null"}; +let _id65 = r_31; +if (runtime.truthy(runtime.opEq(_id65, ({ type: "string", value: "fn" })))) { +const r_32 = _s64; +const r_33 = r_32.values[0] ?? { type: "null"}; +const r_34 = r_32.values[1] ?? { type: "null"}; +const r_35 = r_34.values[0] ?? { type: "null"}; +const r_36 = r_34.values[1] ?? { type: "null"}; +const r_37 = r_34.values[2] ?? { type: "null"}; +let _ident66 = r_37; +const r_38 = r_32.values[2] ?? { type: "null"}; +const r_39 = r_38.values[0] ?? { type: "null"}; +const r_40 = r_38.values[1] ?? { type: "null"}; +const r_41 = r_38.values[2] ?? { type: "null"}; +let _params67 = r_41; +const r_42 = r_32.values[3] ?? { type: "null"}; +let _body68 = r_42; +(runtime.setLine(71), _define_fn41(_ident66, _line63)); +}; +}; +; +runtime.popCall(); +return { type: "null" }; +}; +function _emit_expr33(_expr69) { +runtime.pushCall("emit_expr"); +const r_43 = _expr69; +const r_44 = r_43.values[0] ?? { type: "null"}; +let _ty70 = r_44; +const r_45 = r_43.values[1] ?? { type: "null"}; +let _line71 = r_45; +if (runtime.truthy(runtime.opEq(_ty70, ({ type: "string", value: "list" })))) { +(runtime.setLine(79), _emit_list34(_expr69)); +} else { +if (runtime.truthy(runtime.opEq(_ty70, ({ type: "string", value: "int" })))) { +const r_46 = _expr69; +const r_47 = r_46.values[0] ?? { type: "null"}; +const r_48 = r_46.values[1] ?? { type: "null"}; +const r_49 = r_46.values[2] ?? { type: "null"}; +let _value72 = r_49; +(runtime.setLine(82), _emit39((runtime.setLine(82), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "({ type: \"int\", value: % })" }), _value72)))); +} else { +if (runtime.truthy(runtime.opEq(_ty70, ({ type: "string", value: "string" })))) { +const r_50 = _expr69; +const r_51 = r_50.values[0] ?? { type: "null"}; +const r_52 = r_50.values[1] ?? { type: "null"}; +const r_53 = r_50.values[2] ?? { type: "null"}; +let _value73 = r_53; +(runtime.setLine(85), _emit39((runtime.setLine(85), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "({ type: \"string\", value: \"%\" })" }), (runtime.setLine(85), _string_escape19(_value73)))))); +} else { +if (runtime.truthy(runtime.opEq(_ty70, ({ type: "string", value: "ident" })))) { +const r_54 = _expr69; +const r_55 = r_54.values[0] ?? { type: "null"}; +const r_56 = r_54.values[1] ?? { type: "null"}; +const r_57 = r_54.values[2] ?? { type: "null"}; +let _value74 = r_57; +if (runtime.truthy(runtime.opEq(_value74, ({ type: "string", value: "null" })))) { +(runtime.setLine(90), _emit39(({ type: "string", value: "({ type: \"null\" })" }))); +runtime.popCall(); +return { type: "null" }; +} else { +if (runtime.truthy(runtime.opEq(_value74, ({ type: "string", value: "false" })))) { +(runtime.setLine(93), _emit39(({ type: "string", value: "({ type: \"bool\", value: false })" }))); +runtime.popCall(); +return { type: "null" }; +} else { +if (runtime.truthy(runtime.opEq(_value74, ({ type: "string", value: "true" })))) { +(runtime.setLine(96), _emit39(({ type: "string", value: "({ type: \"bool\", value: true })" }))); +runtime.popCall(); +return { type: "null" }; +}}}; +const r_58 = (runtime.setLine(100), _get_sym48(_value74)); +let _sym75 = r_58; +if (runtime.truthy(runtime.opEq(_sym75, ({ type: "null" })))) { +(runtime.setLine(102), _print_syms49()); +(runtime.setLine(103), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "undefined symbol '%' on line %" }), _value74, _line71)); +}; +const r_59 = _sym75; +const r_60 = r_59.values[0] ?? { type: "null"}; +let _sym_id76 = r_60; +const r_61 = r_59.values[1] ?? { type: "null"}; +let _sym_ty77 = r_61; +if (runtime.truthy(runtime.opEq(_sym_ty77, ({ type: "string", value: "builtin" })))) { +const r_62 = _sym75; +const r_63 = r_62.values[0] ?? { type: "null"}; +const r_64 = r_62.values[1] ?? { type: "null"}; +const r_65 = r_62.values[2] ?? { type: "null"}; +let _id78 = r_65; +(runtime.setLine(109), _emit39((runtime.setLine(109), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "((...args) => runtime.%(...args))" }), _id78)))); +} else { +if (runtime.truthy(runtime.opEq(_sym_ty77, ({ type: "string", value: "fn" })))) { +(runtime.setLine(111), _emit39((runtime.setLine(111), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value74, _sym_id76)))); +} else { +if (runtime.truthy(runtime.opEq(_sym_ty77, ({ type: "string", value: "param" })))) { +(runtime.setLine(113), _emit39((runtime.setLine(113), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value74, _sym_id76)))); +} else { +if (runtime.truthy(runtime.opEq(_sym_ty77, ({ type: "string", value: "let" })))) { +(runtime.setLine(115), _emit39((runtime.setLine(115), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value74, _sym_id76)))); +} else { +(runtime.setLine(117), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented '%'" }), _sym_ty77)); +}}}}; +} else { +(runtime.setLine(120), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "unknown expr type '%' on line %" }), _ty70, _line71)); +}}}}; +; +runtime.popCall(); +return { type: "null" }; +}; +function _emit_list34(_expr79) { +runtime.pushCall("emit_list"); +const r_66 = _expr79; +const r_67 = r_66.values[0] ?? { type: "null"}; +let _ty80 = r_67; +const r_68 = r_66.values[1] ?? { type: "null"}; +let _line81 = r_68; +const r_69 = r_66.values[2] ?? { type: "null"}; +let _s82 = r_69; +if (runtime.truthy(runtime.opEq((runtime.setLine(126), ((...args) => runtime.builtinLen(...args))(_s82)), ({ type: "int", value: 0 })))) { +(runtime.setLine(127), _emit39(({ type: "string", value: "({ type: \"list\", values: [] })" }))); +runtime.popCall(); +return { type: "null" }; +}; +const r_70 = _s82; +const r_71 = r_70.values[0] ?? { type: "null"}; +const r_72 = r_71.values[0] ?? { type: "null"}; +let _id_ty83 = r_72; +const r_73 = r_71.values[1] ?? { type: "null"}; +const r_74 = r_71.values[2] ?? { type: "null"}; +let _id84 = r_74; +if (runtime.truthy(runtime.opNe(_id_ty83, ({ type: "string", value: "ident" })))) { +(runtime.setLine(132), _emit_list_literal35(_s82)); +runtime.popCall(); +return { type: "null" }; +}; +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "fn" })))) { +const r_75 = _s82; +const r_76 = r_75.values[0] ?? { type: "null"}; +const r_77 = r_75.values[1] ?? { type: "null"}; +const r_78 = r_77.values[0] ?? { type: "null"}; +const r_79 = r_77.values[1] ?? { type: "null"}; +const r_80 = r_77.values[2] ?? { type: "null"}; +let _ident85 = r_80; +const r_81 = r_75.values[2] ?? { type: "null"}; +const r_82 = r_81.values[0] ?? { type: "null"}; +const r_83 = r_81.values[1] ?? { type: "null"}; +const r_84 = r_81.values[2] ?? { type: "null"}; +let _params86 = r_84; +const r_85 = r_75.values[3] ?? { type: "null"}; +let _body87 = r_85; +const r_86 = (runtime.setLine(138), _get_sym48(_ident85)); +let _sym88 = r_86; +const r_87 = _sym88; +const r_88 = r_87.values[0] ?? { type: "null"}; +let _sym_id89 = r_88; +(runtime.setLine(141), _emit39((runtime.setLine(141), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "function _%%(" }), _ident85, _sym_id89)))); +(runtime.setLine(143), _enter_scope45()); +const r_89 = ({ type: "bool", value: true }); +let _first90 = r_89; +for (const r_90 of _params86.values) {; +const r_91 = r_90.values[0] ?? { type: "null"}; +const r_92 = r_90.values[1] ?? { type: "null"}; +const r_93 = r_90.values[2] ?? { type: "null"}; +let _ident91 = r_93; +if (runtime.truthy(runtime.opNot(_first90))) { +(runtime.setLine(148), _emit39(({ type: "string", value: ", " }))); +}; +(_first90 = ({ type: "bool", value: false })); +const r_94 = (runtime.setLine(152), _define_param42(_ident91, _line81)); +let _sym_id92 = r_94; +(runtime.setLine(153), _emit39((runtime.setLine(153), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _ident91, _sym_id92)))); +}; +(runtime.setLine(157), _emit39(({ type: "string", value: ") {\n" }))); +(runtime.setLine(158), _emit39((runtime.setLine(158), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.pushCall(\"%\");\n" }), _ident85)))); +(runtime.setLine(160), _emit_expr33(_body87)); +(runtime.setLine(161), _emit39(({ type: "string", value: ";\nruntime.popCall();\nreturn { type: \"null\" };\n}" }))); +(runtime.setLine(163), _leave_scope46()); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "let" })))) { +const r_95 = _s82; +const r_96 = r_95.values[0] ?? { type: "null"}; +const r_97 = r_95.values[1] ?? { type: "null"}; +let _pat93 = r_97; +const r_98 = r_95.values[2] ?? { type: "null"}; +let _expr94 = r_98; +const r_99 = (runtime.setLine(166), _let_node_reg_count50()); +let _reg95 = r_99; +(runtime.setLine(167), _let_node_reg_increment51()); +(runtime.setLine(168), _emit39((runtime.setLine(168), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "const r_% = " }), _reg95)))); +(runtime.setLine(169), _emit_expr33(_expr94)); +(runtime.setLine(170), _emit_let_node36(_pat93, _reg95)); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "do" })))) { +(runtime.setLine(172), _enter_scope45()); +(runtime.setLine(173), _discover_syms32((runtime.setLine(173), _slice26(_s82, ({ type: "int", value: 1 }))))); +(runtime.setLine(174), _emit_exprs31((runtime.setLine(174), _slice26(_s82, ({ type: "int", value: 1 }))))); +(runtime.setLine(175), _leave_scope46()); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "for" })))) { +const r_100 = _s82; +const r_101 = r_100.values[0] ?? { type: "null"}; +const r_102 = r_100.values[1] ?? { type: "null"}; +let _pat96 = r_102; +const r_103 = r_100.values[2] ?? { type: "null"}; +let _expr97 = r_103; +const r_104 = r_100.values[3] ?? { type: "null"}; +let _body98 = r_104; +const r_105 = (runtime.setLine(179), _let_node_reg_count50()); +let _reg99 = r_105; +(runtime.setLine(180), _let_node_reg_increment51()); +(runtime.setLine(181), _emit39((runtime.setLine(181), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "for (const r_% of " }), _reg99)))); +(runtime.setLine(182), _emit_expr33(_expr97)); +(runtime.setLine(183), _emit39(({ type: "string", value: ".values) {" }))); +(runtime.setLine(185), _enter_scope45()); +(runtime.setLine(186), _emit_let_node36(_pat96, _reg99)); +(runtime.setLine(187), _enter_scope45()); +(runtime.setLine(189), _emit39(({ type: "string", value: ";\n" }))); +(runtime.setLine(190), _emit_expr33(_body98)); +(runtime.setLine(191), _emit39(({ type: "string", value: "}" }))); +(runtime.setLine(193), _leave_scope46()); +(runtime.setLine(194), _leave_scope46()); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "loop" })))) { +const r_106 = _s82; +const r_107 = r_106.values[0] ?? { type: "null"}; +const r_108 = r_106.values[1] ?? { type: "null"}; +let _body100 = r_108; +(runtime.setLine(197), _emit39(({ type: "string", value: "while (true) {\n" }))); +(runtime.setLine(198), _emit_expr33(_body100)); +(runtime.setLine(199), _emit39(({ type: "string", value: "}" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "if" })))) { +const r_109 = _s82; +const r_110 = r_109.values[0] ?? { type: "null"}; +const r_111 = r_109.values[1] ?? { type: "null"}; +let _cond101 = r_111; +const r_112 = r_109.values[2] ?? { type: "null"}; +let _truthy102 = r_112; +const r_113 = r_109.values[3] ?? { type: "null"}; +let _falsy103 = r_113; +(runtime.setLine(202), _emit39(({ type: "string", value: "if (runtime.truthy(" }))); +(runtime.setLine(203), _emit_expr33(_cond101)); +(runtime.setLine(204), _emit39(({ type: "string", value: ")) {\n" }))); +(runtime.setLine(205), _emit_expr33(_truthy102)); +(runtime.setLine(206), _emit39(({ type: "string", value: "}" }))); +if (runtime.truthy(runtime.opNe(_falsy103, ({ type: "null" })))) { +(runtime.setLine(208), _emit39(({ type: "string", value: " else {\n" }))); +(runtime.setLine(209), _emit_expr33(_falsy103)); +(runtime.setLine(210), _emit39(({ type: "string", value: "}" }))); +}; +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "return" })))) { +const r_114 = _s82; +const r_115 = r_114.values[0] ?? { type: "null"}; +const r_116 = r_114.values[1] ?? { type: "null"}; +let _value104 = r_116; +(runtime.setLine(214), _emit39(({ type: "string", value: "runtime.popCall();\n" }))); +(runtime.setLine(215), _emit39(({ type: "string", value: "return " }))); +if (runtime.truthy(runtime.opNe(_value104, ({ type: "null" })))) { +(runtime.setLine(217), _emit_expr33(_value104)); +} else { +(runtime.setLine(219), _emit39(({ type: "string", value: "{ type: \"null\" }" }))); +}; +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "break" })))) { +const r_117 = _s82; +const r_118 = r_117.values[0] ?? { type: "null"}; +const r_119 = r_117.values[1] ?? { type: "null"}; +let _value105 = r_119; +(runtime.setLine(223), _emit39(({ type: "string", value: "break" }))); +if (runtime.truthy(runtime.opNe(_value105, ({ type: "null" })))) { +(runtime.setLine(225), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" }))); +}; +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "call" })))) { +const r_120 = _s82; +const r_121 = r_120.values[0] ?? { type: "null"}; +const r_122 = r_120.values[1] ?? { type: "null"}; +let _callee106 = r_122; +const r_123 = (runtime.setLine(229), _slice26(_s82, ({ type: "int", value: 2 }))); +let _args107 = r_123; +(runtime.setLine(230), _emit39((runtime.setLine(230), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%), " }), _line81)))); +(runtime.setLine(231), _emit_expr33(_callee106)); +(runtime.setLine(232), _emit39(({ type: "string", value: "(" }))); +const r_124 = ({ type: "bool", value: true }); +let _first108 = r_124; +for (const r_125 of _args107.values) {; +let _arg109 = r_125; +if (runtime.truthy(runtime.opNot(_first108))) { +(runtime.setLine(237), _emit39(({ type: "string", value: ", " }))); +}; +(_first108 = ({ type: "bool", value: false })); +(runtime.setLine(241), _emit_expr33(_arg109)); +}; +(runtime.setLine(244), _emit39(({ type: "string", value: "))" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "=" })))) { +(runtime.setLine(246), _emit_assign_expr38(_s82, _line81, ({ type: "string", value: "=" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "+=" })))) { +(runtime.setLine(248), _emit_assign_expr38(_s82, _line81, ({ type: "string", value: "+" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "-=" })))) { +(runtime.setLine(250), _emit_assign_expr38(_s82, _line81, ({ type: "string", value: "-" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "or" })))) { +const r_126 = _s82; +const r_127 = r_126.values[0] ?? { type: "null"}; +const r_128 = r_126.values[1] ?? { type: "null"}; +let _left110 = r_128; +const r_129 = r_126.values[2] ?? { type: "null"}; +let _right111 = r_129; +(runtime.setLine(253), _emit39((runtime.setLine(253), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line81)))); +(runtime.setLine(254), _emit39(({ type: "string", value: ", { type: \"bool\", value: runtime.truthy(" }))); +(runtime.setLine(255), _emit_expr33(_left110)); +(runtime.setLine(256), _emit39(({ type: "string", value: ") || runtime.truthy(" }))); +(runtime.setLine(257), _emit_expr33(_right111)); +(runtime.setLine(258), _emit39(({ type: "string", value: ") })" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "and" })))) { +const r_130 = _s82; +const r_131 = r_130.values[0] ?? { type: "null"}; +const r_132 = r_130.values[1] ?? { type: "null"}; +let _left112 = r_132; +const r_133 = r_130.values[2] ?? { type: "null"}; +let _right113 = r_133; +(runtime.setLine(261), _emit39((runtime.setLine(261), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line81)))); +(runtime.setLine(262), _emit39(({ type: "string", value: ", { type: \"bool\", value: runtime.truthy(" }))); +(runtime.setLine(263), _emit_expr33(_left112)); +(runtime.setLine(264), _emit39(({ type: "string", value: ") && runtime.truthy(" }))); +(runtime.setLine(265), _emit_expr33(_right113)); +(runtime.setLine(266), _emit39(({ type: "string", value: ") })" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "==" })))) { +(runtime.setLine(268), _emit_binary_op37(_s82, ({ type: "string", value: "opEq" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "!=" })))) { +(runtime.setLine(270), _emit_binary_op37(_s82, ({ type: "string", value: "opNe" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "<" })))) { +(runtime.setLine(272), _emit_binary_op37(_s82, ({ type: "string", value: "opLt" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: ">" })))) { +(runtime.setLine(274), _emit_binary_op37(_s82, ({ type: "string", value: "opGt" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "<=" })))) { +(runtime.setLine(276), _emit_binary_op37(_s82, ({ type: "string", value: "opLte" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: ">=" })))) { +(runtime.setLine(278), _emit_binary_op37(_s82, ({ type: "string", value: "opGte" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "+" })))) { +(runtime.setLine(280), _emit_binary_op37(_s82, ({ type: "string", value: "opAdd" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "-" })))) { +(runtime.setLine(282), _emit_binary_op37(_s82, ({ type: "string", value: "opSub" }))); +} else { +if (runtime.truthy(runtime.opEq(_id84, ({ type: "string", value: "not" })))) { +const r_134 = _s82; +const r_135 = r_134.values[0] ?? { type: "null"}; +const r_136 = r_134.values[1] ?? { type: "null"}; +let _expr114 = r_136; +(runtime.setLine(285), _emit39(({ type: "string", value: "runtime.opNot(" }))); +(runtime.setLine(286), _emit_expr33(_expr114)); +(runtime.setLine(287), _emit39(({ type: "string", value: ")" }))); +} else { +(runtime.setLine(289), _emit_list_literal35(_s82)); +}}}}}}}}}}}}}}}}}}}}}}}; +; +runtime.popCall(); +return { type: "null" }; +}; +function _emit_list_literal35(_s115) { +runtime.pushCall("emit_list_literal"); +(runtime.setLine(294), _emit39(({ type: "string", value: "({ type: \"list\", values: [" }))); +const r_137 = ({ type: "bool", value: true }); +let _first116 = r_137; +for (const r_138 of _s115.values) {; +let _e117 = r_138; +if (runtime.truthy(runtime.opNot(_first116))) { +(runtime.setLine(298), _emit39(({ type: "string", value: ", " }))); +}; +(_first116 = ({ type: "bool", value: false })); +(runtime.setLine(302), _emit_expr33(_e117)); +}; +(runtime.setLine(304), _emit39(({ type: "string", value: "] })" }))); +; +runtime.popCall(); +return { type: "null" }; +}; +function _emit_let_node36(_pat118, _base_reg119) { +runtime.pushCall("emit_let_node"); +const r_139 = _pat118; +const r_140 = r_139.values[0] ?? { type: "null"}; +let _pat_ty120 = r_140; +const r_141 = r_139.values[1] ?? { type: "null"}; +let _line121 = r_141; +if (runtime.truthy(runtime.opEq(_pat_ty120, ({ type: "string", value: "ident" })))) { +const r_142 = _pat118; +const r_143 = r_142.values[0] ?? { type: "null"}; +const r_144 = r_142.values[1] ?? { type: "null"}; +const r_145 = r_142.values[2] ?? { type: "null"}; +let _ident122 = r_145; +if (runtime.truthy(runtime.opEq(_ident122, ({ type: "string", value: "_" })))) { +runtime.popCall(); +return { type: "null" }}; +const r_146 = (runtime.setLine(314), _define_let43(_ident122, _line121)); +let _sym_id123 = r_146; +(runtime.setLine(315), _emit39((runtime.setLine(315), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nlet _%% = r_%" }), _ident122, _sym_id123, _base_reg119)))); +} else { +if (runtime.truthy(runtime.opEq(_pat_ty120, ({ type: "string", value: "list" })))) { +const r_147 = _pat118; +const r_148 = r_147.values[0] ?? { type: "null"}; +const r_149 = r_147.values[1] ?? { type: "null"}; +const r_150 = r_147.values[2] ?? { type: "null"}; +let _pats124 = r_150; +const r_151 = ({ type: "int", value: 0 }); +let _i125 = r_151; +for (const r_152 of _pats124.values) {; +let _pat126 = r_152; +const r_153 = (runtime.setLine(337), _let_node_reg_count50()); +let _reg127 = r_153; +(runtime.setLine(338), _let_node_reg_increment51()); +(runtime.setLine(339), _emit39((runtime.setLine(339), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nconst r_% = r_%.values[%] ?? { type: \"null\"}" }), _reg127, _base_reg119, _i125)))); +(runtime.setLine(343), _emit_let_node36(_pat126, _reg127)); +(_i125 = runtime.opAdd(_i125, ({ type: "int", value: 1 }))); +}; +} else { +(runtime.setLine(347), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "malformed pattern on line %" }), _line121)); +}}; +; +runtime.popCall(); +return { type: "null" }; +}; +function _emit_binary_op37(_s128, _id129) { +runtime.pushCall("emit_binary_op"); +const r_154 = _s128; +const r_155 = r_154.values[0] ?? { type: "null"}; +const r_156 = r_154.values[1] ?? { type: "null"}; +let _left130 = r_156; +const r_157 = r_154.values[2] ?? { type: "null"}; +let _right131 = r_157; +(runtime.setLine(353), _emit39((runtime.setLine(353), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.%(" }), _id129)))); +(runtime.setLine(354), _emit_expr33(_left130)); +(runtime.setLine(355), _emit39(({ type: "string", value: ", " }))); +(runtime.setLine(356), _emit_expr33(_right131)); +(runtime.setLine(357), _emit39(({ type: "string", value: ")" }))); +; +runtime.popCall(); +return { type: "null" }; +}; +function _emit_assign_expr38(_s132, _line133, _id134) { +runtime.pushCall("emit_assign_expr"); +const r_158 = _s132; +const r_159 = r_158.values[0] ?? { type: "null"}; +const r_160 = r_158.values[1] ?? { type: "null"}; +const r_161 = r_160.values[0] ?? { type: "null"}; +let _target_type135 = r_161; +const r_162 = r_158.values[2] ?? { type: "null"}; +let _expr136 = r_162; +if (runtime.truthy(runtime.opNe(_target_type135, ({ type: "string", value: "ident" })))) { +(runtime.setLine(363), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to expression on line %" }), _line133)); +}; +const r_163 = _s132; +const r_164 = r_163.values[0] ?? { type: "null"}; +const r_165 = r_163.values[1] ?? { type: "null"}; +const r_166 = r_165.values[0] ?? { type: "null"}; +const r_167 = r_165.values[1] ?? { type: "null"}; +const r_168 = r_165.values[2] ?? { type: "null"}; +let _ident137 = r_168; +const r_169 = (runtime.setLine(366), _get_sym48(_ident137)); +let _sym138 = r_169; +if (runtime.truthy(runtime.opEq(_sym138, ({ type: "null" })))) { +(runtime.setLine(368), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "could not find symbol '%' on line %" }), _ident137, _line133)); +}; +const r_170 = _sym138; +const r_171 = r_170.values[0] ?? { type: "null"}; +let _sym_id139 = r_171; +const r_172 = r_170.values[1] ?? { type: "null"}; +let _sym_type140 = r_172; +const r_173 = r_170.values[2] ?? { type: "null"}; +let _sym_ident141 = r_173; +const r_174 = r_170.values[3] ?? { type: "null"}; +if (runtime.truthy(runtime.opEq(_sym_type140, ({ type: "string", value: "let" })))) { +(runtime.setLine(372), _emit39((runtime.setLine(372), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(_%% = " }), _sym_ident141, _sym_id139)))); +if (runtime.truthy(runtime.opEq(_id134, ({ type: "string", value: "=" })))) { +(runtime.setLine(374), _emit_expr33(_expr136)); +} else { +if (runtime.truthy(runtime.opEq(_id134, ({ type: "string", value: "+" })))) { +(runtime.setLine(376), _emit39((runtime.setLine(376), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opAdd(_%%, " }), _sym_ident141, _sym_id139)))); +(runtime.setLine(377), _emit_expr33(_expr136)); +(runtime.setLine(378), _emit39(({ type: "string", value: ")" }))); +} else { +if (runtime.truthy(runtime.opEq(_id134, ({ type: "string", value: "-" })))) { +(runtime.setLine(380), _emit39((runtime.setLine(380), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opSub(_%%, " }), _sym_ident141, _sym_id139)))); +(runtime.setLine(381), _emit_expr33(_expr136)); +(runtime.setLine(382), _emit39(({ type: "string", value: ")" }))); +} else { +(runtime.setLine(384), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" }))); +}}}; +(runtime.setLine(386), _emit39(({ type: "string", value: ")" }))); +} else { +(runtime.setLine(388), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to symbol '%' on line %" }), _sym_ident141, _line133)); +}; +; +runtime.popCall(); +return { type: "null" }; +}; +function _emit39(_str142) { +runtime.pushCall("emit"); +(runtime.setLine(393), ((...args) => runtime.builtinPush(...args))(_output44, _str142)); +; +runtime.popCall(); +return { type: "null" }; +}; +function _define_builtin40(_ident143, _builtin_id144) { +runtime.pushCall("define_builtin"); +const r_175 = (runtime.setLine(397), _sym_id_count52()); +let _sym_id145 = r_175; +(runtime.setLine(398), _sym_id_increment53()); +(runtime.setLine(400), _define_sym47(_ident143, ({ type: "list", values: [_sym_id145, ({ type: "string", value: "builtin" }), _builtin_id144] }))); +runtime.popCall(); +return _sym_id145; +; +runtime.popCall(); +return { type: "null" }; +}; +function _define_fn41(_ident146, _line147) { +runtime.pushCall("define_fn"); +const r_176 = (runtime.setLine(405), _sym_id_count52()); +let _sym_id148 = r_176; +(runtime.setLine(406), _sym_id_increment53()); +(runtime.setLine(408), _define_sym47(_ident146, ({ type: "list", values: [_sym_id148, ({ type: "string", value: "fn" }), _ident146, _line147] }))); +runtime.popCall(); +return _sym_id148; +; +runtime.popCall(); +return { type: "null" }; +}; +function _define_param42(_ident149, _line150) { +runtime.pushCall("define_param"); +const r_177 = (runtime.setLine(413), _sym_id_count52()); +let _sym_id151 = r_177; +(runtime.setLine(414), _sym_id_increment53()); +(runtime.setLine(416), _define_sym47(_ident149, ({ type: "list", values: [_sym_id151, ({ type: "string", value: "param" }), _ident149, _line150] }))); +runtime.popCall(); +return _sym_id151; +; +runtime.popCall(); +return { type: "null" }; +}; +function _define_let43(_ident152, _line153) { +runtime.pushCall("define_let"); +const r_178 = (runtime.setLine(421), _sym_id_count52()); +let _sym_id154 = r_178; +(runtime.setLine(422), _sym_id_increment53()); +(runtime.setLine(424), _define_sym47(_ident152, ({ type: "list", values: [_sym_id154, ({ type: "string", value: "let" }), _ident152, _line153] }))); +runtime.popCall(); +return _sym_id154; +; +runtime.popCall(); +return { type: "null" }; +}; +runtime.popCall(); +return ({ type: "list", values: [_generate30] }); +; +runtime.popCall(); +return { type: "null" }; +}; +function _Counter17() { +runtime.pushCall("Counter"); +const r_179 = ({ type: "int", value: 0 }); +let _counter157 = r_179; +function _count155() { +runtime.pushCall("count"); +runtime.popCall(); +return _counter157; +; +runtime.popCall(); +return { type: "null" }; +}; +function _increment156() { +runtime.pushCall("increment"); +(_counter157 = runtime.opAdd(_counter157, ({ type: "int", value: 1 }))); +; +runtime.popCall(); +return { type: "null" }; +}; +runtime.popCall(); +return ({ type: "list", values: [_count155, _increment156] }); +; +runtime.popCall(); +return { type: "null" }; +}; +function _Syms18() { +runtime.pushCall("Syms"); +const r_180 = ({ type: "list", values: [({ type: "null" }), ({ type: "list", values: [] })] }); +let _syms165 = r_180; +function _enter_scope158() { +runtime.pushCall("enter_scope"); +(_syms165 = ({ type: "list", values: [_syms165, ({ type: "list", values: [] })] })); +; +runtime.popCall(); +return { type: "null" }; +}; +function _leave_scope159() { +runtime.pushCall("leave_scope"); +const r_181 = _syms165; +const r_182 = r_181.values[0] ?? { type: "null"}; +let _parent166 = r_182; +const r_183 = r_181.values[1] ?? { type: "null"}; +(_syms165 = _parent166); +; +runtime.popCall(); +return { type: "null" }; +}; +function _define160(_ident167, _sym168) { +runtime.pushCall("define"); +const r_184 = _syms165; +const r_185 = r_184.values[0] ?? { type: "null"}; +const r_186 = r_184.values[1] ?? { type: "null"}; +let _map169 = r_186; +const r_187 = ({ type: "int", value: 0 }); +let _i170 = r_187; +while (true) { +if (runtime.truthy(runtime.opGte(_i170, (runtime.setLine(461), ((...args) => runtime.builtinLen(...args))(_map169))))) { +break}; +const r_188 = (runtime.setLine(462), ((...args) => runtime.builtinAt(...args))(_map169, _i170)); +const r_189 = r_188.values[0] ?? { type: "null"}; +let _s_ident171 = r_189; +const r_190 = r_188.values[1] ?? { type: "null"}; +if (runtime.truthy(runtime.opEq(_ident167, _s_ident171))) { +(runtime.setLine(464), ((...args) => runtime.builtinSet(...args))(_map169, _i170, ({ type: "list", values: [_ident167, _sym168] }))); +runtime.popCall(); +return { type: "null" }; +}; +(_i170 = runtime.opAdd(_i170, ({ type: "int", value: 1 }))); +}; +(runtime.setLine(469), ((...args) => runtime.builtinPush(...args))(_map169, ({ type: "list", values: [_ident167, _sym168] }))); +; +runtime.popCall(); +return { type: "null" }; +}; +function _find_sym161(_syms172, _ident173) { +runtime.pushCall("find_sym"); +const r_191 = _syms172; +const r_192 = r_191.values[0] ?? { type: "null"}; +let _parent174 = r_192; +const r_193 = r_191.values[1] ?? { type: "null"}; +let _map175 = r_193; +const r_194 = ({ type: "int", value: 0 }); +let _i176 = r_194; +while (true) { +if (runtime.truthy(runtime.opGte(_i176, (runtime.setLine(476), ((...args) => runtime.builtinLen(...args))(_map175))))) { +break}; +const r_195 = (runtime.setLine(477), ((...args) => runtime.builtinAt(...args))(_map175, _i176)); +const r_196 = r_195.values[0] ?? { type: "null"}; +let _s_ident177 = r_196; +const r_197 = r_195.values[1] ?? { type: "null"}; +let _s_sym178 = r_197; +if (runtime.truthy(runtime.opEq(_ident173, _s_ident177))) { +runtime.popCall(); +return _s_sym178; +}; +(_i176 = runtime.opAdd(_i176, ({ type: "int", value: 1 }))); +}; +if (runtime.truthy(runtime.opNe(_parent174, ({ type: "null" })))) { +runtime.popCall(); +return (runtime.setLine(484), _find_sym161(_parent174, _ident173)); +}; +runtime.popCall(); +return ({ type: "null" }); +; +runtime.popCall(); +return { type: "null" }; +}; +function _get162(_ident179) { +runtime.pushCall("get"); +runtime.popCall(); +return (runtime.setLine(490), _find_sym161(_syms165, _ident179)); +; +runtime.popCall(); +return { type: "null" }; +}; +function _print_syms_node163(_syms180, _depth181) { +runtime.pushCall("print_syms_node"); +const r_198 = _syms180; +const r_199 = r_198.values[0] ?? { type: "null"}; +let _parent182 = r_199; +const r_200 = r_198.values[1] ?? { type: "null"}; +let _map183 = r_200; +for (const r_201 of _map183.values) {; +const r_202 = r_201.values[0] ?? { type: "null"}; +let _ident184 = r_202; +const r_203 = r_201.values[1] ?? { type: "null"}; +let _sym185 = r_203; +(runtime.setLine(496), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%- %: %" }), (runtime.setLine(496), _indent25(_depth181)), _ident184, _sym185)); +}; +if (runtime.truthy(runtime.opNe(_parent182, ({ type: "null" })))) { +(runtime.setLine(499), _print_syms_node163(_parent182, runtime.opAdd(_depth181, ({ type: "int", value: 1 })))); +}; +; +runtime.popCall(); +return { type: "null" }; +}; +function _print_syms164() { +runtime.pushCall("print_syms"); +(runtime.setLine(504), _print_syms_node163(_syms165, ({ type: "int", value: 0 }))); +; +runtime.popCall(); +return { type: "null" }; +}; +runtime.popCall(); +return ({ type: "list", values: [_enter_scope158, _leave_scope159, _define160, _get162, _print_syms164] }); +; +runtime.popCall(); +return { type: "null" }; +}; +function _string_escape19(_str186) { +runtime.pushCall("string_escape"); +const r_204 = (runtime.setLine(518), ((...args) => runtime.builtinLen(...args))(_str186)); +let _str_len187 = r_204; +const r_205 = ({ type: "int", value: 0 }); +let _i188 = r_205; +const r_206 = ({ type: "string", value: "" }); +let _result189 = r_206; +while (true) { +if (runtime.truthy(runtime.opGte(_i188, _str_len187))) { +break}; +const r_207 = (runtime.setLine(523), ((...args) => runtime.builtinAt(...args))(_str186, _i188)); +let _ch190 = r_207; +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\\" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\\\" }))); +} else { +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\"" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\\"" }))); +} else { +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\t" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\t" }))); +} else { +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\r" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\r" }))); +} else { +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\n" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\n" }))); +} else { +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\n" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\0" }))); +} else { +(_result189 = runtime.opAdd(_result189, _ch190)); +}}}}}}; +(_i188 = runtime.opAdd(_i188, ({ type: "int", value: 1 }))); +}; +runtime.popCall(); +return _result189; +; +runtime.popCall(); +return { type: "null" }; +}; +function _Parser20(_tokens191) { +runtime.pushCall("Parser"); +const r_208 = ({ type: "int", value: 0 }); +let _i198 = r_208; +const r_209 = (runtime.setLine(546), ((...args) => runtime.builtinAt(...args))(_tokens191, _i198)); +let _tok199 = r_209; +function _parse192() { +runtime.pushCall("parse"); +const r_210 = ({ type: "list", values: [] }); +let _exprs200 = r_210; +while (true) { +if (runtime.truthy((runtime.setLine(551), _done197()))) { +break}; +(runtime.setLine(552), ((...args) => runtime.builtinPush(...args))(_exprs200, (runtime.setLine(552), _parse_expr193()))); +}; +runtime.popCall(); +return _exprs200; +; +runtime.popCall(); +return { type: "null" }; +}; +function _parse_expr193() { +runtime.pushCall("parse_expr"); +const r_211 = _tok199; +const r_212 = r_211.values[0] ?? { type: "null"}; +let _ty201 = r_212; +const r_213 = r_211.values[1] ?? { type: "null"}; +let _line202 = r_213; +const r_214 = r_211.values[2] ?? { type: "null"}; +let _value203 = r_214; +if (runtime.truthy((runtime.setLine(559), _eat194(({ type: "string", value: "(" }))))) { +const r_215 = ({ type: "list", values: [] }); +let _values204 = r_215; +while (true) { +if (runtime.truthy((runtime.setLine(562), _test196(({ type: "string", value: ")" }))))) { +break}; +(runtime.setLine(563), ((...args) => runtime.builtinPush(...args))(_values204, (runtime.setLine(563), _parse_expr193()))); +}; +if (runtime.truthy(runtime.opNot((runtime.setLine(565), _eat194(({ type: "string", value: ")" })))))) { +(runtime.setLine(566), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected ')' on line %" }), (runtime.setLine(566), ((...args) => runtime.builtinAt(...args))(_tok199, ({ type: "int", value: 1 }))))); +}; +runtime.popCall(); +return ({ type: "list", values: [({ type: "string", value: "list" }), _line202, _values204] }); +} else { +if (runtime.truthy((runtime.setLine(569), _eat194(({ type: "string", value: "string" }))))) { +runtime.popCall(); +return ({ type: "list", values: [({ type: "string", value: "string" }), _line202, _value203] }); +} else { +if (runtime.truthy((runtime.setLine(571), _eat194(({ type: "string", value: "int" }))))) { +runtime.popCall(); +return ({ type: "list", values: [({ type: "string", value: "int" }), _line202, (runtime.setLine(572), ((...args) => runtime.builtinStringToInt(...args))(_value203))] }); +} else { +if (runtime.truthy((runtime.setLine(573), _eat194(({ type: "string", value: "ident" }))))) { +runtime.popCall(); +return ({ type: "list", values: [({ type: "string", value: "ident" }), _line202, _value203] }); +} else { +(runtime.setLine(576), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected expression, got '%' on line %" }), _ty201, _line202)); +}}}}; +; +runtime.popCall(); +return { type: "null" }; +}; +function _eat194(_pat205) { +runtime.pushCall("eat"); +if (runtime.truthy(runtime.opNot((runtime.setLine(581), _test196(_pat205))))) { +runtime.popCall(); +return ({ type: "bool", value: false })}; +(runtime.setLine(582), _step195()); +runtime.popCall(); +return ({ type: "bool", value: true }); +; +runtime.popCall(); +return { type: "null" }; +}; +function _step195() { +runtime.pushCall("step"); +(_i198 = runtime.opAdd(_i198, ({ type: "int", value: 1 }))); +if (runtime.truthy(runtime.opNot((runtime.setLine(588), _done197())))) { +const r_216 = (runtime.setLine(589), ((...args) => runtime.builtinAt(...args))(_tokens191, _i198)); +let _new_tok206 = r_216; +(_tok199 = _new_tok206); +}; +; +runtime.popCall(); +return { type: "null" }; +}; +function _test196(_pat207) { +runtime.pushCall("test"); +if (runtime.truthy((runtime.setLine(595), _done197()))) { +runtime.popCall(); +return ({ type: "bool", value: false })}; +const r_217 = _tok199; +const r_218 = r_217.values[0] ?? { type: "null"}; +let _ty208 = r_218; +runtime.popCall(); +return runtime.opEq(_pat207, _ty208); +; +runtime.popCall(); +return { type: "null" }; +}; +function _done197() { +runtime.pushCall("done"); +runtime.popCall(); +return runtime.opGte(_i198, (runtime.setLine(601), ((...args) => runtime.builtinLen(...args))(_tokens191))); +; +runtime.popCall(); +return { type: "null" }; +}; +runtime.popCall(); +return ({ type: "list", values: [_parse192] }); +; +runtime.popCall(); +return { type: "null" }; +}; +function _tokenize21(_text209) { +runtime.pushCall("tokenize"); +const r_219 = (runtime.setLine(608), ((...args) => runtime.builtinLen(...args))(_text209)); +let _text_len210 = r_219; +const r_220 = ({ type: "list", values: [] }); +let _tokens211 = r_220; +const r_221 = ({ type: "int", value: 0 }); +let _i212 = r_221; +const r_222 = ({ type: "int", value: 1 }); +let _line213 = r_222; +const r_223 = runtime.opAdd(({ type: "string", value: "abcdefghijklmnopqrstuvwxyz" }), ({ type: "string", value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-*/%&|=?!<>'_" })); +let _ident_chars214 = r_223; +while (true) { +if (runtime.truthy(runtime.opGte(_i212, _text_len210))) { +break}; +const r_224 = (runtime.setLine(620), ((...args) => runtime.builtinAt(...args))(_text209, _i212)); +let _ch215 = r_224; +if (runtime.truthy((runtime.setLine(622), _contains22(({ type: "string", value: " \t\r\n" }), _ch215)))) { +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\n" })))) { +(_line213 = runtime.opAdd(_line213, ({ type: "int", value: 1 }))); +}; +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +} else { +if (runtime.truthy((runtime.setLine(627), _slice_eq23(_text209, _i212, ({ type: "string", value: "//" }))))) { +while (true) { +if (runtime.truthy((runtime.setLine(629), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opEq((runtime.setLine(629), ((...args) => runtime.builtinAt(...args))(_text209, _i212)), ({ type: "string", value: "\n" }))) }))) { +break; +}; +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +}; +} else { +if (runtime.truthy((runtime.setLine(634), _contains22(({ type: "string", value: "()" }), _ch215)))) { +(runtime.setLine(635), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [_ch215, _line213] }))); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +} else { +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\"" })))) { +const r_225 = ({ type: "string", value: "" }); +let _value216 = r_225; +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +(_ch215 = (runtime.setLine(640), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); +while (true) { +if (runtime.truthy((runtime.setLine(642), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\"" }))) }))) { +break; +}; +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\\" })))) { +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +if (runtime.truthy(runtime.opGte(_i212, _text_len210))) { +break; +}; +(_ch215 = (runtime.setLine(650), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "t" })))) { +(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\t" }))); +} else { +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "r" })))) { +(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\r" }))); +} else { +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "n" })))) { +(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\n" }))); +} else { +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "0" })))) { +(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\n" }))); +} else { +(_value216 = runtime.opAdd(_value216, _ch215)); +}}}}; +} else { +(_value216 = runtime.opAdd(_value216, _ch215)); +}; +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +(_ch215 = (runtime.setLine(666), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); +}; +if (runtime.truthy((runtime.setLine(668), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opNe(_ch215, ({ type: "string", value: "\"" }))) }))) { +(runtime.setLine(669), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected '\"' on line %" }), _line213)); +}; +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +(runtime.setLine(672), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [({ type: "string", value: "string" }), _line213, _value216] }))); +} else { +if (runtime.truthy((runtime.setLine(673), _contains22(({ type: "string", value: "0123456789" }), _ch215)))) { +const r_226 = ({ type: "string", value: "" }); +let _value217 = r_226; +while (true) { +(_ch215 = (runtime.setLine(676), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); +if (runtime.truthy((runtime.setLine(677), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opNot((runtime.setLine(677), _contains22(({ type: "string", value: "0123456789" }), _ch215)))) }))) { +break; +}; +(_value217 = runtime.opAdd(_value217, _ch215)); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +}; +(runtime.setLine(683), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [({ type: "string", value: "int" }), _line213, _value217] }))); +} else { +if (runtime.truthy((runtime.setLine(684), _contains22(_ident_chars214, _ch215)))) { +const r_227 = ({ type: "string", value: "" }); +let _value218 = r_227; +while (true) { +(_ch215 = (runtime.setLine(687), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); +if (runtime.truthy((runtime.setLine(688), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opNot((runtime.setLine(688), _contains22(_ident_chars214, _ch215)))) }))) { +break; +}; +(_value218 = runtime.opAdd(_value218, _ch215)); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +}; +(runtime.setLine(694), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [({ type: "string", value: "ident" }), _line213, _value218] }))); +} else { +(runtime.setLine(696), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "illegal char '%'" }), _ch215)); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +}}}}}}; +}; +runtime.popCall(); +return _tokens211; +; +runtime.popCall(); +return { type: "null" }; +}; +function _contains22(_text219, _ch220) { +runtime.pushCall("contains"); +const r_228 = (runtime.setLine(704), ((...args) => runtime.builtinLen(...args))(_text219)); +let _text_len221 = r_228; +const r_229 = ({ type: "int", value: 0 }); +let _i222 = r_229; +while (true) { +if (runtime.truthy(runtime.opGte(_i222, _text_len221))) { +break}; +if (runtime.truthy(runtime.opEq((runtime.setLine(708), ((...args) => runtime.builtinAt(...args))(_text219, _i222)), _ch220))) { +runtime.popCall(); +return ({ type: "bool", value: true }); +}; +(_i222 = runtime.opAdd(_i222, ({ type: "int", value: 1 }))); +}; +runtime.popCall(); +return ({ type: "bool", value: false }); +; +runtime.popCall(); +return { type: "null" }; +}; +function _slice_eq23(_str223, _slice_idx224, _substr225) { +runtime.pushCall("slice_eq"); +const r_230 = (runtime.setLine(717), ((...args) => runtime.builtinLen(...args))(_str223)); +let _str_len226 = r_230; +const r_231 = (runtime.setLine(718), ((...args) => runtime.builtinLen(...args))(_substr225)); +let _substr_len227 = r_231; +const r_232 = ({ type: "int", value: 0 }); +let _i228 = r_232; +while (true) { +if (runtime.truthy(runtime.opGte(_i228, _substr_len227))) { +runtime.popCall(); +return ({ type: "bool", value: true })}; +if (runtime.truthy(runtime.opGte(runtime.opAdd(_slice_idx224, _i228), _str_len226))) { +runtime.popCall(); +return ({ type: "bool", value: false })}; +if (runtime.truthy(runtime.opNe((runtime.setLine(725), ((...args) => runtime.builtinAt(...args))(_str223, runtime.opAdd(_slice_idx224, _i228))), (runtime.setLine(725), ((...args) => runtime.builtinAt(...args))(_substr225, _i228))))) { +runtime.popCall(); +return ({ type: "bool", value: false })}; +(_i228 = runtime.opAdd(_i228, ({ type: "int", value: 1 }))); +}; +runtime.popCall(); +return ({ type: "bool", value: true }); +; +runtime.popCall(); +return { type: "null" }; +}; +function _print_expr24(_expr229, _depth230) { +runtime.pushCall("print_expr"); +const r_233 = _expr229; +const r_234 = r_233.values[0] ?? { type: "null"}; +let _ty231 = r_234; +const r_235 = r_233.values[1] ?? { type: "null"}; +let _line232 = r_235; +const r_236 = r_233.values[2] ?? { type: "null"}; +let _value233 = r_236; +if (runtime.truthy(runtime.opEq(_ty231, ({ type: "string", value: "list" })))) { +(runtime.setLine(735), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%(% %" }), (runtime.setLine(735), _indent25(_depth230)), _ty231, _line232)); +for (const r_237 of _value233.values) {; +let _e234 = r_237; +(runtime.setLine(737), _print_expr24(_e234, runtime.opAdd(_depth230, ({ type: "int", value: 1 })))); +}; +(runtime.setLine(739), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%)" }), (runtime.setLine(739), _indent25(_depth230)))); +} else { +(runtime.setLine(741), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%%" }), (runtime.setLine(741), _indent25(_depth230)), _expr229)); +}; +; +runtime.popCall(); +return { type: "null" }; +}; +function _indent25(_depth235) { +runtime.pushCall("indent"); +const r_238 = ({ type: "string", value: "" }); +let _space236 = r_238; +const r_239 = ({ type: "int", value: 0 }); +let _i237 = r_239; +while (true) { +if (runtime.truthy(runtime.opGte(_i237, _depth235))) { +break}; +(_space236 = runtime.opAdd(_space236, ({ type: "string", value: " " }))); +(_i237 = runtime.opAdd(_i237, ({ type: "int", value: 1 }))); +}; +runtime.popCall(); +return _space236; +; +runtime.popCall(); +return { type: "null" }; +}; +function _slice26(_list238, _idx239) { +runtime.pushCall("slice"); +const r_240 = (runtime.setLine(757), ((...args) => runtime.builtinLen(...args))(_list238)); +let _list_len240 = r_240; +const r_241 = ({ type: "list", values: [] }); +let _elems241 = r_241; +const r_242 = _idx239; +let _i242 = r_242; +while (true) { +if (runtime.truthy(runtime.opGte(_i242, _list_len240))) { +break}; +(runtime.setLine(762), ((...args) => runtime.builtinPush(...args))(_elems241, (runtime.setLine(762), ((...args) => runtime.builtinAt(...args))(_list238, _i242)))); +(_i242 = runtime.opAdd(_i242, ({ type: "int", value: 1 }))); +}; +runtime.popCall(); +return _elems241; +; +runtime.popCall(); +return { type: "null" }; +}; +const r_243 = ({ type: "bool", value: false }); +let _silent243 = r_243; +const r_244 = (runtime.setLine(770), ((...args) => runtime.builtinGetArgs(...args))()); +const r_245 = r_244.values[0] ?? { type: "null"}; +let _input_filename244 = r_245; +const r_246 = r_244.values[1] ?? { type: "null"}; +let _output_filename245 = r_246; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(772), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "reading file '%'..." }), _input_filename244))}; +const r_247 = (runtime.setLine(773), ((...args) => runtime.builtinReadTextFile(...args))(_input_filename244)); +let _text246 = r_247; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(779), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "tokenizing..." })))}; +const r_248 = (runtime.setLine(780), _tokenize21(_text246)); +let _tokens247 = r_248; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(793), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "parsing..." })))}; +const r_249 = (runtime.setLine(794), _Parser20(_tokens247)); +let _parser248 = r_249; +const r_250 = _parser248; +const r_251 = r_250.values[0] ?? { type: "null"}; +let _parse249 = r_251; +const r_252 = (runtime.setLine(796), _parse249()); +let _ast250 = r_252; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(803), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "emitting..." })))}; +const r_253 = (runtime.setLine(804), _Emitter16(_ast250, _input_filename244)); +let _emitter251 = r_253; +const r_254 = _emitter251; +const r_255 = r_254.values[0] ?? { type: "null"}; +let _emit252 = r_255; +const r_256 = (runtime.setLine(806), _emit252()); +let _js_code253 = r_256; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(811), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "writing file '%'..." }), _output_filename245))}; +(runtime.setLine(812), ((...args) => runtime.builtinWriteTextFile(...args))(_output_filename245, _js_code253));