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.
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*
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,
: return "Meow String!"
:GetMeow() " ERROR!
:call GetMeow() " no output
:echom GetMeow() " shows the string
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.