It absolutely needs to be admitted that it is easy to make a well intentioned unmaintainable mess in Lisp and other highly dynamic languages. Brilliant programmer A will add a lot of layers and abstractions that make sense in one context, which is great until brilliant programmer B does so in a different context. This all seems to break down somewhere when the number of programmers exceeds 1.
I've worked on several large Lisp systems, and have never had this problem.
You can make a mess in any language. I will grant that Lisp offers more ways to do that than most languages, but so does C++ (template metaprogramming, anyone?).
Well, my point is that you can make a mess using template metaprogramming. Maybe that doesn't actually happen too often, because anyone smart enough to use TMP at all is smart enough not to make a mess :)
But you're right, the actual messes I've seen in C++ have not involved TMP. Come to think of it, most of them have been around "const" misuse.
What does "add a lot of layers and abstractions that make sense in one context" mean? Is that like "entities and/or actions placed or performed in a certain manner for a particular purpose, or to carry out a certain task"?
Everything in a high-level programming language is an "abstraction". And anything outside the grammar of the language is a convention.