[Edu-sig] Webster Van Robot
Ian Bicking
ianb at colorstudy.com
Tue Sep 9 18:21:59 CEST 2008
Steve Howell wrote:
> There are some object-oriented variants of Karel the Robot:
>
> http://pclc.pace.edu/~bergin/karel.html
>
> Guido van Robot and Webster van Robot are purely procedural, which
> has the following benefits:
>
> 1) There's a lot less typing, which means more time for thinking,
> exploring, etc. 2) You can master simple, but fundamental, concepts
> like creating methods and nesting loops without the conceptual
> overhead of object-oriented programming.
>
> I would love to brainstorm ideas on creating a path from GvR and WvR
> to more object-oriented programming. IMHO you need to make sure you
> do it in a non-superficial way. For example, I would want your
> object space to be rich enough that you actually have objects that
> interface with each other.
The way it usually is presented in Logo is like:
TELL :robot [FD 10]
That is, you have some actors (activated with TELL), and you have
commands, and the commands are passed to the actors. There's a default
actor. Like everything else in logo, it is dynamically scoped, not
lexically, which makes methods and functions less distinct. That is, if
you do:
TO SQUARE :size
REPEAT 4 [FD :size RT 90]
END
TELL :robot [SQUARE 100]
then even though SQUARE is a procedure, it uses FD, and FD is a method.
Or, something like a method.
Anyway, it's not exactly applicable to Python, though it could be.
Here's a factoring of turtles:
class active_method(object):
def __init__(self, func):
self.func = func
def __get__(self, obj, type=None):
if obj is None:
# Maybe with some default too, like the turtle module lazily
# creates an instance
obj = type.active_turtles[-1]
return new.instancemethod(self.func, obj, type)
class Pen(turtle.Pen):
active_objects = []
def __enter__(self):
self.__class__.active_objects.append(self)
return self
def __exit__(self):
active = self.__class__.active_objects
assert active[-1] is self
active.pop()
@active_method
def fd(self):
whatever fd does...
... and so one, with more @active_method...
fd = Pen.fd
... and again, for every method ...
def square(size):
for i in range(4):
fd(size)
rt(90)
with Pen():
setxy(100, 10)
square()
--
Ian Bicking : ianb at colorstudy.com : http://blog.ianbicking.org
More information about the Edu-sig
mailing list