Let me copypaste a part of a previous comment I made:
When compiling/transpiling/whatever between languages, I have found that relying on regular procedure calls and TCO is generally a lot simpler than having to force the looping facility of one language into the semantics of another language.
I have written a guile scheme macro that more or less copies racket's for loops, and there are a lot of subtle things that would make using something else than tail recursive functions hard to use since I would have to work around the implicit behaviour of whatever looping facility I am trying to use.
When compiling/transpiling/whatever between languages, I have found that relying on regular procedure calls and TCO is generally a lot simpler than having to force the looping facility of one language into the semantics of another language.
I have written a guile scheme macro that more or less copies racket's for loops, and there are a lot of subtle things that would make using something else than tail recursive functions hard to use since I would have to work around the implicit behaviour of whatever looping facility I am trying to use.