[Python-Dev] generator/microthread syntax
Wade Brainerd
wade at treyarch.com
Tue Nov 18 19:12:13 EST 2003
Hello, I'm working on a game engine using Python as the scripting
language and have a question about generators.
I'm using what I guess are called 'microthreads' as my basic script
building block, and I'd like to know if there is some kind of syntax
that could make them clearer, either something in Python already or
something that could be added.
Here's an example script that illustrates the problem.
from jthe import *
def darlene_ai(self):
while True:
for x in wait_until_near(player.po.w,self.po.w): yield None
begin_cutscene(self)
for x in wait_face_each_other(player.po,self.po): yield None
if not player.inventory.has_key("papers"):
for x in say("Hi, I'm Darlene! I found these papers,\ndid
you lose them?"): yield None
else:
for x in say("Hey, I'm new to this town, wanna go out
sometime?"): yield None
end_cutscene(self)
if not player.inventory.has_key("papers"):
spawn(give_item("papers"))
for x in wait(2.5): yield None
Now in our in-house script language the above code would look very
similar, only without the
for x in <call>: yield None
constructs. Instead, subroutines with a wait_ prefix execute yield
statements which are automatically propogated up the call stack all the
way to the thread manager.
Is there anything to be done about this in Python? I can see it
implemented three ways:
1. A new declaration for the caller function. yield statements
propogate up the call stack automatically until the first
non-microthread function is found.
microthread darlene_ai(self):
...
2. A special kind of exception. The wait_ function throws an exception
containing the current execution context, which is caught by the thread
manager and then later resumed. Generators would not be used at all.
3. A new yield-like keyword, which assumes that the argument is a
generator and whose definition is to return the result of
argument.next() until it catches a StopIteration exception, at which
point it continues. This is just shorthand for the for loop, and would
look something like:
def darlene_ai(self):
while True:
wait until_near(player.po.w,self.po.w)
Anyway, thanks for your time, and for the amazing language and modules.
-Wade
More information about the Python-Dev
mailing list