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 <[email protected]> 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