Please forgive me if this is a stupid question. Suppose I have an expression

:(sin(x) + cos(y) * sin(z))

and the values of x, y, z.

How can I write a macro that can substitute the values of x, y, z into the 
above expression? The number of values that I want to substitute depends on 
the actual use cases and thus is unknown.

I wrote a function that can do this 

function substitute(expr::Expr, vals::Array{Expr,1})
    for i = 1:length(vals)
        @eval $(vals[i])
    end
    @eval $expr
end

x = 10
y = 23

substitute(:(x+y), [:(x = 2), :(y = 3)])

x
y

But if you run the above code, you will see that the values of global x and 
y are changed, which is not what I intend to do. This is because "eval" 
does the evaluation in the global scope. Besides, I think it is a bad 
coding pattern to use eval and it is slow.

It would be better if this can be done using macro. But I have no idea 
about how to do this.

Reply via email to