unintuitive select

Brian Rice water at tunes.org
Sat Jul 17 15:40:10 PDT 2004


On Jul 3, 2004, at 1:01 PM, Brian Rice wrote:
> On Jul 3, 2004, at 12:04 PM, Brian Rice wrote:
>> No, it's a feature. It's part of ANSI Smalltalk that select: and 
>> reject: don't re-position elements. Dictionaries and other Mappings 
>> work the same way.
>>
>> If you want just the selected elements, you can do:
>>
>> ({1. 2. 3} reader select: [| :a | a > 2]) contents.

I should amend this; I recoded CollectStream and FilterStream and 
didn't take the time to test them. Currently #contents is not done for 
those stream types. I am about to add it. However, #upToEnd works in 
just the right way, so that's doable. There are a couple of bugs that I 
also need to fix... needless to say, we aren't using these stream types 
yet, but I think this should change, so I'll commit to making them work 
well.

> For those of you who aren't familiar with this idiom (probably nearly 
> everybody), it's first creating a ReadStream on the sequence 
> (specialized to whatever type you request from, here an array), and 
> collect: and select: are defined on ReadStreams to return another 
> ReadStream (a FilterStream and CollectStream, respectively) which 
> returns each result when you call "next" on it. The Filter just 
> searches and returns the next matching element, and the Collector just 
> applies the block to each element from the source and returns the 
> result. This is about two screenfuls of code near the end of 
> src/stream.slate.
>
> Basically, Streams are Sequences without position (handy if you don't 
> care whether some data source is infinite or not, or ordered or not), 
> which is why they "forget" position whereas Sequence's select: doesn't 
> "forget". "contents" of course gathers the elements into an actual 
> concrete collection. There was a big discussion on the Squeak list 
> about whether Sequence's select: should "forget", and it's generally 
> safer in terms of the type/behavior of objects for it not to forget. 
> Plus, you can actually use that information later, so the extra two 
> steps to leave the information behind seems not too bad a cost.
>
> It may actually be nice to make some selectors for this "forgetting 
> select:" to encapsulate "(x reader select: []) contents", but I can't 
> think of a decent name for such a thing.
>
> It just occurred to me that there's no reject: for them. I'll add that 
> since there's an easy definition.
>
>> On Jul 3, 2004, at 7:33 AM, John Leuner wrote:
>>
>>> Slate 1>  {1.2.3.} select: [ | :a | a > 2 ].
>>> {Nil. 3}
>>>
>>> {1.2.3.4.5.6.7.8.9.}  select: [ | :a | a > 2 ].
>>> {Nil. 3.4. 5.6. 7.8.
>>>         9}
>>
>> THIS, on the other hand, is you confusing the parser. :D Liberal use 
>> of periods between digits without separators is liable to make it 
>> think you want Floats and not Integers.

--
Brian T. Rice
LOGOS Research and Development
http://tunes.org/~water/




More information about the Slate mailing list