Questions - RE: Dynamic scoping
Avi Bryant
avi at beta4.com
Wed Jan 29 01:57:57 UTC 2003
On Tue, 28 Jan 2003, Anthony Hannan wrote:
> Avi Bryant <avi at beta4.com> wrote:
> > > 2) If the answer to 1) is "yes", then couldn't the dynamic
> > > scoping be accomplished by using accessor
> > > methods instead of direct references to named objects?
> >
> > I think Anthony's code does largely that. It doesn't do what I want,
> > however, because there's no guarantee that the values will be restored if
> > I reenter the same dynamic scope.
>
> Do you mean:
>
> foo
> [self bar] in: (WorldHandler newWithWorld: [x])
>
> bar
> thisContext outer world
>
> WorldHandler>>world
> ^ worldBlock value
Well... almost. If I were going to build my idea of a dynamic scope
mechanism on top of yours, it would be more like this:
foo
|x|
...
[self bar] in: (WorldHandler newWithGet: [x] set: [:v | x := v])
WorldHandler world
^ getBlock value
WorldHandler world: aWorld
getBlock value: aWorld
But actually the crucial thing here (again, for me) is that x is a temp,
not an inst var, and so that binding will get copied when the stack does.
> foo
> [self bar] in: {#world -> [x]. #user -> [y]}
>
> bar
> thisContext outer world
>
> I originally rejected this because creating an array, associations, and
> blocks each time was wasteful, especially for handlers with many
> method/blocks. But now I'm thinking the compiler can interpret this
> specially, like it does with #ifTrue:, and create a single multi-method
> block instead of many blocks and associations. A multi-method block
> would be like a block closure except it would respond to multiple
> messages instead of just #value. I believe Self has multi-method blocks
> (I don't know what terminology they use).
This feels to me (as does the entire mechanism, to be honest) like an
unnecessary abuse of doesNotUnderstand - I'd rather not have DNU tricks
used at so basic a level, personally. But maybe that's just me.
Avi
More information about the Squeak-dev
mailing list
|