I'm not sure why assignments are local, but I'd guess that it's for 
consistency. function foo(x, y) ... end is syntactic sugar for foo = 
(x,y)->..., and likewise do syntax is also sugar for creating a function 
and passing it as the first argument. Since 

function foo(x)
    a = x
end

does not modify foo's parent scope (the global scope), it seems reasonable 
that local functions (do blocks) shouldn't modify their parent scope 
either. Here are other ways of writing the code you quoted:

local a, b
open(file) do fd
 a = read(fd, ...) # will modify a and b in the parent scope
 b = read(fd, ...)
end

comprehension = map(collection) do i
  ## compute element[i]
  element
end

Best,

Cédric

On Monday, June 20, 2016 at 7:54:10 AM UTC-4, David van Leeuwen wrote:
>
> Hello, 
>
> I regularly make the mistake described here 
> https://groups.google.com/d/msg/julia-users/UyCSm5Shyww/Udt67boT3CsJ, 
> i.e., i write
>
> open(file) do fd
>   a = read(fd, ...)
>   b = read(fd, ...)
> end
> ## a and b undefined.  
>
> I get that the solution is 
>
> a, b = open(file) do fd 
> ...
>
> Great.  I understand that you would want `fd` to be local, is this the 
> reason that every assignment is local?
>
> If `a, b = open() do ... end` is the recommended way of dealing with this, 
> I wonder if this approach could generalize to the for-block
>
> comprehension = for i in collection
>    ## compute element[i]
>    element
> end
>
> as a multiline alternative to the [element for i in collection] syntax. 
>
> Cheers, 
>
> ---david
>

Reply via email to