On Thu, Dec 24, 2009 at 2:51 AM, David Brown <[email protected]> wrote:
> The following generates an NPE during compilation:
>
> (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.
>
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
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en