the following is also tailcall:
x = f(a)
...
...
return x x = f(a)
...
...
return xIf "x" is declared there and never mutated in the subsequent code, and the code in the "..." doesn't perform any side effects, then such an optimization could occur... but then again, if the code in the "..." in your example didn't perform any side effects, it'd be dead code.
Both
If (b == 3):
x = f(a)
else:
x = g(a)
return x
and if (b == 3):
x = f
else:
x = g
return x(a)
are equivalent to: if (b == 3):
return f(a)
else:
return g(a)
In every example the function call is in the tail position semantically. In the the two cases syntactically. The loop construct is hidden.