Thanks! The similarity is no accident: When you consider it, 'isa?' is a generalized subtyping relation:
(isa? Double Number) ==> Double <: Number (isa? ::goat ::animal) ==> ::goat <: ::animal (isa? 1 x) ==> #{1} <: x, which makes sense if you define the value x to mean "the set of all things equivalent to x" Specifically for the keyword case, clojure.core lets you define ad hoc hierarchies, which you could view as type lattices. This project lets you define ad hoc type lattice relations. You might be interested in the papers on LIFE. They define "sorts" for logic terms (very much like types), and an algorithm for unifying two terms (which can be quite a bit more complicated than Prolog terms). On Wednesday, July 11, 2012 2:22:51 AM UTC-4, Ambrose Bonnaire-Sergeant wrote: > > This is cool :) > > It reminds me of subtyping between maps in Typed Clojure, where > > {:a 1, :b 2} <: {:a Number} > > Thanks, > Ambrose > > On Wed, Jul 11, 2012 at 2:16 PM, Leif <leif.poor...@gmail.com> wrote: > >> Hi, everybody. I reimplemented the function isa? in terms of a protocol >> Is-A. >> >> The reason why you would want to do that is in the README at >> https://github.com/leifp/clj-isa-protocol >> >> tl;dr: One of the reasons why people are excited about predicate >> dispatch is the irritation caused by the dispatch function of a multimethod >> being closed. You have to decide up front what information the dispatch fn >> is going to pull out of your arguments. Changing it afterward is a pain. >> >> Since the dispatch uses 'isa?' internally, if that function is >> extensible, then multimethod dispatch becomes, to a certain extent, open. >> See the README. >> >> Comments, critique, code, and questions welcome. >> >> Cheers, >> Leif >> >> P.S. As an aside to people that like weird, obscure programming >> languages, the rough idea of how is-a? should work for maps was inspired by >> (but very much simpler than) the functional logic language LIFE [ >> http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.90.3175 ] >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clojure@googlegroups.com >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+unsubscr...@googlegroups.com >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en > > > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en