In #Clojure Rich mentioned today that we can define our own data
structures on top of the existing ones.
Maybe someone wants/needs his own version of vectors that rearrange
automatically in some specific order or whatever.

If I now want to add something that works nearly like lists, but a
little bit different, and for which I can use all functions that work
for lists, I will have to use a proxy.
Chris Houser implemented a little helper tool:
http://paste.lisp.org/display/67122#1

Now what I would like to see are some minimal examples on how to do
that. Lists are a good candidate as they only have 6 methods which we
need to implement:


user> (show clojure.lang.IPersistentList)
===  #=clojure.lang.IPersistentList  ===
[ 0] cons : interface clojure.lang.IPersistentCollection (1)
[ 1] count : int (0)
[ 2] empty : interface clojure.lang.IPersistentCollection (0)
[ 3] peek : class java.lang.Object (0)
[ 4] pop : interface clojure.lang.IPersistentStack (0)
[ 5] seq : interface clojure.lang.ISeq (0)
nil


The numbers in parens at the end tell us how many parameters the
methods should have. They have a hidden one more. We can magically
use “this”.

Here is what I tried:

user> (defn make-lyst [& items]
        (proxy [clojure.lang.IPersistentList] []
               (cons [obj] (cons obj this))
               (count []   (count this))
               (empty []   ())
               (peek  []   5)
               (pop   []   6)
               (seq   []   this)))


As I found no examples yet, I was hoping this would return an instance
of my own list type.
(make-lyst 1 2 3) would print like normal lists:  (1 2 3)
And it would use the cons function of lists, dito for counting.
(empty lyst) would return an empty IPersistentList, peek always a 5,
pop
always a 6 and seq the list object itself.


But unfortunately (make-lyst 1 2 3) ==>
java.lang.ClassCastException: clojure.lang.Proxy__5307 cannot be cast
to clojure.lang.ISeq


Any ideas how this should be done so that it will work?
--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to