Lisp has a rich type system and there is no conceptual problem in having both static analysis and dynamic checks.
What happens, especially with classes, is that you cannot guarantee that your type hierarchy will not be altered at the time you invoke your generic method (highly dynamic classes are a feature too).<p>But since your whole language is available at compilation time, there is nothing preventing you to define a DSL for a subset of types that are fixed. You could even use compiler macros to deal with trivial cases. Then, you add enough &quot;(declaim (type ...))&quot; directives in your language and augment the optimization settings to allow your implementation to trust declarations without adding dynamic checks.<p>If you need to have access to more type informations, use the implementation-specific tools to walk your code and define custom transformations (<a href="http:&#x2F;&#x2F;www.pvk.ca&#x2F;Blog&#x2F;2014&#x2F;08&#x2F;16&#x2F;how-to-define-new-intrinsics-in-sbcl&#x2F;" rel="nofollow">http:&#x2F;&#x2F;www.pvk.ca&#x2F;Blog&#x2F;2014&#x2F;08&#x2F;16&#x2F;how-to-define-new-intrinsi...</a>) when generating assembly.<p>The only thing that prevents doing the same work than in C++ is that by default, you can redefine your class hierarchy at runtime: your server is running, you change your class definition and instances of that class have, for example, a new slot, properly initialized. Or, you change the class of your object (square -&gt; rectangle).