Re: [julia-users] Closed variable stops working after modules are reloaded

2015-05-01 Thread pdobacz
Thank you very much for the tips.
The aim of what I am doing is to have syntactic sugar to access a very 
special Dict within a very special function.


Re: [julia-users] Closed variable stops working after modules are reloaded

2015-04-30 Thread Isaiah Norton
Running `reload` twice, or simply replacing `reload` with `include`, gives
the expected behavior.

If you look at `@code_typed m2.f(d)` before and after the second `reload`,
you will see that after the second `reload`, `m2.f(d)` is actually closing
over `d`:

start:

julia @code_lowered m2.f(d)

1-element Array{Any,1}:
  :($(Expr(:lambda, {:d}, {{},{{:d,Dict{Symbol,T},1}},{}}, :(begin  # 
 /home/juser/test.jl, line 19:
 $(Expr(:method, :((top(getfield))(Base,:getindex)), 
 :((top(tuple))((top(tuple))(Symbol,(top(apply_type))(Vararg,Any)),(top(tuple))())),
  AST(:($(Expr(:lambda, {:s,:(args::(top(apply_type))(Vararg,Any))}, 
 {{},{{:s,Any,0},{:args,Any,0}},{{:d,Dict{Symbol,T},1}}}, :(begin  # 
 /home/juser/test.jl, line 19:
 return (top(getfield))(getindex(d,s),:i)
 end))) # line 20:
 return println(getindex(:s))
 end


after second reload:

1-element Array{Any,1}:
  :($(Expr(:lambda, {:d}, 
 {{:_var0,:_var1},{{:d,Dict{Symbol,T},1},{:_var0,(Int64,),0},{:_var1,Int64,18}},{}},
  :(begin  # /home/juser/test.jl, line 19:
 $(Expr(:method, :((top(getfield))(Base,:getindex)), 
 :((top(tuple))((top(tuple))(Symbol,(top(apply_type))(Vararg,Any)),(top(tuple))())),
  AST(:($(Expr(:lambda, {:s,:(args::(top(apply_type))(Vararg,Any))}, 
 {{},{{:s,Any,0},{:args,Any,0}},{{:d,Dict{Symbol,T},1}}}, :(begin  # 
 /home/juser/test.jl, line 19:
 return (top(getfield))(getindex(d,s),:i)
 end))) # line 20:
 _var1 = getindex(:s)::Int64
 return println(GetfieldNode(Base,:STDOUT,Any),_var1::Int64)
 end



I'm not entirely sure why this is the case, but I never use reload as I've
found it to be too quirky.

You may be interested in https://github.com/malmaud/Autoreload.jl (note
that it does not in fact use the built-in `reload` at all, probably for
this reason! rather it uses `include`).

ps: this seems like a sort of odd thing to do, but I'll just trust you know
what you are doing :)