Via Bill Clementson's blog, an explanation of how Common Lisp survives, i.e. by being what might be called a language and a "meta" language rolled into one. By contrast, we have Java which can be extended, but the implementation of the extension is itself "outside" the language. (Oh, it might be implemented *using* Java, but it is not implemented *within* Java.)
Kenny's Cells is Common Lisp. Uncommon SQL with its embedded SQL reader macros is Common Lisp. The LOOP Macro is Common Lisp. Uncommon Web, with its limitations and limited CPS macros, is Common Lisp. CLOS is Common Lisp. Garnets KR is Common Lisp.
But, for example, AspectJ, is not Java. Java like, Java inspired, sorta looks like Java, Works with Java, but not Java. They could have done Aspect C++, or AspectPython, or AspectIntercal.
Why the distinction? They had to go outside the domain to implement it. If I throw an AspectJ program at a system that 'knows Java', it will go 'WTF? THIS isn't Java.'
You can not extend the Java language.
Of course the same is true of C#. Consider the popular Xen experiment. If C# were Common Lisp, you'd be able to use Xen already.
Smalltalk operates a bit differently than Common Lisp, but again it is the simplicity of the language and the openness of the implementation that keeps Common Lisp and Smalltalk alive after 20-30 years. And why we will wish Java and C# were dead five years from now.