在Julia中,是否可以在不使用全局变量的情况下在Expr对象中传递评估值?

时间:2016-04-21 06:51:10

标签: metaprogramming julia

我希望能够转换字符串表达式,例如" 2.0 * x * log(x)",到朱莉娅的一个函数。通常的方法是传递" x"的值将通过全局变量:

julia> func1 = parse("2.0*x*log(x)");
julia> x = 2.718281828459;
julia> eval(func1)/2.0
2.7182818284589545

但是,我想知道我是否可以避免使用全局变量。我尝试了以下两种方法,但没有成功:

方法1

julia> func2(x) = parse("2.0*x*log(x)");
julia> eval(func2(1.0))/2.0  # should return zero
2.7182818284589545

方法2

julia> function new_func1(input_value)
           x = input_value
           eval(func1)
       end
new_func1 (generic function with 1 method)

julia> new_func1(1.0)/2.0  # should return zero
2.7182818284589545

3 个答案:

答案 0 :(得分:4)

这样做:

    ex = parse(string)
    @eval f(x) = $ex

当我插入你的字符串并且数字1返回0时,2返回2.772588,依此类推。

答案 1 :(得分:0)

使用func2,因为您未在函数中插入x,所以表达式仅使用符号x构建。这会回到您在撰写x时设置的全局func1

试试这个:

julia> func2(x) = parse("2.0*$x*log($x)");

julia> eval(func2(1.0))
0.0

或者,或者,

julia> func2(x) = eval(parse("2.0*$x*log($x)"));

julia> func2(1.0)
0.0

答案 2 :(得分:0)

似乎也可以使用@generated来执行此操作:

string = "2.0*x*log(x)"
@generated function my_func(x)
    return parse(string)
end

示例输出:

julia> println(my_func(1.0))
0.0

julia> println(my_func(exp(1.0))/2.0)
2.718281828459045

julia> println(my_func(0.5))
-0.6931471805599453

进一步考虑这一点,或许最好使用点符号进行乘法运算:

string = "2.0.*x.*log(x)"
@generated function my_func(x)
    return parse(string)
end

julia> x = [1.0 0.5 exp(1.0)]
1x3 Array{Float64,2}:
 1.0  0.5  2.71828

julia> my_func(x)
1x3 Array{Float64,2}:
 0.0  -0.693147  5.43656