News for hackers. Stuff that matters.
Re:Why Hy? by ashtonbaker on Tuesday May 03, 2022 @11:02AM (#31249195)
this made me wonder - I know I can use global variables inside a function definition:

    a = 1
    def foo():
      x = a
    foo()
so if this 'a' is a new variable, what happens when the name collides with a global variable?

    a = 1
    def foo():
      a = a
    foo()

    > UnboundLocalError: local variable 'a' referenced before assignment
yuck!
Re:Why Hy? by gilch on Tuesday May 03, 2022 @04:23PM (#31253107)
It works if you disambiguate your namespaces:

    >>> a = 1
    >>> def foo():
    ...     a = globals()['a']
    ...     print(a)
    ...
    >>> foo()
    1
Still yuck?
Re:Why Hy? by gilch on Wednesday May 04, 2022 @06:22PM (#31266628)
Here's another way to do it:

  >>> def foo():
  ...     import __main__
  ...     a = __main__.a
  ...     print(a)
  ...
  >>> foo()
  1
Re:Why Hy? by all2 on Tuesday May 03, 2022 @03:40PM (#31252562)
I'm not sure this is so much of a problem? Changing what you name the variable fixes the issue.

Python is generally quite good at having a verbose option to express things, so I'm surprised there's not an explicit way to reference the enclosing scope from an object.

Re:Why Hy? by vegai_ on Tuesday May 03, 2022 @03:40PM (#31252568)
Is there any non-horror piece of code where supporting this latter case would be useful?
Re:Why Hy? by m55au on Tuesday May 03, 2022 @03:47PM (#31252657)
It is not a particularly good example. A better one would be

    a = 1
    def foo():
      x = a
      a = 2
    foo()

    > UnboundLocalError: local variable 'a' referenced before assignment
Basically a name cannot be both global and local inside the same function. Otherwise it would be a total mess.

"a = a" just means assign the value of local variable "a" to a local variable "a", so the error makes sense.