First try:a skiplist implementation

Brian Rice water at tunes.org
Tue Jan 11 10:50:41 PST 2005


I have made the said corrections and checked these into CVS as files 
src/lib/skiplist.slate and tests/skiplist.slate. One test failed, the 
#newPointerLength test. I haven't investigated it. Let me know if there 
are any issues. :)

On Jan 11, 2005, at 10:08 AM, Brian Rice wrote:

> Welcome. :)
>
> On Jan 11, 2005, at 6:29 AM, Márton Sasvári (IJ/ETH) wrote:
>
>> Hi,
>>
>> I was starting to study Slate recently. As an exercise I've 
>> implemented a skiplist as there wasn't one in the collection library. 
>> Naming (SkipListNode) came from the Squeak implementation but as I 
>> developped it test-first there should not be too much resemblance 
>> with it.
>
> Cool!
>
>> Unit test are at the end of the file.
>
> Doubly so!
>
>> I would appreciate any comments on style, language use, etc.
>> Tested on Slate-0.3.1 but if I followed the list thoroughly there was 
>> no language spec change in the basic features besides delegation what 
>> I did not use in that depth.
>
> That's right - this program should work fine in current-CVS Slate.
>
> There's one issue that could expose a bug later, that you are using 
> RandomStream itself instead of calling newSeed: to get a fresh one. 
> That could cause contention in the presence of concurrency.
>
> As for style, mostly I would say that you can now take advantage of 
> the `>> macro (cascade syntax) to change:
>
> sl@(SkipList traits) newEmpty
> [| newSL |
>   newSL: sl clone.
>   newSL pointers: (Array newSize: 5).
>   newSL maxLevel: 5.
>   newSL numElements: 0.
>   newSL
> ].
>
> into:
>
> sl@(SkipList traits) newEmpty
> [sl clone `>> [pointers: (sl pointers newSize: 5). maxLevel: 5. 
> numElements: 0. ]].
>
> I also changed the #pointers initialization to refer to the existing 
> slot, which requires that it be set up in the named-prototype, but it 
> also means that the code is less brittle, since the underlying 
> implementation isn't hardcoded so much (which allows for dynamically 
> changing it and getting forward-propagation of it, although in 
> SkipList's case it may not matter).
>
> Furthermore, you can make SkipListNode an "attribute type" of 
> SkipList, like so:
>
> (SkipList traits addPrototype: #Node derivedFrom: {Cloneable})
>   `>> [addSlot: #pointers. addSlot: #object. ].
>
> And then you can refer to the named prototype as "SkipList Node" or 
> "<myList> Node".
>
> Everything else looks pretty good, although I may spend some time 
> cleaning up the control-flow of the larger methods to make them a 
> little more clear before checking this into CVS (you don't mind, do 
> you?).
>
> Thanks!
--
Brian T. Rice
LOGOS Research and Development
http://tunes.org/~water/




More information about the Slate mailing list