On 20 Oct 2009, at 18:00 , MRAB wrote:
Bruce Leban wrote: I'd prefer:
def foo(): a = 1 b = 3 def bar(): nonlocal * local b a = 2 b = 4 return (a,b)
if a later 'local' can override an earlier 'nonlocal', or:
def foo(): a = 1 b = 3 def bar(): local b nonlocal * a = 2 b = 4 return (a,b)
if a 'nonlocal' can act as a catch-all for any names not previously mentioned.
If you go that route, I'd suggest removing all the legacy stuff and just using "let" to create a new binding in the current scope: def foo(): let a = 1 let b = 3 def bar(): a = 2 let b = 4 bar() return (a, b) # returns (2, 3) Plus it allows the compiler to statically catch typos: def foo(): let some_very_complex_type = 42 def bar(): some_very_complex_typo = "oh noes" # not a new binding, no existing binding for that name => warning(*) bar() return some_very_complex_type You can even get "two in one" and use the keyword to create explicit scopes: def foo(): let foo="whatever", bar=42: do_something_with(foo, bar) return foo # warning, no foo in scope which would probably be useful mostly for code clarity purposes. *: warning, not error, because the programmer could be manipulating locals() directly, or something like that.