Thanks for the comments.  With a bit more digging I was able to figure out 
how to pass a module in which to look for the function, this finds the 
correct function and avoids eval.

module Bar
bar(s::String, args...;m::Module=Main) = getfield(m,symbol(s))(args...)
export bar
end
using Bar
foo(s::String, args...;m::Module=Main) = getfield(m,symbol(s))(args...)

baz(x...) = +(x...)

baz(4,5,6)
foo("baz",4,5,6)
bar("baz",4,5,6)

I want to be able to write a Step object to disk, and recreate it with the 
correction function later.  I see now how do that with func::Function, but 
I hadn't previously seen how to do that so I went with a String.

On Tuesday, July 29, 2014 3:20:44 PM UTC-6, Leah Hanson wrote:
>
> In general, you should avoid using `eval`. Is there a reason you don't 
> want to pass in a function and make it `func::Function` in your type?
>
> Your `eval` inside module `Bar` is evaluating the code inside the scope of 
> `Bar`, which is what's causing your problem.
>
> -- Leah
>
>
> On Tue, Jul 29, 2014 at 3:58 PM, ggggg <galen...@gmail.com <javascript:>> 
> wrote:
>
>> I'm trying to write a small module that allows one to define a Step that 
>> describes operations on an HDF5 file.
>>
>> immutable Step
>>     func::String
>>     a_ins::(String...) #attribute inputs
>>     d_ins::(String...) #dataset inputs
>>     a_outs::(String...) #attribute outputs
>>     d_outs::(String...) #dataset outputs
>> end
>>
>> The idea is to gather up the inputs specified by a_ins and d_ins, pass 
>> them to the function specified by func, and place the outputs in HDF5 
>> datasets and attributes as specified by a_outs and d_outs.  The issues I'm 
>> having is finding the correct function given that it is defined in some 
>> other Module.  A minimal example is given by
>>
>> module Bar
>> bar(s::String, args...) = eval(parse(s))(args...)
>> export bar
>> end
>> using Bar
>> foo(s::String, args...) = eval(parse(s))(args...)
>>
>> baz(x...) = +(x...)
>>
>> baz(4,5,6)
>> foo("baz",4,5,6)
>> bar("baz",4,5,6) # ERROR: baz not defined
>>
>> One path I can see is that when I create the Step I could pass an actual 
>> function to the constructor.  If I knew how to access the fully qualified 
>> name of the function, I could record that instead of just the name.  I'm 
>> not sure if that is possible. Any ideas on how I should approach this?
>>
>> Also I probably shouldn't be using eval(parse(s)) since that opens up the 
>> opportunity for arbitrary code execution.  
>>
>
>

Reply via email to