在Julia中迭代具有不同参数数的不同函数

在Julia中迭代具有不同参数数的不同函数,julia,eval,metaprogramming,Julia,Eval,Metaprogramming,我试图在不同的函数上运行一个循环,使用不同数量的参数。变量是在循环内部的运行时创建的,我想在每次迭代中使用eval来使用变量:symbol实例化一个结构。但是,我不能这样做,因为eval只在全局范围内工作。这是有效案例的MWE: function f1(x); return x; end function f2(x1,x2); return x1+x2; end handles = [f1,f2] args =[:(x1),:(x1,x2)] x1 = 1; x2 = 1; for (i,f

我试图在不同的函数上运行一个循环,使用不同数量的参数。变量是在循环内部的运行时创建的,我想在每次迭代中使用eval来使用变量:symbol实例化一个结构。但是,我不能这样做,因为eval只在全局范围内工作。这是有效案例的MWE:

function f1(x); return x; end
function f2(x1,x2); return x1+x2; end

handles = [f1,f2]
args =[:(x1),:(x1,x2)]

x1 = 1; x2 = 1;
for (i,f) in enumerate(handles)
    params = eval(args[i])
    @show f(params...)
end

f(params...) = 1
f(params...) = 2
但是,如果我将变量定义移动到循环中(这是我真正想要的),那么在重新启动Julia以清除工作区后,它将不起作用

function f1(x); return x; end
function f2(x1,x2); return x1+x2; end

handles = [f1,f2]
args =[:(x1),:(x1,x2)]

for (i,f) in enumerate(handles)
    x1 = 1; x2 = 1;
    params = eval(args[i])
    @show f(params...)
end

ERROR: UndefVarError: x1 not defined
我试过几种答案,例如,但我似乎无法让它起作用。我可以编写一个自定义分派函数,它接受[x1,x2]并使用正确的参数调用f1或f2。但是,有没有办法通过eval或其他优雅的解决方案来实现这一点

编辑:下面是关于我试图在代码中做什么的更多细节。每个算法都有一个配置结构,在这里我想预先定义它需要的参数

KMF_config = AlgConfig( 
    name = "KMF",
    constructor = KMC.KMF,
    parameters = :(mu,N,L,p),
    fit = KMC.fit!)
MF_config = AlgConfig( 
    name = "MF",
    constructor = KMC.MF,
    parameters = :(mu,N,L),
    fit = KMC.fit!)

alg_config_list = [KMF_config, MF_config]
for (i,alg_config) in enumerate(alg_config_list)
    mu,N,L,p,A,B,C,D,data = gen_vars() #this returns a bunch of variables that are used in different algorithms
    method = alg_config.constructor(eval(method.parameters)...)
    method.fit(data)
end

一种可能的解决方案是让函数获取所有变量和方法,然后根据method.name返回一个包含变量子集的元组。但我不确定这是否是最好的方法。

这里有一种方法使用多个分派,而不是
eval

run_a(x, y) = x + 10*y
run_b(x, y, z) = x + 10*y + 100*z

extract(p, ::typeof(run_a)) = (p.x, p.y)
extract(p, ::typeof(run_b)) = (p.x, p.y, p.z)
genvars() = (x=1, y=2, z=3)

function doall()
    todo = [
        run_a,
        run_b,
    ]
    for runalg in todo
        v = genvars()
        p = extract(v, runalg)
        @show runalg(p...)
    end
end
在您的示例中,将
run_a
run_b
替换为
KMC.KMF
KMC.MF


编辑:清理示例,以避免示例中不存在的结构。

您能否在有效的情况下显示结构生成的示例?也许不使用
eval
就可以实现另一种解决方案,因为我的变量不是全局变量,所以它实际上不起作用,但我已经添加了一个示例,说明了我实际上要做的事情。