&gt; Or functional as having proper closures.<p>Closures are an implementation detail.<p>&gt; Or tail cail elimination.<p>Tail call elimination is just the <i>right</i> way to implement tail calls in a strict language.<p>&gt; Or using immutable data, or immutable variables.<p>Variables don&#x27;t “mutate”, they are <i>substituted</i> with other expressions. What imperative languages have is “assignables”.<p>&gt; Or minimizing mutable state.<p>Functional programs have plenty of state - which changes over time. You can&#x27;t have computation without traversing a state space - over time.<p>&gt; Or being declarative.<p>What (technical!) definition “declarative” are you using?