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