I would argue that functional code is much closer to Unix pipelines than imperative code. Each function takes inputs and transforms them. Pipelines are just function composition.
100% agree with everything else you just said though.
100% agree with everything else you just said though.
When you use (progn ....) in lisp or (do ...) or (-> ...) in clojure you are pretty near to what I understand as imperative but you are leaving the orthodoxy of functional programming.
What is relevant is idempotence which is easily achievable in functional programming and in procedural/imperative as long as you don't use global variables.
Idempotence generally not a feature of OOP. (OOP quite often is not even deterministic).