I’m actually still having issues with both of these options — I’ll try to 
enumerate what I think the problem is here. 

   - When I do using MyPackage and my code is loaded (including the 
   plotting routines). 
   - Then when I call plot(x<:MyType) (sorry for the shorthand), the 
   function is compiled. 
   - If PyPlot is not defined I try to either define it for them or emit an 
   error message telling them to define it. 
   - After PyPlot is defined I try to run the file again, and I get errors 
   telling me the functions from PyPlot that I use in the plot(x::MyType) 
   function are not defined. 

I think the reason they are not defined within the function is that it was 
compiled the first time I called it, when the functions weren’t actually 
available. 

Does my analysis seem correct?

Does anyone know a way to accomplish this?
------------------------------

I will provide a quick usable example so it is easy for people to experiment

type Foo
    x::Int
end

function check_defined_err(x::Symbol)
    if !isdefined(x)
        error("Module $x not defined. run `using $x` to fix the problem")
    end
end

function check_defined_eval(x::Symbol)
    if !isdefined(x)
        eval(Expr(:using, x))
    end
end

function plot_err(x::Foo)
    check_defined_err(:PyPlot)
    d = 1:x
    plot(d, d.^2)
end

function plot_eval(x::Foo)
    check_defined_eval(:PyPlot)
    d = 1:x
    plot(d, d.^2)
end

a = Foo(10)
# plot_err(a)
# plot_eval(a)

Then when I have run the code above, I get the following at the console (it 
says string because I :

julia> plot_err(a)
ERROR: Module PyPlot not defined. run `using PyPlot` to fix the problem
 in error at /usr/local/julia/usr/lib/julia/sys.dylib
 in check_defined_err at none:7
 in plot_err at string:18

julia> using PyPlot
INFO: Loading help data...
Warning: using PyPlot.plot in module Main conflicts with an existing identifier.

julia> plot_err(a)
ERROR: plot not defined
 in plot_err at none:20

In another session to see plot_eval(a):

julia> plot_eval(a)
INFO: Loading help data...
Warning: using PyPlot.plot in module Main conflicts with an existing identifier.
ERROR: plot not defined
 in plot_eval at none:4

Thank you for your help.

On Friday, August 22, 2014 12:18:14 PM UTC-4, Steve Kelly wrote:

Peter Simon, very cool. When I ran hit this problem I saw it as an 
> opportunity to make my code more Julian. :P Eval FTW.
>
>
> On Fri, Aug 22, 2014 at 12:16 PM, Peter Simon <psimo...@gmail.com 
> <javascript:>> wrote:
>
>> From https://groups.google.com/d/topic/julia-users/AWCerAdDLQo/discussion 
>> :
>>
>>  eval(Expr(:using,:PyPlot))
>>
>> can be used inside a conditional.
>>
>> --Peter
>>
>>
>> On Friday, August 22, 2014 8:56:53 AM UTC-7, Spencer Lyon wrote:
>>>
>>> I am working on a library that defines various types as well as a few 
>>> “helper” functions to plot those types with PyPlot.
>>>
>>> If I do [import|using] PyPlot at the top level of any file in my 
>>> package, PyPlot is loaded when I do [using|import] MyPackage. This 
>>> makes the startup time for my package much much longer.
>>>
>>> What I would like to do is instead of having to load it when my package 
>>> loads, I could load it when someone calls one of the functions that needs 
>>> it.
>>>
>>> Here is an example of what I would like to do:
>>>
>>> function plot_my_type(x::MyType)
>>>     if !isdefined(:PyPlot)
>>>         using PyPlot
>>>     end
>>>     # finish the function by plotting with PyPlot
>>> end
>>>
>>> I haven’t been able to get a solution that works for this. Does anyone 
>>> know if it is possible?
>>> ​
>>>
>>
>  ​

Reply via email to