diff --git a/src/builtins/fns.c b/src/builtins/fns.c index 9f1e55a4..293cce00 100644 --- a/src/builtins/fns.c +++ b/src/builtins/fns.c @@ -76,9 +76,80 @@ B ud_c1(B t, B x) { return taga(r); } -extern B rt_ud; B ud_c2(B t, B w, B x) { - return c2(rt_ud, w, x); + usz wia=1; + if (isArr(w)) { + if (RNK(w)>1) thrM("↕: 𝕨 must have rank at most 1"); + wia = IA(w); + if (wia==0) { decG(w); return x; } + } + ur xr; + if (isAtm(x) || (xr=RNK(x)) UR_MAX) thrM("↕: Result rank too large"); + ur wr = wia; + ur rr = xr + wr; + ShArr* sh = m_shArr(rr); + usz* rsh = sh->a; + usz* wsh = rsh + wr; + if (isAtm(w)) { + wsh[0] = o2s(w); + } else { + SGetU(w) + for (usz i=0; i