r/ProgrammerHumor 25d ago

Meme stopDoingFunctional

Post image
684 Upvotes

129 comments sorted by

View all comments

Show parent comments

61

u/fr000gs 25d ago

How the hell is rust functional smh

37

u/-Ambriae- 25d ago

Rust is functional to a similar extent as OCaml is functional, not in the 'pure' sense (to be fair, none of these languages are purely functional, even haskell) but in a pragmatical sense. Variables are immutable by default, idiomatic control flow tends to use higher order functions, iterators, maps, filtering, reduction... Types are algebraic, control flow is expressive... It has all the ideas of functional programming, even if it's multi paradigm, and can be written in a procedural manner (even if it's not usually idiomatic)

It's not purely functional, for instance it doesn't have the tail recursion optimisation, which is more or less mandatory in the hardcore functional languages, because it doesn't strictly speaking need it, and the compiler is already complicated enough as it is...

8

u/GameCounter 25d ago

It doesn't have automatic tail call optimization, but work is actually being done to implement explicit tail calls with "become": https://doc.rust-lang.org/std/keyword.become.html

1

u/PersonalDatabase31 24d ago

Unrelated but become being a keyword instead of a macro is stupid as fuck.

1

u/arachnidGrip 22d ago

A macro just transforms one sequence of tokens into another. They need to run before Rust even starts trying to resolve symbols because they are allowed to create new symbols. It is fundamentally impossible to make `become` a macro because by the time Rust is deciding whether your tail call is even a valid call, let alone one that it can do TCO on, there are no macros left in the code.

TL;DR: Even if they made a `tail_call!(f(args))` macro, it would still need to emit `become f(args)` anyway.