|
|
|
|
|
by adityaathalye
279 days ago
|
|
Yeah, absent automatic TCO, we have to do it all, explicitly, by hand... `recur` and `trampoline`. recur: https://clojuredocs.org/clojure.core/recur > Evaluates the exprs in order, then, in parallel, rebinds the bindings of
the recursion point to the values of the exprs. (def factorial
(fn [n]
(loop [cnt n
acc 1]
(if (zero? cnt)
acc
(recur (dec cnt) (* acc cnt))
; in loop cnt will take the value (dec cnt)
; and acc will take the value (* acc cnt)
))))
trampoline: https://clojuredocs.org/clojure.core/trampoline > trampoline can be used to convert algorithms requiring mutual recursion without stack consumption.
i.e. these emulate TCO, with similar stack consumption properties (they don't implement real TCO).(edit: formatting) |
|
https://dl.acm.org/doi/pdf/10.1145/317636.317779
Usually the trampoline is implemented automatically by the language rather than forcing the author to confront it, though I can see why Clojure might have chosen to put the burden on the user.