3 ms·
It is also possible for the Clojure compiler to do TCO in certain cases: Rich Hickey made the conscious decision to not do it. If I read your statement as Rich
by hga 11y ago
It is also possible for the Clojure compiler to do TCO in certain cases: Rich Hickey made the conscious decision to not do it.
If I read your statement as Rich Hickey having the opportunity but passed on it, I'd reply that he did that with recur. Unless you mean silent TCO like e.g. Scheme does.
- treerex 11y agoYes, silent TCO. Isn't that what most people mean about TCO when applied to recursion?
- hga 11y agoPerhaps, but that doesn't mean it's accurate. TCO literally just says tail calls are optimized, and I personally see an advantage to making your intent to make a TCO-ed tail call explicit, so like in Clojure you get a compilation error rather than blowing your stack at runtime. It certainly looks more elegant to do it silently, but Clojure doesn't strive for that sort of elegance.
- dkersten 11y agoTCO is broader than what recur does. Recur only optimises recursive tail-calls to the function you are in, TCO generally implies that any tail-calls (recursive or not) can be optimised (including mutually recursive calls, for which clojure made the trampoline function or just calling one function at the tail of another). Personally, I like clojure's approach as IMHO recur makes intent clear, but recur is a subset of what TCO optimises in other languages.