On 3 February 2014 14:49, Tobias Pape Das.Linux@gmx.de wrote:
On 03.02.2014, at 15:28, Frank Shearar frank.shearar@gmail.com wrote:
On 3 February 2014 13:48, commits@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