About Self implicit receiver
Jecel Assumpcao Jr
jecel at merlintec.com
Sun Sep 28 22:05:51 UTC 2003
Stef,
Avi and Benjamin already gave some good explanations, so I will just add
some less obvious details. Note that there is a self-interest list at
YahooGroups, though I don't think the folks here will mind an
occasional non-Squeak question.
The model that is presented to the programmer (the actual implementation
is quite different, but totally hidden) is that a method object is
cloned to create the corresponding context object. When this cloning
takes place, the method's "self*" slot is set to the receiver of the
message. The "*" indicates that this is a parent slot, so a message
sent to the context object and not found there will be looked up in the
receiver.
So the implicit self is more like "thisContext" in Smalltalk than like
"self".
Note that block and blockContexts can be exactly like methods and
contexts except that they have a "lexicalParent*" slots instead of a
"self*" one. So "self" still refers to the receiver of the outermost
lexical context, as it should.
Here is what the lookup of the unary message "set" looks like with an
implicity self receiver inside a nested block:
thisContext has no 'set' slot=>look in lexicalParent*
blockContext has no 'set' slot=>look in lexicalParent*
context has no 'set' slot=>look in self*
a circleMorph has no 'set' slot=>look in parent*
traits circleMorph has no 'set' slot=>look in parent*
traits morph has no 'set' slot=>look in parent*
traits clonable has no 'set' slot=>look in parent*, cloning*,
comparing*, ordering*
lobby has no 'set' slot=>look in globals*, defaultBehavior*
globals has a 'set' slot, so we return that
I didn't follow the branches in the cloning*, comparing*, ordering* or
defaultBehavior* slots to make things shorter, but in a real lookup all
parents are searched.
At each step in the lookup, a 'set' slot would correspond to the
Smalltalk temp/arg, temp/arg, temp/arg, instance variable, class
variable, class variable, class variable, pool, global and global
respectively.
So the whole issue, here, is to present a single concept to the
programmer that can be used in several different situations.
It is interesting that Brian has eliminated the "self*" slot in Slate,
so that the above lookup would not find the instance and class
variables. Instead, you have to explicitly send a message to one of the
arguments (the first one is named, and not "self" though I think you
can call it that for old time's sake). In Neo Smalltalk I went one step
further and eliminated the globals.
-- Jecel
More information about the Squeak-dev
mailing list
|