Allright, let's take some list of what can be understood for "mainstream" languages (because, according to other criteria, Lisp is mainstream too.)
TIOBE index top 10:
Java, C, C++, Python, C#, Visual Basic.NET, PHP, Javascript, SQL, Ruby.
let's compare to Lisp and Haskell:
- NONE of those langs have the hindley-milner type system, type inference and typeclasses of Haskell.
- even Common Lisp's type system is more sophisticated than almost all langs on the list, allowing for union types.
- all of those langs only allow you to write the code that will execute at runtime. CL allows you to specify if a function is to be executed at read time, compile time, and run time.
- NONE has an object oriented system with multiple dispatch nor a meta-object system. Unlike Common Lisp.
- None have metaprogramming based on homoiconicity (like Common Lisp), so the only way of macros is to use a cumbersome AST->AST library, and even then, it can only be done at compile time nor runtime.
- Only a very few allow changing the definiton of a class or function at runtime, without stopping the running program, and then it's often a difficult proposition because the language wasn't designed to do this on the first place. Unlike in Common Lisp.
- For the garbage collected languages there, NONE allows you to circumvent or disable the garbage collector, unlike CL.
- For the garbage collected languages there, NONE is faster than CL, and only CL allows the programmer to write Lisp code that reaches C speed, if he/she wishes so.
- only a few have built-in support for all of these: integers, arbitrary precision numbers, rationals, floats with IEEE compliance, complex numbers, and bit vectors. All which CL brings you by default.
Now, you can suggest more languages and I can go on.
There are very few languages that can compete with Coq, Agda, Haskell, Ada/Spark, Common Lisp, Julia and Racket today.
No, there are many features missing. Features that are very relevant. Do you know that many of the design patterns often used in Java are unnecessary in Common Lisp simply because many of them are workarounds for things that the Java OOP system lacks but Lisp's OOP system implements?