On Feb 26, 12:00 am, dmiller <dmiller2...@gmail.com> wrote:
> Regarding the Sequential interface:
>
> There are a number of places where (x instanceof Sequential) is taken
> to imply something else about x:
>
> (a) that casting in the form of ((IPersistentCollection)x) is okay,
> or
> (b) that RT.seq(x) will succeed, or
> (c) that Rt.count(x) will succeed
>
> Note that (a) implies (b) and (c).
>
> In arbitrary code, these conclusions do not necessarily follow.
>
> Occurrences (same in both pre- and post-lazy change codebases)
>
> Type (a):
>
> APersistentVector.doEquals
> APersistentVector.doEquiv
> PersistentQueue.equals
> PersistentQueue.equiv
> RT.nth
>
> Type (b):
>
> ASeq.equals
> ASeq.equiv
>
> Type (c):
>
> PersistentList.EmptyList.equals
>
> Sample code: PersistentQueue.equals:
>
> public boolean equals(Object obj){
>
> if(!(obj instanceof Sequential))
> return false;
> ISeq ms = ((IPersistentCollection) obj).seq();
> ...
>
> }
>
> Sample code: ASeq.equiv:
>
> public boolean equiv(Object obj){
>
> if(!(obj instanceof Sequential || obj instanceof List))
> return false;
> ISeq ms = RT.seq(obj);
> ...
>
> The following interfaces extend Sequential: IPersistentList,
> IPersistentVector, ISeq
>
> In core.clj, Sequential is used only in the definition of (sequential?
> x).
>
> Why does Sequential exist at all? Why not just use
> IPersistentCollection?
> Are the listed interfaces the only ones intended to extend Sequential?
> Is there an implicit charge to anyone extending/implementing
> Sequential to guarantee (a), (b), (c)?
>
> Put another way, is there any meaning to being Sequential but not
> IPersistentCollection?
>
Sequential is a marker interface. It doesn't imply the success of
casts that follow it, they are independent tests. Sequential is used
to help partition the collections space for equality purposes, so
sequentials/sets/maps are never equal to things outside of their
'category'. Sequential unifies vectors/lists/seqs.
Chouser did a great graph:
http://github.com/Chouser/clojure-classes/raw/master/graph-w-legend.png
Rich
--~--~---------~--~----~------------~-------~--~----~
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
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
-~----------~----~----~----~------~----~------~--~---