Mauro <mauro...@runbox.com> 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

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

Reply via email to