Update: This appears to have been the product of a funky state.

Restarting with a new swank service seems to have removed the problem.

- e in sd



On Oct 15, 8:04 am, Eric in San Diego <eric.sc...@acm.org> wrote:
> Hi all -
>
> I'm experiencing some unexpected behavior with protocols. Stripping
> out extraneous details...
>
> ;;;;;;;;;;;;;
> (ns my.ns1
> ...)
>
> (defprotocol pro-1
>  ...)
>
> (deftype T1 [...]
>    pro-1
>    ...)
>
> (defn fun [p]
> ^{:pre [(satisfies? pro-1 p)
>        ]
>  }
>  ...)
> ;;;;;;;;;;;;;;;;
> Then in another file:
> (ns my.ns2
>     (:use [my.ns1]))
>
> (deftype T2 [...]
>          pro-1
>          ...)
>
> ...
> ;;;;;;;;;;;;;;;;;;;;;;;;;
> Then in a third file
> (ns my.ns3
>    (:use
>     [my.ns1]
>     [my.ns2]))
>
> (defn ...
>  (let [x (T2. ...)
>      ]
>      ...
>      (fun x)
>      ...))
>
> This throws an error saying that 'x' does not satisfy the protocol.
>
> Looking at the documented source of 'satisfies?', I see that this
> amounts to asking
> (instance? (:on-interface pro-1) x), which => false.
>
> (:on-interface pro-1) => my.ns1.pro_1
>
> but (class x) => T2 and (supers T2) => #{my.ns1.pro_1
> java.lang.object}
>
> Also, just to check (instance? T2 x) => true.
>
> What am I not getting here? How can x be an instance of T2 and not be
> an instance of one of its supers?

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

Reply via email to