Lisp is a family of programming-language dialects that have certain features that all other programming languages have slowly been acquiring, over the decades. When a programming language reaches the capabilities of Lisp, it's no longer just a new programming language, but rather a new dialect of Lisp. As of this writing, most mainstream programming languages do not support all the capabilities of Lisp. They're getting close, but most are missing at least 2 important features. Those important features are what make Lisp a programmable programming language.
Lisp’s greatest downside is also its greatest strength: The language itself is programmable. This means that you can add any programming-language feature to Lisp yourself. Do you want a new looping mechanism? Do you like the idea of doing away with boiler-plate code? Interested in some new object-oriented feature? These are things that every seasoned Lisp programmer builds into Lisp as part of his or her regular programming effort.
Lisp programmers tend to modify Lisp to adapt it to the problem that they’re solving. They might look at some problem and think: “I would love to be able to type some expression X in such and such a way, and have Lisp know what I’m trying to do.” So they modify the language to do just that. And I don’t mean that they write a function. I mean that they program the way that their code should be interpreted by Lisp in a given context.
Programmability makes Lisp powerful in the sense that it can ostensibly never really fall behind other programming languages. This is why Lisp still matters today, more than 50 years after it was invented. Lisp might represent the theoretical limit of programming-language expressiveness.
However, that same programmability is also precicely the greatest downside of Lisp. When you look at someone else’s Lisp program, it might be more difficult to understand what the program is doing, because the programming language (Lisp itself) might have changed from what you’re used to seeing. Therefore, you might find yourself putting in a little extra effort to understand what’s going on in the code.
If you’re working with a small team, this might not be an issue, and might in fact work to your advantage. On the other hand, if you see a lot of churn among your colleagues, or you’re working in a large team, then you might want to think of using a standard programming language that the programmers can’t change. The standard programming language won’t give you the same flexibility or productivity, but at least it will be easier for one person to pick up where another one left.
There are many other downsides to Lisp, including the fact that it’s much harder to find Lispers to hire or to help you learn the language than it is to find Java or Python programmers. I’m sure I could come up with a huge list of other such issues. Nevertheless, I’m betting that programmability is likely the biggest downside for the language.