Why does @ need :: and why does . need () in amend?

https://learninghub.kx.com/forums/topic/why-does-need-and-why-does-need-in-amend

https://code.kx.com/q/ref/amend/

Based on the above, why does . need () to get the entire list and @ need ()?

Surely this would imply:

q) 1 2 3 4 5 . () /this is NOT the case
1 2 3 4 5

and

q) list @ :: /this is NOT the case
list

However

q)list @ enlist[::] /this is the case
list

Can anyone help me make sense of this?

The binary form of . is not exactly the same as the 3 or 4 parameter version. The handling of () is special, as it’s equivalent to list instead of list . ().

For list @ :: , this is not the correct syntax for what you want to do as :: is being parsed as a binary operator missing its right argument. If you write it as list @ (::) it works.

list @ enlist[::] is something else: note that here the index is a list, not a single element, therefore the result will be a list as well, meaning it’s actually enlist[list] - while this looks like the original list in the printout, if you check the type of the result you will notice that they are different.