【问题标题】:Julia create function from stringJulia 从字符串创建函数
【发布时间】:2023-04-09 14:56:01
【问题描述】:

在 Julia v1.01 中,我想从字符串创建一个函数。

背景:在数值求解器中,测试用例是通过 JSON 文件定义的。如果用户能以字符串形式指定初始条件,那就太好了。

这会导致以下情况:假设我们有(来自 JSON 文件)

fcn_as_string = "sin.(2*pi*x)" 

有没有办法将其转换为function fcn 以便我可以调用

fcn(1.0) # = sin.(2*pi*1.0)

性能并不是真正的问题,因为初始条件只评估一次,然后实际计算会消耗大部分时间。

【问题讨论】:

    标签: julia metaprogramming


    【解决方案1】:

    无法在评论中正确显示我的代码,因此这里有一个针对 crstnbr's solution 的快速修复

    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
    

    【讨论】:

    • 这是@Alex338207 的解决方案,不是我的。
    【解决方案2】:

    Meta.parseeval 函数允许您这样做:

    fcn_as_string = "sin.(2*pi*x)" 
    fcn = eval(Meta.parse("x -> " * fcn_as_string))
    @show fcn(1.0)
    

    此返回 -2.4492935982947064e-16(由于舍入错误)。

    【讨论】:

    • 起初我认为这可以解决问题,但我无法将您的代码放入例如main.jl 在函数内。这给出了一个错误:The applicable method may be too new: running in world age 25050, while current world is 25051.任何可能的修改?
    • 您必须以某种方式在 eval 内部按值传递参数,因此函数调用在 eval 内部完成。否则全局上下文生成函数发现它无法访问其调用函数的本地调用堆栈这是一种方法: function f(y) fcn_as_string = "sin.(2*pi*x)" @show eval(Meta.parse(" (x -> " * fcn_as_string * ")($y)")) 结束 f(1.0) .
    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多