phi-lang/stage2.js
2025-09-23 23:54:07 +02:00

1523 lines
77 KiB
JavaScript

#!/usr/bin/env node
import { Runtime } from "./runtime.js";
const runtime = new Runtime("compile.phi");
runtime.setFile("stdlib.phi");
function _slice29(_list40, _idx41) {
runtime.pushCall("slice", "stdlib.phi");
const r_0 = (runtime.info("stdlib.phi", 3), ((...args) => runtime.builtinLen(...args))(_list40));
let _list_len42 = r_0;
const r_1 = ({ type: "list", values: [] });
let _elems43 = r_1;
const r_2 = _idx41;
let _i44 = r_2;
while (true) {
if (runtime.truthy((runtime.info("stdlib.phi", 7), runtime.opGte(_i44, _list_len42)))) {
break};
(runtime.info("stdlib.phi", 8), ((...args) => runtime.builtinPush(...args))(_elems43, (runtime.info("stdlib.phi", 8), ((...args) => runtime.builtinAt(...args))(_list40, _i44))));
(_i44 = runtime.opAdd(_i44, ({ type: "int", value: 1 })));
};
runtime.popCall();
return _elems43;
;
runtime.popCall();
return { type: "null" };
};
function _slice_eq30(_str45, _slice_idx46, _substr47) {
runtime.pushCall("slice_eq", "stdlib.phi");
const r_3 = (runtime.info("stdlib.phi", 15), ((...args) => runtime.builtinLen(...args))(_str45));
let _str_len48 = r_3;
const r_4 = (runtime.info("stdlib.phi", 16), ((...args) => runtime.builtinLen(...args))(_substr47));
let _substr_len49 = r_4;
const r_5 = ({ type: "int", value: 0 });
let _i50 = r_5;
while (true) {
if (runtime.truthy((runtime.info("stdlib.phi", 19), runtime.opGte(_i50, _substr_len49)))) {
runtime.popCall();
return ({ type: "bool", value: true })};
if (runtime.truthy((runtime.info("stdlib.phi", 21), runtime.opGte((runtime.info("stdlib.phi", 21), runtime.opAdd(_slice_idx46, _i50)), _str_len48)))) {
runtime.popCall();
return ({ type: "bool", value: false })};
if (runtime.truthy((runtime.info("stdlib.phi", 23), runtime.opNe((runtime.info("stdlib.phi", 23), ((...args) => runtime.builtinAt(...args))(_str45, (runtime.info("stdlib.phi", 23), runtime.opAdd(_slice_idx46, _i50)))), (runtime.info("stdlib.phi", 23), ((...args) => runtime.builtinAt(...args))(_substr47, _i50)))))) {
runtime.popCall();
return ({ type: "bool", value: false })};
(_i50 = runtime.opAdd(_i50, ({ type: "int", value: 1 })));
};
runtime.popCall();
return ({ type: "bool", value: true });
;
runtime.popCall();
return { type: "null" };
};
function _contains31(_text51, _ch52) {
runtime.pushCall("contains", "stdlib.phi");
const r_6 = (runtime.info("stdlib.phi", 32), ((...args) => runtime.builtinLen(...args))(_text51));
let _text_len53 = r_6;
const r_7 = ({ type: "int", value: 0 });
let _i54 = r_7;
while (true) {
if (runtime.truthy((runtime.info("stdlib.phi", 35), runtime.opGte(_i54, _text_len53)))) {
break};
if (runtime.truthy((runtime.info("stdlib.phi", 36), runtime.opEq((runtime.info("stdlib.phi", 36), ((...args) => runtime.builtinAt(...args))(_text51, _i54)), _ch52)))) {
runtime.popCall();
return ({ type: "bool", value: true });
};
(_i54 = runtime.opAdd(_i54, ({ type: "int", value: 1 })));
};
runtime.popCall();
return ({ type: "bool", value: false });
;
runtime.popCall();
return { type: "null" };
};
function _indent32(_depth55) {
runtime.pushCall("indent", "stdlib.phi");
const r_8 = ({ type: "string", value: "" });
let _space56 = r_8;
const r_9 = ({ type: "int", value: 0 });
let _i57 = r_9;
while (true) {
if (runtime.truthy((runtime.info("stdlib.phi", 48), runtime.opGte(_i57, _depth55)))) {
break};
(_space56 = runtime.opAdd(_space56, ({ type: "string", value: " " })));
(_i57 = runtime.opAdd(_i57, ({ type: "int", value: 1 })));
};
runtime.popCall();
return _space56;
;
runtime.popCall();
return { type: "null" };
};
function _list_push33(_list_58, _value59) {
runtime.pushCall("list_push", "stdlib.phi");
const r_10 = (runtime.info("stdlib.phi", 56), ((...args) => runtime.builtinLen(...args))(_list_58));
let _list_len60 = r_10;
const r_11 = ({ type: "int", value: 0 });
let _i61 = r_11;
while (true) {
if (runtime.truthy((runtime.info("stdlib.phi", 59), runtime.opGte(_i61, _list_len60)))) {
break};
if (runtime.truthy((runtime.info("stdlib.phi", 60), runtime.opEq((runtime.info("stdlib.phi", 60), ((...args) => runtime.builtinAt(...args))(_list_58, _i61)), ({ type: "null" }))))) {
(runtime.info("stdlib.phi", 61), ((...args) => runtime.builtinSet(...args))(_list_58, _i61, _value59));
runtime.popCall();
return { type: "null" };
};
(_i61 = runtime.opAdd(_i61, ({ type: "int", value: 1 })));
};
(runtime.info("stdlib.phi", 66), ((...args) => runtime.builtinPush(...args))(_list_58, _value59));
;
runtime.popCall();
return { type: "null" };
};
function _list_pop34(_list_62) {
runtime.pushCall("list_pop", "stdlib.phi");
const r_12 = (runtime.info("stdlib.phi", 70), runtime.opSub((runtime.info("stdlib.phi", 70), ((...args) => runtime.builtinLen(...args))(_list_62)), ({ type: "int", value: 1 })));
let _i63 = r_12;
while (true) {
if (runtime.truthy((runtime.info("stdlib.phi", 72), runtime.opLt(_i63, ({ type: "int", value: 0 }))))) {
break};
const r_13 = (runtime.info("stdlib.phi", 73), ((...args) => runtime.builtinAt(...args))(_list_62, _i63));
let _value64 = r_13;
if (runtime.truthy((runtime.info("stdlib.phi", 74), runtime.opNe(_value64, ({ type: "null" }))))) {
(runtime.info("stdlib.phi", 75), ((...args) => runtime.builtinSet(...args))(_list_62, _i63, ({ type: "null" })));
runtime.popCall();
return _value64;
};
(_i63 = runtime.opSub(_i63, ({ type: "int", value: 1 })));
};
runtime.popCall();
return ({ type: "null" });
;
runtime.popCall();
return { type: "null" };
};
function _list_contains35(_list_65, _value66) {
runtime.pushCall("list_contains", "stdlib.phi");
for (const r_14 of _list_65.values) {;
let _elem67 = r_14;
if (runtime.truthy((runtime.info("stdlib.phi", 85), runtime.opEq(_elem67, _value66)))) {
runtime.popCall();
return ({ type: "bool", value: true });
};
};
runtime.popCall();
return ({ type: "bool", value: false });
;
runtime.popCall();
return { type: "null" };
};
function _map36() {
runtime.pushCall("map", "stdlib.phi");
runtime.popCall();
return ({ type: "list", values: [] });
;
runtime.popCall();
return { type: "null" };
};
function _map_has37(_map68, _key69) {
runtime.pushCall("map_has", "stdlib.phi");
for (const r_15 of _map68.values) {;
const r_16 = r_15.values[0] ?? { type: "null"};
let _m_key70 = r_16;
const r_17 = r_15.values[1] ?? { type: "null"};
if (runtime.truthy((runtime.info("stdlib.phi", 98), runtime.opEq(_m_key70, _key69)))) {
runtime.popCall();
return ({ type: "bool", value: true });
};
};
runtime.popCall();
return ({ type: "bool", value: false });
;
runtime.popCall();
return { type: "null" };
};
function _map_get38(_map71, _key72) {
runtime.pushCall("map_get", "stdlib.phi");
for (const r_18 of _map71.values) {;
const r_19 = r_18.values[0] ?? { type: "null"};
let _m_key73 = r_19;
const r_20 = r_18.values[1] ?? { type: "null"};
let _value74 = r_20;
if (runtime.truthy((runtime.info("stdlib.phi", 107), runtime.opEq(_m_key73, _key72)))) {
runtime.popCall();
return _value74;
};
};
runtime.popCall();
return ({ type: "null" });
;
runtime.popCall();
return { type: "null" };
};
function _map_set39(_map75, _key76, _value77) {
runtime.pushCall("map_set", "stdlib.phi");
for (const r_21 of _map75.values) {;
let _entry78 = r_21;
const r_22 = _entry78;
const r_23 = r_22.values[0] ?? { type: "null"};
let _entry_key79 = r_23;
const r_24 = r_22.values[1] ?? { type: "null"};
if (runtime.truthy((runtime.info("stdlib.phi", 117), runtime.opEq(_entry_key79, _key76)))) {
(runtime.info("stdlib.phi", 118), ((...args) => runtime.builtinSet(...args))(_entry78, ({ type: "int", value: 1 }), _value77));
runtime.popCall();
return { type: "null" };
};
};
(runtime.info("stdlib.phi", 122), ((...args) => runtime.builtinPush(...args))(_map75, ({ type: "list", values: [_key76, _value77] })));
;
runtime.popCall();
return { type: "null" };
};
runtime.setFile("compile.phi");
;
runtime.setFile("compiler/parse.phi");
;
function _Parser94(_tokens96) {
runtime.pushCall("Parser", "compiler/parse.phi");
const r_25 = ({ type: "int", value: 0 });
let _i103 = r_25;
const r_26 = (runtime.info("compiler/parse.phi", 5), ((...args) => runtime.builtinAt(...args))(_tokens96, _i103));
let _tok104 = r_26;
function _parse97() {
runtime.pushCall("parse", "compiler/parse.phi");
const r_27 = ({ type: "list", values: [] });
let _exprs105 = r_27;
while (true) {
if (runtime.truthy((runtime.info("compiler/parse.phi", 10), _done102()))) {
break};
(runtime.info("compiler/parse.phi", 11), ((...args) => runtime.builtinPush(...args))(_exprs105, (runtime.info("compiler/parse.phi", 11), _parse_expr98())));
};
runtime.popCall();
return _exprs105;
;
runtime.popCall();
return { type: "null" };
};
function _parse_expr98() {
runtime.pushCall("parse_expr", "compiler/parse.phi");
const r_28 = _tok104;
const r_29 = r_28.values[0] ?? { type: "null"};
let _ty106 = r_29;
const r_30 = r_28.values[1] ?? { type: "null"};
let _line107 = r_30;
const r_31 = r_28.values[2] ?? { type: "null"};
let _value108 = r_31;
if (runtime.truthy((runtime.info("compiler/parse.phi", 18), _eat99(({ type: "string", value: "(" }))))) {
const r_32 = ({ type: "list", values: [] });
let _values109 = r_32;
while (true) {
if (runtime.truthy((runtime.info("compiler/parse.phi", 21), _test101(({ type: "string", value: ")" }))))) {
break};
(runtime.info("compiler/parse.phi", 22), ((...args) => runtime.builtinPush(...args))(_values109, (runtime.info("compiler/parse.phi", 22), _parse_expr98())));
};
if (runtime.truthy(runtime.opNot((runtime.info("compiler/parse.phi", 24), _eat99(({ type: "string", value: ")" })))))) {
(runtime.info("compiler/parse.phi", 25), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected ')' on line %" }), (runtime.info("compiler/parse.phi", 25), ((...args) => runtime.builtinAt(...args))(_tok104, ({ type: "int", value: 1 })))));
};
runtime.popCall();
return ({ type: "list", values: [({ type: "string", value: "list" }), _line107, _values109] });
} else {
if (runtime.truthy((runtime.info("compiler/parse.phi", 28), _eat99(({ type: "string", value: "string" }))))) {
runtime.popCall();
return ({ type: "list", values: [({ type: "string", value: "string" }), _line107, _value108] });
} else {
if (runtime.truthy((runtime.info("compiler/parse.phi", 30), _eat99(({ type: "string", value: "int" }))))) {
runtime.popCall();
return ({ type: "list", values: [({ type: "string", value: "int" }), _line107, (runtime.info("compiler/parse.phi", 31), ((...args) => runtime.builtinStringToInt(...args))(_value108))] });
} else {
if (runtime.truthy((runtime.info("compiler/parse.phi", 32), _eat99(({ type: "string", value: "ident" }))))) {
runtime.popCall();
return ({ type: "list", values: [({ type: "string", value: "ident" }), _line107, _value108] });
} else {
(runtime.info("compiler/parse.phi", 35), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected expression, got '%' on line %" }), _ty106, _line107));
}}}};
;
runtime.popCall();
return { type: "null" };
};
function _eat99(_pat110) {
runtime.pushCall("eat", "compiler/parse.phi");
if (runtime.truthy(runtime.opNot((runtime.info("compiler/parse.phi", 40), _test101(_pat110))))) {
runtime.popCall();
return ({ type: "bool", value: false })};
(runtime.info("compiler/parse.phi", 41), _step100());
runtime.popCall();
return ({ type: "bool", value: true });
;
runtime.popCall();
return { type: "null" };
};
function _step100() {
runtime.pushCall("step", "compiler/parse.phi");
(_i103 = runtime.opAdd(_i103, ({ type: "int", value: 1 })));
if (runtime.truthy(runtime.opNot((runtime.info("compiler/parse.phi", 47), _done102())))) {
const r_33 = (runtime.info("compiler/parse.phi", 48), ((...args) => runtime.builtinAt(...args))(_tokens96, _i103));
let _new_tok111 = r_33;
(_tok104 = _new_tok111);
};
;
runtime.popCall();
return { type: "null" };
};
function _test101(_pat112) {
runtime.pushCall("test", "compiler/parse.phi");
if (runtime.truthy((runtime.info("compiler/parse.phi", 54), _done102()))) {
runtime.popCall();
return ({ type: "bool", value: false })};
const r_34 = _tok104;
const r_35 = r_34.values[0] ?? { type: "null"};
let _ty113 = r_35;
runtime.popCall();
return (runtime.info("compiler/parse.phi", 56), runtime.opEq(_pat112, _ty113));
;
runtime.popCall();
return { type: "null" };
};
function _done102() {
runtime.pushCall("done", "compiler/parse.phi");
runtime.popCall();
return (runtime.info("compiler/parse.phi", 60), runtime.opGte(_i103, (runtime.info("compiler/parse.phi", 60), ((...args) => runtime.builtinLen(...args))(_tokens96))));
;
runtime.popCall();
return { type: "null" };
};
runtime.popCall();
return ({ type: "list", values: [_parse97] });
;
runtime.popCall();
return { type: "null" };
};
function _tokenize95(_text114) {
runtime.pushCall("tokenize", "compiler/parse.phi");
const r_36 = (runtime.info("compiler/parse.phi", 67), ((...args) => runtime.builtinLen(...args))(_text114));
let _text_len115 = r_36;
const r_37 = ({ type: "list", values: [] });
let _tokens116 = r_37;
const r_38 = ({ type: "int", value: 0 });
let _i117 = r_38;
const r_39 = ({ type: "int", value: 1 });
let _line118 = r_39;
const r_40 = (runtime.info("compiler/parse.phi", 73), runtime.opAdd(({ type: "string", value: "abcdefghijklmnopqrstuvwxyz" }), ({ type: "string", value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-*/%&|=?!<>'_" })));
let _ident_chars119 = r_40;
while (true) {
if (runtime.truthy((runtime.info("compiler/parse.phi", 77), runtime.opGte(_i117, _text_len115)))) {
break};
const r_41 = (runtime.info("compiler/parse.phi", 79), ((...args) => runtime.builtinAt(...args))(_text114, _i117));
let _ch120 = r_41;
if (runtime.truthy((runtime.info("compiler/parse.phi", 81), _contains31(({ type: "string", value: " \t\r\n" }), _ch120)))) {
if (runtime.truthy((runtime.info("compiler/parse.phi", 82), runtime.opEq(_ch120, ({ type: "string", value: "\n" }))))) {
(_line118 = runtime.opAdd(_line118, ({ type: "int", value: 1 })));
};
(_i117 = runtime.opAdd(_i117, ({ type: "int", value: 1 })));
} else {
if (runtime.truthy((runtime.info("compiler/parse.phi", 86), _slice_eq30(_text114, _i117, ({ type: "string", value: "//" }))))) {
while (true) {
if (runtime.truthy((runtime.info("compiler/parse.phi", 88), { type: "bool", value: runtime.truthy((runtime.info("compiler/parse.phi", 88), runtime.opGte(_i117, _text_len115))) || runtime.truthy((runtime.info("compiler/parse.phi", 88), runtime.opEq((runtime.info("compiler/parse.phi", 88), ((...args) => runtime.builtinAt(...args))(_text114, _i117)), ({ type: "string", value: "\n" })))) }))) {
break;
};
(_i117 = runtime.opAdd(_i117, ({ type: "int", value: 1 })));
};
} else {
if (runtime.truthy((runtime.info("compiler/parse.phi", 93), _contains31(({ type: "string", value: "()" }), _ch120)))) {
(runtime.info("compiler/parse.phi", 94), ((...args) => runtime.builtinPush(...args))(_tokens116, ({ type: "list", values: [_ch120, _line118] })));
(_i117 = runtime.opAdd(_i117, ({ type: "int", value: 1 })));
} else {
if (runtime.truthy((runtime.info("compiler/parse.phi", 96), runtime.opEq(_ch120, ({ type: "string", value: "\"" }))))) {
const r_42 = ({ type: "string", value: "" });
let _value121 = r_42;
(_i117 = runtime.opAdd(_i117, ({ type: "int", value: 1 })));
(_ch120 = (runtime.info("compiler/parse.phi", 99), ((...args) => runtime.builtinAt(...args))(_text114, _i117)));
while (true) {
if (runtime.truthy((runtime.info("compiler/parse.phi", 101), { type: "bool", value: runtime.truthy((runtime.info("compiler/parse.phi", 101), runtime.opGte(_i117, _text_len115))) || runtime.truthy((runtime.info("compiler/parse.phi", 101), runtime.opEq(_ch120, ({ type: "string", value: "\"" })))) }))) {
break;
};
if (runtime.truthy((runtime.info("compiler/parse.phi", 104), runtime.opEq(_ch120, ({ type: "string", value: "\\" }))))) {
(_i117 = runtime.opAdd(_i117, ({ type: "int", value: 1 })));
if (runtime.truthy((runtime.info("compiler/parse.phi", 106), runtime.opGte(_i117, _text_len115)))) {
break;
};
(_ch120 = (runtime.info("compiler/parse.phi", 109), ((...args) => runtime.builtinAt(...args))(_text114, _i117)));
if (runtime.truthy((runtime.info("compiler/parse.phi", 110), runtime.opEq(_ch120, ({ type: "string", value: "t" }))))) {
(_value121 = runtime.opAdd(_value121, ({ type: "string", value: "\t" })));
} else {
if (runtime.truthy((runtime.info("compiler/parse.phi", 112), runtime.opEq(_ch120, ({ type: "string", value: "r" }))))) {
(_value121 = runtime.opAdd(_value121, ({ type: "string", value: "\r" })));
} else {
if (runtime.truthy((runtime.info("compiler/parse.phi", 114), runtime.opEq(_ch120, ({ type: "string", value: "n" }))))) {
(_value121 = runtime.opAdd(_value121, ({ type: "string", value: "\n" })));
} else {
if (runtime.truthy((runtime.info("compiler/parse.phi", 116), runtime.opEq(_ch120, ({ type: "string", value: "0" }))))) {
(_value121 = runtime.opAdd(_value121, ({ type: "string", value: "\n" })));
} else {
(_value121 = runtime.opAdd(_value121, _ch120));
}}}};
} else {
(_value121 = runtime.opAdd(_value121, _ch120));
};
(_i117 = runtime.opAdd(_i117, ({ type: "int", value: 1 })));
(_ch120 = (runtime.info("compiler/parse.phi", 125), ((...args) => runtime.builtinAt(...args))(_text114, _i117)));
};
if (runtime.truthy((runtime.info("compiler/parse.phi", 127), { type: "bool", value: runtime.truthy((runtime.info("compiler/parse.phi", 127), runtime.opGte(_i117, _text_len115))) || runtime.truthy((runtime.info("compiler/parse.phi", 127), runtime.opNe(_ch120, ({ type: "string", value: "\"" })))) }))) {
(runtime.info("compiler/parse.phi", 128), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected '\"' on line %" }), _line118));
};
(_i117 = runtime.opAdd(_i117, ({ type: "int", value: 1 })));
(runtime.info("compiler/parse.phi", 131), ((...args) => runtime.builtinPush(...args))(_tokens116, ({ type: "list", values: [({ type: "string", value: "string" }), _line118, _value121] })));
} else {
if (runtime.truthy((runtime.info("compiler/parse.phi", 132), _contains31(({ type: "string", value: "0123456789" }), _ch120)))) {
const r_43 = ({ type: "string", value: "" });
let _value122 = r_43;
while (true) {
(_ch120 = (runtime.info("compiler/parse.phi", 135), ((...args) => runtime.builtinAt(...args))(_text114, _i117)));
if (runtime.truthy((runtime.info("compiler/parse.phi", 136), { type: "bool", value: runtime.truthy((runtime.info("compiler/parse.phi", 136), runtime.opGte(_i117, _text_len115))) || runtime.truthy(runtime.opNot((runtime.info("compiler/parse.phi", 136), _contains31(({ type: "string", value: "0123456789" }), _ch120)))) }))) {
break;
};
(_value122 = runtime.opAdd(_value122, _ch120));
(_i117 = runtime.opAdd(_i117, ({ type: "int", value: 1 })));
};
(runtime.info("compiler/parse.phi", 142), ((...args) => runtime.builtinPush(...args))(_tokens116, ({ type: "list", values: [({ type: "string", value: "int" }), _line118, _value122] })));
} else {
if (runtime.truthy((runtime.info("compiler/parse.phi", 143), _contains31(_ident_chars119, _ch120)))) {
const r_44 = ({ type: "string", value: "" });
let _value123 = r_44;
while (true) {
(_ch120 = (runtime.info("compiler/parse.phi", 146), ((...args) => runtime.builtinAt(...args))(_text114, _i117)));
if (runtime.truthy((runtime.info("compiler/parse.phi", 147), { type: "bool", value: runtime.truthy((runtime.info("compiler/parse.phi", 147), runtime.opGte(_i117, _text_len115))) || runtime.truthy(runtime.opNot((runtime.info("compiler/parse.phi", 147), _contains31(_ident_chars119, _ch120)))) }))) {
break;
};
(_value123 = runtime.opAdd(_value123, _ch120));
(_i117 = runtime.opAdd(_i117, ({ type: "int", value: 1 })));
};
(runtime.info("compiler/parse.phi", 153), ((...args) => runtime.builtinPush(...args))(_tokens116, ({ type: "list", values: [({ type: "string", value: "ident" }), _line118, _value123] })));
} else {
(runtime.info("compiler/parse.phi", 155), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "illegal char '%'" }), _ch120));
(_i117 = runtime.opAdd(_i117, ({ type: "int", value: 1 })));
}}}}}};
};
runtime.popCall();
return _tokens116;
;
runtime.popCall();
return { type: "null" };
};
runtime.setFile("compile.phi");
;
runtime.setFile("compiler/emit_js.phi");
;
;
runtime.setFile("compiler/syms.phi");
;
function _Syms155() {
runtime.pushCall("Syms", "compiler/syms.phi");
const r_45 = ({ type: "list", values: [({ type: "null" }), (runtime.info("compiler/syms.phi", 4), _map36())] });
let _syms164 = r_45;
function _enter_scope156() {
runtime.pushCall("enter_scope", "compiler/syms.phi");
(_syms164 = ({ type: "list", values: [_syms164, (runtime.info("compiler/syms.phi", 7), _map36())] }));
;
runtime.popCall();
return { type: "null" };
};
function _leave_scope157() {
runtime.pushCall("leave_scope", "compiler/syms.phi");
const r_46 = _syms164;
const r_47 = r_46.values[0] ?? { type: "null"};
let _parent165 = r_47;
const r_48 = r_46.values[1] ?? { type: "null"};
(_syms164 = _parent165);
;
runtime.popCall();
return { type: "null" };
};
function _define_sym158(_ident166, _sym167) {
runtime.pushCall("define_sym", "compiler/syms.phi");
const r_49 = _syms164;
const r_50 = r_49.values[0] ?? { type: "null"};
const r_51 = r_49.values[1] ?? { type: "null"};
let _map168 = r_51;
(runtime.info("compiler/syms.phi", 17), _map_set39(_map168, _ident166, _sym167));
;
runtime.popCall();
return { type: "null" };
};
function _find_sym159(_syms169, _ident170) {
runtime.pushCall("find_sym", "compiler/syms.phi");
const r_52 = _syms169;
const r_53 = r_52.values[0] ?? { type: "null"};
let _parent171 = r_53;
const r_54 = r_52.values[1] ?? { type: "null"};
let _map172 = r_54;
if (runtime.truthy((runtime.info("compiler/syms.phi", 22), _map_has37(_map172, _ident170)))) {
runtime.popCall();
return (runtime.info("compiler/syms.phi", 23), _map_get38(_map172, _ident170));
};
if (runtime.truthy((runtime.info("compiler/syms.phi", 25), runtime.opNe(_parent171, ({ type: "null" }))))) {
runtime.popCall();
return (runtime.info("compiler/syms.phi", 26), _find_sym159(_parent171, _ident170));
};
runtime.popCall();
return ({ type: "null" });
;
runtime.popCall();
return { type: "null" };
};
function _get_sym160(_ident173) {
runtime.pushCall("get_sym", "compiler/syms.phi");
runtime.popCall();
return (runtime.info("compiler/syms.phi", 32), _find_sym159(_syms164, _ident173));
;
runtime.popCall();
return { type: "null" };
};
function _get_current_map161() {
runtime.pushCall("get_current_map", "compiler/syms.phi");
const r_55 = _syms164;
const r_56 = r_55.values[0] ?? { type: "null"};
const r_57 = r_55.values[1] ?? { type: "null"};
let _map174 = r_57;
runtime.popCall();
return _map174;
;
runtime.popCall();
return { type: "null" };
};
function _print_syms_node162(_syms175, _depth176) {
runtime.pushCall("print_syms_node", "compiler/syms.phi");
const r_58 = _syms175;
const r_59 = r_58.values[0] ?? { type: "null"};
let _parent177 = r_59;
const r_60 = r_58.values[1] ?? { type: "null"};
let _map178 = r_60;
for (const r_61 of _map178.values) {;
const r_62 = r_61.values[0] ?? { type: "null"};
let _ident179 = r_62;
const r_63 = r_61.values[1] ?? { type: "null"};
let _sym180 = r_63;
(runtime.info("compiler/syms.phi", 43), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%- %: %" }), (runtime.info("compiler/syms.phi", 43), _indent32(_depth176)), _ident179, _sym180));
};
if (runtime.truthy((runtime.info("compiler/syms.phi", 45), runtime.opNe(_parent177, ({ type: "null" }))))) {
(runtime.info("compiler/syms.phi", 46), _print_syms_node162(_parent177, (runtime.info("compiler/syms.phi", 46), runtime.opAdd(_depth176, ({ type: "int", value: 1 })))));
};
;
runtime.popCall();
return { type: "null" };
};
function _print_syms163() {
runtime.pushCall("print_syms", "compiler/syms.phi");
(runtime.info("compiler/syms.phi", 51), _print_syms_node162(_syms164, ({ type: "int", value: 0 })));
;
runtime.popCall();
return { type: "null" };
};
runtime.popCall();
return ({ type: "list", values: [_enter_scope156, _leave_scope157, _define_sym158, _get_sym160, _get_current_map161, _print_syms163] });
;
runtime.popCall();
return { type: "null" };
};
runtime.setFile("compiler/emit_js.phi");
;
function _JsEmitter138(_ast181, _initial_filename182) {
runtime.pushCall("JsEmitter", "compiler/emit_js.phi");
const r_64 = ({ type: "list", values: [] });
let _output204 = r_64;
const r_65 = _initial_filename182;
let _filename205 = r_65;
const r_66 = (runtime.info("compiler/emit_js.phi", 13), _Syms155());
let _syms206 = r_66;
const r_67 = (runtime.info("compiler/emit_js.phi", 15), _Counter139());
const r_68 = r_67.values[0] ?? { type: "null"};
let _sym_id_count207 = r_68;
const r_69 = r_67.values[1] ?? { type: "null"};
let _sym_id_increment208 = r_69;
const r_70 = (runtime.info("compiler/emit_js.phi", 16), _Counter139());
const r_71 = r_70.values[0] ?? { type: "null"};
let _let_node_reg_count209 = r_71;
const r_72 = r_70.values[1] ?? { type: "null"};
let _let_node_reg_increment210 = r_72;
const r_73 = ({ type: "list", values: [_filename205] });
let _import_stack211 = r_73;
const r_74 = (runtime.info("compiler/emit_js.phi", 19), _map36());
let _imported_files212 = r_74;
const r_75 = ({ 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_syms213 = r_75;
function _generate183() {
runtime.pushCall("generate", "compiler/emit_js.phi");
(runtime.info("compiler/emit_js.phi", 39), _emit193(({ type: "string", value: "#!/usr/bin/env node\n" })));
(runtime.info("compiler/emit_js.phi", 40), _emit193(({ type: "string", value: "import { Runtime } from \"./runtime.js\";\n" })));
(runtime.info("compiler/emit_js.phi", 41), _emit193((runtime.info("compiler/emit_js.phi", 41), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "const runtime = new Runtime(\"%\");\n" }), _filename205))));
for (const r_76 of _builtin_syms213.values) {;
const r_77 = r_76.values[0] ?? { type: "null"};
let _ident214 = r_77;
const r_78 = r_76.values[1] ?? { type: "null"};
let _builtin_id215 = r_78;
(runtime.info("compiler/emit_js.phi", 44), _define_builtin194(_ident214, _builtin_id215));
};
(runtime.info("compiler/emit_js.phi", 47), _enter_scope198());
(runtime.info("compiler/emit_js.phi", 48), _discover_syms185(_ast181));
(runtime.info("compiler/emit_js.phi", 49), _emit_exprs184(_ast181));
runtime.popCall();
return (runtime.info("compiler/emit_js.phi", 50), ((...args) => runtime.builtinStringsJoin(...args))(_output204));
;
runtime.popCall();
return { type: "null" };
};
function _emit_exprs184(_exprs216) {
runtime.pushCall("emit_exprs", "compiler/emit_js.phi");
for (const r_79 of _exprs216.values) {;
let _expr217 = r_79;
(runtime.info("compiler/emit_js.phi", 55), _emit_expr186(_expr217));
(runtime.info("compiler/emit_js.phi", 56), _emit193(({ type: "string", value: ";\n" })));
};
;
runtime.popCall();
return { type: "null" };
};
function _discover_syms185(_exprs218) {
runtime.pushCall("discover_syms", "compiler/emit_js.phi");
for (const r_80 of _exprs218.values) {;
let _expr219 = r_80;
const r_81 = _expr219;
const r_82 = r_81.values[0] ?? { type: "null"};
let _ty220 = r_82;
const r_83 = r_81.values[1] ?? { type: "null"};
let _line221 = r_83;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 63), runtime.opNe(_ty220, ({ type: "string", value: "list" }))))) {
runtime.popCall();
return { type: "null" }};
const r_84 = _expr219;
const r_85 = r_84.values[0] ?? { type: "null"};
const r_86 = r_84.values[1] ?? { type: "null"};
const r_87 = r_84.values[2] ?? { type: "null"};
let _s222 = r_87;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 65), runtime.opEq((runtime.info("compiler/emit_js.phi", 65), ((...args) => runtime.builtinLen(...args))(_s222)), ({ type: "int", value: 0 }))))) {
runtime.popCall();
return { type: "null" }};
const r_88 = _s222;
const r_89 = r_88.values[0] ?? { type: "null"};
const r_90 = r_89.values[0] ?? { type: "null"};
const r_91 = r_89.values[1] ?? { type: "null"};
const r_92 = r_89.values[2] ?? { type: "null"};
let _id223 = r_92;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 67), runtime.opEq(_id223, ({ type: "string", value: "fn" }))))) {
const r_93 = _s222;
const r_94 = r_93.values[0] ?? { type: "null"};
const r_95 = r_93.values[1] ?? { type: "null"};
const r_96 = r_95.values[0] ?? { type: "null"};
const r_97 = r_95.values[1] ?? { type: "null"};
const r_98 = r_95.values[2] ?? { type: "null"};
let _ident224 = r_98;
const r_99 = r_93.values[2] ?? { type: "null"};
const r_100 = r_99.values[0] ?? { type: "null"};
const r_101 = r_99.values[1] ?? { type: "null"};
const r_102 = r_99.values[2] ?? { type: "null"};
let _params225 = r_102;
const r_103 = r_93.values[3] ?? { type: "null"};
let _body226 = r_103;
(runtime.info("compiler/emit_js.phi", 69), _define_fn195(_ident224, _line221));
};
};
;
runtime.popCall();
return { type: "null" };
};
function _emit_expr186(_expr227) {
runtime.pushCall("emit_expr", "compiler/emit_js.phi");
const r_104 = _expr227;
const r_105 = r_104.values[0] ?? { type: "null"};
let _ty228 = r_105;
const r_106 = r_104.values[1] ?? { type: "null"};
let _line229 = r_106;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 76), runtime.opEq(_ty228, ({ type: "string", value: "list" }))))) {
(runtime.info("compiler/emit_js.phi", 77), _emit_list187(_expr227));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 78), runtime.opEq(_ty228, ({ type: "string", value: "int" }))))) {
const r_107 = _expr227;
const r_108 = r_107.values[0] ?? { type: "null"};
const r_109 = r_107.values[1] ?? { type: "null"};
const r_110 = r_107.values[2] ?? { type: "null"};
let _value230 = r_110;
(runtime.info("compiler/emit_js.phi", 80), _emit193((runtime.info("compiler/emit_js.phi", 80), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "({ type: \"int\", value: % })" }), _value230))));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 81), runtime.opEq(_ty228, ({ type: "string", value: "string" }))))) {
const r_111 = _expr227;
const r_112 = r_111.values[0] ?? { type: "null"};
const r_113 = r_111.values[1] ?? { type: "null"};
const r_114 = r_111.values[2] ?? { type: "null"};
let _value231 = r_114;
(runtime.info("compiler/emit_js.phi", 83), _emit193((runtime.info("compiler/emit_js.phi", 83), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "({ type: \"string\", value: \"%\" })" }), (runtime.info("compiler/emit_js.phi", 83), _string_escape140(_value231))))));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 84), runtime.opEq(_ty228, ({ type: "string", value: "ident" }))))) {
const r_115 = _expr227;
const r_116 = r_115.values[0] ?? { type: "null"};
const r_117 = r_115.values[1] ?? { type: "null"};
const r_118 = r_115.values[2] ?? { type: "null"};
let _value232 = r_118;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 87), runtime.opEq(_value232, ({ type: "string", value: "null" }))))) {
(runtime.info("compiler/emit_js.phi", 88), _emit193(({ type: "string", value: "({ type: \"null\" })" })));
runtime.popCall();
return { type: "null" };
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 90), runtime.opEq(_value232, ({ type: "string", value: "false" }))))) {
(runtime.info("compiler/emit_js.phi", 91), _emit193(({ type: "string", value: "({ type: \"bool\", value: false })" })));
runtime.popCall();
return { type: "null" };
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 93), runtime.opEq(_value232, ({ type: "string", value: "true" }))))) {
(runtime.info("compiler/emit_js.phi", 94), _emit193(({ type: "string", value: "({ type: \"bool\", value: true })" })));
runtime.popCall();
return { type: "null" };
}}};
const r_119 = (runtime.info("compiler/emit_js.phi", 98), _get_sym201(_value232));
let _sym233 = r_119;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 99), runtime.opEq(_sym233, ({ type: "null" }))))) {
(runtime.info("compiler/emit_js.phi", 100), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "undefined symbol '%' on line %" }), _value232, _line229));
};
const r_120 = _sym233;
const r_121 = r_120.values[0] ?? { type: "null"};
let _sym_id234 = r_121;
const r_122 = r_120.values[1] ?? { type: "null"};
let _sym_ty235 = r_122;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 104), runtime.opEq(_sym_ty235, ({ type: "string", value: "builtin" }))))) {
const r_123 = _sym233;
const r_124 = r_123.values[0] ?? { type: "null"};
const r_125 = r_123.values[1] ?? { type: "null"};
const r_126 = r_123.values[2] ?? { type: "null"};
let _id236 = r_126;
(runtime.info("compiler/emit_js.phi", 106), _emit193((runtime.info("compiler/emit_js.phi", 106), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "((...args) => runtime.%(...args))" }), _id236))));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 107), runtime.opEq(_sym_ty235, ({ type: "string", value: "fn" }))))) {
(runtime.info("compiler/emit_js.phi", 108), _emit193((runtime.info("compiler/emit_js.phi", 108), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value232, _sym_id234))));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 109), runtime.opEq(_sym_ty235, ({ type: "string", value: "param" }))))) {
(runtime.info("compiler/emit_js.phi", 110), _emit193((runtime.info("compiler/emit_js.phi", 110), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value232, _sym_id234))));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 111), runtime.opEq(_sym_ty235, ({ type: "string", value: "let" }))))) {
(runtime.info("compiler/emit_js.phi", 112), _emit193((runtime.info("compiler/emit_js.phi", 112), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value232, _sym_id234))));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 113), runtime.opEq(_sym_ty235, ({ type: "string", value: "imported" }))))) {
(runtime.info("compiler/emit_js.phi", 118), _emit193((runtime.info("compiler/emit_js.phi", 118), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value232, _sym_id234))));
} else {
(runtime.info("compiler/emit_js.phi", 120), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented '%'" }), _sym_ty235));
}}}}};
} else {
(runtime.info("compiler/emit_js.phi", 123), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "unknown expr type '%' on line %" }), _ty228, _line229));
}}}};
;
runtime.popCall();
return { type: "null" };
};
function _emit_list187(_expr237) {
runtime.pushCall("emit_list", "compiler/emit_js.phi");
const r_127 = _expr237;
const r_128 = r_127.values[0] ?? { type: "null"};
let _ty238 = r_128;
const r_129 = r_127.values[1] ?? { type: "null"};
let _line239 = r_129;
const r_130 = r_127.values[2] ?? { type: "null"};
let _s240 = r_130;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 129), runtime.opEq((runtime.info("compiler/emit_js.phi", 129), ((...args) => runtime.builtinLen(...args))(_s240)), ({ type: "int", value: 0 }))))) {
(runtime.info("compiler/emit_js.phi", 130), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "illegal function on line %" }), _line239));
};
const r_131 = _s240;
const r_132 = r_131.values[0] ?? { type: "null"};
const r_133 = r_132.values[0] ?? { type: "null"};
let _id_ty241 = r_133;
const r_134 = r_132.values[1] ?? { type: "null"};
const r_135 = r_132.values[2] ?? { type: "null"};
let _id242 = r_135;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 133), runtime.opNe(_id_ty241, ({ type: "string", value: "ident" }))))) {
(runtime.info("compiler/emit_js.phi", 134), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "illegal function on line %" }), _line239));
};
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 136), runtime.opEq(_id242, ({ type: "string", value: "import" }))))) {
const r_136 = _s240;
const r_137 = r_136.values[0] ?? { type: "null"};
const r_138 = r_136.values[1] ?? { type: "null"};
const r_139 = r_138.values[0] ?? { type: "null"};
const r_140 = r_138.values[1] ?? { type: "null"};
const r_141 = r_138.values[2] ?? { type: "null"};
let _inner_filename243 = r_141;
const r_142 = r_136.values[2] ?? { type: "null"};
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 _idents244 = r_145;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 139), _list_contains35(_import_stack211, _inner_filename243)))) {
(runtime.info("compiler/emit_js.phi", 140), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "circular dependendy: '%' imports '%'" }), _filename205, _inner_filename243));
};
(runtime.info("compiler/emit_js.phi", 142), _list_push33(_import_stack211, _inner_filename243));
const r_146 = ({ type: "null" });
let _sym_map245 = r_146;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 146), _map_has37(_imported_files212, _inner_filename243)))) {
(_sym_map245 = (runtime.info("compiler/emit_js.phi", 147), _map_get38(_imported_files212, _inner_filename243)));
} else {
(runtime.info("compiler/emit_js.phi", 149), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "compiling '%'" }), _inner_filename243));
const r_147 = _filename205;
let _outer_filename246 = r_147;
(_filename205 = _inner_filename243);
const r_148 = (runtime.info("compiler/emit_js.phi", 153), ((...args) => runtime.builtinReadTextFile(...args))(_filename205));
let _text247 = r_148;
const r_149 = (runtime.info("compiler/emit_js.phi", 154), _tokenize95(_text247));
let _tokens248 = r_149;
const r_150 = (runtime.info("compiler/emit_js.phi", 155), _Parser94(_tokens248));
let _parser249 = r_150;
const r_151 = _parser249;
const r_152 = r_151.values[0] ?? { type: "null"};
let _parse250 = r_152;
const r_153 = (runtime.info("compiler/emit_js.phi", 157), _parse250());
let _ast251 = r_153;
(runtime.info("compiler/emit_js.phi", 159), _emit193((runtime.info("compiler/emit_js.phi", 159), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.setFile(\"%\");\n" }), _filename205))));
const r_154 = _syms206;
let _outer_syms252 = r_154;
(_syms206 = (runtime.info("compiler/emit_js.phi", 162), _Syms155()));
for (const r_155 of _builtin_syms213.values) {;
const r_156 = r_155.values[0] ?? { type: "null"};
let _ident253 = r_156;
const r_157 = r_155.values[1] ?? { type: "null"};
let _builtin_id254 = r_157;
(runtime.info("compiler/emit_js.phi", 164), _define_builtin194(_ident253, _builtin_id254));
};
(runtime.info("compiler/emit_js.phi", 167), _enter_scope198());
(runtime.info("compiler/emit_js.phi", 168), _discover_syms185(_ast251));
(runtime.info("compiler/emit_js.phi", 169), _emit_exprs184(_ast251));
(_sym_map245 = (runtime.info("compiler/emit_js.phi", 170), _get_current_map202()));
(runtime.info("compiler/emit_js.phi", 171), _map_set39(_imported_files212, _filename205, _sym_map245));
(_syms206 = _outer_syms252);
(_filename205 = _outer_filename246);
(runtime.info("compiler/emit_js.phi", 176), _emit193((runtime.info("compiler/emit_js.phi", 176), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.setFile(\"%\");\n" }), _outer_filename246))));
};
(runtime.info("compiler/emit_js.phi", 178), _list_pop34(_import_stack211));
for (const r_158 of _idents244.values) {;
const r_159 = r_158.values[0] ?? { type: "null"};
const r_160 = r_158.values[1] ?? { type: "null"};
const r_161 = r_158.values[2] ?? { type: "null"};
let _ident255 = r_161;
const r_162 = ({ type: "null" });
let _sym256 = r_162;
for (const r_163 of _sym_map245.values) {;
const r_164 = r_163.values[0] ?? { type: "null"};
let _sym_ident257 = r_164;
const r_165 = r_163.values[1] ?? { type: "null"};
let _found_sym258 = r_165;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 183), runtime.opEq(_sym_ident257, _ident255)))) {
(_sym256 = _found_sym258);
break;
};
};
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 188), runtime.opEq(_sym256, ({ type: "null" }))))) {
(runtime.info("compiler/emit_js.phi", 189), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "no symbol '%' from imported '%'" }), _ident255, _inner_filename243));
};
const r_166 = _sym256;
const r_167 = r_166.values[0] ?? { type: "null"};
const r_168 = r_166.values[1] ?? { type: "null"};
let _sym_type259 = r_168;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 192), runtime.opEq(_sym_type259, ({ type: "string", value: "imported" }))))) {
(runtime.info("compiler/emit_js.phi", 193), _define_sym200(_ident255, _sym256));
} else {
const r_169 = _sym256;
const r_170 = r_169.values[0] ?? { type: "null"};
let _sym_id260 = r_170;
(runtime.info("compiler/emit_js.phi", 196), _define_sym200(_ident255, ({ type: "list", values: [_sym_id260, ({ type: "string", value: "imported" }), _sym256] })));
};
};
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 199), runtime.opEq(_id242, ({ type: "string", value: "fn" }))))) {
const r_171 = _s240;
const r_172 = r_171.values[0] ?? { type: "null"};
const r_173 = r_171.values[1] ?? { type: "null"};
const r_174 = r_173.values[0] ?? { type: "null"};
const r_175 = r_173.values[1] ?? { type: "null"};
const r_176 = r_173.values[2] ?? { type: "null"};
let _ident261 = r_176;
const r_177 = r_171.values[2] ?? { type: "null"};
const r_178 = r_177.values[0] ?? { type: "null"};
const r_179 = r_177.values[1] ?? { type: "null"};
const r_180 = r_177.values[2] ?? { type: "null"};
let _params262 = r_180;
const r_181 = r_171.values[3] ?? { type: "null"};
let _body263 = r_181;
const r_182 = (runtime.info("compiler/emit_js.phi", 202), _get_sym201(_ident261));
let _sym264 = r_182;
const r_183 = _sym264;
const r_184 = r_183.values[0] ?? { type: "null"};
let _sym_id265 = r_184;
(runtime.info("compiler/emit_js.phi", 205), _emit193((runtime.info("compiler/emit_js.phi", 205), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "function _%%(" }), _ident261, _sym_id265))));
(runtime.info("compiler/emit_js.phi", 207), _enter_scope198());
const r_185 = ({ type: "bool", value: true });
let _first266 = r_185;
for (const r_186 of _params262.values) {;
const r_187 = r_186.values[0] ?? { type: "null"};
const r_188 = r_186.values[1] ?? { type: "null"};
const r_189 = r_186.values[2] ?? { type: "null"};
let _ident267 = r_189;
if (runtime.truthy(runtime.opNot(_first266))) {
(runtime.info("compiler/emit_js.phi", 212), _emit193(({ type: "string", value: ", " })));
};
(_first266 = ({ type: "bool", value: false }));
const r_190 = (runtime.info("compiler/emit_js.phi", 216), _define_param196(_ident267, _line239));
let _sym_id268 = r_190;
(runtime.info("compiler/emit_js.phi", 217), _emit193((runtime.info("compiler/emit_js.phi", 217), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _ident267, _sym_id268))));
};
(runtime.info("compiler/emit_js.phi", 221), _emit193(({ type: "string", value: ") {\n" })));
(runtime.info("compiler/emit_js.phi", 222), _emit193((runtime.info("compiler/emit_js.phi", 222), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.pushCall(\"%\", \"%\");\n" }), _ident261, _filename205))));
(runtime.info("compiler/emit_js.phi", 224), _emit_expr186(_body263));
(runtime.info("compiler/emit_js.phi", 225), _emit193(({ type: "string", value: ";\nruntime.popCall();\nreturn { type: \"null\" };\n}" })));
(runtime.info("compiler/emit_js.phi", 227), _leave_scope199());
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 228), runtime.opEq(_id242, ({ type: "string", value: "let" }))))) {
const r_191 = _s240;
const r_192 = r_191.values[0] ?? { type: "null"};
const r_193 = r_191.values[1] ?? { type: "null"};
let _pat269 = r_193;
const r_194 = r_191.values[2] ?? { type: "null"};
let _expr270 = r_194;
const r_195 = (runtime.info("compiler/emit_js.phi", 230), _let_node_reg_count209());
let _reg271 = r_195;
(runtime.info("compiler/emit_js.phi", 231), _let_node_reg_increment210());
(runtime.info("compiler/emit_js.phi", 232), _emit193((runtime.info("compiler/emit_js.phi", 232), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "const r_% = " }), _reg271))));
(runtime.info("compiler/emit_js.phi", 233), _emit_expr186(_expr270));
(runtime.info("compiler/emit_js.phi", 234), _emit_let_node189(_pat269, _reg271));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 235), runtime.opEq(_id242, ({ type: "string", value: "do" }))))) {
(runtime.info("compiler/emit_js.phi", 236), _enter_scope198());
(runtime.info("compiler/emit_js.phi", 237), _discover_syms185((runtime.info("compiler/emit_js.phi", 237), _slice29(_s240, ({ type: "int", value: 1 })))));
(runtime.info("compiler/emit_js.phi", 238), _emit_exprs184((runtime.info("compiler/emit_js.phi", 238), _slice29(_s240, ({ type: "int", value: 1 })))));
(runtime.info("compiler/emit_js.phi", 239), _leave_scope199());
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 240), runtime.opEq(_id242, ({ type: "string", value: "for" }))))) {
const r_196 = _s240;
const r_197 = r_196.values[0] ?? { type: "null"};
const r_198 = r_196.values[1] ?? { type: "null"};
let _pat272 = r_198;
const r_199 = r_196.values[2] ?? { type: "null"};
let _expr273 = r_199;
const r_200 = r_196.values[3] ?? { type: "null"};
let _body274 = r_200;
const r_201 = (runtime.info("compiler/emit_js.phi", 243), _let_node_reg_count209());
let _reg275 = r_201;
(runtime.info("compiler/emit_js.phi", 244), _let_node_reg_increment210());
(runtime.info("compiler/emit_js.phi", 245), _emit193((runtime.info("compiler/emit_js.phi", 245), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "for (const r_% of " }), _reg275))));
(runtime.info("compiler/emit_js.phi", 246), _emit_expr186(_expr273));
(runtime.info("compiler/emit_js.phi", 247), _emit193(({ type: "string", value: ".values) {" })));
(runtime.info("compiler/emit_js.phi", 249), _enter_scope198());
(runtime.info("compiler/emit_js.phi", 250), _emit_let_node189(_pat272, _reg275));
(runtime.info("compiler/emit_js.phi", 251), _enter_scope198());
(runtime.info("compiler/emit_js.phi", 253), _emit193(({ type: "string", value: ";\n" })));
(runtime.info("compiler/emit_js.phi", 254), _emit_expr186(_body274));
(runtime.info("compiler/emit_js.phi", 255), _emit193(({ type: "string", value: "}" })));
(runtime.info("compiler/emit_js.phi", 257), _leave_scope199());
(runtime.info("compiler/emit_js.phi", 258), _leave_scope199());
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 259), runtime.opEq(_id242, ({ type: "string", value: "loop" }))))) {
const r_202 = _s240;
const r_203 = r_202.values[0] ?? { type: "null"};
const r_204 = r_202.values[1] ?? { type: "null"};
let _body276 = r_204;
(runtime.info("compiler/emit_js.phi", 261), _emit193(({ type: "string", value: "while (true) {\n" })));
(runtime.info("compiler/emit_js.phi", 262), _emit_expr186(_body276));
(runtime.info("compiler/emit_js.phi", 263), _emit193(({ type: "string", value: "}" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 264), runtime.opEq(_id242, ({ type: "string", value: "if" }))))) {
const r_205 = _s240;
const r_206 = r_205.values[0] ?? { type: "null"};
const r_207 = r_205.values[1] ?? { type: "null"};
let _cond277 = r_207;
const r_208 = r_205.values[2] ?? { type: "null"};
let _truthy278 = r_208;
const r_209 = r_205.values[3] ?? { type: "null"};
let _falsy279 = r_209;
(runtime.info("compiler/emit_js.phi", 266), _emit193(({ type: "string", value: "if (runtime.truthy(" })));
(runtime.info("compiler/emit_js.phi", 267), _emit_expr186(_cond277));
(runtime.info("compiler/emit_js.phi", 268), _emit193(({ type: "string", value: ")) {\n" })));
(runtime.info("compiler/emit_js.phi", 269), _emit_expr186(_truthy278));
(runtime.info("compiler/emit_js.phi", 270), _emit193(({ type: "string", value: "}" })));
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 271), runtime.opNe(_falsy279, ({ type: "null" }))))) {
(runtime.info("compiler/emit_js.phi", 272), _emit193(({ type: "string", value: " else {\n" })));
(runtime.info("compiler/emit_js.phi", 273), _emit_expr186(_falsy279));
(runtime.info("compiler/emit_js.phi", 274), _emit193(({ type: "string", value: "}" })));
};
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 276), runtime.opEq(_id242, ({ type: "string", value: "return" }))))) {
const r_210 = _s240;
const r_211 = r_210.values[0] ?? { type: "null"};
const r_212 = r_210.values[1] ?? { type: "null"};
let _value280 = r_212;
(runtime.info("compiler/emit_js.phi", 278), _emit193(({ type: "string", value: "runtime.popCall();\n" })));
(runtime.info("compiler/emit_js.phi", 279), _emit193(({ type: "string", value: "return " })));
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 280), runtime.opNe(_value280, ({ type: "null" }))))) {
(runtime.info("compiler/emit_js.phi", 281), _emit_expr186(_value280));
} else {
(runtime.info("compiler/emit_js.phi", 283), _emit193(({ type: "string", value: "{ type: \"null\" }" })));
};
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 285), runtime.opEq(_id242, ({ type: "string", value: "break" }))))) {
const r_213 = _s240;
const r_214 = r_213.values[0] ?? { type: "null"};
const r_215 = r_213.values[1] ?? { type: "null"};
let _value281 = r_215;
(runtime.info("compiler/emit_js.phi", 287), _emit193(({ type: "string", value: "break" })));
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 288), runtime.opNe(_value281, ({ type: "null" }))))) {
(runtime.info("compiler/emit_js.phi", 289), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" })));
};
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 291), runtime.opEq(_id242, ({ type: "string", value: "call" }))))) {
const r_216 = _s240;
const r_217 = r_216.values[0] ?? { type: "null"};
const r_218 = r_216.values[1] ?? { type: "null"};
let _callee282 = r_218;
const r_219 = (runtime.info("compiler/emit_js.phi", 293), _slice29(_s240, ({ type: "int", value: 2 })));
let _args283 = r_219;
(runtime.info("compiler/emit_js.phi", 294), _emit193((runtime.info("compiler/emit_js.phi", 294), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(%, " }), (runtime.info("compiler/emit_js.phi", 294), _rt_info191(_line239))))));
(runtime.info("compiler/emit_js.phi", 295), _emit_expr186(_callee282));
(runtime.info("compiler/emit_js.phi", 296), _emit193(({ type: "string", value: "(" })));
const r_220 = ({ type: "bool", value: true });
let _first284 = r_220;
for (const r_221 of _args283.values) {;
let _arg285 = r_221;
if (runtime.truthy(runtime.opNot(_first284))) {
(runtime.info("compiler/emit_js.phi", 301), _emit193(({ type: "string", value: ", " })));
};
(_first284 = ({ type: "bool", value: false }));
(runtime.info("compiler/emit_js.phi", 305), _emit_expr186(_arg285));
};
(runtime.info("compiler/emit_js.phi", 308), _emit193(({ type: "string", value: "))" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 309), runtime.opEq(_id242, ({ type: "string", value: "list" }))))) {
(runtime.info("compiler/emit_js.phi", 310), _emit_list_literal188((runtime.info("compiler/emit_js.phi", 310), _slice29(_s240, ({ type: "int", value: 1 })))));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 311), runtime.opEq(_id242, ({ type: "string", value: "=" }))))) {
(runtime.info("compiler/emit_js.phi", 312), _emit_assign_expr192(_s240, _line239, ({ type: "string", value: "=" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 313), runtime.opEq(_id242, ({ type: "string", value: "+=" }))))) {
(runtime.info("compiler/emit_js.phi", 314), _emit_assign_expr192(_s240, _line239, ({ type: "string", value: "+" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 315), runtime.opEq(_id242, ({ type: "string", value: "-=" }))))) {
(runtime.info("compiler/emit_js.phi", 316), _emit_assign_expr192(_s240, _line239, ({ type: "string", value: "-" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 317), runtime.opEq(_id242, ({ type: "string", value: "or" }))))) {
const r_222 = _s240;
const r_223 = r_222.values[0] ?? { type: "null"};
const r_224 = r_222.values[1] ?? { type: "null"};
let _left286 = r_224;
const r_225 = r_222.values[2] ?? { type: "null"};
let _right287 = r_225;
(runtime.info("compiler/emit_js.phi", 319), _emit193((runtime.info("compiler/emit_js.phi", 319), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(%" }), (runtime.info("compiler/emit_js.phi", 319), _rt_info191(_line239)), _line239))));
(runtime.info("compiler/emit_js.phi", 320), _emit193(({ type: "string", value: ", { type: \"bool\", value: runtime.truthy(" })));
(runtime.info("compiler/emit_js.phi", 321), _emit_expr186(_left286));
(runtime.info("compiler/emit_js.phi", 322), _emit193(({ type: "string", value: ") || runtime.truthy(" })));
(runtime.info("compiler/emit_js.phi", 323), _emit_expr186(_right287));
(runtime.info("compiler/emit_js.phi", 324), _emit193(({ type: "string", value: ") })" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 325), runtime.opEq(_id242, ({ type: "string", value: "and" }))))) {
const r_226 = _s240;
const r_227 = r_226.values[0] ?? { type: "null"};
const r_228 = r_226.values[1] ?? { type: "null"};
let _left288 = r_228;
const r_229 = r_226.values[2] ?? { type: "null"};
let _right289 = r_229;
(runtime.info("compiler/emit_js.phi", 327), _emit193((runtime.info("compiler/emit_js.phi", 327), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(%" }), (runtime.info("compiler/emit_js.phi", 327), _rt_info191(_line239)), _line239))));
(runtime.info("compiler/emit_js.phi", 328), _emit193(({ type: "string", value: ", { type: \"bool\", value: runtime.truthy(" })));
(runtime.info("compiler/emit_js.phi", 329), _emit_expr186(_left288));
(runtime.info("compiler/emit_js.phi", 330), _emit193(({ type: "string", value: ") && runtime.truthy(" })));
(runtime.info("compiler/emit_js.phi", 331), _emit_expr186(_right289));
(runtime.info("compiler/emit_js.phi", 332), _emit193(({ type: "string", value: ") })" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 333), runtime.opEq(_id242, ({ type: "string", value: "==" }))))) {
(runtime.info("compiler/emit_js.phi", 334), _emit_binary_op190(_s240, ({ type: "string", value: "opEq" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 335), runtime.opEq(_id242, ({ type: "string", value: "!=" }))))) {
(runtime.info("compiler/emit_js.phi", 336), _emit_binary_op190(_s240, ({ type: "string", value: "opNe" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 337), runtime.opEq(_id242, ({ type: "string", value: "<" }))))) {
(runtime.info("compiler/emit_js.phi", 338), _emit_binary_op190(_s240, ({ type: "string", value: "opLt" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 339), runtime.opEq(_id242, ({ type: "string", value: ">" }))))) {
(runtime.info("compiler/emit_js.phi", 340), _emit_binary_op190(_s240, ({ type: "string", value: "opGt" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 341), runtime.opEq(_id242, ({ type: "string", value: "<=" }))))) {
(runtime.info("compiler/emit_js.phi", 342), _emit_binary_op190(_s240, ({ type: "string", value: "opLte" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 343), runtime.opEq(_id242, ({ type: "string", value: ">=" }))))) {
(runtime.info("compiler/emit_js.phi", 344), _emit_binary_op190(_s240, ({ type: "string", value: "opGte" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 345), runtime.opEq(_id242, ({ type: "string", value: "+" }))))) {
(runtime.info("compiler/emit_js.phi", 346), _emit_binary_op190(_s240, ({ type: "string", value: "opAdd" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 347), runtime.opEq(_id242, ({ type: "string", value: "-" }))))) {
(runtime.info("compiler/emit_js.phi", 348), _emit_binary_op190(_s240, ({ type: "string", value: "opSub" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 349), runtime.opEq(_id242, ({ type: "string", value: "not" }))))) {
const r_230 = _s240;
const r_231 = r_230.values[0] ?? { type: "null"};
const r_232 = r_230.values[1] ?? { type: "null"};
let _expr290 = r_232;
(runtime.info("compiler/emit_js.phi", 351), _emit193(({ type: "string", value: "runtime.opNot(" })));
(runtime.info("compiler/emit_js.phi", 352), _emit_expr186(_expr290));
(runtime.info("compiler/emit_js.phi", 353), _emit193(({ type: "string", value: ")" })));
} else {
const r_233 = _s240;
const r_234 = r_233.values[0] ?? { type: "null"};
let _callee291 = r_234;
const r_235 = (runtime.info("compiler/emit_js.phi", 356), _slice29(_s240, ({ type: "int", value: 1 })));
let _args292 = r_235;
(runtime.info("compiler/emit_js.phi", 357), _emit193((runtime.info("compiler/emit_js.phi", 357), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(%, " }), (runtime.info("compiler/emit_js.phi", 357), _rt_info191(_line239)), _line239))));
(runtime.info("compiler/emit_js.phi", 358), _emit_expr186(_callee291));
(runtime.info("compiler/emit_js.phi", 359), _emit193(({ type: "string", value: "(" })));
const r_236 = ({ type: "bool", value: true });
let _first293 = r_236;
for (const r_237 of _args292.values) {;
let _arg294 = r_237;
if (runtime.truthy(runtime.opNot(_first293))) {
(runtime.info("compiler/emit_js.phi", 364), _emit193(({ type: "string", value: ", " })));
};
(_first293 = ({ type: "bool", value: false }));
(runtime.info("compiler/emit_js.phi", 368), _emit_expr186(_arg294));
};
(runtime.info("compiler/emit_js.phi", 371), _emit193(({ type: "string", value: "))" })));
}}}}}}}}}}}}}}}}}}}}}}}}};
;
runtime.popCall();
return { type: "null" };
};
function _emit_list_literal188(_s295) {
runtime.pushCall("emit_list_literal", "compiler/emit_js.phi");
(runtime.info("compiler/emit_js.phi", 376), _emit193(({ type: "string", value: "({ type: \"list\", values: [" })));
const r_238 = ({ type: "bool", value: true });
let _first296 = r_238;
for (const r_239 of _s295.values) {;
let _e297 = r_239;
if (runtime.truthy(runtime.opNot(_first296))) {
(runtime.info("compiler/emit_js.phi", 380), _emit193(({ type: "string", value: ", " })));
};
(_first296 = ({ type: "bool", value: false }));
(runtime.info("compiler/emit_js.phi", 384), _emit_expr186(_e297));
};
(runtime.info("compiler/emit_js.phi", 386), _emit193(({ type: "string", value: "] })" })));
;
runtime.popCall();
return { type: "null" };
};
function _emit_let_node189(_pat298, _base_reg299) {
runtime.pushCall("emit_let_node", "compiler/emit_js.phi");
const r_240 = _pat298;
const r_241 = r_240.values[0] ?? { type: "null"};
let _pat_ty300 = r_241;
const r_242 = r_240.values[1] ?? { type: "null"};
let _line301 = r_242;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 391), runtime.opEq(_pat_ty300, ({ type: "string", value: "ident" }))))) {
const r_243 = _pat298;
const r_244 = r_243.values[0] ?? { type: "null"};
const r_245 = r_243.values[1] ?? { type: "null"};
const r_246 = r_243.values[2] ?? { type: "null"};
let _ident302 = r_246;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 394), runtime.opEq(_ident302, ({ type: "string", value: "_" }))))) {
runtime.popCall();
return { type: "null" }};
const r_247 = (runtime.info("compiler/emit_js.phi", 396), _define_let197(_ident302, _line301));
let _sym_id303 = r_247;
(runtime.info("compiler/emit_js.phi", 397), _emit193((runtime.info("compiler/emit_js.phi", 397), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nlet _%% = r_%" }), _ident302, _sym_id303, _base_reg299))));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 398), runtime.opEq(_pat_ty300, ({ type: "string", value: "list" }))))) {
const r_248 = _pat298;
const r_249 = r_248.values[0] ?? { type: "null"};
const r_250 = r_248.values[1] ?? { type: "null"};
const r_251 = r_248.values[2] ?? { type: "null"};
let _pats304 = r_251;
const r_252 = ({ type: "int", value: 0 });
let _i305 = r_252;
for (const r_253 of _pats304.values) {;
let _pat306 = r_253;
const r_254 = (runtime.info("compiler/emit_js.phi", 403), _let_node_reg_count209());
let _reg307 = r_254;
(runtime.info("compiler/emit_js.phi", 404), _let_node_reg_increment210());
(runtime.info("compiler/emit_js.phi", 405), _emit193((runtime.info("compiler/emit_js.phi", 405), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nconst r_% = r_%.values[%] ?? { type: \"null\"}" }), _reg307, _base_reg299, _i305))));
(runtime.info("compiler/emit_js.phi", 409), _emit_let_node189(_pat306, _reg307));
(_i305 = runtime.opAdd(_i305, ({ type: "int", value: 1 })));
};
} else {
(runtime.info("compiler/emit_js.phi", 413), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "malformed pattern on line %" }), _line301));
}};
;
runtime.popCall();
return { type: "null" };
};
function _emit_binary_op190(_s308, _id309) {
runtime.pushCall("emit_binary_op", "compiler/emit_js.phi");
const r_255 = _s308;
const r_256 = r_255.values[0] ?? { type: "null"};
const r_257 = r_256.values[0] ?? { type: "null"};
const r_258 = r_256.values[1] ?? { type: "null"};
let _line310 = r_258;
const r_259 = r_256.values[2] ?? { type: "null"};
const r_260 = r_255.values[1] ?? { type: "null"};
let _left311 = r_260;
const r_261 = r_255.values[2] ?? { type: "null"};
let _right312 = r_261;
(runtime.info("compiler/emit_js.phi", 419), _emit193((runtime.info("compiler/emit_js.phi", 419), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(%, runtime.%(" }), (runtime.info("compiler/emit_js.phi", 419), _rt_info191(_line310)), _id309))));
(runtime.info("compiler/emit_js.phi", 420), _emit_expr186(_left311));
(runtime.info("compiler/emit_js.phi", 421), _emit193(({ type: "string", value: ", " })));
(runtime.info("compiler/emit_js.phi", 422), _emit_expr186(_right312));
(runtime.info("compiler/emit_js.phi", 423), _emit193(({ type: "string", value: "))" })));
;
runtime.popCall();
return { type: "null" };
};
function _rt_info191(_line313) {
runtime.pushCall("rt_info", "compiler/emit_js.phi");
runtime.popCall();
return (runtime.info("compiler/emit_js.phi", 427), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.info(\"%\", %)" }), _filename205, _line313));
;
runtime.popCall();
return { type: "null" };
};
function _emit_assign_expr192(_s314, _line315, _id316) {
runtime.pushCall("emit_assign_expr", "compiler/emit_js.phi");
const r_262 = _s314;
const r_263 = r_262.values[0] ?? { type: "null"};
const r_264 = r_262.values[1] ?? { type: "null"};
const r_265 = r_264.values[0] ?? { type: "null"};
let _target_type317 = r_265;
const r_266 = r_262.values[2] ?? { type: "null"};
let _expr318 = r_266;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 432), runtime.opNe(_target_type317, ({ type: "string", value: "ident" }))))) {
(runtime.info("compiler/emit_js.phi", 433), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to expression on line %" }), _line315));
};
const r_267 = _s314;
const r_268 = r_267.values[0] ?? { type: "null"};
const r_269 = r_267.values[1] ?? { type: "null"};
const r_270 = r_269.values[0] ?? { type: "null"};
const r_271 = r_269.values[1] ?? { type: "null"};
const r_272 = r_269.values[2] ?? { type: "null"};
let _ident319 = r_272;
const r_273 = (runtime.info("compiler/emit_js.phi", 436), _get_sym201(_ident319));
let _sym320 = r_273;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 437), runtime.opEq(_sym320, ({ type: "null" }))))) {
(runtime.info("compiler/emit_js.phi", 438), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "could not find symbol '%' on line %" }), _ident319, _line315));
};
const r_274 = _sym320;
const r_275 = r_274.values[0] ?? { type: "null"};
let _sym_id321 = r_275;
const r_276 = r_274.values[1] ?? { type: "null"};
let _sym_type322 = r_276;
const r_277 = r_274.values[2] ?? { type: "null"};
let _sym_ident323 = r_277;
const r_278 = r_274.values[3] ?? { type: "null"};
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 441), runtime.opEq(_sym_type322, ({ type: "string", value: "let" }))))) {
(runtime.info("compiler/emit_js.phi", 442), _emit193((runtime.info("compiler/emit_js.phi", 442), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(_%% = " }), _sym_ident323, _sym_id321))));
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 443), runtime.opEq(_id316, ({ type: "string", value: "=" }))))) {
(runtime.info("compiler/emit_js.phi", 444), _emit_expr186(_expr318));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 445), runtime.opEq(_id316, ({ type: "string", value: "+" }))))) {
(runtime.info("compiler/emit_js.phi", 446), _emit193((runtime.info("compiler/emit_js.phi", 446), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opAdd(_%%, " }), _sym_ident323, _sym_id321))));
(runtime.info("compiler/emit_js.phi", 447), _emit_expr186(_expr318));
(runtime.info("compiler/emit_js.phi", 448), _emit193(({ type: "string", value: ")" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 449), runtime.opEq(_id316, ({ type: "string", value: "-" }))))) {
(runtime.info("compiler/emit_js.phi", 450), _emit193((runtime.info("compiler/emit_js.phi", 450), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opSub(_%%, " }), _sym_ident323, _sym_id321))));
(runtime.info("compiler/emit_js.phi", 451), _emit_expr186(_expr318));
(runtime.info("compiler/emit_js.phi", 452), _emit193(({ type: "string", value: ")" })));
} else {
(runtime.info("compiler/emit_js.phi", 454), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" })));
}}};
(runtime.info("compiler/emit_js.phi", 456), _emit193(({ type: "string", value: ")" })));
} else {
(runtime.info("compiler/emit_js.phi", 458), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to symbol '%' on line %" }), _sym_ident323, _line315));
};
;
runtime.popCall();
return { type: "null" };
};
function _emit193(_str324) {
runtime.pushCall("emit", "compiler/emit_js.phi");
(runtime.info("compiler/emit_js.phi", 463), ((...args) => runtime.builtinPush(...args))(_output204, _str324));
;
runtime.popCall();
return { type: "null" };
};
function _define_builtin194(_ident325, _builtin_id326) {
runtime.pushCall("define_builtin", "compiler/emit_js.phi");
const r_279 = (runtime.info("compiler/emit_js.phi", 467), _sym_id_count207());
let _sym_id327 = r_279;
(runtime.info("compiler/emit_js.phi", 468), _sym_id_increment208());
(runtime.info("compiler/emit_js.phi", 470), _define_sym200(_ident325, ({ type: "list", values: [_sym_id327, ({ type: "string", value: "builtin" }), _builtin_id326] })));
runtime.popCall();
return _sym_id327;
;
runtime.popCall();
return { type: "null" };
};
function _define_fn195(_ident328, _line329) {
runtime.pushCall("define_fn", "compiler/emit_js.phi");
const r_280 = (runtime.info("compiler/emit_js.phi", 475), _sym_id_count207());
let _sym_id330 = r_280;
(runtime.info("compiler/emit_js.phi", 476), _sym_id_increment208());
(runtime.info("compiler/emit_js.phi", 478), _define_sym200(_ident328, ({ type: "list", values: [_sym_id330, ({ type: "string", value: "fn" }), _ident328, _line329] })));
runtime.popCall();
return _sym_id330;
;
runtime.popCall();
return { type: "null" };
};
function _define_param196(_ident331, _line332) {
runtime.pushCall("define_param", "compiler/emit_js.phi");
const r_281 = (runtime.info("compiler/emit_js.phi", 483), _sym_id_count207());
let _sym_id333 = r_281;
(runtime.info("compiler/emit_js.phi", 484), _sym_id_increment208());
(runtime.info("compiler/emit_js.phi", 486), _define_sym200(_ident331, ({ type: "list", values: [_sym_id333, ({ type: "string", value: "param" }), _ident331, _line332] })));
runtime.popCall();
return _sym_id333;
;
runtime.popCall();
return { type: "null" };
};
function _define_let197(_ident334, _line335) {
runtime.pushCall("define_let", "compiler/emit_js.phi");
const r_282 = (runtime.info("compiler/emit_js.phi", 491), _sym_id_count207());
let _sym_id336 = r_282;
(runtime.info("compiler/emit_js.phi", 492), _sym_id_increment208());
(runtime.info("compiler/emit_js.phi", 494), _define_sym200(_ident334, ({ type: "list", values: [_sym_id336, ({ type: "string", value: "let" }), _ident334, _line335] })));
runtime.popCall();
return _sym_id336;
;
runtime.popCall();
return { type: "null" };
};
function _enter_scope198() {
runtime.pushCall("enter_scope", "compiler/emit_js.phi");
const r_283 = _syms206;
const r_284 = r_283.values[0] ?? { type: "null"};
let _enter_scope337 = r_284;
(runtime.info("compiler/emit_js.phi", 501), _enter_scope337());
;
runtime.popCall();
return { type: "null" };
};
function _leave_scope199() {
runtime.pushCall("leave_scope", "compiler/emit_js.phi");
const r_285 = _syms206;
const r_286 = r_285.values[0] ?? { type: "null"};
const r_287 = r_285.values[1] ?? { type: "null"};
let _leave_scope338 = r_287;
(runtime.info("compiler/emit_js.phi", 505), _leave_scope338());
;
runtime.popCall();
return { type: "null" };
};
function _define_sym200(_ident339, _sym340) {
runtime.pushCall("define_sym", "compiler/emit_js.phi");
const r_288 = _syms206;
const r_289 = r_288.values[0] ?? { type: "null"};
const r_290 = r_288.values[1] ?? { type: "null"};
const r_291 = r_288.values[2] ?? { type: "null"};
let _define_sym341 = r_291;
runtime.popCall();
return (runtime.info("compiler/emit_js.phi", 509), _define_sym341(_ident339, _sym340));
;
runtime.popCall();
return { type: "null" };
};
function _get_sym201(_ident342) {
runtime.pushCall("get_sym", "compiler/emit_js.phi");
const r_292 = _syms206;
const r_293 = r_292.values[0] ?? { type: "null"};
const r_294 = r_292.values[1] ?? { type: "null"};
const r_295 = r_292.values[2] ?? { type: "null"};
const r_296 = r_292.values[3] ?? { type: "null"};
let _get_sym343 = r_296;
runtime.popCall();
return (runtime.info("compiler/emit_js.phi", 513), _get_sym343(_ident342));
;
runtime.popCall();
return { type: "null" };
};
function _get_current_map202() {
runtime.pushCall("get_current_map", "compiler/emit_js.phi");
const r_297 = _syms206;
const r_298 = r_297.values[0] ?? { type: "null"};
const r_299 = r_297.values[1] ?? { type: "null"};
const r_300 = r_297.values[2] ?? { type: "null"};
const r_301 = r_297.values[3] ?? { type: "null"};
const r_302 = r_297.values[4] ?? { type: "null"};
let _get_current_map344 = r_302;
runtime.popCall();
return (runtime.info("compiler/emit_js.phi", 517), _get_current_map344());
;
runtime.popCall();
return { type: "null" };
};
function _print_syms203() {
runtime.pushCall("print_syms", "compiler/emit_js.phi");
const r_303 = _syms206;
const r_304 = r_303.values[0] ?? { type: "null"};
const r_305 = r_303.values[1] ?? { type: "null"};
const r_306 = r_303.values[2] ?? { type: "null"};
const r_307 = r_303.values[3] ?? { type: "null"};
const r_308 = r_303.values[4] ?? { type: "null"};
const r_309 = r_303.values[5] ?? { type: "null"};
let _print_syms345 = r_309;
(runtime.info("compiler/emit_js.phi", 521), _print_syms345());
;
runtime.popCall();
return { type: "null" };
};
runtime.popCall();
return ({ type: "list", values: [_generate183] });
;
runtime.popCall();
return { type: "null" };
};
function _Counter139() {
runtime.pushCall("Counter", "compiler/emit_js.phi");
const r_310 = ({ type: "int", value: 0 });
let _counter348 = r_310;
function _count346() {
runtime.pushCall("count", "compiler/emit_js.phi");
runtime.popCall();
return _counter348;
;
runtime.popCall();
return { type: "null" };
};
function _increment347() {
runtime.pushCall("increment", "compiler/emit_js.phi");
(_counter348 = runtime.opAdd(_counter348, ({ type: "int", value: 1 })));
;
runtime.popCall();
return { type: "null" };
};
runtime.popCall();
return ({ type: "list", values: [_count346, _increment347] });
;
runtime.popCall();
return { type: "null" };
};
function _string_escape140(_str349) {
runtime.pushCall("string_escape", "compiler/emit_js.phi");
const r_311 = (runtime.info("compiler/emit_js.phi", 542), ((...args) => runtime.builtinLen(...args))(_str349));
let _str_len350 = r_311;
const r_312 = ({ type: "int", value: 0 });
let _i351 = r_312;
const r_313 = ({ type: "string", value: "" });
let _result352 = r_313;
while (true) {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 546), runtime.opGte(_i351, _str_len350)))) {
break};
const r_314 = (runtime.info("compiler/emit_js.phi", 547), ((...args) => runtime.builtinAt(...args))(_str349, _i351));
let _ch353 = r_314;
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 548), runtime.opEq(_ch353, ({ type: "string", value: "\\" }))))) {
(_result352 = runtime.opAdd(_result352, ({ type: "string", value: "\\\\" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 550), runtime.opEq(_ch353, ({ type: "string", value: "\"" }))))) {
(_result352 = runtime.opAdd(_result352, ({ type: "string", value: "\\\"" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 552), runtime.opEq(_ch353, ({ type: "string", value: "\t" }))))) {
(_result352 = runtime.opAdd(_result352, ({ type: "string", value: "\\t" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 554), runtime.opEq(_ch353, ({ type: "string", value: "\r" }))))) {
(_result352 = runtime.opAdd(_result352, ({ type: "string", value: "\\r" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 556), runtime.opEq(_ch353, ({ type: "string", value: "\n" }))))) {
(_result352 = runtime.opAdd(_result352, ({ type: "string", value: "\\n" })));
} else {
if (runtime.truthy((runtime.info("compiler/emit_js.phi", 558), runtime.opEq(_ch353, ({ type: "string", value: "\n" }))))) {
(_result352 = runtime.opAdd(_result352, ({ type: "string", value: "\\0" })));
} else {
(_result352 = runtime.opAdd(_result352, _ch353));
}}}}}};
(_i351 = runtime.opAdd(_i351, ({ type: "int", value: 1 })));
};
runtime.popCall();
return _result352;
;
runtime.popCall();
return { type: "null" };
};
runtime.setFile("compile.phi");
;
function _print_expr14(_expr354, _depth355) {
runtime.pushCall("print_expr", "compile.phi");
const r_315 = _expr354;
const r_316 = r_315.values[0] ?? { type: "null"};
let _ty356 = r_316;
const r_317 = r_315.values[1] ?? { type: "null"};
let _line357 = r_317;
const r_318 = r_315.values[2] ?? { type: "null"};
let _value358 = r_318;
if (runtime.truthy((runtime.info("compile.phi", 7), runtime.opEq(_ty356, ({ type: "string", value: "list" }))))) {
(runtime.info("compile.phi", 8), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%(% %" }), (runtime.info("compile.phi", 8), _indent32(_depth355)), _ty356, _line357));
for (const r_319 of _value358.values) {;
let _e359 = r_319;
(runtime.info("compile.phi", 10), _print_expr14(_e359, (runtime.info("compile.phi", 10), runtime.opAdd(_depth355, ({ type: "int", value: 1 })))));
};
(runtime.info("compile.phi", 12), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%)" }), (runtime.info("compile.phi", 12), _indent32(_depth355))));
} else {
(runtime.info("compile.phi", 14), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%%" }), (runtime.info("compile.phi", 14), _indent32(_depth355)), _expr354));
};
;
runtime.popCall();
return { type: "null" };
};
const r_320 = (runtime.info("compile.phi", 18), ((...args) => runtime.builtinGetArgs(...args))());
const r_321 = r_320.values[0] ?? { type: "null"};
let _input_filename360 = r_321;
const r_322 = r_320.values[1] ?? { type: "null"};
let _output_filename361 = r_322;
(runtime.info("compile.phi", 20), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "compiling '%'..." }), _input_filename360));
const r_323 = (runtime.info("compile.phi", 21), ((...args) => runtime.builtinReadTextFile(...args))(_input_filename360));
let _text362 = r_323;
const r_324 = (runtime.info("compile.phi", 23), _tokenize95(_text362));
let _tokens363 = r_324;
const r_325 = (runtime.info("compile.phi", 24), _Parser94(_tokens363));
let _parser364 = r_325;
const r_326 = _parser364;
const r_327 = r_326.values[0] ?? { type: "null"};
let _parse365 = r_327;
const r_328 = (runtime.info("compile.phi", 26), _parse365());
let _ast366 = r_328;
const r_329 = (runtime.info("compile.phi", 27), _JsEmitter138(_ast366, _input_filename360));
let _emitter367 = r_329;
const r_330 = _emitter367;
const r_331 = r_330.values[0] ?? { type: "null"};
let _emit368 = r_331;
const r_332 = (runtime.info("compile.phi", 29), _emit368());
let _js_code369 = r_332;
(runtime.info("compile.phi", 34), ((...args) => runtime.builtinWriteTextFile(...args))(_output_filename361, _js_code369));
(runtime.info("compile.phi", 35), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "writing '%'" }), _output_filename361));