[squeak-dev] The Inbox: Collections-ul.564.mcz

Frank Shearar frank.shearar at gmail.com
Mon Feb 3 15:01:04 UTC 2014


On 3 February 2014 14:49, Tobias Pape <Das.Linux at gmx.de> wrote:
> On 03.02.2014, at 15:28, Frank Shearar <frank.shearar at gmail.com> wrote:
>
>> On 3 February 2014 13:48,  <commits at source.squeak.org> wrote:
>>> A new version of Collections was added to project The Inbox:
>>> http://source.squeak.org/inbox/Collections-ul.564.mcz
>>>
>>> ==================== Summary ====================
>>>
>>> Name: Collections-ul.564
>>> Author: ul
>>> Time: 3 February 2014, 2:35:36.802 pm
>>> UUID: 4b9a37ef-df86-40a0-a0dd-8e8b2c04d4ed
>>> Ancestors: Collections-ul.563
>>>
>>> Make sure that Array >> #isLiteral won't get into an infinite recursion, even if the receiver has an recursive structure.
>>>
>>> =============== Diff against Collections-ul.563 ===============
>>>
>>> Item was changed:
>>>  ----- Method: Array>>isLiteral (in category 'testing') -----
>>>  isLiteral
>>> +
>>> +       ^self class == Array and: [
>>> +               self isLiteralIfContainedBy: IdentitySet new ]!
>>> -       ^self class == Array and: [self allSatisfy: [:each | each isLiteral]]!
>>>
>>> Item was added:
>>> + ----- Method: Array>>isLiteralIfContainedBy: (in category 'testing') -----
>>> + isLiteralIfContainedBy: parents
>>> +       " Answer whether the receiver has a literal text form recognized by the compiler. Precondition: the receiver is an instance of Array. "
>>> +
>>> +       (parents includes: self) ifTrue: [ ^false ].
>>> +       parents add: self.
>>> +       1 to: self size do: [ :index |
>>> +               | element |
>>> +               element := self at: index.
>>> +               (element class == Array
>>> +                       ifTrue: [ element isLiteralIfContainedBy: parents ]
>>> +                       ifFalse: [ element isLiteral ]) ifFalse: [ ^false ] ].
>>> +       parents remove: self.
>>> +       ^true!
>>
>> So this is a basic depth first traversal with cycle protection, yes?
>> (This pattern seems to crop up _a lot_. Maybe it's worth pulling out
>> as a separate algorithm?)
>
> Well, there are two such applications:
> One with an explicit down-handling of a variable (like this)
> and one with an implicit variable (semi-global)
>         (Dynamic variable, probably, at least thread-local)
>
> I would like to have both.
> I propose the (seaside-inspired) #use:during: message for the second.

Except that DynamicVariable's #use:during: is incompatible with
stack-slicing, because those kinds of dynamic variables aren't
delimited. (Unlike resumable exceptions, for instance.)

> However I cannot imagine a generic message for the first variant.

myArray depthFirstDo: [:each | each doSomething] havingVisited:
IdentitySet new ?

frank

> Best
>         -Tobias


More information about the Squeak-dev mailing list