IMO, everything should be a function call until the termination case is encountered in the recursive design.
It should not be possible to use operators other than function calls except at the leaf levels.
For example, "+" should not appear in any code except the very lowest-level code.
Likewise, "cons" and array operations.
Compilers can optimize-away function calls by making them into inline (macro) calls.
AFAICT, most PLs allow unrestricted use of low-level operations (like "+", cons, arrays) at any level of the design.
Low-level operations are like GOTOs — they should be avoided and structured.