Why there are so many ignorant idiots in the world?
According to Alan Kay, the essence of OO approach (or paradigm if you wish) is a synthesis of a few fundamental concepts (like a Lisp itself) where not a single one can be removed because harmony (or balance) would be destroyed, and an ugly, mediocre construction would emerge instead (Java).
The concepts are:
* First-class closures - isolated, share-nothing abstractions.
* Nesting of closures, so they could have an internal structure.
* Message passing as the only way of communication among closures.
As long as you follow these three principles, you have "generics" for free, because all the operations are mere messages.
These are three of four principles upon which Smalltalk has been built upon.
Here is an illustration, assuming that we are implementing message passing as simple as a procedures call.
(define (kons x y)
(lambda (m)
(cond ((eq? m 'car) x)
((eq? m 'cdr) y)
(else (error "bottom!")))))
(define (kar x)
(x 'car))
(define (kdr x)
(x 'cdr))
Notice that using only these abstractions we could implement a unified list structure of Lisps (recall Escher's hands).
This is (surprise!) the "core" of Erlang - extending of closure-based language with immutable data with explicit message-passing, to create first-class agents (servers, etc).
Where is inheritance? Inheritance is just a protocol which specifies what to do with unknown message instead of signaling an error or returning a bottom like in Haskell.
What is MOP could be found in Wikipedia. Smalltalk was its ancestor.
What is CLOS? It is a DSL embedded in a Lisp (based on structures made out of closures) which implements some or other subset of MOP. MIT Scheme, for example, has SOS.
So FP meet OP in CLOS.