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