Tail-recursive functions in Racket are optimized down to essentially for loops.
What's it like to debug them?
One strategy is by "tracing" a function call:
https://docs.racket-lang.org/trace/