state machine and a global variable

Michael Sparks ms at cerenity.org
Sun Dec 16 16:32:52 EST 2007


tuom.larsen at gmail.com wrote:

> Basically, I agree that often the local state is much more useful. It
> just seems to me that for some application it's an overkill. Like say,
> for Turtle [1] (no jokes, please :) or PostScript [2].

Sounds also a bit similar to what happens under the hood in Open GL and some
other systems which revolve around display lists. The approach generally
taken there is to recognise that you often have a "current" context which
is being operated on.

A basic version of this might look like this:

file: statemachine_user.py

#!/usr/bin/python

from statemachine import *

context = statemachine()
context2 = statemachine()

set_context(context)
set_state(3)
print get_state()

set_context(context2)
set_state(1)
print get_state()

set_context(context)
print get_state()


file: statemachine.py

#!/usr/bin/python

class statemachine(object):
    def __init__(self):
        self.state = None
    def set_state(self, value):
        self.state = value
    def get_state(self):
        return self.state

context = statemachine()

def set_context(somecontext):
    global context
    context = somecontext

def set_state(value):
    context.set_state(value)

def get_state():
    return context.get_state()

A more interesting example which probably relates closer to your example,
and also can be quite useful for interpretting little languages is where
the "states" that get stored are matrices representing transforms and are
used to put objects into a 3D space. 

You might in that circumstance want to use your a statemachine more like
this: (this code is untested)

class statemachine(object):
    default = None
    def __init__(self, **argd):
        self.__dict__.update(**argd)
        self.state = self.default
    def set_state(self, value):
        self.state = value
    def get_state(self):
        return self.state

context = [ statemachine() ] # default context

def push_context(somecontext):
    global context
    context.append( somecontext )

def pop_context(somecontext):
    global context
    return context.pop( -1 )

def set_state(value): context[-1].set_state(value)

def get_state(): return context[-1].get_state()

def get_allstates(): return [ x.get_state() for x in context ]

This isn't really quite what the do, but gives a different possible
perspective.


Michael.
--
http://yeoldeclue.com/blog
http://kamaelia.sourceforge.net/Developers/




More information about the Python-list mailing list