Вы можете создать замыкание:
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
в al oop:
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