[Squeak-e] Re: Comments on Lex's "Object as Capabilities in Squeak"

Mark S. Miller markm at caplet.com
Sun Feb 2 10:19:04 CET 2003


At 11:48 PM 2/1/2003 Saturday, Mark S. Miller wrote:
>I think the real problem is that Squeak currently has a very rigid notion of 
>lexically nested levels of instantiation:
>
>Global
>Class/Factory
>Instance
>Method (activation frame)
>Block
>Block
>...

I don't know what I was thinking when I wrote that. Clearly, I was terribly 
confused. In Squeak, the Class/Factory level and the Global level are the 
same. I knew that, that's the origin of the problem we're wrestling with.

Also, "Method" is confused, about which more below.

I still make the same abstract recommendation, but the specific 
recommendation I made doesn't make any sense at all given the above mistake. 
Let's start again.

Let's model each level of instantiation in vaguely lambda terms. Clearly 
blocks are lambda-like, evaluating to block-closures which are closures. 
(Has Squeak fixed the old Smalltalk-80 bug, where block-closures weren't 
proper lexical closures? This bug must be fixed for Squeak-E.)

Method and Instance should be considered together as one level of 
instantiation. A message call and method dispatch can be described in lambda 
terms as

    An instance is a function of a message.
    A message call applies the instance-as-function to the message-as-argument
    The instance-function then does a switch or something on the message selector.
    A method is just a case of that switch.

Now, things start to get a bit messy. An instance's instance variables are 
declared by the class. A call on the class-as-factory instantiates the 
instance, but does not initialize the instance variables. Instead, by 
convention, an initialization method does so, which, as Lex points out, will 
require all Squeak-E programmers to write extra code to suppress redundant 
initialization, unless this convention is changed. I like the lambda 
solution to this problem, but there are others that are less disruptive to 
Squeak code, such as Java constructors. I leave it to y'all to judge which 
is more disruptive to Squeak taste.

The next level of state -- class variables, pools variables, classes 
themselves, metaclasses, class instance variable, global variables -- are 
all at the global level of instantiation -- as each such variable has one 
binding per global scope. Most of these are mutable, or enable mutable state 
to be reached. Many of these also convey authority. In Squeak-E, the only 
objects that can be at the global level of instantiation are transitively 
read-only ones (transitively immutable is preferred) that convey no authority.

What if the only classes that appeared directly at the global level of 
instantiation were those that lived comfortably in those conditions? Let's 
call these top-level classes.

What if all other class definitions appear in some method, where the 
in-scope variables at that place in the method (locals, parameters, instance 
variable, on out) are also in scope to the nested class definition, in 
proper lexical scoping fashion? Even Java does this correctly.

Then we could deal with "World" by having an outer class with "World" as a 
factory parameter, and it would instantiate inner class factories with World 
in scope. When these factories were then called to make instances, these 
would also have World in scope according to their instantiating context, not 
their calling context.

The above tale leaves Squeak-E more like Squeak but harder to implement in 
Squeak. Alternatively, if Squeak-E only has lexically nested instances and 
factories but not classes, then these can easily be implemented by expansion 
to top-level Squeak classes, where all the closed-over variables of the 
Squeak-E factory are turned into instance variables declared by a 
corresponding factory-class. Or, you could go the E way and have no 
primitive notion of a factory -- just make it a pattern. Then, a nested 
browser would correspond to an instance definition, and be an expression 
that evaluates directly to the instance. Less like Squeak, but easy to 
implement.


When I wrote this message, I did not intend it to lead to the conclusion "Do 
it the E way". However, I did things this way for certain reasons, and this 
discussion is helping me rediscover them. But having done it this way, these 
techniques have formed grooves in my mind it's all too easy to slip back 
into. I many very well be missing something.


----------------------------------------
Text by me above is hereby placed in the public domain

        Cheers,
        --MarkM



More information about the Squeak-e mailing list