This "solves" the problem because z is now local to g. I don't think it gets at the heart of the issue though, which is the strangeness of z seeming to have global scope (outside of the for loop) when inside the g() definition, but the other z's have scope local to the for loop. Is that intended? Or a bug? I'm not sure.
On Wednesday, April 29, 2015 at 5:26:32 PM UTC-4, David Gold wrote: > > How about: > > julia> for i=1:2 > if i>=2; println(z); end > z="Hi" > g(z)= println(z) > g(z) > end > Hi > Hi > Hi > > > Does this just fall under case 4, or does it change your analysis? > > On Wednesday, April 29, 2015 at 11:20:17 AM UTC-4, Sisyphuss wrote: >> >> Please these four versions: >> Version 1: >> for i=1:2 >> if i>=2; println(z); end >> z="Hi" >> end >> No error >> >> Version 2: >> for i=1:2 >> z="Hi" >> g()= println(z) >> g() >> end >> No error >> >> Version 3: >> for i=1:2 >> if i>=2; println(z); end >> z="Hi" >> g()= println(z) >> g() >> end >> ERROR: z not defined >> >> Version 4: >> for i=1:2 >> if i>=2; println(z); end >> z="Hi" >> g(x)= println(x) >> g(z) >> end >> No error >> >> My guess is: Version 1 treats `z` in the same way as local variable >> (let's call it *local way*). Version 2 treats `z` in the same way as >> global variable although it's in a local scope (let's call it *global >> way*). Version 3 treats it simultaneously in the local/global way, thus >> introduce an error. Version 4 is a walk around and also a better >> programming habit. >> >> If my guess is right, I further conclude that the main dilemma of Julia >> is that it depends on the scope (local/global scope) to decide the >> treatment of variables (local/global way); however, when scopes are nested, >> the problem appears. >> >> >> >> >> On Wednesday, April 29, 2015 at 4:53:12 PM UTC+2, Sisyphuss wrote: >>> >>> Here's a variant version of your code: >>> ``` >>> for i=1:10 >>> if i>=2; println(z); end >>> z=2 >>> g()=(*global z*; 2z) >>> println(z) >>> end >>> ``` >>> If `z` is defined global, there will not be any error. I would have like >>> to use `nonlocal`, but there isn't this keyword in Julia. >>> In my personal opinion, the magic in your original code is that when the >>> compiler see the definition of `g()`, it will try to do some *amazing >>> *things >>> on the compilation of `z`. >>> >>> >>> On Wednesday, April 29, 2015 at 4:37:24 PM UTC+2, Pooya wrote: >>>> >>>> That's exactly my question: Why should defining a function inside the >>>> loop mess with the variables in the loop? >>>> >>>> On Wednesday, April 29, 2015 at 10:33:03 AM UTC-4, Sisyphuss wrote: >>>>> >>>>> Another *miracle* here is that if you delete "g()=2z", there will be >>>>> no error! >>>>> >>>>> >>>>> On Wednesday, April 29, 2015 at 3:53:23 PM UTC+2, Pooya wrote: >>>>>> >>>>>> Can someone explain why this is the desired behavior? z is defined >>>>>> until the end of first iteration in the for loop, but not in the >>>>>> beginning >>>>>> of the next: >>>>>> >>>>>> julia> for i=1:10 >>>>>> if i>=2; println(z); end >>>>>> z=2 >>>>>> g()=2z >>>>>> println(z) >>>>>> end >>>>>> 2 >>>>>> ERROR: z not defined >>>>>> in anonymous at no file:2 >>>>>> >>>>>
