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 >