Due to popular demand I created a pull request ;-)

https://github.com/JuliaLang/julia/pull/7322

Let me know if that does not work for you.

On Thu, 2014-06-19 at 16:55, [email protected] wrote:
> This is pretty interesting, it seems odd that we have function_module, but 
> nothing like a "variable_module". However, I can't seem to get this to work 
> with the last commit in master (f548812). It gives an error:
>
> julia> Base.@binding_module b3
> Error showing value of type b3:
> ERROR: type: subtype: expected Type{T<:Top}, got (Symbol,)
>  in typeinf at ./inference.jl:1233
>  in typeinf_ext at ./inference.jl:1207
>  in print_response at REPL.jl:139
>  in print_response at REPL.jl:124
>  in anonymous at REPL.jl:539
>  in run_interface at ./LineEdit.jl:1349
>  in run_frontend at ./REPL.jl:761
>  in run_repl at ./REPL.jl:169
>  in _start at ./client.jl:398
>
> Was there something else you changed?
>
>
> On Monday, June 16, 2014 5:15:18 AM UTC-7, Mauro wrote:
>>
>> >> I can get the module of an exported method like so: 
>> >> ``` 
>> >> julia> module BB 
>> >>        export B2, cc, f 
>> >>        type B2 
>> >>            a 
>> >>        end 
>> >>        f(x) = x+3 
>> >>        cc = 5 
>> >>        end 
>> >> 
>> >> julia> using BB 
>> >> 
>> >> julia> Base.function_module(f) 
>> >> BB 
>> >> ``` 
>> >> How can I do the same for the datatype `B2` and the variable `cc`?  (as 
>> >> a bonus, what about macros?) 
>> > 
>> > For the datatype it is: 
>> > julia> B2.name.module 
>> > 
>> > For variable bindings, Julia knows about it, as it displays a warning: 
>> > 
>> > julia> cc = 1 
>> > Warning: imported binding for cc overwritten in module Main 
>> > 
>> > This originates from the function `jl_get_binding_wr` in `src/module.c`, 
>> > which shows that a binding as a `owner`.  I'll try and figure out how to 
>> > get to it. 
>> > 
>> > For marcos it seems impossible to get hold of them without them being 
>> > evaluated. 
>>
>> For posterity here a method to find the origin of variable bindings. 
>> Adding to module.c: 
>> ``` 
>> // return module of binding 
>> DLLEXPORT jl_module_t *jl_get_module_of_binding(jl_sym_t *var) 
>> { 
>>     jl_binding_t *b = 
>> (jl_binding_t*)ptrhash_get(&jl_current_module->bindings, var); 
>> } 
>> ``` 
>>
>> and defining in reflection.jl: 
>> ``` 
>> function binding_module(var::Symbol) 
>>     if isdefined(var) # this returns true for 'used' bindings 
>>         mod = ccall(:jl_get_module_of_binding, Any, (Any,), var) 
>>     else 
>>         error("Symbol $var is not bound in the current module 
>> $(current_module()) and not exported in any 'used' module.") 
>>     end 
>> end 
>>
>> macro binding_module(var) 
>>     :(binding_module(symbol($(string(var)))) ) 
>> end 
>> ``` 
>> (is there a better way to write that macro? I.e. how to get to the 
>> Symbol of var?) 
>>
>>
>> Now I can do: 
>> ``` 
>> julia> Base.@binding_module isa 
>> Core 
>>
>> julia> module B3 
>>        export b3, t 
>>        b3 = 5 
>>        t() = 5 
>>        end 
>>
>> julia> Base.@binding_module t 
>> ERROR: Symbol t is not bound in the current module Main and not exported 
>> in any 'used' module. 
>>  in error at error.jl:21 
>>  in binding_module at reflection.jl:171 
>>
>> julia> using B3 
>>
>> julia> Base.@binding_module t 
>> B3 
>>
>> julia> b = B3.b3 
>> 5 
>>
>> julia> Base.@binding_module b 
>> Main 
>>
>> julia> Base.@binding_module b3 
>> B3 
>> ``` 
>>

-- 

Reply via email to