&gt; Closures are an implementation detail.<p>Except when they are not there done properly (cough cough Python), it not so fun doing functional programming.<p>&gt; Tail call elimination is just the right way to implement tail calls in a strict language.<p>Well Erlang is not strict and has tail call elimination. Because of lack immutability, recursion is used. Without tail call elimination recursion will blow the stack.<p>&gt; Variables don&#x27;t “mutate”, they are substituted with other expressions. What imperative languages have is “assignables”.<p>Yes they do. X=X+1 -- Variable mutated. Like it or not that is the bread and butter of programming. Unless someone did strictly functional programming and math. Then I can see how they&#x27;d be very confused by that statement.<p>There is also immutable vs mutable data. For example both Erlang and Elixir have immutable data. But Elixir has mutable variable, while Erlang doesn&#x27;t.<p>As for assignables, I&#x27;ve never heard that word. I went to the standard 4 year CS program. Seemingly did a regular curriculum. Is that a translation from another langauge or a functional programming terminology?<p>&gt; Functional programs have plenty of state - which changes over time.<p>Some have more, some less. Minimizing means making it explicit, passing it around, using immutable data. As opposed to say sticking it in a large object instance in a global singleton and then everything calls 100 something methods to mutate it.<p>&gt; What (technical!) definition “declarative” are you using?<p>The point I think is, it is just as technical as &quot;functional&quot; is.  It has a bit of a &quot;No True Scotsman&quot; thing going for it.<p>But as a heuristic think maybe about when you&#x27;d use patern matching to destructure something vs say a nested set of if and elses.