|
As for the semantics, here are the equivalent JS functions: I = y => [...y.keys()].filter((e,i) => y[i]) // ⍸y Indices of trues in y
E = (x,y) => y.map((e,i) => x.every((e,j) => e == y[i+j])) // x⍷y mask indicating indices where x Exists as a sub-array in y
C = (x,y) => [x,y].flat() // x,y Catenate x and y into a single array
w = [1,1,1,1,0,1,1,1,0,1,0,1,1,0,0,0,1,1,1,1]
I(E([0,1],C(0,w))) // [0,5,9,11,16]
Now, if I, E, and C were prefix/infix JS operators, with x being the left argument (if any) and y being the right argument, we'd write: I([0,1] E (0 C w))
All APL operators have long right scope, so we don't need to parenthesise right arguments: I [0,1] E 0 C w // same syntax as APL's ⍸ 0 1 ⍷ 0 , ⍵
Alternatively, you can see the infix operators as being methods of all types: I([0,1].E(0.C(w)))
Now we remove all the .() noise: I [0,1] E 0 C w // same syntax as APL's ⍸ 0 1 ⍷ 0 , ⍵
Wasn't that hard, was it? |