Join devRant
Do all the things like
++ or -- rants, post your own rants, comment on others' rants and build your customized dev avatar
Sign Up
Pipeless API
From the creators of devRant, Pipeless lets you power real-time personalized recommendations and activity feeds using a simple API
Learn More
Search - "tail recursive"
-
Dear Coffee,
I ask for your help.
I need to pass this exam, and at the same time a client is angry.
I invoke you.
Like the function I'm in.
A function of time, a function that will probably never halt but you cannot prove it. You hope it will stop soon, but deep inside you know it will continue to compute.
I beg you, Coffee. Make this function of procrastination stop. Please.
I see no escape.
It is a tail-recursive function. You realize it as soon as you reach the end.
You can do nothing about it, you're trapped inside this loop. At each iteration you hope to reach the bottom, but you never know. You can only hope that the bottom is close.
This is the last one, you keep repeating to yourself.
Please Coffee, let it be a non-pure function.
Make the environment change.
Only then we can be saved.3 -
Possibly my favourite function is Clojure's "recur", which isn't really a function at all, but a special form that gives you a guaranteed tail-position call to the current function.
Basically what that means is you can write recursive functions (functions that call themselves) and know that you're not creating a potential stack overflow.
Um. Okay, I can feel people looking at me like 🤔 Basically what *that* means is: normally when a function calls another function, a "stack frame" is allocated, holding all the local variables for that call. If a function calls itself 1000 times, 1000 stack frames get allocated. "Tail call optimisation" is a process by which if you call yourself as the very last thing in a function, the language doesn't need to remember the current frame; it just has to pass the return value upwards. The trouble is, it's sometimes hard to notice that you've turned a tail-call optimisable function into a non-optimisable one. Clojure's recur keyword makes it explicit, and therefore safe: if you try to do anything with the return value of recur, it's an error.
PS I'm sure another language did explicit TCR first, but Clojure is where I first saw it.6 -
That moment that you realize that you have more experience than your college teacher...
Me: Can you tell me why a tail recurcive function in a functional programming language the stack and memory do not increase?
Teacher: I don't know what is a tail recursive function...
Me: Ok....
I feel like I am wasting time...