Julia 为一个函数创建多个稍作修改的版本
Julia create multiple slightly modified versions of a function
我有一个函数看起来像
function eom!(du, u, p)
@views a, b = u[:,1], u[:,2];
@views da, db = du[:,1], du[:,2];
y = # some stuff involving p and a;
da .= f(a, b, y);
db .= g(b, a);
end
我现在想创建第二个完全相同的函数,除了最后一行是
db .= g(b, y);
我怎样才能最干净地做到这一点?当然,我可以只复制和粘贴并为函数指定略有不同的名称,但这似乎并不理想,尤其是如果我以后可能想要更多函数,其中 g
的第二个参数可能是其他东西。有没有一种方法可以向函数 eom!
传递一个表达式(通过参数 p
)来指定 g
的第二个参数?或者有什么方法可以使某些函数 eom_generator
可以输出我想要的所有函数?也许宏是执行此操作的核心工具,但我不确定。
你可以产生一个闭包:
function eom_generator(g)
return function eom!(du, u, p)
@views a, b = u[:,1], u[:,2]
@views da, db = du[:,1], du[:,2]
y = nothing # some stuff involving p and a;
da .= f(a, b, y)
db .= g(a, b, y)
end
end
const eom1! = eom_generator((a, b, y) -> g(b, a))
const eom2! = eom_generator((a, b, y) -> g(b, y))
但由于这是微分方程的核心,因此请务必测试一下您是否没有任何性能问题。
如果你决定你真的需要元编程,你可以在循环中使用@eval
:
for (i, expr) in enumerate((:(g(b, a)), :(g(b, y))))
@eval function $(Symbol("eom", i, "!"))(du, u, p)
@views a, b = u[:,1], u[:,2]
@views da, db = du[:,1], du[:,2]
y = nothing # some stuff involving p and a;
da .= f(a, b, y)
db .= $expr
end
end
end
我有一个函数看起来像
function eom!(du, u, p)
@views a, b = u[:,1], u[:,2];
@views da, db = du[:,1], du[:,2];
y = # some stuff involving p and a;
da .= f(a, b, y);
db .= g(b, a);
end
我现在想创建第二个完全相同的函数,除了最后一行是
db .= g(b, y);
我怎样才能最干净地做到这一点?当然,我可以只复制和粘贴并为函数指定略有不同的名称,但这似乎并不理想,尤其是如果我以后可能想要更多函数,其中 g
的第二个参数可能是其他东西。有没有一种方法可以向函数 eom!
传递一个表达式(通过参数 p
)来指定 g
的第二个参数?或者有什么方法可以使某些函数 eom_generator
可以输出我想要的所有函数?也许宏是执行此操作的核心工具,但我不确定。
你可以产生一个闭包:
function eom_generator(g)
return function eom!(du, u, p)
@views a, b = u[:,1], u[:,2]
@views da, db = du[:,1], du[:,2]
y = nothing # some stuff involving p and a;
da .= f(a, b, y)
db .= g(a, b, y)
end
end
const eom1! = eom_generator((a, b, y) -> g(b, a))
const eom2! = eom_generator((a, b, y) -> g(b, y))
但由于这是微分方程的核心,因此请务必测试一下您是否没有任何性能问题。
如果你决定你真的需要元编程,你可以在循环中使用@eval
:
for (i, expr) in enumerate((:(g(b, a)), :(g(b, y))))
@eval function $(Symbol("eom", i, "!"))(du, u, p)
@views a, b = u[:,1], u[:,2]
@views da, db = du[:,1], du[:,2]
y = nothing # some stuff involving p and a;
da .= f(a, b, y)
db .= $expr
end
end
end