[Python-3000] Lexical Scoping and Javascript

Nick Coghlan ncoghlan at gmail.com
Sun Jul 9 04:03:15 CEST 2006


Talin wrote:
> I'd like to encourage those who are interested to read the Javascript 
> document carefully (in particular, all of the sections describing 'let', 
> and the 'dictionary assignment' feature) and think about how this line 
> of thinking might affect the discussion here.
> 
> Who knows, perhaps there might be some cross-borrowing :)

Interesting, very interesting.

The 'let' statement/expression does seem like a very reasonable approach to 
the early binding/late binding question, since the order of writing matches 
the order of execution.

Try this for an adaptation to Python:

   let NAME=EXPR in EXPR2    # Early binding expression

   let NAME=EXPR in:         # Early binding statement
       SUITE

Instead of the single NAME=EXPR part, you could also use a sequence of 
assignments (similar to keyword arguments).

The let statement would create a new local scope, similar to def. Unlike def, 
the new local scope is executed immediately, rather than being kept around for 
later execution.

Just like a nested function definition, assignment statements in the body of a 
'let' statement would *not* be able to write to the outer scope in the absence 
of some form of 'nonlocal' declaration.

The expression form would be essentially equivalent to:

   (lamda NAME=EXPR: EXPR)()

And the statement form would be equivalent to:

   def _hidden1(NAME=EXPR):
       SUITE
   _hidden1()
   del _hidden1

To make the following use early binding instead of late binding:

     def f():
         funcs = []
         for i in range(10):
             funcs.append(lamba: i)
         return funcs

 >>> [x() for x in f()]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]


You could do either:

     def f():
         funcs = []
         for i in range(10):
             let i=i in funcs.append(lamba: i)
         return funcs

Or:

     def f():
         funcs = []
         for i in range(10):
             let i=i in:
                 def inner():
                     return i
                 funcs.append(inner)
             # 'inner' is NOT defined anymore!
         return funcs

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org


More information about the Python-3000 mailing list