[Edu-sig] PySqueak: "Self" as the source of many ideas in Squeak

Paul D. Fernhout pdfernhout at kurtz-fernhout.com
Fri May 5 22:15:59 CEST 2006


Ian Bicking wrote:
> That's very hard to implement...

Probably true, at leas to do it in a  human readable way.

> For instance, imagine the user does this:
> 
>   x = [1, 2]
> 
> Then they get a handle on that [1, 2] list (we'll call it OB1) and do 
> "OB1[0] = 5".  How do we represent that as source?  Because they are 
> acting on actual objects, not bindings, and OB1 doesn't have any name, 
> nor will it exist at the same address in a second run of the program.
> 
> In order to turn this into source, you'd have to keep track of how you 
> can repeatably get to OB1 (I guess you'd see that it was named "x" 
> through source introspection?), and then translate operations on that 
> object into source that does operations on the path to that object.
> 
> I think doing this generally becomes infeasible, though you can get 
> close through successively more bizarre source code generation, until 
> you end up with something that looks like a Python-source version of 
> pickle, and even that won't work very well.

Just as reference to Squeak Smalltalk, it has a "changes" file that 
records each top level Transcript type interaction (equivalent to a Python 
shell in many ways) so that these can be replayed if you need to rebuilt 
an image from the last version you saved if there was a crash. That's not 
what I am proposing here.

But to address your specif example, maybe it does point to a paradigm 
shift. Is this what you would do in an interactive session for your example?
 >>> x = [1, 2]
 >>> OB1 = x
 >>> OB1[0] = 5
 >>> del OB1
 >>> x
[5, 2]
 >>> OB1
Traceback (most recent call last):
   File "<stdin>", line 1, in ?
NameError: name 'OB1' is not defined

But, your "program" in terms of an image at that point no longer needs to 
assign "x = [1, 2]". What it needs to do, to get back to where it is, is 
assign "x = [5, 2]" if I understand your example correctly? Basically, 
there is a bound variable in some scope, and a value it is. As long as 
objects are reachable, we can write them out starting from roots of the 
system (class path, the stack, modules and globals, and so on). Anything 
we cant; reach should have been garbage collected anyway (though might not 
have with CPython's reference counting system). So, we recreate the 
binding and the object in as simple a way as possible, to make the objects 
that are part of the accessible system. (Might make sense to combine this 
work with a true generational mark-and-sweep multiple-spaces tenuring etc. 
garbage collection system for Python? :-)

Maybe I don't understand the example?  As I see it right now, while it 
might be interesting to have a change log about how objects got to be how 
they are now, what counts when saving an image to a Python *.py file for 
future reload would be just their current structure and the name bindings.

As a note, remember that if there was a line of program code somewhere to 
create an object using a class, using "x = [1, 2" that line would be 
stored and regenerated as part of the class being stored. The fact that 
creating a new object using an
   "test = Spam()"
would assign
   test.x = 1
is independent of the fact that in recreating test, we might do:
   test = object()
   test.__class__ = Spam   # can this work? fails with a TypeError
   test.x = 5
or, with some sort of optimizing storage system geared to writing 
human-equivalent code rather than doing things one piece at a time:
   test = Spam()
   text.x = 5
Again, though maybe I am missing something obvious here?

Now, there may be a lot of things to improve this. I like your "make" idea 
in that regard, and perhaps other ideas could help with that as well.

You are absolutely right in Python syntax defining how to create a set of 
objects being more than declaring a specific structure. Forth has some of 
the same aspects (only worse!). It is a big headache in many ways to 
analyze Forth (as opposed to Smalltalk or Java or plain C) but Python now 
has the advantage that this approach of using a Python program to save the 
state of a sea of objects is more feasible.

Obviously somewhere you are going to have some code with a lot of 
declaration of temporary variables and deleting them for complex 
manipulation on structures. Perhaps this could require sort of engine to 
optimize how to do that in a human readable way, sort of like an 
optimizing compiler? A big task, but potentially doable for people who 
like that sort of thing.

--Paul Fernhout


More information about the Edu-sig mailing list