Found 4 comments on HN
pjmlp · 2015-11-10 · Original thread
Multi-methods are how Lisp based languages have done OO since the early days.

LOOPS in Interlisp-D, here for a time travel to Xerox PARC.

Check the "LOOPS, A Friendly Prime" book.

Meta-methods are at the core of CLOS, Common Lisp Object System, made famous with the "The Art of Metaobject Protocol" book.

They are also used by Dylan, the Lisp with Algol like syntax developed by Apple,

Protocols provide the same type of polymorphism offered by Objective-C protocols, Java/C# interfaces, Go interfaces, ...

Many mainstream developers might only know one way of doing OO, but back in the day we could choose between Smalltalk, Lisp, Beta, Eiffel, Sather, C++, Modula-3, Oberon, Component Pascal, SELF, .....

Each had their own view how encapsulation, polymorphism, message dispatch, type extensions should take place.

So it is kind of funny to have some in FP languages bashing OO, while successful FP languages are actually hybrid. At the same time having people in teh OO side bashing FP, while their languages keep absorbing FP concepts.

Eventually we will get back to Smalltalk and Lisp, which already provided both ways in the late 70's.

If you haven't had the chance to read "The Art of the Metaobject Protocol" [0], I highly recommend it. It deserves to be mentioned anytime something like OMeta is mentioned.


perlgeek · 2011-12-15 · Original thread
Yes, lots of OO research happened and happens in smalltalk. Which is why it has such a flexible object system, and which is why it is so well suited for OO research :-)

The Common Lisp Object System (CLOS) also uses meta classes; there's a book about it: "The Art of the Meta Object Protocol",

Sadly it seems to be the only approachable resource on meta object systems, apart from a few research papers. If anybody has more literature reference, I'd be happy to learn about them.

Xurinos · 2010-12-10 · Original thread
His example is a little small to see how he would implement inheritance.

Also, inheritance is not a core requirement of OOP. Before you hit that downvote button, consider this: Inheritance allows your class to share attributes and behaviors with another class, and it allows code to recognize that instances of your class have those attributes and behaviors. In other words, when we say "is a", we really mean "does things that match the interface and meaning of". You can accomplish the same thing with "aspects" instead of "inheritance". Following that idea, it is simply a matter of introducing this simple API to add your behavior to an instance:

    add_aspect(&foo, 'Some Aspect Identifier');

And that's just the tip of the iceberg. Check out Art of the Metaobject Protocol ( for some huge eye-openers.

Get dozens of book recommendations delivered straight to your inbox every Thursday.