I really like the fact that proponents of Clojure, CL, Scheme, Haskell, etc.. are so enthusiastic about their favorite languages.
One of the themes I hear is that at some point, perhaps not the first time one attempts to learn a language, he finally gains certain insight.
Is there anything to this?
One of the many insights, for me personally, was the fact that a program that interprets other programs is itself just a program. The idea of DSLs became less "cool" and "magical" when I realized that, and LISP and Clojure programmers design systems naturally in such metalinguistic abstractions. It is just a normal way of doing things.
The other thing I found was that bottom-up design was much more natural in a functional programming language such a Clojure, and being a LISP, it became an even better vehicle for it.
I'm sure other folks have had other or similar revelations!
The insight to me seems to be the freedom of expressing and composing high level data transformations. Once I realize that, I feel this is a more human like thinking than what imperative language taught us to do. Now I feel the imperative languages are glorified machine codes, one is still manipulating registers, memory locations, and such. These are all notions of the implementation details of a Von Neuman machine. OOP tried to hide those, but in the process created another layer of details for us to get around. Functional language let you think directly about how you are going to manipulate YOUR DATA, regardless how the data might be represented in the machine.