On Tuesday, April 12, 2016 at 8:52:23 AM UTC-4, Didier Verna wrote:
>
> Mauro <[email protected] <javascript:>> wrote:
>
> > Maybe you can be a bit more explicit in what you mean, examples would
> > help too.
>
> Sorry for the fuzziness. This is an example of what I mean:
>
> let
> x = 10
> end
>
Your let is broken, it's a no-op. let always creates local bindings
xx = 20
let xx = 30
@show xx
end
@show xx
> xx=30
> xx=20
I agree that the hard/soft scoping rules are messy. In practice, it doesn't
seem to cause a lot of issues
>
> here, the same expression "x = 10" will either assign a new value to x
> if such a /global/ exists, or create a new /local/ binding. This is
> already bad enough[1]. Then, begin/end behaves differently. Then, "if"
> doesn't introduce a new block, but some others constructs do, and some
> don't. And then, some like "for" do or don't, it depends.
>
> Now even worse:
> x = 10
> function foo()
> println(x)
> x = 5
> println(x)
> end
>
> will break on the first println (one could expect to get 10, the global
> value for x) because since there is an assignment /later on/, a new
> /local/ binding will be created for x (which BTW is the exact opposite
> of what let does!), but this binding isn't available to the first
> println. And also, since a variable cannot switch from global to local
> (or vice-versa) in the same block, the intuition (well, mine anyway ;-))
> that after the assignment, the scoping changes, is wrong.
>
> And then, as you mention, nested functions will behave yet
> differently. All of this looks really bad.
>
> So IMHO, the real problem is that there are two distinct concepts:
> assigning a new value to an existing binding, and creating a new
> binding, possibly with an initial assignment. These are separate things
> and mixing the two in such ways is wrong, and also quite surprising,
> knowing the lispy side of this language.
>
>
>
> Footnotes:
> [1] consider that a simple typo in your code may lead to silently
> creating a new variable, which will never be used.
>
> --
> ELS'16 registration open! http://www.european-lisp-symposium.org
>
> Lisp, Jazz, Aïkido: http://www.didierverna.info
>