Julia 从字符串创建函数
Julia create function from string
在 Julia v1.01 中,我想从一个字符串创建一个函数。
背景:在数值求解器中,测试用例是通过 JSON 文件定义的。如果用户能以字符串形式指定初始条件就好了。
这会导致以下情况:假设我们有(来自 JSON 文件)
fcn_as_string = "sin.(2*pi*x)"
有没有办法把它转换成 function fcn
这样我就可以调用
fcn(1.0) # = sin.(2*pi*1.0)
性能不是真正的问题,因为初始条件被评估一次,然后实际计算消耗了大部分时间。
函数 Meta.parse
和 eval
允许您这样做:
fcn_as_string = "sin.(2*pi*x)"
fcn = eval(Meta.parse("x -> " * fcn_as_string))
@show fcn(1.0)
这个return -2.4492935982947064e-16(由于舍入误差)。
无法在评论中正确显示我的代码,因此这里是
的快速修复
function fcnFromString(s)
f = eval(Meta.parse("x -> " * s))
return x -> Base.invokelatest(f, x)
end
function main()
s = "sin.(2*pi*x)"
f = fcnFromString(s)
f(1.)
end
julia> main()
-2.4492935982947064e-16
在 Julia v1.01 中,我想从一个字符串创建一个函数。
背景:在数值求解器中,测试用例是通过 JSON 文件定义的。如果用户能以字符串形式指定初始条件就好了。
这会导致以下情况:假设我们有(来自 JSON 文件)
fcn_as_string = "sin.(2*pi*x)"
有没有办法把它转换成 function fcn
这样我就可以调用
fcn(1.0) # = sin.(2*pi*1.0)
性能不是真正的问题,因为初始条件被评估一次,然后实际计算消耗了大部分时间。
函数 Meta.parse
和 eval
允许您这样做:
fcn_as_string = "sin.(2*pi*x)"
fcn = eval(Meta.parse("x -> " * fcn_as_string))
@show fcn(1.0)
这个return -2.4492935982947064e-16(由于舍入误差)。
无法在评论中正确显示我的代码,因此这里是
function fcnFromString(s)
f = eval(Meta.parse("x -> " * s))
return x -> Base.invokelatest(f, x)
end
function main()
s = "sin.(2*pi*x)"
f = fcnFromString(s)
f(1.)
end
julia> main()
-2.4492935982947064e-16