## Still strugling

Learning APL or new to Dyalog? Ask "silly" questions here, without fear...

### Still strugling

5⌈2 + 8⌈14 gives 16
but
2 + 8⌈14 gives also 16
That first 5 does not do anything ?

but 5⌈2 gives 5 ??
So I would expect 5 + 14 gives 19
----------------------------------------------
Same confusing thing :

4×2 5+3 gives 20 32
Simply don't see how to come to this.
Feeling very dumb. Sorry.

-----------------------------------------------
Ah , the first I got (I think)
first 8⌈14 = 14. Then 2 + 14 = 16. then 5⌈16 = 16 !! Correct ?

----------------------------------------------
The second one (4×2 5+3) I can only solve when I get rid of the "right to left" rule !
2 5+3 = 5 8. thus first 2+3 then 5+3 ?? thus not 5+3 first ? 4× 5 8 = 20 32
hbarkhof

Posts: 44
Joined: Mon Apr 09, 2018 8:37 am

### Re: Still strugling

Yes, you got the first one.

Regarding the second one, the 2 and the 5 bind together first, to form a 2-element vector. This is called strand notation, and it takes precedence over function application (I think that is the right terminology, but I will be corrected soon enough below if not). Treat this as one thing, and then use the right to left rule - so the first thing that happens is 2 5+3 which yields the two element vector 5 8.
paulmansour

Posts: 343
Joined: Fri Oct 03, 2008 4:14 pm

### Re: Still strugling

Try putting parens around until you get the hang of it. It's not crazy, just different. Here are the strand (vector) notation rules from the Programmer's Guide:

A series of two or more adjacent expressions results in a vector whose elements are the enclosed arrays resulting from each expression. This is known as VECTOR (or STRAND) NOTATION. Each expression in the series may consist of one of the following:
a. a single numeric value;
b. single character, within a pair of quotes;
c. more than one character, within a pair of quotes;
d. the name of a variable;
e. the evaluated input symbol ⎕;
g. the name of a niladic, defined function yielding a result;
h. any other APL expression which yields a result, within parentheses.

The tricky case might be when using variable names (whether on their own or mixed with constants), as in this case:
Code: Select all
`      A B C D E F←1 2 3 4 5 6      A B C + D E F5 7 9      (A B C) + (D E F)5 7 9      A B (C + D) E F1 2 7 5 6`
petermsiegel

Posts: 88
Joined: Thu Nov 11, 2010 11:04 pm

### Re: Still strugling

Hi,
perhaps the easiest way to grasp this is to use parentheses (from right to left), e.g.
`      5⌈(2+(8⌈14))16      5⌈(2+ 8⌈14 )16      5⌈ 2+ 8⌈14  16`

Remember that the vector binding is stronger than function binding, thus
`      4×((2 5)+3)20 32      4× (2 5)+320 32      4×  2 5 +320 32`

And last: don't ever use multiple assignment without parentheses (avoiding problems, e.g understanding the code afterwards), that's an unnecessary and irritating anomaly. The expression
`      Foo Goo Hoo←...`

may be interpreted as function Foo with two arguments set at once, or assigning three variables, or assigning the right argument for function Goo, or..
This becomes more hairy with namespaces, with []PATH *sigh*.

But writing
`      (Foo Goo Hoo)←...`

is safe, and clear, and logical.

-wm
Veli-Matti

Posts: 56
Joined: Sat Nov 28, 2009 3:12 pm

### Re: Still strugling

Thanks a lot , Gents. I think I got it. Very good tip to use parentheses !
hbarkhof

Posts: 44
Joined: Mon Apr 09, 2018 8:37 am