[Python-3000] Sky pie: a "var" keyword
Talin
talin at acm.org
Tue Oct 10 20:30:23 CEST 2006
You might want to check out this thread in which I proposed something
similar (and got similar objections):
http://mail.python.org/pipermail/python-dev/2006-July/066978.html
Neil Toronto wrote:
> As long as patches are flying willy-nilly and we're just kicking around
> ideas like puppies, I thought I'd offer one of my own.
>
> No, not a puppy. An idea. Of course, if it ends up beaten to death, I
> might rather it were a puppy. My apologies if it's been discussed in
> some other form.
>
> It occurs to me that some of Python's gotchas are due to the compiler
> not being able to determine whether the user intends to *create* a
> variable, or *modify* one.
>
> The "global" gotcha:
>
> x = 0
> def f():
> print x # 'local variable 'x' referenced before assignment'
> x = 3
>
>
> The "read-only lexical scoping" gotcha:
>
> def f():
> x = 0
> def g():
> x = 3 # doesn't alter outer 'x'
>
>
> And the "changing a writable property name is a very bad plan" gotcha.
> This bit me severely when I was first learning Python. I changed an
> attribute name from "x" to "value" in some Bayesian network code, and
> spent hours trying to determine why it wasn't working anymore. Turns out
> I missed a "node.x = " somewhere. Nowadays, I'd write a dummy property
> named "x" that throws an exception, but that seems an extraordinarily
> hackish thing to do to support an operation that happens a lot.
>
> A "var" keyword fixes them all. The "global" gotcha:
>
> x = 0
> def f():
> print x # no exception - prints "0"
> x = 3
>
> def g():
> print x # exception
> var x = 3
>
>
> The read-only lexical scoping gotcha:
>
> def f():
> var x = 0
> def g():
> x = 3 # alters outer 'x'
>
>
> And when the runtime encountered "node.x = " it would have complained
> that the variable didn't exist. The __init__ method would look like this:
>
> def __init__(self, stuff):
> var self.stuff = stuff
> var self.x = 0
> # ...
>
>
> If you don't like how it looks, we could call it "eric" instead:
>
> eric self.x = 0
>
>
> Of course, "var" isn't a swear word in any language (as far as I know),
> but "eric" is heinously rude in Swahili.
>
> Essentially, "var" means "make a new entry in the dictionary."
>
> Some Zen arguments:
>
> Explicit is better than implicit (are you creating? are you modifying?)
> Complex is worse than simple (it's slightly more complex), but complex
> is better than complicated (which the scoping semantics are now)
>
> It also has nice duality with the "del" keyword. Same number of letters
> and everything:
>
> var x = 0
> del x
>
>
> If type annotations ever got into Py3k, they'd go in very naturally.
> This might also enable some compiler optimizations.
>
> The biggest downside I can see is that it would break every scrap of
> Python code ever written.
>
> Another puppy to kick around: If that's totally unacceptable, how about
> making the default for assignment act on a variable in the outer scope
> if one exists, and have "var" override? This would allow read/write
> lexical scoping and put the "this is meant to be new in this scope"
> decoration at the point of declaration. (I also think "this is meant to
> be new" is much cleaner than "this is meant to be old," but that's just me.)
>
> Grovelingly,
> Neil
>
> _______________________________________________
> Python-3000 mailing list
> Python-3000 at python.org
> http://mail.python.org/mailman/listinfo/python-3000
> Unsubscribe: http://mail.python.org/mailman/options/python-3000/talin%40acm.org
>
>
>
More information about the Python-3000
mailing list