diff --git a/web/src/lib/expr.ts b/web/src/lib/expr.ts index fc990db..10dc0b4 100644 --- a/web/src/lib/expr.ts +++ b/web/src/lib/expr.ts @@ -229,8 +229,8 @@ function idx(i: number, len: number): number { const ARR_FUNCS: Record ArrVal> = { len: a => asArr(a[0]).length, - sum: a => asArr(a[0]).reduce((s, x) => s + asNum(x), 0), - mean: a => { const r = asArr(a[0]); return r.length ? r.reduce((s, x) => s + asNum(x), 0) / r.length : 0; }, + sum: a => asArr(a[0]).reduce((s, x) => s + asNum(x), 0), + mean: a => { const r = asArr(a[0]); return r.length ? r.reduce((s, x) => s + asNum(x), 0) / r.length : 0; }, // min/max: scalar-variadic OR single-array — see ev() dispatch below slice: a => { const r = asArr(a[0]); const s = a[1] === undefined ? 0 : asNum(a[1]); const e = a[2] === undefined ? r.length : asNum(a[2]); return r.slice(s, e); }, concat: a => asArr(a[0]).concat(asArr(a[1])), @@ -256,7 +256,10 @@ function ev(n: Node, R: Resolver): ArrVal { case 'arr': return n.items.map(it => ev(it, R)); case 'sig': return R(n.ds, n.name); case 'var': return R('local', n.name); - case 'index': return asArr(ev(n.a, R))[idx(asNum(ev(n.i, R)), asArr(ev(n.a, R)).length)]; + case 'index': { + const arr = asArr(ev(n.a, R)); + return arr[idx(asNum(ev(n.i, R)), arr.length)]; + } case 'un': return n.op === '-' ? -asNum(ev(n.a, R)) : (asNum(ev(n.a, R)) === 0 ? 1 : 0); case 'tern': return asNum(ev(n.c, R)) !== 0 ? ev(n.a, R) : ev(n.b, R); case 'call': {