-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinterpreter.js
More file actions
1 lines (1 loc) · 19.4 KB
/
Copy pathinterpreter.js
File metadata and controls
1 lines (1 loc) · 19.4 KB
1
"use strict";var W=Object.create;var H=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var ee=Object.getPrototypeOf,te=Object.prototype.hasOwnProperty;var ae=(e,t,a,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Y(t))!te.call(e,s)&&s!==a&&H(e,s,{get:()=>t[s],enumerable:!(r=X(t,s))||r.enumerable});return e};var re=(e,t,a)=>(a=e!=null?W(ee(e)):{},ae(t||!e||!e.__esModule?H(a,"default",{value:e,enumerable:!0}):a,e));var A=class extends Error{},I={code_unit_at:(e,t)=>e.charCodeAt(t),repeat:(e,t)=>t.repeat(e)},B={truncate:(e,t)=>e.length=t,flatten:e=>e.flat(),drain:(e,t,a)=>e.splice(t,a-t),join:(e,t)=>e.join(t),map:(e,t)=>e.map(t),mapi:(e,t)=>e.map((a,r)=>t(r,a)),copy_nonoverlapping:(e,t,a,r,s)=>{for(let l=t,n=r;n<r+s;l++,n++)a[n]=e[l]}};var m={left:1,right:2},k={left:3,right:4},_={left:5,right:6},u={single:7,double:8,back:9},b={identifier:10,space:11};var J={atom:b,quote:u,square_bracket:_,curly_bracket:k,parenthesis:m,debug:e=>{switch(e){case m.left:return"parenthesis.left";case m.right:return"parenthesis.right";case k.left:return"curly_bracket.left";case k.right:return"curly_bracket.right";case _.left:return"square_bracket.left";case _.right:return"square_bracket.right";case u.single:return"quote.single";case u.double:return"quote.double";case u.back:return"quote.back";case b.identifier:return"atom.identifier";case b.space:return"atom.space";default:throw new A}}},w={debug:e=>`{ kind: ${J.debug(e.kind)}, line: ${e.line}, character: ${e.character}, length: ${e.length}, start: ${e.start}, end: ${e.end} }`,to_start_position:e=>({line:e.line,character:e.character}),to_end_position:e=>({line:e.line,character:e.character+e.length}),to_span:(e,t)=>t.slice(e.start,e.end),to_range:e=>{let t=w.to_start_position(e),a=w.to_end_position(e);return{start:t,end:a}},kind:J},x={parenthesis:{left:40,right:41},square_bracket:{left:91,right:93},curly_bracket:{left:123,right:125},quote:{single:39,double:34,back:96}},z={tabulation:{horizontal:9,vertical:11},line_feed:10},L={space:32};var K={make:e=>({text:e,line:0,character:0,start:0}),next:e=>{let t=e.character,a=e.line,r=e.start,s=t,l=a,n=r,i=0;if(n<e.text.length){let p=I.code_unit_at(e.text,n),g;switch(p){case x.parenthesis.left:n++,s++,i++,g=m.left;break;case x.parenthesis.right:n++,s++,i++,g=m.right;break;case x.square_bracket.left:n++,s++,i++,g=_.left;break;case x.square_bracket.right:n++,s++,i++,g=_.right;break;case x.curly_bracket.left:n++,s++,i++,g=k.left;break;case x.curly_bracket.right:n++,s++,i++,g=k.right;break;case x.quote.single:n++,s++,i++,g=u.single;break;case x.quote.double:n++,s++,i++,g=u.double;break;case x.quote.back:n++,s++,i++,g=u.back;break;case z.line_feed:n++,s=0,i++,l++;e:for(;n<e.text.length;)switch(I.code_unit_at(e.text,n)){case z.line_feed:n++,s=0,i++,l++;continue e;case z.tabulation.horizontal:case z.tabulation.vertical:case L.space:n++,s++,i++;continue e;default:break e}g=b.space;break;case z.tabulation.horizontal:case z.tabulation.vertical:case L.space:n++,s++,i++;e:for(;n<e.text.length;)switch(I.code_unit_at(e.text,n)){case z.line_feed:n++,s=0,i++,l++;continue e;case z.tabulation.horizontal:case z.tabulation.vertical:case L.space:n++,s++,i++;continue e;default:break e}g=b.space;break;default:n++,s++,i++;e:for(;n<e.text.length;)switch(I.code_unit_at(e.text,n)){case x.parenthesis.left:case x.parenthesis.right:case x.square_bracket.left:case x.square_bracket.right:case x.curly_bracket.left:case x.curly_bracket.right:case x.quote.single:case x.quote.double:case x.quote.back:case z.line_feed:case z.tabulation.horizontal:case z.tabulation.vertical:case L.space:break e;default:n++,s++,i++;continue e}g=b.identifier;break}return e.start=n,e.character=s,e.line=l,{kind:g,line:a,character:t,length:i,start:r,end:n}}else return}};var j={atom:1,lone:2,group:3,mismatch:4},N={debug:e=>{switch(e.tag){case j.atom:case j.lone:return w.kind.debug(e.leaf.kind);case j.group:case j.mismatch:return`(${e.children.map(N.debug).join(" ")})`}}},c={group:e=>({tag:j.group,children:e}),mismatch:e=>({tag:j.mismatch,children:e}),atom:e=>({tag:j.atom,leaf:e}),lone:e=>({tag:j.lone,leaf:e}),debug:e=>{switch(e.tag){case j.atom:case j.lone:return w.debug(e.leaf);case j.group:case j.mismatch:return`{ ${e.children.map(c.debug).join(",")} }`}},to_range:e=>{switch(e.tag){case c.tag.group:case c.tag.mismatch:{let t=e.children,a=t[0],r=t[t.length-1],s=w.to_start_position(a.leaf),l=w.to_end_position(r.leaf);return{start:s,end:l}}case c.tag.atom:case c.tag.lone:return w.to_range(e.leaf)}},tag:j,skeleton:N},d={make:e=>({lexer:K.make(e),pending:[],stack:[]}),matching:(e,t,a)=>{switch(t.token.kind){case b.space:case b.identifier:case m.right:case _.right:case k.right:throw new A;case m.left:switch(a.kind){case m.right:{let r=c.group(d.reduce(e,t,a));e.pending.push(r)}break;case k.right:case _.right:{let r=c.mismatch(d.reduce(e,t,a));e.pending.push(r)}break;case b.space:case b.identifier:e.stack.push(t),d.shift(e,a);break;case m.left:case _.left:case k.left:case u.single:case u.double:case u.back:e.stack.push(t),d.nest(e,a);break;default:throw new A}break;case _.left:switch(a.kind){case _.right:{let r=c.group(d.reduce(e,t,a));e.pending.push(r)}break;case m.right:case k.right:{let r=c.mismatch(d.reduce(e,t,a));e.pending.push(r)}break;case b.space:case b.identifier:e.stack.push(t),d.shift(e,a);break;case m.left:case _.left:case k.left:case u.single:case u.double:case u.back:e.stack.push(t),d.nest(e,a);break;default:throw new A}break;case k.left:switch(a.kind){case k.right:{let r=c.group(d.reduce(e,t,a));e.pending.push(r)}break;case m.right:case _.right:{let r=c.mismatch(d.reduce(e,t,a));e.pending.push(r)}break;case b.space:case b.identifier:e.stack.push(t),d.shift(e,a);break;case m.left:case _.left:case k.left:case u.single:case u.double:case u.back:e.stack.push(t),d.nest(e,a);break;default:throw new A}break;case u.back:switch(a.kind){case u.back:{let r=c.group(d.reduce(e,t,a));e.pending.push(r)}break;case u.single:case u.double:{let r=c.mismatch(d.reduce(e,t,a));e.pending.push(r)}break;case m.right:case _.right:case k.right:e.stack.push(t),d.retain(e,a);break;case m.left:case _.left:case k.left:e.stack.push(t),d.nest(e,a);break;case b.space:case b.identifier:e.stack.push(t),d.shift(e,a);break;default:throw new A}break;case u.single:switch(a.kind){case u.single:{let r=c.group(d.reduce(e,t,a));e.pending.push(r)}break;case u.back:case u.double:{let r=c.mismatch(d.reduce(e,t,a));e.pending.push(r)}break;case m.right:case _.right:case k.right:e.stack.push(t),d.retain(e,a);break;case m.left:case _.left:case k.left:e.stack.push(t),d.nest(e,a);break;case b.space:case b.identifier:e.stack.push(t),d.shift(e,a);break;default:throw new A}break;case u.double:switch(a.kind){case u.double:{let r=c.group(d.reduce(e,t,a));e.pending.push(r)}break;case u.back:case u.single:{let r=c.mismatch(d.reduce(e,t,a));e.pending.push(r)}break;case m.right:case _.right:case k.right:e.stack.push(t),d.retain(e,a);break;case m.left:case _.left:case k.left:e.stack.push(t),d.nest(e,a);break;case b.space:case b.identifier:e.stack.push(t),d.shift(e,a);break;default:throw new A}break;default:throw new A}},advance:(e,t)=>{switch(t.kind){case m.left:case _.left:case k.left:case u.single:case u.double:case u.back:d.nest(e,t);return;case b.space:case b.identifier:d.shift(e,t);return;case m.right:case _.right:case k.right:d.retain(e,t);return}},reduce:(e,t,a)=>{let r=new Array(2+e.pending.length-t.start),s=c.atom(t.token);r[0]=s;for(let n=t.start,i=1;n<e.pending.length;n++,i++)r[i]=e.pending[n];B.truncate(e.pending,t.start);let l=c.atom(a);return r[r.length-1]=l,r},nest:(e,t)=>{let a={start:e.pending.length,token:t};e.stack.push(a)},shift:(e,t)=>{let a=c.atom(t);e.pending.push(a)},retain:(e,t)=>{let a=c.lone(t);e.pending.push(a)},parse:e=>{e:for(;;){let t=K.next(e.lexer);if(t!==void 0){let a=e.stack.pop();a!==void 0?d.matching(e,a,t):d.advance(e,t);continue e}else break e}if(e.stack.length===0)return e.pending;{let t=new Array(e.pending.length+e.stack.length),a=e.pending,r=0,s=0,l=0;for(let i of e.stack){let p=i.start-l,g=c.lone(i.token);B.copy_nonoverlapping(a,r,t,s,p),r+=p,s+=p,t[s]=g,s++,l=i.start}let n=a.length-r;return B.copy_nonoverlapping(a,r,t,s,n),t}}};var R=(e,t)=>{switch(t.tag){case c.tag.atom:case c.tag.lone:return t.leaf.kind===w.kind.atom.space;case c.tag.group:case c.tag.mismatch:return t.children.length>=3?O(e,t.children[1])==="doc":!1}},$=e=>({tag:"hole",range:e}),O=(e,t)=>{switch(t.tag){case c.tag.lone:case c.tag.atom:return w.to_span(t.leaf,e);case c.tag.mismatch:case c.tag.group:{let a=t.children[0].leaf.start,r=t.children[t.children.length-1].leaf.end;return e.slice(a,r)}}},P=e=>{switch(e.tag){case c.tag.atom:case c.tag.lone:return w.to_start_position(e.leaf);case c.tag.group:case c.tag.mismatch:return P(e.children[0])}},Q=e=>{switch(e.tag){case c.tag.atom:case c.tag.lone:return w.to_start_position(e.leaf);case c.tag.group:case c.tag.mismatch:return Q(e.children[e.children.length-1])}},M={open:e=>c.to_range(e[0]),close:e=>c.to_range(e[e.length-1]),to_range:e=>{let t=P(e[0]),a=Q(e[e.length-1]);return{start:t,end:a}},extra:(e,t)=>M.to_range(e.slice(t,e.length-1))},ne=(e,t,a)=>{let r=[],s=M.to_range(a),l=[];for(let n=a.length-2;n>=1;n--)l.push(a[n]);for(;;){let n=l.pop();if(n===void 0)break;switch(n.tag){case c.tag.lone:case c.tag.atom:{let i={tag:"raw_string",range:c.to_range(n),data:O(e,n)};r.push(i);break}case c.tag.mismatch:case c.tag.group:{let i=n.children[0],p=n.children[n.children.length-1];if(i.leaf.kind===w.kind.curly_bracket.left&&p.leaf.kind===w.kind.curly_bracket.right){let h=q(e,t,n.children,1,E,$(M.close(n.children)),M.close(n.children),"expr","interpolation");C(t,n.children,2,"interpolation"),r.push(h)}else for(let h=n.children.length-1;h>=0;h--)l.push(n.children[h]);break}}}return{tag:"interpolation_string",range:s,data:r}},se=/^\d+$/,q=(e,t,a,r,s,l,n,i,p)=>a.length>r+1?s(e,t,a[r]):(t.push({range:n,message:`missing <${i}> in <${p}>`}),l),C=(e,t,a,r)=>{t.length>a+1&&e.push({range:M.extra(t,a),message:`extra <syntax> in <${r}>`})},ie=(e,t,a)=>{let r=a[1],s=a[a.length-1];return{tag:"doc",range:M.to_range(a),text:e.slice(r.leaf.end,s.leaf.start)}},le=(e,t,a)=>{let r=c.to_range(a);switch(a.tag){case c.tag.lone:case c.tag.atom:return{range:r,pattern:{range:r,text:"_"},body:$(r)};case c.tag.mismatch:case c.tag.group:{let s="clause",l=a.children.filter(g=>!R(e,g)),n=M.close(l),i=q(e,t,l,1,S,{range:n,text:"_"},n,"type",s),p=q(e,t,l,2,E,$(n),n,"body",s);return C(t,l,3,s),{range:r,pattern:i,body:p}}}},ce=(e,t,a)=>{switch(a.tag){case c.tag.atom:case c.tag.lone:return{params:[],body:$(c.to_range(a))};case c.tag.mismatch:case c.tag.group:{let r=a.children.filter(p=>!R(e,p)),s="signature",l=M.close(r),n=q(e,t,r,r.length-2,E,$(l),l,"body",s),i=[];for(let p=1;p<r.length-2;p++)i.push(T("parameter",e,t,r[p]));return{params:i,body:n}}}},S=(e,t,a)=>{let r=c.to_range(a);switch(a.tag){case c.tag.lone:case c.tag.atom:return{range:r,text:w.to_span(a.leaf,e)};case c.tag.mismatch:case c.tag.group:{let s=a.children[0].leaf.start,l=a.children[a.children.length-1].leaf.end;return{range:r,text:e.slice(s,l)}}}},T=(e,t,a,r)=>{let s=c.to_range(r);switch(r.tag){case c.tag.lone:case c.tag.atom:{let l=S(t,a,r),n={tag:"variable",range:s,text:l.text};return a.push({range:s,message:`expected <label-body-pair> in ${e}`}),{range:s,label:l,body:n}}case c.tag.mismatch:case c.tag.group:{let l=r.children.filter(g=>!R(t,g)),n=M.close(l),i=q(t,a,l,1,S,{range:n,text:"_"},n,"label",e),p=q(t,a,l,2,E,$(n),n,"body",e);return C(a,l,3,"label-body-pair"),{range:s,label:i,body:p}}}},E=(e,t,a)=>{let r=c.to_range(a);switch(a.tag){case c.tag.lone:case c.tag.atom:{let s=w.to_span(a.leaf,e);return se.test(s)?{tag:"integer",range:r,data:parseInt(s)}:{tag:"variable",range:r,text:s}}case c.tag.mismatch:case c.tag.group:{let s=a.children[0],l=a.children[a.children.length-1];if(a.children.length>=3&&O(e,a.children[1])==="doc")return ie(e,t,a.children);if(s.leaf.kind===w.kind.quote.double&&l.leaf.kind===w.kind.quote.double)return ne(e,t,a.children);{let n=a.children.filter(g=>!R(e,g)),i=M.close(n);if(n.length<3)return t.push({range:i,message:"ambiguous syntax"}),$(r);switch(O(e,n[1])){case"let":{let g="let",h=q(e,t,n,2,S,{range:i,text:"_"},i,"binder",g),y=q(e,t,n,3,E,$(i),i,"body",g);return C(t,n,4,g),{tag:"binding",range:r,binder:h,body:y}}case"record":{let h=q(e,t,n,2,S,{range:i,text:"_"},i,"binder","record"),y=[];for(let v=3;v<n.length-1;v++)y.push(T("field",e,t,n[v]));return{tag:"record",range:r,binder:h,fields:y}}case"inductive":{let h=q(e,t,n,2,S,{range:i,text:"_"},i,"binder","inductive"),y=[];for(let v=3;v<n.length-1;v++)y.push(S(e,t,n[v]));return{tag:"inductive",range:r,binder:h,variants:y}}case"match":{let h=q(e,t,n,2,E,$(i),i,"body","match"),y=[];for(let v=3;v<n.length-1;v++)y.push(le(e,t,n[v]));return{tag:"match",range:r,body:h,clauses:y}}case"scope":{let h=q(e,t,n,n.length-2,E,$(i),i,"body","scope"),y=[];for(let v=2;v<n.length-2;v++)y.push(E(e,t,n[v]));return{tag:"scope",range:r,stmts:y,body:h}}case"lambda":{let g="lambda",h=q(e,t,n,2,ce,{params:[],body:$(i)},i,"signature",g),y=q(e,t,n,3,E,$(i),i,"body",g);return C(t,n,4,g),{tag:"lambda",range:r,signature:h,body:y}}default:{let g=q(e,t,n,1,E,$(i),i,"func","apply"),h=[];for(let y=2;y<n.length-1;y++)h.push(E(e,t,n[y]));return{tag:"apply",range:r,func:g,args:h}}}}}}},oe=(e,t)=>{switch(t.tag){case c.tag.atom:case c.tag.lone:return t.leaf.kind===w.kind.atom.space;case c.tag.group:case c.tag.mismatch:return!1}},U=(e,t,a)=>{let r=[];for(let s of a)oe(e,s)||r.push(E(e,t,s));return r};var V=re(require("node:fs")),Z=class extends Error{},o=class extends Error{},F=class extends Error{},D=e=>{let t=e.toplevel.get("unit");if(t!==void 0){if(t.tag==="record")return{tag:"vobject",typ:t,data:{}};throw new o("expected record type")}else throw new o("missing intrinsic unit type")},ge=e=>{let t=new Map;for(let a of e)switch(a.tag){case"record":case"inductive":{if(t.has(a.binder.text)){let s="toplevel binder conflict";throw new o(s)}else t.set(a.binder.text,a);break}case"binding":{let{binder:s,body:l}=a;switch(l.tag){case"lambda":{if(t.has(s.text)){let n="toplevel binder conflict";throw new o(n)}else t.set(s.text,l);break}default:{let n="expected <lambda>";throw new o(n)}}break}case"doc":break;default:let r="expected <expr>";throw new o(r)}return t},G=e=>{switch(e.tag){case"vinteger":return String(e.data);case"vstring":return e.data;case"vobject":{let t=Object.values(e.data);if(t.length===0)return e.typ.binder.text;{let r=t.map(G).join(" ");return`(${e.typ.binder.text} ${r})`}}}},de=new Set(["int.add","int.sub","int.cmp","str.cmp","println"]),pe=e=>{let t=e.split(".");if(t.length<1){let a="invalid identifier";throw new o(a)}else return[t[0],t.slice(1,t.length)]},ue=(e,t,a)=>{switch(t){case"println":{if(a.length!==1){let l="arity mismatch";throw new o(l)}let r=f(e,a[0]),s=console.log;return s(G(r)),D(e)}case"int.sub":{if(a.length!==2){let n="arity mismatch";throw new o(n)}let r=f(e,a[0]),s=f(e,a[1]);if(r.tag!=="vinteger"){let n="expected int type";throw new o(n)}if(s.tag!=="vinteger"){let n="expected int type";throw new o(n)}return{tag:"vinteger",data:r.data-s.data}}case"int.add":{if(a.length!==2){let n="arity mismatch";throw new o(n)}let r=f(e,a[0]),s=f(e,a[1]);if(r.tag!=="vinteger"){let n="expected int type";throw new o(n)}if(s.tag!=="vinteger"){let n="expected int type";throw new o(n)}return{tag:"vinteger",data:r.data+s.data}}case"int.cmp":{if(a.length!==2){let i="arity mismatch";throw new o(i)}let r=f(e,a[0]),s=f(e,a[1]);if(r.tag!=="vinteger"){let i="expected int type";throw new o(i)}if(s.tag!=="vinteger"){let i="expected int type";throw new o(i)}let l;r.data<s.data?l="less":r.data===s.data?l="equal":l="greater";let n=e.toplevel.get(l);if(n===void 0){let i="missing intrinsic record type less, equal, greater";throw new o(i)}else{if(n.tag==="record")return{tag:"vobject",typ:n,data:{}};{let i="expected record type";throw new o(i)}}}case"str.cmp":{if(a.length!==2){let i="arity mismatch";throw new o(i)}let r=f(e,a[0]),s=f(e,a[1]);if(r.tag!=="vstring"){let i="expected str type";throw new o(i)}if(s.tag!=="vstring"){let i="expected str type";throw new o(i)}let l;r.data<s.data?l="less":r.data===s.data?l="equal":l="greater";let n=e.toplevel.get(l);if(n===void 0){let i="missing intrinsic record type less, equal, greater";throw new o(i)}else{if(n.tag==="record")return{tag:"vobject",typ:n,data:{}};{let i="expected record type";throw new o(i)}}}default:throw new Z}},he=/[a-zA-Z_][a-zA-Z_0-9]*/,f=(e,t)=>{switch(t.tag){case"integer":return{tag:"vinteger",data:t.data};case"interpolation_string":{let a="";for(let r of t.data)a+=G(f(e,r));return{tag:"vstring",data:a}}case"raw_string":return{tag:"vstring",data:t.data};case"doc":return D(e);case"binding":{if(!he.test(t.binder.text)){let r="invalid local binder";throw new o(r)}if(e.toplevel.has(t.binder.text)){let r="local binder conflict with toplevel";throw new o(r)}let a=e.local[e.local.length-1];if(a.has(t.binder.text)){let r="local binder conflict with current scope";throw new o(r)}return a.set(t.binder.text,f(e,t.body)),D(e)}case"apply":{let{func:a,args:r}=t;switch(a.tag){case"variable":{if(de.has(a.text)){e.stack_trace.push({name:a.text,pos:a.range.start});let l=ue(e,a.text,r);return e.stack_trace.pop(),l}let s=e.toplevel.get(a.text);if(s===void 0){let l="unresolved toplevel function";throw new o(l)}else switch(s.tag){case"lambda":if(s.signature.params.length!==r.length){let l="arity mismatch";throw new o(l)}else{let l=new Map;for(let i=0;i<r.length;i++){let p=f(e,r[i]),g=s.signature.params[i].label.text;l.set(g,p)}e.stack_trace.push({name:a.text,pos:a.range.start}),e.local.push(l);let n=f(e,s.body);return e.local.pop(),e.stack_trace.pop(),n}case"record":if(s.fields.length!==r.length){let l="arity mismatch";throw new o(l)}else{let l={};for(let n=0;n<r.length;n++){let i=s.fields[n],p=f(e,r[n]);l[i.label.text]=p}return{tag:"vobject",typ:s,data:l}}default:{let l="expected <function> or <constructor>";throw new o(l)}}}default:throw new Z}}case"match":{let a=f(e,t.body);switch(a.tag){case"vobject":{for(let s of t.clauses){let l=a.typ.binder.text,n=s.pattern.text;if(l===n)return f(e,s.body)}let r="non exhaustive <pattern> in <match>";throw new o(r)}default:{let r="expected <expr> has inductive type in <match>";throw new o(r)}}}case"variable":{if(t.text==="abort")throw new F("abort");let a=e.toplevel.get(t.text);if(a!==void 0)switch(a.tag){case"record":if(a.fields.length!==0){let r="expected record type is unit record";throw new o(r)}else return{tag:"vobject",typ:a,data:{}};default:{let r="expected record type";throw new o(r)}}else{let[r,s]=pe(t.text);for(let n=e.local.length-1;n>=0;n--){let p=e.local[n].get(r);if(p!==void 0){for(let g of s)switch(p.tag){case"vobject":{if(p.data[g]!==void 0)p=p.data[g];else{let y="inaccessible record field";throw new o(y)}break}default:{let h="expected record type";throw new o(h)}}return p}}let l="unbound local variable";throw new o(l)}}case"scope":{e.local.push(new Map);for(let r of t.stmts)f(e,r);let a=f(e,t.body);return e.local.pop(),a}default:{let a="expected <expr>";throw new o(a)}}},ye=(e,t)=>{let a=e.toplevel.get("main");if(a===void 0){let r="missing <main> entry function";throw new o(r)}else if(a.tag==="lambda")f(e,a.body);else{let r="expected <lambda>";throw new o(r)}},be=()=>{let e=process.argv[2];if(e===void 0)throw Error("expected source file path for CLI args");let t=[];try{let a=V.readFileSync(e,{encoding:"utf-8"}),r=d.make(a),s=d.parse(r),n=U(a,[],s),p={toplevel:ge(n),local:[],stack_trace:t};ye(p,n)}catch(a){if(a instanceof o||a instanceof F){console.log(`stack trace: ${a.message}`),console.log(`stack depth: ${t.length}`);for(let r=t.length-1;r>=0;r--){let{name:s,pos:l}=t[r];console.log(` at ${s} ${e}:${l.line+1}:${l.character}`)}}else throw a}};be();