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