NPE in reify.

5 views
Skip to first unread message

David Brown

unread,
Dec 24, 2009, 2:51:45 AM12/24/09
to clo...@googlegroups.com
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.

David

Rich Hickey

unread,
Dec 29, 2009, 1:58:45 PM12/29/09
to clo...@googlegroups.com

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

David Brown

unread,
Dec 29, 2009, 6:49:01 PM12/29/09
to clo...@googlegroups.com
On Tue, Dec 29, 2009 at 01:58:45PM -0500, Rich Hickey wrote:

>(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

Reply all
Reply to author
Forward
0 new messages