Hypothesis:
When you're using a function as an R-value, or right hand side value, of an assignment statement, you're trying to assign the output of the R-value to the L-value variable.
Why call is needed when calling a function:
From the documentation (see :h call) it is evident that call will discard the return value of a function.
*:cal* *:call* *E107* *E117*
:[range]cal[l] {name}([arguments])
Call a function. The name of the function and its arguments
are as specified with |:function|. Up to 20 arguments can be
used. The returned value is discarded.
So, since when you're using functions as R-value you don't want to discard the output of the function, rather want to assign it to the L-value, you don't use call.
Moreover, you don't always need call to call a function. You can pass the function to another function for example,
:function GetMeow()
: return "Meow String!"
:endfunction
:GetMeow() " ERROR!
:call GetMeow() " no output
:echom GetMeow() " shows "Meow String!"
Edit
Many languages have the notion of "statements" and "expressions" and programs are generally sequences of statements. In C, GetMeow() may be an expression but GetMeow(); (with a semicolon) is a statement. In vim, GetMeow() is an expression but call GetMeow() is a statement, which are referred to as ex commands. It's really not as strange as the question implies.
call. Thank you so much for clarifying it in your question. – Steven Lu Nov 09 '20 at 02:13