(deftype Small [])
(defn wrap []
(reify Small))
Obviously, my real use has more interfaces I implement, but this shows
the problem.
My problem is that I need to override 'print-method', which is using
defmulti off of 'type' of it's argument. I guess I could also
implement IMeta and provide a tag as well. But, the workaround I've
been using is to create an empty interface in Java, which reify is
happy to implement.
David
The name Small doesn't designate a class name. It is in fact a factory fn:
(deftype Small [])
(fn? Small)
true
(Small)
#:Small{}
So you can't reify Small any more than you could reify first or rest.
The error/message certainly could be better.
If you were using AOT, you would have a class named your.ns.Small. But
when used dynamically, that class will be something like
your.ns.Small__42.
However, deftypes are designed to be used dynamically and participate
in the 'type' system. The 'type' of a (dynamically or AOT-defined)
Small instance will be a keyword:
(type (Small))
:user/Small
You can use this keyword type tag for multimethod dispatch.
I am a bit confused as to why you would want to reify a deftype. You
can reify protocols, however.
Rich
>(type (Small))
>:user/Small
>
>You can use this keyword type tag for multimethod dispatch.
I did eventually figure this out.
>I am a bit confused as to why you would want to reify a deftype. You
>can reify protocols, however.
I need to make something that defines it's own Comparable, and I also
want a custom printer for it. Once I figured out that the multimethod
dispatch in the printer uses type, and I can just use that on the
deftype name, it got much easier.
Hopefully there isn't too painful a transition period moving from
multimethods to protocols.
Thanks,
David