1) Response about the scope
The following example in the issue cited by @mauro is an advanced issue
about the scope, and somewhat related to the case here:
```
foo1=1
let
foo2=1
f2() = (foo1=6; foo2=6)
@assert f2()==6
@assert foo1==1 # hard scope
@assert foo2==6 # soft scope
end
```
Here `foo1` is global, and screened by `f2()`; `foo2` is local (let-block),
and accepted by `foo2`.
2) Response about the original code and the variant Version 3
I think it is a bug, and a bug associated with the compiler optimization.
Someone files an issue in Github?
Since it is deeply related to the design (the origin of the high
performance) of Julia, I don't think it to be easily solved.
On Thu, Apr 30, 2015 at 1:05 PM, Zheng Wendell <[email protected]>
wrote:
> @David, your code is the same as case 4.
>
> @Tom, no, in case 3, all *z*'s have local scope (of *for* loop), even the
> *z* in function *g()*. Ref: the issue cited by @mauro
>
> On Thu, Apr 30, 2015 at 1:15 AM, Tom Breloff <[email protected]> wrote:
>
>> 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
>>>>>>>>
>>>>>>>
>