[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: multicasting (was: idea: slices)
Jecel wrote:
> Rainer Blome wrote:
> > I was looking for a way to allow `selection do: [moveBy: distance. ]'.
> > ... Am I missing something ...?
> Blocks are lexically scoped, so the receiver of the moveBy:
> message will be the receiver of the method that executes this
> expression ...
That's why I said that `I was looking for a way to allow ...'.
After sending my last message, it occurred to me that I wanted
`moveBy:' to be sent to the selection member, and `distance' to the
implicit self that sends `do:'. So it'll never work like that.
Either way, distance is a message to the sending context. How
often is it supposed to be sent? Once for each element of the
selection? Imagine this in a distributed environment.
In my view, the main advantage of `blocks as messages' is better
locality. Evaluation of the block (at least conceptually) happens
at the elements' sites, the selection is not involved any more.
With the `:value' method, it is the selection or the owner of the
block who conceptually does the work.
A mechanism to initialize a block's slots with locally computed
values would be useful. Is there a way to package the result of
sending `distance' in such a way that it is local to the block
being sent? (I'm not sure whether I am expressing myself clearly
here.)
To do this in Self, one has to pack up all that is needed in a
throwaway object, then pass it to the block given to `do:' along
with the element (this probably has the usual glitches):
(| proxy= (| parent* = traits clonable.
distance <- nil.
speed <- nil. |). |
proxy distance: distance.
proxy speed: speed.
selection do: [| :element. :proxy. environment* <- nil. |
environment*: proxy clone. -- Now we have local references
element moveBy: distance With: speed.
] With: proxy.
)
This looks awkward. But the block is free of free variables
now, so we can repackage this. The do:With: method could decorate the user
code (the last line) with what is needed to get the above behavior.
selection _define do: action With: proxy
(do: [| :element. environment* <- nil. |
environment*: proxy clone. -- Now we have local references
-- problem: how to eval action in this context here
action value: element.
].
)
Then a call could look like
selection do: [|:element| element moveBy: distance With: speed]
With: "distance: distance. speed: speed. " makeObjectHere,
where `makeObjectHere' creates the proxy.
This is getting lengthy, enough of this for now.
Rainer