A very important aspect of Lisp, and in fact an important aspect of many of the functional languages ββthat followed it, is that it is compositional. This means that the value of an expression is determined using the values ββof its subexpressions β or, in other words, the definition of an estimate is what is essentially recursive. In non-functional languages ββthere are some differences, as in expressions against operators, but even there, expressions are not limited in any way, so recursion is also baked in the definition. Probably the only cases where the recursiveness of a language definition is not so obvious are assembly languages. (Although even there the definition of meaning, of course, will require induction.)
So, the struggle with the definition of eval recursion is what you lose. If you go with compilation to machine code, this code will be recursive (and the generating code will also be recursive). If you make the assessment through the Forth evaluator, then that evaluator will still be recursive. Even if you go with the CPS offer in another answer, you just get another stack encoding.
So, the bottom line is that the best you can get is some kind of stack encoding that doesn't directly use the computer stack - there is no significant difference, but you usually lose performance (since processors process the stack very efficiently and it will be encoded on the heap slower).
source share