I was hoping that someone more knowledgeable would respond, but no luck...
I think this is a bug. Could you file an issue?
This also happens with a (;) block, a let-block and inside functions:
julia> function fn()
foo = 1
bar() = (foo=foo+1; foo)
bar()
end
julia> fn()
2
(but not inside a module-block)
This closed issue https://github.com/JuliaLang/julia/issues/4645
discussed an example similar to this but without the begin-block. You
should reference it.
(If this is not a bug, why?)
On Thu, 2014-06-12 at 01:29, [email protected] wrote:
> I'm sure you have a point in that example. However, I'm getting more
> confused after playing around some more. In repl when I do this:
>> foo = 1
>> bar() = (foo=foo+1)
>> bar()
> I get ERROR: foo not defined. So far so good.
>
> But if I write it like this:
>> begin
>> foo = 1
>> bar() = (foo=foo+1)
>> bar()
>> end
> I get 2.
>
> Why wrapping it in block changes the behavior? I thought using a block
> doesn't introduce any new scope, as
> per
> http://julia.readthedocs.org/en/latest/manual/variables-and-scoping/#man-variables-and-scoping.
>
> But apparently the bar() inside a block can access foo without declaring it
> global. And outside the block, I can see foo, so apparently it is really a
> global.
>
>
> On Wednesday, June 11, 2014 11:46:14 AM UTC-4, Stefan Karpinski wrote:
>>
>> I'm just pointing out that you can't change a global binding without
>> declaring it to be global. That's why I'm confused about what the warning
>> could possibly be for.
>>
>>
>> On Wed, Jun 11, 2014 at 11:30 AM, Tony Fong <[email protected]
>> <javascript:>> wrote:
>>
>>> You are assuming perfect knowledge of Julia and with a fresh mind on the
>>> part of the user...
>>>
>>>
>>> On Wednesday, June 11, 2014 11:26:48 AM UTC-4, Stefan Karpinski wrote:
>>>
>>>> f2 doesn't modify global foo – precisely because it doesn't declare foo
>>>> to be global. So there's nothing to warn about...
>>>>
>>>>
>>>> On Wed, Jun 11, 2014 at 10:58 AM, Tony Fong <
>>>> [email protected]> wrote:
>>>>
>>>>> I'm struggling with something like this:
>>>>>
>>>>> Module M
>>>>> foo = 1
>>>>> bar()=foo # it's not obvious if foo can be modified. Ok, maybe I
>>>>> should not need a FYI even.
>>>>> f1()=(global foo=2 ) # this is clear.
>>>>> f2()=(foo = 3 ) # how could I get a warning out of this? it's
>>>>> perfectly legal and may or may not do what the author intends.
>>>>> end
>>>>>
>>>>>
>>>>>
>>
--