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
>>>>>>
>>>>>

Reply via email to