Your implementation of cons in your deftype is probably being associated to 
the ISeq type, not IPersistentCollection.

user=> (deftype Foo [a b] 
  #_=>   clojure.lang.IPersistentCollection 
  #_=>     (cons [_ c] [a b c]))
user.Foo
user=> (conj (Foo. 1 2) 3)
[1 2 3]

I think Vector supports ISeq through the Seqable interface but not 
directly. So your type Foo may not need it:

user=> (.cons [] 1) ; ok
[1]
user=> (.first [] 1) ; ??
IllegalArgumentException No matching method found: first for class 
clojure.lang.PersistentVector  clojure.lang.Reflector.invokeMatchingMetho

On Wednesday, September 3, 2014 10:13:36 AM UTC-7, Karsten Schmidt wrote:
>
> Hi all, 
>
> I've defined a custom vector type and implemented various clj/cljs 
> protocols, but now ended up hitting my head against some weird behaviour 
> with conj (or rather cons, internally). The type 
> defines a 2-element vector-like construct and my cons 
> implementation would simply return a standard 
> clojure.lang.PersistentVector with the given arg added like this: 
>
> (deftype Foo [a b] 
>   clojure.lang.IPersistentCollection 
>   clojure.lang.Indexed 
>   clojure.lang.Sequential 
>   clojure.lang.ISeq 
>   clojure.lang.Seqable 
>   clojure.lang.Reversible 
>   ;; ... elided seq fn impls... 
>   (cons [_ c] [a b c])) 
>
> However, attempting a conj results in an exception I don't understand: 
>
> (conj (Foo. 1 2) 3) 
> java.lang.ClassCastException: clojure.lang.PersistentVector cannot be 
> cast to clojure.lang.ISeq 
> at user.Foo.cons (foo.clj:13) 
> user.Foo.cons (foo.clj:-1) 
> clojure.lang.RT.conj (RT.java:562) 
> clojure.core$conj.invoke (core.clj:83) 
> ... 
>
> As far as I can tell, clojure.core/conj simply calls RT.conj(coll, x), 
> which just calls 
> coll.cons(x): 
>
>
> https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/RT.java#L604
>  
>
> static public IPersistentCollection conj(IPersistentCollection coll, 
> Object x){ 
>   if(coll == null) 
>     return new PersistentList(x); 
>   return coll.cons(x); 
> } 
>
> So where in that call path is there an attempt or requirement to cast 
> to an ISeq? 
>
> I've been comparing notes (as far as this possible) with the default 
> PersistenVector implementation, but not sure where I'm going wrong 
> here... 
>

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to