From a9d744d2786052fb7360d4525ec72a1e93895001 Mon Sep 17 00:00:00 2001 From: sfja Date: Tue, 23 Sep 2025 17:03:10 +0200 Subject: [PATCH] add implicit function call syntax --- compile.phi | 27 +- stage2.js | 1055 ++++++++++++++++++++++++++------------------------- 2 files changed, 552 insertions(+), 530 deletions(-) diff --git a/compile.phi b/compile.phi index 6eb2f4d..99ddd4e 100644 --- a/compile.phi +++ b/compile.phi @@ -111,15 +111,11 @@ (fn emit_list (expr) (do (let (ty line s) expr) (if (== (call len s) 0) (do - (call emit "({ type: \"list\", values: [] })") - (call println "warning: deprecated list syntax on line %" line) - (return) + (call panic "illegal function call on line %" line) )) (let ((id_ty _ id)) s) (if (!= id_ty "ident") (do - (call emit_list_literal s) - (call println "warning: deprecated list syntax on line %" line) - (return) + (call panic "illegal function call on line %" line) )) (if (== id "fn") (do (let (_ (_ _ ident) (_ _ params) body) s) @@ -277,8 +273,23 @@ (call emit_expr expr) (call emit ")") ) (do - (call emit_list_literal s) - (call println "warning: deprecated list syntax on line %" line) + (let (callee) s) + (let args (call slice s 1)) + (call emit (call format "(runtime.setLine(%), " line)) + (call emit_expr callee) + (call emit "(") + + (let first true) + (for arg args (do + (if (not first) (do + (call emit ", ") + )) + (= first false) + + (call emit_expr arg) + )) + + (call emit "))") ))))))))))))))))))))))))) )) diff --git a/stage2.js b/stage2.js index 63d55c8..08d96bf 100644 --- a/stage2.js +++ b/stage2.js @@ -202,10 +202,7 @@ let _line77 = r_67; const r_68 = r_65.values[2] ?? { type: "null"}; let _s78 = r_68; if (runtime.truthy(runtime.opEq((runtime.setLine(113), ((...args) => runtime.builtinLen(...args))(_s78)), ({ type: "int", value: 0 })))) { -(runtime.setLine(114), _emit36(({ type: "string", value: "({ type: \"list\", values: [] })" }))); -(runtime.setLine(115), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "warning: deprecated list syntax on line %" }), _line77)); -runtime.popCall(); -return { type: "null" }; +(runtime.setLine(114), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "illegal function call on line %" }), _line77)); }; const r_69 = _s78; const r_70 = r_69.values[0] ?? { type: "null"}; @@ -215,10 +212,7 @@ const r_72 = r_70.values[1] ?? { type: "null"}; const r_73 = r_70.values[2] ?? { type: "null"}; let _id80 = r_73; if (runtime.truthy(runtime.opNe(_id_ty79, ({ type: "string", value: "ident" })))) { -(runtime.setLine(120), _emit_list_literal32(_s78)); -(runtime.setLine(121), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "warning: deprecated list syntax on line %" }), _line77)); -runtime.popCall(); -return { type: "null" }; +(runtime.setLine(118), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "illegal function call on line %" }), _line77)); }; if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "fn" })))) { const r_74 = _s78; @@ -235,13 +229,13 @@ const r_83 = r_80.values[2] ?? { type: "null"}; let _params82 = r_83; const r_84 = r_74.values[3] ?? { type: "null"}; let _body83 = r_84; -const r_85 = (runtime.setLine(127), _get_sym45(_ident81)); +const r_85 = (runtime.setLine(123), _get_sym45(_ident81)); let _sym84 = r_85; const r_86 = _sym84; const r_87 = r_86.values[0] ?? { type: "null"}; let _sym_id85 = r_87; -(runtime.setLine(130), _emit36((runtime.setLine(130), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "function _%%(" }), _ident81, _sym_id85)))); -(runtime.setLine(132), _enter_scope42()); +(runtime.setLine(126), _emit36((runtime.setLine(126), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "function _%%(" }), _ident81, _sym_id85)))); +(runtime.setLine(128), _enter_scope42()); const r_88 = ({ type: "bool", value: true }); let _first86 = r_88; for (const r_89 of _params82.values) {; @@ -250,18 +244,18 @@ const r_91 = r_89.values[1] ?? { type: "null"}; const r_92 = r_89.values[2] ?? { type: "null"}; let _ident87 = r_92; if (runtime.truthy(runtime.opNot(_first86))) { -(runtime.setLine(137), _emit36(({ type: "string", value: ", " }))); +(runtime.setLine(133), _emit36(({ type: "string", value: ", " }))); }; (_first86 = ({ type: "bool", value: false })); -const r_93 = (runtime.setLine(141), _define_param39(_ident87, _line77)); +const r_93 = (runtime.setLine(137), _define_param39(_ident87, _line77)); let _sym_id88 = r_93; -(runtime.setLine(142), _emit36((runtime.setLine(142), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _ident87, _sym_id88)))); +(runtime.setLine(138), _emit36((runtime.setLine(138), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _ident87, _sym_id88)))); }; -(runtime.setLine(146), _emit36(({ type: "string", value: ") {\n" }))); -(runtime.setLine(147), _emit36((runtime.setLine(147), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.pushCall(\"%\");\n" }), _ident81)))); -(runtime.setLine(149), _emit_expr30(_body83)); -(runtime.setLine(150), _emit36(({ type: "string", value: ";\nruntime.popCall();\nreturn { type: \"null\" };\n}" }))); -(runtime.setLine(152), _leave_scope43()); +(runtime.setLine(142), _emit36(({ type: "string", value: ") {\n" }))); +(runtime.setLine(143), _emit36((runtime.setLine(143), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.pushCall(\"%\");\n" }), _ident81)))); +(runtime.setLine(145), _emit_expr30(_body83)); +(runtime.setLine(146), _emit36(({ type: "string", value: ";\nruntime.popCall();\nreturn { type: \"null\" };\n}" }))); +(runtime.setLine(148), _leave_scope43()); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "let" })))) { const r_94 = _s78; @@ -270,18 +264,18 @@ const r_96 = r_94.values[1] ?? { type: "null"}; let _pat89 = r_96; const r_97 = r_94.values[2] ?? { type: "null"}; let _expr90 = r_97; -const r_98 = (runtime.setLine(155), _let_node_reg_count47()); +const r_98 = (runtime.setLine(151), _let_node_reg_count47()); let _reg91 = r_98; -(runtime.setLine(156), _let_node_reg_increment48()); -(runtime.setLine(157), _emit36((runtime.setLine(157), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "const r_% = " }), _reg91)))); -(runtime.setLine(158), _emit_expr30(_expr90)); -(runtime.setLine(159), _emit_let_node33(_pat89, _reg91)); +(runtime.setLine(152), _let_node_reg_increment48()); +(runtime.setLine(153), _emit36((runtime.setLine(153), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "const r_% = " }), _reg91)))); +(runtime.setLine(154), _emit_expr30(_expr90)); +(runtime.setLine(155), _emit_let_node33(_pat89, _reg91)); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "do" })))) { -(runtime.setLine(161), _enter_scope42()); -(runtime.setLine(162), _discover_syms29((runtime.setLine(162), _slice24(_s78, ({ type: "int", value: 1 }))))); -(runtime.setLine(163), _emit_exprs28((runtime.setLine(163), _slice24(_s78, ({ type: "int", value: 1 }))))); -(runtime.setLine(164), _leave_scope43()); +(runtime.setLine(157), _enter_scope42()); +(runtime.setLine(158), _discover_syms29((runtime.setLine(158), _slice24(_s78, ({ type: "int", value: 1 }))))); +(runtime.setLine(159), _emit_exprs28((runtime.setLine(159), _slice24(_s78, ({ type: "int", value: 1 }))))); +(runtime.setLine(160), _leave_scope43()); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "for" })))) { const r_99 = _s78; @@ -292,29 +286,29 @@ const r_102 = r_99.values[2] ?? { type: "null"}; let _expr93 = r_102; const r_103 = r_99.values[3] ?? { type: "null"}; let _body94 = r_103; -const r_104 = (runtime.setLine(168), _let_node_reg_count47()); +const r_104 = (runtime.setLine(164), _let_node_reg_count47()); let _reg95 = r_104; -(runtime.setLine(169), _let_node_reg_increment48()); -(runtime.setLine(170), _emit36((runtime.setLine(170), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "for (const r_% of " }), _reg95)))); -(runtime.setLine(171), _emit_expr30(_expr93)); -(runtime.setLine(172), _emit36(({ type: "string", value: ".values) {" }))); -(runtime.setLine(174), _enter_scope42()); -(runtime.setLine(175), _emit_let_node33(_pat92, _reg95)); -(runtime.setLine(176), _enter_scope42()); -(runtime.setLine(178), _emit36(({ type: "string", value: ";\n" }))); -(runtime.setLine(179), _emit_expr30(_body94)); -(runtime.setLine(180), _emit36(({ type: "string", value: "}" }))); -(runtime.setLine(182), _leave_scope43()); -(runtime.setLine(183), _leave_scope43()); +(runtime.setLine(165), _let_node_reg_increment48()); +(runtime.setLine(166), _emit36((runtime.setLine(166), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "for (const r_% of " }), _reg95)))); +(runtime.setLine(167), _emit_expr30(_expr93)); +(runtime.setLine(168), _emit36(({ type: "string", value: ".values) {" }))); +(runtime.setLine(170), _enter_scope42()); +(runtime.setLine(171), _emit_let_node33(_pat92, _reg95)); +(runtime.setLine(172), _enter_scope42()); +(runtime.setLine(174), _emit36(({ type: "string", value: ";\n" }))); +(runtime.setLine(175), _emit_expr30(_body94)); +(runtime.setLine(176), _emit36(({ type: "string", value: "}" }))); +(runtime.setLine(178), _leave_scope43()); +(runtime.setLine(179), _leave_scope43()); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "loop" })))) { const r_105 = _s78; const r_106 = r_105.values[0] ?? { type: "null"}; const r_107 = r_105.values[1] ?? { type: "null"}; let _body96 = r_107; -(runtime.setLine(186), _emit36(({ type: "string", value: "while (true) {\n" }))); -(runtime.setLine(187), _emit_expr30(_body96)); -(runtime.setLine(188), _emit36(({ type: "string", value: "}" }))); +(runtime.setLine(182), _emit36(({ type: "string", value: "while (true) {\n" }))); +(runtime.setLine(183), _emit_expr30(_body96)); +(runtime.setLine(184), _emit36(({ type: "string", value: "}" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "if" })))) { const r_108 = _s78; @@ -325,15 +319,15 @@ const r_111 = r_108.values[2] ?? { type: "null"}; let _truthy98 = r_111; const r_112 = r_108.values[3] ?? { type: "null"}; let _falsy99 = r_112; -(runtime.setLine(191), _emit36(({ type: "string", value: "if (runtime.truthy(" }))); -(runtime.setLine(192), _emit_expr30(_cond97)); -(runtime.setLine(193), _emit36(({ type: "string", value: ")) {\n" }))); -(runtime.setLine(194), _emit_expr30(_truthy98)); -(runtime.setLine(195), _emit36(({ type: "string", value: "}" }))); +(runtime.setLine(187), _emit36(({ type: "string", value: "if (runtime.truthy(" }))); +(runtime.setLine(188), _emit_expr30(_cond97)); +(runtime.setLine(189), _emit36(({ type: "string", value: ")) {\n" }))); +(runtime.setLine(190), _emit_expr30(_truthy98)); +(runtime.setLine(191), _emit36(({ type: "string", value: "}" }))); if (runtime.truthy(runtime.opNe(_falsy99, ({ type: "null" })))) { -(runtime.setLine(197), _emit36(({ type: "string", value: " else {\n" }))); -(runtime.setLine(198), _emit_expr30(_falsy99)); -(runtime.setLine(199), _emit36(({ type: "string", value: "}" }))); +(runtime.setLine(193), _emit36(({ type: "string", value: " else {\n" }))); +(runtime.setLine(194), _emit_expr30(_falsy99)); +(runtime.setLine(195), _emit36(({ type: "string", value: "}" }))); }; } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "return" })))) { @@ -341,12 +335,12 @@ const r_113 = _s78; const r_114 = r_113.values[0] ?? { type: "null"}; const r_115 = r_113.values[1] ?? { type: "null"}; let _value100 = r_115; -(runtime.setLine(203), _emit36(({ type: "string", value: "runtime.popCall();\n" }))); -(runtime.setLine(204), _emit36(({ type: "string", value: "return " }))); +(runtime.setLine(199), _emit36(({ type: "string", value: "runtime.popCall();\n" }))); +(runtime.setLine(200), _emit36(({ type: "string", value: "return " }))); if (runtime.truthy(runtime.opNe(_value100, ({ type: "null" })))) { -(runtime.setLine(206), _emit_expr30(_value100)); +(runtime.setLine(202), _emit_expr30(_value100)); } else { -(runtime.setLine(208), _emit36(({ type: "string", value: "{ type: \"null\" }" }))); +(runtime.setLine(204), _emit36(({ type: "string", value: "{ type: \"null\" }" }))); }; } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "break" })))) { @@ -354,9 +348,9 @@ const r_116 = _s78; const r_117 = r_116.values[0] ?? { type: "null"}; const r_118 = r_116.values[1] ?? { type: "null"}; let _value101 = r_118; -(runtime.setLine(212), _emit36(({ type: "string", value: "break" }))); +(runtime.setLine(208), _emit36(({ type: "string", value: "break" }))); if (runtime.truthy(runtime.opNe(_value101, ({ type: "null" })))) { -(runtime.setLine(214), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" }))); +(runtime.setLine(210), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" }))); }; } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "call" })))) { @@ -364,34 +358,34 @@ const r_119 = _s78; const r_120 = r_119.values[0] ?? { type: "null"}; const r_121 = r_119.values[1] ?? { type: "null"}; let _callee102 = r_121; -const r_122 = (runtime.setLine(218), _slice24(_s78, ({ type: "int", value: 2 }))); +const r_122 = (runtime.setLine(214), _slice24(_s78, ({ type: "int", value: 2 }))); let _args103 = r_122; -(runtime.setLine(219), _emit36((runtime.setLine(219), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%), " }), _line77)))); -(runtime.setLine(220), _emit_expr30(_callee102)); -(runtime.setLine(221), _emit36(({ type: "string", value: "(" }))); +(runtime.setLine(215), _emit36((runtime.setLine(215), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%), " }), _line77)))); +(runtime.setLine(216), _emit_expr30(_callee102)); +(runtime.setLine(217), _emit36(({ type: "string", value: "(" }))); const r_123 = ({ type: "bool", value: true }); let _first104 = r_123; for (const r_124 of _args103.values) {; let _arg105 = r_124; if (runtime.truthy(runtime.opNot(_first104))) { -(runtime.setLine(226), _emit36(({ type: "string", value: ", " }))); +(runtime.setLine(222), _emit36(({ type: "string", value: ", " }))); }; (_first104 = ({ type: "bool", value: false })); -(runtime.setLine(230), _emit_expr30(_arg105)); +(runtime.setLine(226), _emit_expr30(_arg105)); }; -(runtime.setLine(233), _emit36(({ type: "string", value: "))" }))); +(runtime.setLine(229), _emit36(({ type: "string", value: "))" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "list" })))) { -(runtime.setLine(235), _emit_list_literal32((runtime.setLine(235), _slice24(_s78, ({ type: "int", value: 1 }))))); +(runtime.setLine(231), _emit_list_literal32((runtime.setLine(231), _slice24(_s78, ({ type: "int", value: 1 }))))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "=" })))) { -(runtime.setLine(237), _emit_assign_expr35(_s78, _line77, ({ type: "string", value: "=" }))); +(runtime.setLine(233), _emit_assign_expr35(_s78, _line77, ({ type: "string", value: "=" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "+=" })))) { -(runtime.setLine(239), _emit_assign_expr35(_s78, _line77, ({ type: "string", value: "+" }))); +(runtime.setLine(235), _emit_assign_expr35(_s78, _line77, ({ type: "string", value: "+" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "-=" })))) { -(runtime.setLine(241), _emit_assign_expr35(_s78, _line77, ({ type: "string", value: "-" }))); +(runtime.setLine(237), _emit_assign_expr35(_s78, _line77, ({ type: "string", value: "-" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "or" })))) { const r_125 = _s78; @@ -400,12 +394,12 @@ const r_127 = r_125.values[1] ?? { type: "null"}; let _left106 = r_127; const r_128 = r_125.values[2] ?? { type: "null"}; let _right107 = r_128; -(runtime.setLine(244), _emit36((runtime.setLine(244), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line77)))); -(runtime.setLine(245), _emit36(({ type: "string", value: ", { type: \"bool\", value: runtime.truthy(" }))); -(runtime.setLine(246), _emit_expr30(_left106)); -(runtime.setLine(247), _emit36(({ type: "string", value: ") || runtime.truthy(" }))); -(runtime.setLine(248), _emit_expr30(_right107)); -(runtime.setLine(249), _emit36(({ type: "string", value: ") })" }))); +(runtime.setLine(240), _emit36((runtime.setLine(240), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line77)))); +(runtime.setLine(241), _emit36(({ type: "string", value: ", { type: \"bool\", value: runtime.truthy(" }))); +(runtime.setLine(242), _emit_expr30(_left106)); +(runtime.setLine(243), _emit36(({ type: "string", value: ") || runtime.truthy(" }))); +(runtime.setLine(244), _emit_expr30(_right107)); +(runtime.setLine(245), _emit36(({ type: "string", value: ") })" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "and" })))) { const r_129 = _s78; @@ -414,240 +408,257 @@ const r_131 = r_129.values[1] ?? { type: "null"}; let _left108 = r_131; const r_132 = r_129.values[2] ?? { type: "null"}; let _right109 = r_132; -(runtime.setLine(252), _emit36((runtime.setLine(252), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line77)))); -(runtime.setLine(253), _emit36(({ type: "string", value: ", { type: \"bool\", value: runtime.truthy(" }))); -(runtime.setLine(254), _emit_expr30(_left108)); -(runtime.setLine(255), _emit36(({ type: "string", value: ") && runtime.truthy(" }))); -(runtime.setLine(256), _emit_expr30(_right109)); -(runtime.setLine(257), _emit36(({ type: "string", value: ") })" }))); +(runtime.setLine(248), _emit36((runtime.setLine(248), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line77)))); +(runtime.setLine(249), _emit36(({ type: "string", value: ", { type: \"bool\", value: runtime.truthy(" }))); +(runtime.setLine(250), _emit_expr30(_left108)); +(runtime.setLine(251), _emit36(({ type: "string", value: ") && runtime.truthy(" }))); +(runtime.setLine(252), _emit_expr30(_right109)); +(runtime.setLine(253), _emit36(({ type: "string", value: ") })" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "==" })))) { -(runtime.setLine(259), _emit_binary_op34(_s78, ({ type: "string", value: "opEq" }))); +(runtime.setLine(255), _emit_binary_op34(_s78, ({ type: "string", value: "opEq" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "!=" })))) { -(runtime.setLine(261), _emit_binary_op34(_s78, ({ type: "string", value: "opNe" }))); +(runtime.setLine(257), _emit_binary_op34(_s78, ({ type: "string", value: "opNe" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "<" })))) { -(runtime.setLine(263), _emit_binary_op34(_s78, ({ type: "string", value: "opLt" }))); +(runtime.setLine(259), _emit_binary_op34(_s78, ({ type: "string", value: "opLt" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: ">" })))) { -(runtime.setLine(265), _emit_binary_op34(_s78, ({ type: "string", value: "opGt" }))); +(runtime.setLine(261), _emit_binary_op34(_s78, ({ type: "string", value: "opGt" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "<=" })))) { -(runtime.setLine(267), _emit_binary_op34(_s78, ({ type: "string", value: "opLte" }))); +(runtime.setLine(263), _emit_binary_op34(_s78, ({ type: "string", value: "opLte" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: ">=" })))) { -(runtime.setLine(269), _emit_binary_op34(_s78, ({ type: "string", value: "opGte" }))); +(runtime.setLine(265), _emit_binary_op34(_s78, ({ type: "string", value: "opGte" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "+" })))) { -(runtime.setLine(271), _emit_binary_op34(_s78, ({ type: "string", value: "opAdd" }))); +(runtime.setLine(267), _emit_binary_op34(_s78, ({ type: "string", value: "opAdd" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "-" })))) { -(runtime.setLine(273), _emit_binary_op34(_s78, ({ type: "string", value: "opSub" }))); +(runtime.setLine(269), _emit_binary_op34(_s78, ({ type: "string", value: "opSub" }))); } else { if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "not" })))) { const r_133 = _s78; const r_134 = r_133.values[0] ?? { type: "null"}; const r_135 = r_133.values[1] ?? { type: "null"}; let _expr110 = r_135; -(runtime.setLine(276), _emit36(({ type: "string", value: "runtime.opNot(" }))); -(runtime.setLine(277), _emit_expr30(_expr110)); -(runtime.setLine(278), _emit36(({ type: "string", value: ")" }))); +(runtime.setLine(272), _emit36(({ type: "string", value: "runtime.opNot(" }))); +(runtime.setLine(273), _emit_expr30(_expr110)); +(runtime.setLine(274), _emit36(({ type: "string", value: ")" }))); } else { -(runtime.setLine(280), _emit_list_literal32(_s78)); -(runtime.setLine(281), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "warning: deprecated list syntax on line %" }), _line77)); +const r_136 = _s78; +const r_137 = r_136.values[0] ?? { type: "null"}; +let _callee111 = r_137; +const r_138 = (runtime.setLine(277), _slice24(_s78, ({ type: "int", value: 1 }))); +let _args112 = r_138; +(runtime.setLine(278), _emit36((runtime.setLine(278), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%), " }), _line77)))); +(runtime.setLine(279), _emit_expr30(_callee111)); +(runtime.setLine(280), _emit36(({ type: "string", value: "(" }))); +const r_139 = ({ type: "bool", value: true }); +let _first113 = r_139; +for (const r_140 of _args112.values) {; +let _arg114 = r_140; +if (runtime.truthy(runtime.opNot(_first113))) { +(runtime.setLine(285), _emit36(({ type: "string", value: ", " }))); +}; +(_first113 = ({ type: "bool", value: false })); +(runtime.setLine(289), _emit_expr30(_arg114)); +}; +(runtime.setLine(292), _emit36(({ type: "string", value: "))" }))); }}}}}}}}}}}}}}}}}}}}}}}}; ; runtime.popCall(); return { type: "null" }; }; -function _emit_list_literal32(_s111) { +function _emit_list_literal32(_s115) { runtime.pushCall("emit_list_literal"); -(runtime.setLine(286), _emit36(({ type: "string", value: "({ type: \"list\", values: [" }))); -const r_136 = ({ type: "bool", value: true }); -let _first112 = r_136; -for (const r_137 of _s111.values) {; -let _e113 = r_137; -if (runtime.truthy(runtime.opNot(_first112))) { -(runtime.setLine(290), _emit36(({ type: "string", value: ", " }))); +(runtime.setLine(297), _emit36(({ type: "string", value: "({ type: \"list\", values: [" }))); +const r_141 = ({ type: "bool", value: true }); +let _first116 = r_141; +for (const r_142 of _s115.values) {; +let _e117 = r_142; +if (runtime.truthy(runtime.opNot(_first116))) { +(runtime.setLine(301), _emit36(({ type: "string", value: ", " }))); }; -(_first112 = ({ type: "bool", value: false })); -(runtime.setLine(294), _emit_expr30(_e113)); +(_first116 = ({ type: "bool", value: false })); +(runtime.setLine(305), _emit_expr30(_e117)); }; -(runtime.setLine(296), _emit36(({ type: "string", value: "] })" }))); +(runtime.setLine(307), _emit36(({ type: "string", value: "] })" }))); ; runtime.popCall(); return { type: "null" }; }; -function _emit_let_node33(_pat114, _base_reg115) { +function _emit_let_node33(_pat118, _base_reg119) { runtime.pushCall("emit_let_node"); -const r_138 = _pat114; -const r_139 = r_138.values[0] ?? { type: "null"}; -let _pat_ty116 = r_139; -const r_140 = r_138.values[1] ?? { type: "null"}; -let _line117 = r_140; -if (runtime.truthy(runtime.opEq(_pat_ty116, ({ type: "string", value: "ident" })))) { -const r_141 = _pat114; -const r_142 = r_141.values[0] ?? { type: "null"}; -const r_143 = r_141.values[1] ?? { type: "null"}; -const r_144 = r_141.values[2] ?? { type: "null"}; -let _ident118 = r_144; -if (runtime.truthy(runtime.opEq(_ident118, ({ type: "string", value: "_" })))) { -runtime.popCall(); -return { type: "null" }}; -const r_145 = (runtime.setLine(306), _define_let40(_ident118, _line117)); -let _sym_id119 = r_145; -(runtime.setLine(307), _emit36((runtime.setLine(307), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nlet _%% = r_%" }), _ident118, _sym_id119, _base_reg115)))); -} else { -if (runtime.truthy(runtime.opEq(_pat_ty116, ({ type: "string", value: "list" })))) { -const r_146 = _pat114; +const r_143 = _pat118; +const r_144 = r_143.values[0] ?? { type: "null"}; +let _pat_ty120 = r_144; +const r_145 = r_143.values[1] ?? { type: "null"}; +let _line121 = r_145; +if (runtime.truthy(runtime.opEq(_pat_ty120, ({ type: "string", value: "ident" })))) { +const r_146 = _pat118; const r_147 = r_146.values[0] ?? { type: "null"}; const r_148 = r_146.values[1] ?? { type: "null"}; const r_149 = r_146.values[2] ?? { type: "null"}; -let _pats120 = r_149; -const r_150 = ({ type: "int", value: 0 }); -let _i121 = r_150; -for (const r_151 of _pats120.values) {; -let _pat122 = r_151; -const r_152 = (runtime.setLine(329), _let_node_reg_count47()); -let _reg123 = r_152; -(runtime.setLine(330), _let_node_reg_increment48()); -(runtime.setLine(331), _emit36((runtime.setLine(331), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nconst r_% = r_%.values[%] ?? { type: \"null\"}" }), _reg123, _base_reg115, _i121)))); -(runtime.setLine(335), _emit_let_node33(_pat122, _reg123)); -(_i121 = runtime.opAdd(_i121, ({ type: "int", value: 1 }))); +let _ident122 = r_149; +if (runtime.truthy(runtime.opEq(_ident122, ({ type: "string", value: "_" })))) { +runtime.popCall(); +return { type: "null" }}; +const r_150 = (runtime.setLine(317), _define_let40(_ident122, _line121)); +let _sym_id123 = r_150; +(runtime.setLine(318), _emit36((runtime.setLine(318), ((...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_151 = _pat118; +const r_152 = r_151.values[0] ?? { type: "null"}; +const r_153 = r_151.values[1] ?? { type: "null"}; +const r_154 = r_151.values[2] ?? { type: "null"}; +let _pats124 = r_154; +const r_155 = ({ type: "int", value: 0 }); +let _i125 = r_155; +for (const r_156 of _pats124.values) {; +let _pat126 = r_156; +const r_157 = (runtime.setLine(340), _let_node_reg_count47()); +let _reg127 = r_157; +(runtime.setLine(341), _let_node_reg_increment48()); +(runtime.setLine(342), _emit36((runtime.setLine(342), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nconst r_% = r_%.values[%] ?? { type: \"null\"}" }), _reg127, _base_reg119, _i125)))); +(runtime.setLine(346), _emit_let_node33(_pat126, _reg127)); +(_i125 = runtime.opAdd(_i125, ({ type: "int", value: 1 }))); }; } else { -(runtime.setLine(339), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "malformed pattern on line %" }), _line117)); +(runtime.setLine(350), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "malformed pattern on line %" }), _line121)); }}; ; runtime.popCall(); return { type: "null" }; }; -function _emit_binary_op34(_s124, _id125) { +function _emit_binary_op34(_s128, _id129) { runtime.pushCall("emit_binary_op"); -const r_153 = _s124; -const r_154 = r_153.values[0] ?? { type: "null"}; -const r_155 = r_153.values[1] ?? { type: "null"}; -let _left126 = r_155; -const r_156 = r_153.values[2] ?? { type: "null"}; -let _right127 = r_156; -(runtime.setLine(345), _emit36((runtime.setLine(345), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.%(" }), _id125)))); -(runtime.setLine(346), _emit_expr30(_left126)); -(runtime.setLine(347), _emit36(({ type: "string", value: ", " }))); -(runtime.setLine(348), _emit_expr30(_right127)); -(runtime.setLine(349), _emit36(({ type: "string", value: ")" }))); +const r_158 = _s128; +const r_159 = r_158.values[0] ?? { type: "null"}; +const r_160 = r_158.values[1] ?? { type: "null"}; +let _left130 = r_160; +const r_161 = r_158.values[2] ?? { type: "null"}; +let _right131 = r_161; +(runtime.setLine(356), _emit36((runtime.setLine(356), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.%(" }), _id129)))); +(runtime.setLine(357), _emit_expr30(_left130)); +(runtime.setLine(358), _emit36(({ type: "string", value: ", " }))); +(runtime.setLine(359), _emit_expr30(_right131)); +(runtime.setLine(360), _emit36(({ type: "string", value: ")" }))); ; runtime.popCall(); return { type: "null" }; }; -function _emit_assign_expr35(_s128, _line129, _id130) { +function _emit_assign_expr35(_s132, _line133, _id134) { runtime.pushCall("emit_assign_expr"); -const r_157 = _s128; -const r_158 = r_157.values[0] ?? { type: "null"}; -const r_159 = r_157.values[1] ?? { type: "null"}; -const r_160 = r_159.values[0] ?? { type: "null"}; -let _target_type131 = r_160; -const r_161 = r_157.values[2] ?? { type: "null"}; -let _expr132 = r_161; -if (runtime.truthy(runtime.opNe(_target_type131, ({ type: "string", value: "ident" })))) { -(runtime.setLine(355), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to expression on line %" }), _line129)); -}; -const r_162 = _s128; +const r_162 = _s132; const r_163 = r_162.values[0] ?? { type: "null"}; const r_164 = r_162.values[1] ?? { type: "null"}; const r_165 = r_164.values[0] ?? { type: "null"}; -const r_166 = r_164.values[1] ?? { type: "null"}; -const r_167 = r_164.values[2] ?? { type: "null"}; -let _ident133 = r_167; -const r_168 = (runtime.setLine(358), _get_sym45(_ident133)); -let _sym134 = r_168; -if (runtime.truthy(runtime.opEq(_sym134, ({ type: "null" })))) { -(runtime.setLine(360), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "could not find symbol '%' on line %" }), _ident133, _line129)); +let _target_type135 = r_165; +const r_166 = r_162.values[2] ?? { type: "null"}; +let _expr136 = r_166; +if (runtime.truthy(runtime.opNe(_target_type135, ({ type: "string", value: "ident" })))) { +(runtime.setLine(366), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to expression on line %" }), _line133)); }; -const r_169 = _sym134; +const r_167 = _s132; +const r_168 = r_167.values[0] ?? { type: "null"}; +const r_169 = r_167.values[1] ?? { type: "null"}; const r_170 = r_169.values[0] ?? { type: "null"}; -let _sym_id135 = r_170; const r_171 = r_169.values[1] ?? { type: "null"}; -let _sym_type136 = r_171; const r_172 = r_169.values[2] ?? { type: "null"}; -let _sym_ident137 = r_172; -const r_173 = r_169.values[3] ?? { type: "null"}; -if (runtime.truthy(runtime.opEq(_sym_type136, ({ type: "string", value: "let" })))) { -(runtime.setLine(364), _emit36((runtime.setLine(364), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(_%% = " }), _sym_ident137, _sym_id135)))); -if (runtime.truthy(runtime.opEq(_id130, ({ type: "string", value: "=" })))) { -(runtime.setLine(366), _emit_expr30(_expr132)); +let _ident137 = r_172; +const r_173 = (runtime.setLine(369), _get_sym45(_ident137)); +let _sym138 = r_173; +if (runtime.truthy(runtime.opEq(_sym138, ({ type: "null" })))) { +(runtime.setLine(371), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "could not find symbol '%' on line %" }), _ident137, _line133)); +}; +const r_174 = _sym138; +const r_175 = r_174.values[0] ?? { type: "null"}; +let _sym_id139 = r_175; +const r_176 = r_174.values[1] ?? { type: "null"}; +let _sym_type140 = r_176; +const r_177 = r_174.values[2] ?? { type: "null"}; +let _sym_ident141 = r_177; +const r_178 = r_174.values[3] ?? { type: "null"}; +if (runtime.truthy(runtime.opEq(_sym_type140, ({ type: "string", value: "let" })))) { +(runtime.setLine(375), _emit36((runtime.setLine(375), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(_%% = " }), _sym_ident141, _sym_id139)))); +if (runtime.truthy(runtime.opEq(_id134, ({ type: "string", value: "=" })))) { +(runtime.setLine(377), _emit_expr30(_expr136)); } else { -if (runtime.truthy(runtime.opEq(_id130, ({ type: "string", value: "+" })))) { -(runtime.setLine(368), _emit36((runtime.setLine(368), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opAdd(_%%, " }), _sym_ident137, _sym_id135)))); -(runtime.setLine(369), _emit_expr30(_expr132)); -(runtime.setLine(370), _emit36(({ type: "string", value: ")" }))); +if (runtime.truthy(runtime.opEq(_id134, ({ type: "string", value: "+" })))) { +(runtime.setLine(379), _emit36((runtime.setLine(379), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opAdd(_%%, " }), _sym_ident141, _sym_id139)))); +(runtime.setLine(380), _emit_expr30(_expr136)); +(runtime.setLine(381), _emit36(({ type: "string", value: ")" }))); } else { -if (runtime.truthy(runtime.opEq(_id130, ({ type: "string", value: "-" })))) { -(runtime.setLine(372), _emit36((runtime.setLine(372), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opSub(_%%, " }), _sym_ident137, _sym_id135)))); -(runtime.setLine(373), _emit_expr30(_expr132)); -(runtime.setLine(374), _emit36(({ type: "string", value: ")" }))); +if (runtime.truthy(runtime.opEq(_id134, ({ type: "string", value: "-" })))) { +(runtime.setLine(383), _emit36((runtime.setLine(383), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opSub(_%%, " }), _sym_ident141, _sym_id139)))); +(runtime.setLine(384), _emit_expr30(_expr136)); +(runtime.setLine(385), _emit36(({ type: "string", value: ")" }))); } else { -(runtime.setLine(376), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" }))); +(runtime.setLine(387), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" }))); }}}; -(runtime.setLine(378), _emit36(({ type: "string", value: ")" }))); +(runtime.setLine(389), _emit36(({ type: "string", value: ")" }))); } else { -(runtime.setLine(380), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to symbol '%' on line %" }), _sym_ident137, _line129)); +(runtime.setLine(391), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to symbol '%' on line %" }), _sym_ident141, _line133)); }; ; runtime.popCall(); return { type: "null" }; }; -function _emit36(_str138) { +function _emit36(_str142) { runtime.pushCall("emit"); -(runtime.setLine(385), ((...args) => runtime.builtinPush(...args))(_output41, _str138)); +(runtime.setLine(396), ((...args) => runtime.builtinPush(...args))(_output41, _str142)); ; runtime.popCall(); return { type: "null" }; }; -function _define_builtin37(_ident139, _builtin_id140) { +function _define_builtin37(_ident143, _builtin_id144) { runtime.pushCall("define_builtin"); -const r_174 = (runtime.setLine(389), _sym_id_count49()); -let _sym_id141 = r_174; -(runtime.setLine(390), _sym_id_increment50()); -(runtime.setLine(392), _define_sym44(_ident139, ({ type: "list", values: [_sym_id141, ({ type: "string", value: "builtin" }), _builtin_id140] }))); +const r_179 = (runtime.setLine(400), _sym_id_count49()); +let _sym_id145 = r_179; +(runtime.setLine(401), _sym_id_increment50()); +(runtime.setLine(403), _define_sym44(_ident143, ({ type: "list", values: [_sym_id145, ({ type: "string", value: "builtin" }), _builtin_id144] }))); runtime.popCall(); -return _sym_id141; +return _sym_id145; ; runtime.popCall(); return { type: "null" }; }; -function _define_fn38(_ident142, _line143) { +function _define_fn38(_ident146, _line147) { runtime.pushCall("define_fn"); -const r_175 = (runtime.setLine(397), _sym_id_count49()); -let _sym_id144 = r_175; -(runtime.setLine(398), _sym_id_increment50()); -(runtime.setLine(400), _define_sym44(_ident142, ({ type: "list", values: [_sym_id144, ({ type: "string", value: "fn" }), _ident142, _line143] }))); +const r_180 = (runtime.setLine(408), _sym_id_count49()); +let _sym_id148 = r_180; +(runtime.setLine(409), _sym_id_increment50()); +(runtime.setLine(411), _define_sym44(_ident146, ({ type: "list", values: [_sym_id148, ({ type: "string", value: "fn" }), _ident146, _line147] }))); runtime.popCall(); -return _sym_id144; +return _sym_id148; ; runtime.popCall(); return { type: "null" }; }; -function _define_param39(_ident145, _line146) { +function _define_param39(_ident149, _line150) { runtime.pushCall("define_param"); -const r_176 = (runtime.setLine(405), _sym_id_count49()); -let _sym_id147 = r_176; -(runtime.setLine(406), _sym_id_increment50()); -(runtime.setLine(408), _define_sym44(_ident145, ({ type: "list", values: [_sym_id147, ({ type: "string", value: "param" }), _ident145, _line146] }))); +const r_181 = (runtime.setLine(416), _sym_id_count49()); +let _sym_id151 = r_181; +(runtime.setLine(417), _sym_id_increment50()); +(runtime.setLine(419), _define_sym44(_ident149, ({ type: "list", values: [_sym_id151, ({ type: "string", value: "param" }), _ident149, _line150] }))); runtime.popCall(); -return _sym_id147; +return _sym_id151; ; runtime.popCall(); return { type: "null" }; }; -function _define_let40(_ident148, _line149) { +function _define_let40(_ident152, _line153) { runtime.pushCall("define_let"); -const r_177 = (runtime.setLine(413), _sym_id_count49()); -let _sym_id150 = r_177; -(runtime.setLine(414), _sym_id_increment50()); -(runtime.setLine(416), _define_sym44(_ident148, ({ type: "list", values: [_sym_id150, ({ type: "string", value: "let" }), _ident148, _line149] }))); +const r_182 = (runtime.setLine(424), _sym_id_count49()); +let _sym_id154 = r_182; +(runtime.setLine(425), _sym_id_increment50()); +(runtime.setLine(427), _define_sym44(_ident152, ({ type: "list", values: [_sym_id154, ({ type: "string", value: "let" }), _ident152, _line153] }))); runtime.popCall(); -return _sym_id150; +return _sym_id154; ; runtime.popCall(); return { type: "null" }; @@ -660,104 +671,104 @@ return { type: "null" }; }; function _Counter15() { runtime.pushCall("Counter"); -const r_178 = ({ type: "int", value: 0 }); -let _counter153 = r_178; -function _count151() { +const r_183 = ({ type: "int", value: 0 }); +let _counter157 = r_183; +function _count155() { runtime.pushCall("count"); runtime.popCall(); -return _counter153; +return _counter157; ; runtime.popCall(); return { type: "null" }; }; -function _increment152() { +function _increment156() { runtime.pushCall("increment"); -(_counter153 = runtime.opAdd(_counter153, ({ type: "int", value: 1 }))); +(_counter157 = runtime.opAdd(_counter157, ({ type: "int", value: 1 }))); ; runtime.popCall(); return { type: "null" }; }; runtime.popCall(); -return ({ type: "list", values: [_count151, _increment152] }); +return ({ type: "list", values: [_count155, _increment156] }); ; runtime.popCall(); return { type: "null" }; }; function _Syms16() { runtime.pushCall("Syms"); -const r_179 = ({ type: "list", values: [({ type: "null" }), ({ type: "list", values: [] })] }); -let _syms161 = r_179; -function _enter_scope154() { +const r_184 = ({ type: "list", values: [({ type: "null" }), ({ type: "list", values: [] })] }); +let _syms165 = r_184; +function _enter_scope158() { runtime.pushCall("enter_scope"); -(_syms161 = ({ type: "list", values: [_syms161, ({ type: "list", values: [] })] })); +(_syms165 = ({ type: "list", values: [_syms165, ({ type: "list", values: [] })] })); ; runtime.popCall(); return { type: "null" }; }; -function _leave_scope155() { +function _leave_scope159() { runtime.pushCall("leave_scope"); -const r_180 = _syms161; -const r_181 = r_180.values[0] ?? { type: "null"}; -let _parent162 = r_181; -const r_182 = r_180.values[1] ?? { type: "null"}; -(_syms161 = _parent162); +const r_185 = _syms165; +const r_186 = r_185.values[0] ?? { type: "null"}; +let _parent166 = r_186; +const r_187 = r_185.values[1] ?? { type: "null"}; +(_syms165 = _parent166); ; runtime.popCall(); return { type: "null" }; }; -function _define156(_ident163, _sym164) { +function _define160(_ident167, _sym168) { runtime.pushCall("define"); -const r_183 = _syms161; -const r_184 = r_183.values[0] ?? { type: "null"}; -const r_185 = r_183.values[1] ?? { type: "null"}; -let _map165 = r_185; -const r_186 = ({ type: "int", value: 0 }); -let _i166 = r_186; +const r_188 = _syms165; +const r_189 = r_188.values[0] ?? { type: "null"}; +const r_190 = r_188.values[1] ?? { type: "null"}; +let _map169 = r_190; +const r_191 = ({ type: "int", value: 0 }); +let _i170 = r_191; while (true) { -if (runtime.truthy(runtime.opGte(_i166, (runtime.setLine(453), ((...args) => runtime.builtinLen(...args))(_map165))))) { +if (runtime.truthy(runtime.opGte(_i170, (runtime.setLine(464), ((...args) => runtime.builtinLen(...args))(_map169))))) { break}; -const r_187 = (runtime.setLine(454), ((...args) => runtime.builtinAt(...args))(_map165, _i166)); -const r_188 = r_187.values[0] ?? { type: "null"}; -let _s_ident167 = r_188; -const r_189 = r_187.values[1] ?? { type: "null"}; -if (runtime.truthy(runtime.opEq(_ident163, _s_ident167))) { -(runtime.setLine(456), ((...args) => runtime.builtinSet(...args))(_map165, _i166, ({ type: "list", values: [_ident163, _sym164] }))); +const r_192 = (runtime.setLine(465), ((...args) => runtime.builtinAt(...args))(_map169, _i170)); +const r_193 = r_192.values[0] ?? { type: "null"}; +let _s_ident171 = r_193; +const r_194 = r_192.values[1] ?? { type: "null"}; +if (runtime.truthy(runtime.opEq(_ident167, _s_ident171))) { +(runtime.setLine(467), ((...args) => runtime.builtinSet(...args))(_map169, _i170, ({ type: "list", values: [_ident167, _sym168] }))); runtime.popCall(); return { type: "null" }; }; -(_i166 = runtime.opAdd(_i166, ({ type: "int", value: 1 }))); +(_i170 = runtime.opAdd(_i170, ({ type: "int", value: 1 }))); }; -(runtime.setLine(461), ((...args) => runtime.builtinPush(...args))(_map165, ({ type: "list", values: [_ident163, _sym164] }))); +(runtime.setLine(472), ((...args) => runtime.builtinPush(...args))(_map169, ({ type: "list", values: [_ident167, _sym168] }))); ; runtime.popCall(); return { type: "null" }; }; -function _find_sym157(_syms168, _ident169) { +function _find_sym161(_syms172, _ident173) { runtime.pushCall("find_sym"); -const r_190 = _syms168; -const r_191 = r_190.values[0] ?? { type: "null"}; -let _parent170 = r_191; -const r_192 = r_190.values[1] ?? { type: "null"}; -let _map171 = r_192; -const r_193 = ({ type: "int", value: 0 }); -let _i172 = r_193; +const r_195 = _syms172; +const r_196 = r_195.values[0] ?? { type: "null"}; +let _parent174 = r_196; +const r_197 = r_195.values[1] ?? { type: "null"}; +let _map175 = r_197; +const r_198 = ({ type: "int", value: 0 }); +let _i176 = r_198; while (true) { -if (runtime.truthy(runtime.opGte(_i172, (runtime.setLine(468), ((...args) => runtime.builtinLen(...args))(_map171))))) { +if (runtime.truthy(runtime.opGte(_i176, (runtime.setLine(479), ((...args) => runtime.builtinLen(...args))(_map175))))) { break}; -const r_194 = (runtime.setLine(469), ((...args) => runtime.builtinAt(...args))(_map171, _i172)); -const r_195 = r_194.values[0] ?? { type: "null"}; -let _s_ident173 = r_195; -const r_196 = r_194.values[1] ?? { type: "null"}; -let _s_sym174 = r_196; -if (runtime.truthy(runtime.opEq(_ident169, _s_ident173))) { +const r_199 = (runtime.setLine(480), ((...args) => runtime.builtinAt(...args))(_map175, _i176)); +const r_200 = r_199.values[0] ?? { type: "null"}; +let _s_ident177 = r_200; +const r_201 = r_199.values[1] ?? { type: "null"}; +let _s_sym178 = r_201; +if (runtime.truthy(runtime.opEq(_ident173, _s_ident177))) { runtime.popCall(); -return _s_sym174; +return _s_sym178; }; -(_i172 = runtime.opAdd(_i172, ({ type: "int", value: 1 }))); +(_i176 = runtime.opAdd(_i176, ({ type: "int", value: 1 }))); }; -if (runtime.truthy(runtime.opNe(_parent170, ({ type: "null" })))) { +if (runtime.truthy(runtime.opNe(_parent174, ({ type: "null" })))) { runtime.popCall(); -return (runtime.setLine(476), _find_sym157(_parent170, _ident169)); +return (runtime.setLine(487), _find_sym161(_parent174, _ident173)); }; runtime.popCall(); return ({ type: "null" }); @@ -765,329 +776,329 @@ return ({ type: "null" }); runtime.popCall(); return { type: "null" }; }; -function _get158(_ident175) { +function _get162(_ident179) { runtime.pushCall("get"); runtime.popCall(); -return (runtime.setLine(482), _find_sym157(_syms161, _ident175)); +return (runtime.setLine(493), _find_sym161(_syms165, _ident179)); ; runtime.popCall(); return { type: "null" }; }; -function _print_syms_node159(_syms176, _depth177) { +function _print_syms_node163(_syms180, _depth181) { runtime.pushCall("print_syms_node"); -const r_197 = _syms176; -const r_198 = r_197.values[0] ?? { type: "null"}; -let _parent178 = r_198; -const r_199 = r_197.values[1] ?? { type: "null"}; -let _map179 = r_199; -for (const r_200 of _map179.values) {; -const r_201 = r_200.values[0] ?? { type: "null"}; -let _ident180 = r_201; -const r_202 = r_200.values[1] ?? { type: "null"}; -let _sym181 = r_202; -(runtime.setLine(488), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%- %: %" }), (runtime.setLine(488), _indent23(_depth177)), _ident180, _sym181)); +const r_202 = _syms180; +const r_203 = r_202.values[0] ?? { type: "null"}; +let _parent182 = r_203; +const r_204 = r_202.values[1] ?? { type: "null"}; +let _map183 = r_204; +for (const r_205 of _map183.values) {; +const r_206 = r_205.values[0] ?? { type: "null"}; +let _ident184 = r_206; +const r_207 = r_205.values[1] ?? { type: "null"}; +let _sym185 = r_207; +(runtime.setLine(499), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%- %: %" }), (runtime.setLine(499), _indent23(_depth181)), _ident184, _sym185)); }; -if (runtime.truthy(runtime.opNe(_parent178, ({ type: "null" })))) { -(runtime.setLine(491), _print_syms_node159(_parent178, runtime.opAdd(_depth177, ({ type: "int", value: 1 })))); +if (runtime.truthy(runtime.opNe(_parent182, ({ type: "null" })))) { +(runtime.setLine(502), _print_syms_node163(_parent182, runtime.opAdd(_depth181, ({ type: "int", value: 1 })))); }; ; runtime.popCall(); return { type: "null" }; }; -function _print_syms160() { +function _print_syms164() { runtime.pushCall("print_syms"); -(runtime.setLine(496), _print_syms_node159(_syms161, ({ type: "int", value: 0 }))); +(runtime.setLine(507), _print_syms_node163(_syms165, ({ type: "int", value: 0 }))); ; runtime.popCall(); return { type: "null" }; }; runtime.popCall(); -return ({ type: "list", values: [_enter_scope154, _leave_scope155, _define156, _get158, _print_syms160] }); +return ({ type: "list", values: [_enter_scope158, _leave_scope159, _define160, _get162, _print_syms164] }); ; runtime.popCall(); return { type: "null" }; }; -function _string_escape17(_str182) { +function _string_escape17(_str186) { runtime.pushCall("string_escape"); -const r_203 = (runtime.setLine(510), ((...args) => runtime.builtinLen(...args))(_str182)); -let _str_len183 = r_203; -const r_204 = ({ type: "int", value: 0 }); -let _i184 = r_204; -const r_205 = ({ type: "string", value: "" }); -let _result185 = r_205; +const r_208 = (runtime.setLine(521), ((...args) => runtime.builtinLen(...args))(_str186)); +let _str_len187 = r_208; +const r_209 = ({ type: "int", value: 0 }); +let _i188 = r_209; +const r_210 = ({ type: "string", value: "" }); +let _result189 = r_210; while (true) { -if (runtime.truthy(runtime.opGte(_i184, _str_len183))) { +if (runtime.truthy(runtime.opGte(_i188, _str_len187))) { break}; -const r_206 = (runtime.setLine(515), ((...args) => runtime.builtinAt(...args))(_str182, _i184)); -let _ch186 = r_206; -if (runtime.truthy(runtime.opEq(_ch186, ({ type: "string", value: "\\" })))) { -(_result185 = runtime.opAdd(_result185, ({ type: "string", value: "\\\\" }))); +const r_211 = (runtime.setLine(526), ((...args) => runtime.builtinAt(...args))(_str186, _i188)); +let _ch190 = r_211; +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\\" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\\\" }))); } else { -if (runtime.truthy(runtime.opEq(_ch186, ({ type: "string", value: "\"" })))) { -(_result185 = runtime.opAdd(_result185, ({ type: "string", value: "\\\"" }))); +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\"" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\\"" }))); } else { -if (runtime.truthy(runtime.opEq(_ch186, ({ type: "string", value: "\t" })))) { -(_result185 = runtime.opAdd(_result185, ({ 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.truthy(runtime.opEq(_ch186, ({ type: "string", value: "\r" })))) { -(_result185 = runtime.opAdd(_result185, ({ 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.truthy(runtime.opEq(_ch186, ({ type: "string", value: "\n" })))) { -(_result185 = runtime.opAdd(_result185, ({ 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.truthy(runtime.opEq(_ch186, ({ type: "string", value: "\n" })))) { -(_result185 = runtime.opAdd(_result185, ({ type: "string", value: "\\0" }))); +if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\n" })))) { +(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\0" }))); } else { -(_result185 = runtime.opAdd(_result185, _ch186)); +(_result189 = runtime.opAdd(_result189, _ch190)); }}}}}}; -(_i184 = runtime.opAdd(_i184, ({ type: "int", value: 1 }))); +(_i188 = runtime.opAdd(_i188, ({ type: "int", value: 1 }))); }; runtime.popCall(); -return _result185; +return _result189; ; runtime.popCall(); return { type: "null" }; }; -function _Parser18(_tokens187) { +function _Parser18(_tokens191) { runtime.pushCall("Parser"); -const r_207 = ({ type: "int", value: 0 }); -let _i194 = r_207; -const r_208 = (runtime.setLine(538), ((...args) => runtime.builtinAt(...args))(_tokens187, _i194)); -let _tok195 = r_208; -function _parse188() { +const r_212 = ({ type: "int", value: 0 }); +let _i198 = r_212; +const r_213 = (runtime.setLine(549), ((...args) => runtime.builtinAt(...args))(_tokens191, _i198)); +let _tok199 = r_213; +function _parse192() { runtime.pushCall("parse"); -const r_209 = ({ type: "list", values: [] }); -let _exprs196 = r_209; +const r_214 = ({ type: "list", values: [] }); +let _exprs200 = r_214; while (true) { -if (runtime.truthy((runtime.setLine(543), _done193()))) { +if (runtime.truthy((runtime.setLine(554), _done197()))) { break}; -(runtime.setLine(544), ((...args) => runtime.builtinPush(...args))(_exprs196, (runtime.setLine(544), _parse_expr189()))); +(runtime.setLine(555), ((...args) => runtime.builtinPush(...args))(_exprs200, (runtime.setLine(555), _parse_expr193()))); }; runtime.popCall(); -return _exprs196; +return _exprs200; ; runtime.popCall(); return { type: "null" }; }; -function _parse_expr189() { +function _parse_expr193() { runtime.pushCall("parse_expr"); -const r_210 = _tok195; -const r_211 = r_210.values[0] ?? { type: "null"}; -let _ty197 = r_211; -const r_212 = r_210.values[1] ?? { type: "null"}; -let _line198 = r_212; -const r_213 = r_210.values[2] ?? { type: "null"}; -let _value199 = r_213; -if (runtime.truthy((runtime.setLine(551), _eat190(({ type: "string", value: "(" }))))) { -const r_214 = ({ type: "list", values: [] }); -let _values200 = r_214; +const r_215 = _tok199; +const r_216 = r_215.values[0] ?? { type: "null"}; +let _ty201 = r_216; +const r_217 = r_215.values[1] ?? { type: "null"}; +let _line202 = r_217; +const r_218 = r_215.values[2] ?? { type: "null"}; +let _value203 = r_218; +if (runtime.truthy((runtime.setLine(562), _eat194(({ type: "string", value: "(" }))))) { +const r_219 = ({ type: "list", values: [] }); +let _values204 = r_219; while (true) { -if (runtime.truthy((runtime.setLine(554), _test192(({ type: "string", value: ")" }))))) { +if (runtime.truthy((runtime.setLine(565), _test196(({ type: "string", value: ")" }))))) { break}; -(runtime.setLine(555), ((...args) => runtime.builtinPush(...args))(_values200, (runtime.setLine(555), _parse_expr189()))); +(runtime.setLine(566), ((...args) => runtime.builtinPush(...args))(_values204, (runtime.setLine(566), _parse_expr193()))); }; -if (runtime.truthy(runtime.opNot((runtime.setLine(557), _eat190(({ type: "string", value: ")" })))))) { -(runtime.setLine(558), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected ')' on line %" }), (runtime.setLine(558), ((...args) => runtime.builtinAt(...args))(_tok195, ({ type: "int", value: 1 }))))); +if (runtime.truthy(runtime.opNot((runtime.setLine(568), _eat194(({ type: "string", value: ")" })))))) { +(runtime.setLine(569), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected ')' on line %" }), (runtime.setLine(569), ((...args) => runtime.builtinAt(...args))(_tok199, ({ type: "int", value: 1 }))))); }; runtime.popCall(); -return ({ type: "list", values: [({ type: "string", value: "list" }), _line198, _values200] }); +return ({ type: "list", values: [({ type: "string", value: "list" }), _line202, _values204] }); } else { -if (runtime.truthy((runtime.setLine(561), _eat190(({ type: "string", value: "string" }))))) { +if (runtime.truthy((runtime.setLine(572), _eat194(({ type: "string", value: "string" }))))) { runtime.popCall(); -return ({ type: "list", values: [({ type: "string", value: "string" }), _line198, _value199] }); +return ({ type: "list", values: [({ type: "string", value: "string" }), _line202, _value203] }); } else { -if (runtime.truthy((runtime.setLine(563), _eat190(({ type: "string", value: "int" }))))) { +if (runtime.truthy((runtime.setLine(574), _eat194(({ type: "string", value: "int" }))))) { runtime.popCall(); -return ({ type: "list", values: [({ type: "string", value: "int" }), _line198, (runtime.setLine(564), ((...args) => runtime.builtinStringToInt(...args))(_value199))] }); +return ({ type: "list", values: [({ type: "string", value: "int" }), _line202, (runtime.setLine(575), ((...args) => runtime.builtinStringToInt(...args))(_value203))] }); } else { -if (runtime.truthy((runtime.setLine(565), _eat190(({ type: "string", value: "ident" }))))) { +if (runtime.truthy((runtime.setLine(576), _eat194(({ type: "string", value: "ident" }))))) { runtime.popCall(); -return ({ type: "list", values: [({ type: "string", value: "ident" }), _line198, _value199] }); +return ({ type: "list", values: [({ type: "string", value: "ident" }), _line202, _value203] }); } else { -(runtime.setLine(568), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected expression, got '%' on line %" }), _ty197, _line198)); +(runtime.setLine(579), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected expression, got '%' on line %" }), _ty201, _line202)); }}}}; ; runtime.popCall(); return { type: "null" }; }; -function _eat190(_pat201) { +function _eat194(_pat205) { runtime.pushCall("eat"); -if (runtime.truthy(runtime.opNot((runtime.setLine(573), _test192(_pat201))))) { +if (runtime.truthy(runtime.opNot((runtime.setLine(584), _test196(_pat205))))) { runtime.popCall(); return ({ type: "bool", value: false })}; -(runtime.setLine(574), _step191()); +(runtime.setLine(585), _step195()); runtime.popCall(); return ({ type: "bool", value: true }); ; runtime.popCall(); return { type: "null" }; }; -function _step191() { +function _step195() { runtime.pushCall("step"); -(_i194 = runtime.opAdd(_i194, ({ type: "int", value: 1 }))); -if (runtime.truthy(runtime.opNot((runtime.setLine(580), _done193())))) { -const r_215 = (runtime.setLine(581), ((...args) => runtime.builtinAt(...args))(_tokens187, _i194)); -let _new_tok202 = r_215; -(_tok195 = _new_tok202); +(_i198 = runtime.opAdd(_i198, ({ type: "int", value: 1 }))); +if (runtime.truthy(runtime.opNot((runtime.setLine(591), _done197())))) { +const r_220 = (runtime.setLine(592), ((...args) => runtime.builtinAt(...args))(_tokens191, _i198)); +let _new_tok206 = r_220; +(_tok199 = _new_tok206); }; ; runtime.popCall(); return { type: "null" }; }; -function _test192(_pat203) { +function _test196(_pat207) { runtime.pushCall("test"); -if (runtime.truthy((runtime.setLine(587), _done193()))) { +if (runtime.truthy((runtime.setLine(598), _done197()))) { runtime.popCall(); return ({ type: "bool", value: false })}; -const r_216 = _tok195; -const r_217 = r_216.values[0] ?? { type: "null"}; -let _ty204 = r_217; +const r_221 = _tok199; +const r_222 = r_221.values[0] ?? { type: "null"}; +let _ty208 = r_222; runtime.popCall(); -return runtime.opEq(_pat203, _ty204); +return runtime.opEq(_pat207, _ty208); ; runtime.popCall(); return { type: "null" }; }; -function _done193() { +function _done197() { runtime.pushCall("done"); runtime.popCall(); -return runtime.opGte(_i194, (runtime.setLine(593), ((...args) => runtime.builtinLen(...args))(_tokens187))); +return runtime.opGte(_i198, (runtime.setLine(604), ((...args) => runtime.builtinLen(...args))(_tokens191))); ; runtime.popCall(); return { type: "null" }; }; runtime.popCall(); -return ({ type: "list", values: [_parse188] }); +return ({ type: "list", values: [_parse192] }); ; runtime.popCall(); return { type: "null" }; }; -function _tokenize19(_text205) { +function _tokenize19(_text209) { runtime.pushCall("tokenize"); -const r_218 = (runtime.setLine(600), ((...args) => runtime.builtinLen(...args))(_text205)); -let _text_len206 = r_218; -const r_219 = ({ type: "list", values: [] }); -let _tokens207 = r_219; -const r_220 = ({ type: "int", value: 0 }); -let _i208 = r_220; -const r_221 = ({ type: "int", value: 1 }); -let _line209 = r_221; -const r_222 = runtime.opAdd(({ type: "string", value: "abcdefghijklmnopqrstuvwxyz" }), ({ type: "string", value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-*/%&|=?!<>'_" })); -let _ident_chars210 = r_222; +const r_223 = (runtime.setLine(611), ((...args) => runtime.builtinLen(...args))(_text209)); +let _text_len210 = r_223; +const r_224 = ({ type: "list", values: [] }); +let _tokens211 = r_224; +const r_225 = ({ type: "int", value: 0 }); +let _i212 = r_225; +const r_226 = ({ type: "int", value: 1 }); +let _line213 = r_226; +const r_227 = runtime.opAdd(({ type: "string", value: "abcdefghijklmnopqrstuvwxyz" }), ({ type: "string", value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-*/%&|=?!<>'_" })); +let _ident_chars214 = r_227; while (true) { -if (runtime.truthy(runtime.opGte(_i208, _text_len206))) { +if (runtime.truthy(runtime.opGte(_i212, _text_len210))) { break}; -const r_223 = (runtime.setLine(612), ((...args) => runtime.builtinAt(...args))(_text205, _i208)); -let _ch211 = r_223; -if (runtime.truthy((runtime.setLine(614), _contains20(({ type: "string", value: " \t\r\n" }), _ch211)))) { -if (runtime.truthy(runtime.opEq(_ch211, ({ type: "string", value: "\n" })))) { -(_line209 = runtime.opAdd(_line209, ({ type: "int", value: 1 }))); +const r_228 = (runtime.setLine(623), ((...args) => runtime.builtinAt(...args))(_text209, _i212)); +let _ch215 = r_228; +if (runtime.truthy((runtime.setLine(625), _contains20(({ 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 }))); }; -(_i208 = runtime.opAdd(_i208, ({ type: "int", value: 1 }))); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); } else { -if (runtime.truthy((runtime.setLine(619), _slice_eq21(_text205, _i208, ({ type: "string", value: "//" }))))) { +if (runtime.truthy((runtime.setLine(630), _slice_eq21(_text209, _i212, ({ type: "string", value: "//" }))))) { while (true) { -if (runtime.truthy((runtime.setLine(621), { type: "bool", value: runtime.truthy(runtime.opGte(_i208, _text_len206)) || runtime.truthy(runtime.opEq((runtime.setLine(621), ((...args) => runtime.builtinAt(...args))(_text205, _i208)), ({ type: "string", value: "\n" }))) }))) { +if (runtime.truthy((runtime.setLine(632), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opEq((runtime.setLine(632), ((...args) => runtime.builtinAt(...args))(_text209, _i212)), ({ type: "string", value: "\n" }))) }))) { break; }; -(_i208 = runtime.opAdd(_i208, ({ type: "int", value: 1 }))); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); }; } else { -if (runtime.truthy((runtime.setLine(626), _contains20(({ type: "string", value: "()" }), _ch211)))) { -(runtime.setLine(627), ((...args) => runtime.builtinPush(...args))(_tokens207, ({ type: "list", values: [_ch211, _line209] }))); -(_i208 = runtime.opAdd(_i208, ({ type: "int", value: 1 }))); +if (runtime.truthy((runtime.setLine(637), _contains20(({ type: "string", value: "()" }), _ch215)))) { +(runtime.setLine(638), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [_ch215, _line213] }))); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); } else { -if (runtime.truthy(runtime.opEq(_ch211, ({ type: "string", value: "\"" })))) { -const r_224 = ({ type: "string", value: "" }); -let _value212 = r_224; -(_i208 = runtime.opAdd(_i208, ({ type: "int", value: 1 }))); -(_ch211 = (runtime.setLine(632), ((...args) => runtime.builtinAt(...args))(_text205, _i208))); +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\"" })))) { +const r_229 = ({ type: "string", value: "" }); +let _value216 = r_229; +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +(_ch215 = (runtime.setLine(643), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); while (true) { -if (runtime.truthy((runtime.setLine(634), { type: "bool", value: runtime.truthy(runtime.opGte(_i208, _text_len206)) || runtime.truthy(runtime.opEq(_ch211, ({ type: "string", value: "\"" }))) }))) { +if (runtime.truthy((runtime.setLine(645), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\"" }))) }))) { break; }; -if (runtime.truthy(runtime.opEq(_ch211, ({ type: "string", value: "\\" })))) { -(_i208 = runtime.opAdd(_i208, ({ type: "int", value: 1 }))); -if (runtime.truthy(runtime.opGte(_i208, _text_len206))) { +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; }; -(_ch211 = (runtime.setLine(642), ((...args) => runtime.builtinAt(...args))(_text205, _i208))); -if (runtime.truthy(runtime.opEq(_ch211, ({ type: "string", value: "t" })))) { -(_value212 = runtime.opAdd(_value212, ({ type: "string", value: "\t" }))); +(_ch215 = (runtime.setLine(653), ((...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(_ch211, ({ type: "string", value: "r" })))) { -(_value212 = runtime.opAdd(_value212, ({ 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.truthy(runtime.opEq(_ch211, ({ type: "string", value: "n" })))) { -(_value212 = runtime.opAdd(_value212, ({ 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.truthy(runtime.opEq(_ch211, ({ type: "string", value: "0" })))) { -(_value212 = runtime.opAdd(_value212, ({ type: "string", value: "\n" }))); +if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "0" })))) { +(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\n" }))); } else { -(_value212 = runtime.opAdd(_value212, _ch211)); +(_value216 = runtime.opAdd(_value216, _ch215)); }}}}; } else { -(_value212 = runtime.opAdd(_value212, _ch211)); +(_value216 = runtime.opAdd(_value216, _ch215)); }; -(_i208 = runtime.opAdd(_i208, ({ type: "int", value: 1 }))); -(_ch211 = (runtime.setLine(658), ((...args) => runtime.builtinAt(...args))(_text205, _i208))); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +(_ch215 = (runtime.setLine(669), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); }; -if (runtime.truthy((runtime.setLine(660), { type: "bool", value: runtime.truthy(runtime.opGte(_i208, _text_len206)) || runtime.truthy(runtime.opNe(_ch211, ({ type: "string", value: "\"" }))) }))) { -(runtime.setLine(661), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected '\"' on line %" }), _line209)); +if (runtime.truthy((runtime.setLine(671), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opNe(_ch215, ({ type: "string", value: "\"" }))) }))) { +(runtime.setLine(672), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected '\"' on line %" }), _line213)); }; -(_i208 = runtime.opAdd(_i208, ({ type: "int", value: 1 }))); -(runtime.setLine(664), ((...args) => runtime.builtinPush(...args))(_tokens207, ({ type: "list", values: [({ type: "string", value: "string" }), _line209, _value212] }))); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); +(runtime.setLine(675), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [({ type: "string", value: "string" }), _line213, _value216] }))); } else { -if (runtime.truthy((runtime.setLine(665), _contains20(({ type: "string", value: "0123456789" }), _ch211)))) { -const r_225 = ({ type: "string", value: "" }); -let _value213 = r_225; +if (runtime.truthy((runtime.setLine(676), _contains20(({ type: "string", value: "0123456789" }), _ch215)))) { +const r_230 = ({ type: "string", value: "" }); +let _value217 = r_230; while (true) { -(_ch211 = (runtime.setLine(668), ((...args) => runtime.builtinAt(...args))(_text205, _i208))); -if (runtime.truthy((runtime.setLine(669), { type: "bool", value: runtime.truthy(runtime.opGte(_i208, _text_len206)) || runtime.truthy(runtime.opNot((runtime.setLine(669), _contains20(({ type: "string", value: "0123456789" }), _ch211)))) }))) { +(_ch215 = (runtime.setLine(679), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); +if (runtime.truthy((runtime.setLine(680), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opNot((runtime.setLine(680), _contains20(({ type: "string", value: "0123456789" }), _ch215)))) }))) { break; }; -(_value213 = runtime.opAdd(_value213, _ch211)); -(_i208 = runtime.opAdd(_i208, ({ type: "int", value: 1 }))); +(_value217 = runtime.opAdd(_value217, _ch215)); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); }; -(runtime.setLine(675), ((...args) => runtime.builtinPush(...args))(_tokens207, ({ type: "list", values: [({ type: "string", value: "int" }), _line209, _value213] }))); +(runtime.setLine(686), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [({ type: "string", value: "int" }), _line213, _value217] }))); } else { -if (runtime.truthy((runtime.setLine(676), _contains20(_ident_chars210, _ch211)))) { -const r_226 = ({ type: "string", value: "" }); -let _value214 = r_226; +if (runtime.truthy((runtime.setLine(687), _contains20(_ident_chars214, _ch215)))) { +const r_231 = ({ type: "string", value: "" }); +let _value218 = r_231; while (true) { -(_ch211 = (runtime.setLine(679), ((...args) => runtime.builtinAt(...args))(_text205, _i208))); -if (runtime.truthy((runtime.setLine(680), { type: "bool", value: runtime.truthy(runtime.opGte(_i208, _text_len206)) || runtime.truthy(runtime.opNot((runtime.setLine(680), _contains20(_ident_chars210, _ch211)))) }))) { +(_ch215 = (runtime.setLine(690), ((...args) => runtime.builtinAt(...args))(_text209, _i212))); +if (runtime.truthy((runtime.setLine(691), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opNot((runtime.setLine(691), _contains20(_ident_chars214, _ch215)))) }))) { break; }; -(_value214 = runtime.opAdd(_value214, _ch211)); -(_i208 = runtime.opAdd(_i208, ({ type: "int", value: 1 }))); +(_value218 = runtime.opAdd(_value218, _ch215)); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); }; -(runtime.setLine(686), ((...args) => runtime.builtinPush(...args))(_tokens207, ({ type: "list", values: [({ type: "string", value: "ident" }), _line209, _value214] }))); +(runtime.setLine(697), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [({ type: "string", value: "ident" }), _line213, _value218] }))); } else { -(runtime.setLine(688), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "illegal char '%'" }), _ch211)); -(_i208 = runtime.opAdd(_i208, ({ type: "int", value: 1 }))); +(runtime.setLine(699), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "illegal char '%'" }), _ch215)); +(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 }))); }}}}}}; }; runtime.popCall(); -return _tokens207; +return _tokens211; ; runtime.popCall(); return { type: "null" }; }; -function _contains20(_text215, _ch216) { +function _contains20(_text219, _ch220) { runtime.pushCall("contains"); -const r_227 = (runtime.setLine(696), ((...args) => runtime.builtinLen(...args))(_text215)); -let _text_len217 = r_227; -const r_228 = ({ type: "int", value: 0 }); -let _i218 = r_228; +const r_232 = (runtime.setLine(707), ((...args) => runtime.builtinLen(...args))(_text219)); +let _text_len221 = r_232; +const r_233 = ({ type: "int", value: 0 }); +let _i222 = r_233; while (true) { -if (runtime.truthy(runtime.opGte(_i218, _text_len217))) { +if (runtime.truthy(runtime.opGte(_i222, _text_len221))) { break}; -if (runtime.truthy(runtime.opEq((runtime.setLine(700), ((...args) => runtime.builtinAt(...args))(_text215, _i218)), _ch216))) { +if (runtime.truthy(runtime.opEq((runtime.setLine(711), ((...args) => runtime.builtinAt(...args))(_text219, _i222)), _ch220))) { runtime.popCall(); return ({ type: "bool", value: true }); }; -(_i218 = runtime.opAdd(_i218, ({ type: "int", value: 1 }))); +(_i222 = runtime.opAdd(_i222, ({ type: "int", value: 1 }))); }; runtime.popCall(); return ({ type: "bool", value: false }); @@ -1095,25 +1106,25 @@ return ({ type: "bool", value: false }); runtime.popCall(); return { type: "null" }; }; -function _slice_eq21(_str219, _slice_idx220, _substr221) { +function _slice_eq21(_str223, _slice_idx224, _substr225) { runtime.pushCall("slice_eq"); -const r_229 = (runtime.setLine(709), ((...args) => runtime.builtinLen(...args))(_str219)); -let _str_len222 = r_229; -const r_230 = (runtime.setLine(710), ((...args) => runtime.builtinLen(...args))(_substr221)); -let _substr_len223 = r_230; -const r_231 = ({ type: "int", value: 0 }); -let _i224 = r_231; +const r_234 = (runtime.setLine(720), ((...args) => runtime.builtinLen(...args))(_str223)); +let _str_len226 = r_234; +const r_235 = (runtime.setLine(721), ((...args) => runtime.builtinLen(...args))(_substr225)); +let _substr_len227 = r_235; +const r_236 = ({ type: "int", value: 0 }); +let _i228 = r_236; while (true) { -if (runtime.truthy(runtime.opGte(_i224, _substr_len223))) { +if (runtime.truthy(runtime.opGte(_i228, _substr_len227))) { runtime.popCall(); return ({ type: "bool", value: true })}; -if (runtime.truthy(runtime.opGte(runtime.opAdd(_slice_idx220, _i224), _str_len222))) { +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(717), ((...args) => runtime.builtinAt(...args))(_str219, runtime.opAdd(_slice_idx220, _i224))), (runtime.setLine(717), ((...args) => runtime.builtinAt(...args))(_substr221, _i224))))) { +if (runtime.truthy(runtime.opNe((runtime.setLine(728), ((...args) => runtime.builtinAt(...args))(_str223, runtime.opAdd(_slice_idx224, _i228))), (runtime.setLine(728), ((...args) => runtime.builtinAt(...args))(_substr225, _i228))))) { runtime.popCall(); return ({ type: "bool", value: false })}; -(_i224 = runtime.opAdd(_i224, ({ type: "int", value: 1 }))); +(_i228 = runtime.opAdd(_i228, ({ type: "int", value: 1 }))); }; runtime.popCall(); return ({ type: "bool", value: true }); @@ -1121,100 +1132,100 @@ return ({ type: "bool", value: true }); runtime.popCall(); return { type: "null" }; }; -function _print_expr22(_expr225, _depth226) { +function _print_expr22(_expr229, _depth230) { runtime.pushCall("print_expr"); -const r_232 = _expr225; -const r_233 = r_232.values[0] ?? { type: "null"}; -let _ty227 = r_233; -const r_234 = r_232.values[1] ?? { type: "null"}; -let _line228 = r_234; -const r_235 = r_232.values[2] ?? { type: "null"}; -let _value229 = r_235; -if (runtime.truthy(runtime.opEq(_ty227, ({ type: "string", value: "list" })))) { -(runtime.setLine(727), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%(% %" }), (runtime.setLine(727), _indent23(_depth226)), _ty227, _line228)); -for (const r_236 of _value229.values) {; -let _e230 = r_236; -(runtime.setLine(729), _print_expr22(_e230, runtime.opAdd(_depth226, ({ type: "int", value: 1 })))); +const r_237 = _expr229; +const r_238 = r_237.values[0] ?? { type: "null"}; +let _ty231 = r_238; +const r_239 = r_237.values[1] ?? { type: "null"}; +let _line232 = r_239; +const r_240 = r_237.values[2] ?? { type: "null"}; +let _value233 = r_240; +if (runtime.truthy(runtime.opEq(_ty231, ({ type: "string", value: "list" })))) { +(runtime.setLine(738), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%(% %" }), (runtime.setLine(738), _indent23(_depth230)), _ty231, _line232)); +for (const r_241 of _value233.values) {; +let _e234 = r_241; +(runtime.setLine(740), _print_expr22(_e234, runtime.opAdd(_depth230, ({ type: "int", value: 1 })))); }; -(runtime.setLine(731), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%)" }), (runtime.setLine(731), _indent23(_depth226)))); +(runtime.setLine(742), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%)" }), (runtime.setLine(742), _indent23(_depth230)))); } else { -(runtime.setLine(733), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%%" }), (runtime.setLine(733), _indent23(_depth226)), _expr225)); +(runtime.setLine(744), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%%" }), (runtime.setLine(744), _indent23(_depth230)), _expr229)); }; ; runtime.popCall(); return { type: "null" }; }; -function _indent23(_depth231) { +function _indent23(_depth235) { runtime.pushCall("indent"); -const r_237 = ({ type: "string", value: "" }); -let _space232 = r_237; -const r_238 = ({ type: "int", value: 0 }); -let _i233 = r_238; +const r_242 = ({ type: "string", value: "" }); +let _space236 = r_242; +const r_243 = ({ type: "int", value: 0 }); +let _i237 = r_243; while (true) { -if (runtime.truthy(runtime.opGte(_i233, _depth231))) { +if (runtime.truthy(runtime.opGte(_i237, _depth235))) { break}; -(_space232 = runtime.opAdd(_space232, ({ type: "string", value: " " }))); -(_i233 = runtime.opAdd(_i233, ({ type: "int", value: 1 }))); +(_space236 = runtime.opAdd(_space236, ({ type: "string", value: " " }))); +(_i237 = runtime.opAdd(_i237, ({ type: "int", value: 1 }))); }; runtime.popCall(); -return _space232; +return _space236; ; runtime.popCall(); return { type: "null" }; }; -function _slice24(_list234, _idx235) { +function _slice24(_list238, _idx239) { runtime.pushCall("slice"); -const r_239 = (runtime.setLine(749), ((...args) => runtime.builtinLen(...args))(_list234)); -let _list_len236 = r_239; -const r_240 = ({ type: "list", values: [] }); -let _elems237 = r_240; -const r_241 = _idx235; -let _i238 = r_241; +const r_244 = (runtime.setLine(760), ((...args) => runtime.builtinLen(...args))(_list238)); +let _list_len240 = r_244; +const r_245 = ({ type: "list", values: [] }); +let _elems241 = r_245; +const r_246 = _idx239; +let _i242 = r_246; while (true) { -if (runtime.truthy(runtime.opGte(_i238, _list_len236))) { +if (runtime.truthy(runtime.opGte(_i242, _list_len240))) { break}; -(runtime.setLine(754), ((...args) => runtime.builtinPush(...args))(_elems237, (runtime.setLine(754), ((...args) => runtime.builtinAt(...args))(_list234, _i238)))); -(_i238 = runtime.opAdd(_i238, ({ type: "int", value: 1 }))); +(runtime.setLine(765), ((...args) => runtime.builtinPush(...args))(_elems241, (runtime.setLine(765), ((...args) => runtime.builtinAt(...args))(_list238, _i242)))); +(_i242 = runtime.opAdd(_i242, ({ type: "int", value: 1 }))); }; runtime.popCall(); -return _elems237; +return _elems241; ; runtime.popCall(); return { type: "null" }; }; -const r_242 = ({ type: "bool", value: false }); -let _silent239 = r_242; -const r_243 = (runtime.setLine(762), ((...args) => runtime.builtinGetArgs(...args))()); -const r_244 = r_243.values[0] ?? { type: "null"}; -let _input_filename240 = r_244; -const r_245 = r_243.values[1] ?? { type: "null"}; -let _output_filename241 = r_245; -if (runtime.truthy(runtime.opNot(_silent239))) { -(runtime.setLine(764), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "reading file '%'..." }), _input_filename240))}; -const r_246 = (runtime.setLine(765), ((...args) => runtime.builtinReadTextFile(...args))(_input_filename240)); -let _text242 = r_246; -if (runtime.truthy(runtime.opNot(_silent239))) { -(runtime.setLine(771), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "tokenizing..." })))}; -const r_247 = (runtime.setLine(772), _tokenize19(_text242)); -let _tokens243 = r_247; -if (runtime.truthy(runtime.opNot(_silent239))) { -(runtime.setLine(785), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "parsing..." })))}; -const r_248 = (runtime.setLine(786), _Parser18(_tokens243)); -let _parser244 = r_248; -const r_249 = _parser244; -const r_250 = r_249.values[0] ?? { type: "null"}; -let _parse245 = r_250; -const r_251 = (runtime.setLine(788), _parse245()); -let _ast246 = r_251; -if (runtime.truthy(runtime.opNot(_silent239))) { -(runtime.setLine(795), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "emitting..." })))}; -const r_252 = (runtime.setLine(796), _Emitter14(_ast246, _input_filename240)); -let _emitter247 = r_252; -const r_253 = _emitter247; -const r_254 = r_253.values[0] ?? { type: "null"}; -let _emit248 = r_254; -const r_255 = (runtime.setLine(798), _emit248()); -let _js_code249 = r_255; -if (runtime.truthy(runtime.opNot(_silent239))) { -(runtime.setLine(803), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "writing file '%'..." }), _output_filename241))}; -(runtime.setLine(804), ((...args) => runtime.builtinWriteTextFile(...args))(_output_filename241, _js_code249)); +const r_247 = ({ type: "bool", value: false }); +let _silent243 = r_247; +const r_248 = (runtime.setLine(773), ((...args) => runtime.builtinGetArgs(...args))()); +const r_249 = r_248.values[0] ?? { type: "null"}; +let _input_filename244 = r_249; +const r_250 = r_248.values[1] ?? { type: "null"}; +let _output_filename245 = r_250; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(775), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "reading file '%'..." }), _input_filename244))}; +const r_251 = (runtime.setLine(776), ((...args) => runtime.builtinReadTextFile(...args))(_input_filename244)); +let _text246 = r_251; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(782), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "tokenizing..." })))}; +const r_252 = (runtime.setLine(783), _tokenize19(_text246)); +let _tokens247 = r_252; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(796), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "parsing..." })))}; +const r_253 = (runtime.setLine(797), _Parser18(_tokens247)); +let _parser248 = r_253; +const r_254 = _parser248; +const r_255 = r_254.values[0] ?? { type: "null"}; +let _parse249 = r_255; +const r_256 = (runtime.setLine(799), _parse249()); +let _ast250 = r_256; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(806), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "emitting..." })))}; +const r_257 = (runtime.setLine(807), _Emitter14(_ast250, _input_filename244)); +let _emitter251 = r_257; +const r_258 = _emitter251; +const r_259 = r_258.values[0] ?? { type: "null"}; +let _emit252 = r_259; +const r_260 = (runtime.setLine(809), _emit252()); +let _js_code253 = r_260; +if (runtime.truthy(runtime.opNot(_silent243))) { +(runtime.setLine(814), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "writing file '%'..." }), _output_filename245))}; +(runtime.setLine(815), ((...args) => runtime.builtinWriteTextFile(...args))(_output_filename245, _js_code253));