[Idle-dev] Running beginner Pythons

Terry Reedy tjreedy at udel.edu
Sat Oct 10 04:29:40 CEST 2015

Reconceptualizing for beginners...

Many people working with kids have asked for various changes to Python 
in order to make it easier for kids, sometimes very young.  Some 
variations have been requested more than once.

1. Simple looping: 'repeat/do/loop/for n [times]:' (take your pick of 
keyword) versus 'for i in range(n):'.

  The latest request is by Andre Roberge, today on python-ideas, in 
"Simpler syntax for basic iterations".  This inspired me to write this 
post.  The education hook he offered is that the variation eliminates 
the need for a loop variable in a context where variables are not 
otherwise used.  He has worked on robot programming for kids.

2. Simple function call: 'move 3', 'turn 90' (Logo, I believe) versus 
'move(3)' 'turn(90)' (Turtle).

3. Simple Native language keywords.  String-within-code translation is 
not suited for this.

These are all things I think are wrong for Python itself but possibly 
right for various learning situations.  For 18 years I have watched 
people try to change Python in ways like the above, when I think the 
energy would be better directed to writing good quality translation 

Of course, the latter would be more inviting if there were a place to 
plug them in.  I think IDLE is quite well suited to be such a framework. 
It would be possible now for one one alter Idle with a small patch -- if 
the locations were documented.  But I am thinking more about altering 
Idle slightly to make patching unnecessary.

The API for a translation function is trivial: str -> str (or 
SyntaxError with standard details).  Default: "def notran(code): return 
code".  I believe there are 2 places, for Shell and for editor code, 
where this could be called before compiling.  Referring back to the 
variations above...

1. The code for a single new keyword only used at the beginning of lines 
is simple.

def robotrans(codetext):
     out = []
     for i, line in enumerate(codetext.splitlines()):
         if line.startswith('repeat'):
             <check rest of line and either append translation
               or raise SyntaxError with proper details>
     return '\n'.join(outlines)

With a properly initialized SyntaxError, the error location should be 
marked in the editor as it is today.

2. Multiple line-beginning names are a bit harder, but not much, and the 
reformatting of 'name arg' to 'name(arg)' is simpler.

3. Multiple names anywhere are even harder to find, but a single word 
substitution is even easier.

IDLE would need to read, colorize, and write .pyx files.  A hook should 
allow to adjust the list of keywords and builtins.  Multiple plug-ins 
should be allowed.  A .pyx file should identify the plug-in needed to 
run it.

A big issue is whether plug-in code should be in a module to be imported 
or in a config file to be exec'ed, and whether either should be in 
idlelib, .idlers, or in a user-specified directory.

Thoughts welcome.

Terry Jan Reedy

More information about the IDLE-dev mailing list