Thanks to you both Raul and Tracy. I'm pretty sure I've got it straight now. Of 
course only time will tell!

---Tracy Harms wrote:
> Regarding the nature of the error that occurs with your original code
> attempt
>
>    ops=: +`*`-
>    ((0 1 2,:0 2 1){ops) /"1 _] 1 2 3 4  NB. Ric's attempt
>
> |rank error
>
>    ((0 1 2,:0 2 1){ops) 4 :'x/y'"1]1 2 3 4 NB. Raul's fix
> _1 _9
>
> The rank error occurs because there are two things to accomplish but
> your code only provides for one of them. Insertion allows verbs to take
> effect between each of the four integers -- and as you've found it
> works fine so long as what is to the left of the slash is not fancier
> than a list of verbs.
>
> But you want to do this again and again, once for each list of verb-
> lists you specify. Here's the example you used:
>
>    ((0 1 2,:0 2 1){ops)
> +-+-+-+
> |+|*|-|
> +-+-+-+
> |+|-|*|
> +-+-+-+
>
> When you try to insert this into (1 2 3 4) you're specifying something
> like this:
>
>   +   *   -
> 1   2   3   4
>   +   -   *
>
> Conceivably this could be interpreted as you wish, but J does not do
> that. Instead, we get "rank error", which here means "Whoa, you've
> handed me a stack of verbs between each of these items; I need one verb
> for each pair of nouns."
>
> If we think in terms of loops, we need one loop for each of the two
> axes in the verb array. Insert supplies only one them. Raul's solution
> is to build a verb that supplies the other.
>
> The fact that Insert is overwhelmed as soon as it gets a multi-axis
> left parameter can be seen below, which shows that everything that was
> to the right of the slash is irrelevant to this problem:
>
>    ((0 1 2,:0 2 1){ops)/
> |rank error
> |       ((0 1 2,:0 2 1){ops)/
>
> When Insert is used the rank of the resulting verb defaults to maximum.
> E.g.
>
>    + b. 0
> 0 0 0
>    (+/) b. 0
> _ _ _
>    (4 :'x/y') b. 0
> _ _ _
>    (4 :'x/y'"1) b. 0
> 1 1 1
>
> The last line of these four lines of code shows the verb Raul wrote
> that did the trick. By specifying rank-one for the resulting verb, it
> means "take rows of x and apply them to rows of y" rather than "take
> all of x and apply it to all of y".  This provides the row-wise
> interpretation (cycling) of your array of gerunds, while insert (/)
> continues to provide the "inner loop."

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to