【发布时间】:2021-03-28 03:00:53
【问题描述】:
第一次发帖,感谢阅读!
问题:我有一个Vector{String} - 称之为A - 其中每个元素都是等式的一部分,例如A 的第一个元素是 "x[1] - (0.8*x[1])"。我想编写一个宏,它以 i) 一个 String 为参数 - 称它为 fn_name - 带有一个函数的名称,ii) 向量 A,并返回一个名为 fn_name 的函数,它看起来像
function fn_name(f, x)
f[1] = x[1] - (0.8*x[1])
f[2] = (exp(x[4]) - 0.8*exp(x[3]))^(-1.1) - (0.99*(exp(x[4]) - 0.8*exp(x[4]))^(-1.1)*(1.0 - 0.025 + 0.30*exp(x[1])*exp(x[2])^(0.30 - 1.0)))
f[3] = exp(x[2]) - ((1.0 - 0.025)*exp(x[2]) + exp(x[1])*exp(x[2])^0.30 - exp(x[4]))
f[4] = x[3] - (x[4])
end
其中每个 rhs 是一个元素
A = ["x[1] - (0.8*x[1])", "(exp(x[4]) - 0.8*exp(x[3]))^(-1.1) - (0.99*(exp(x[4]) - 0.8*exp(x[4]))^(-1.1)*(1.0 - 0.025 + 0.30*exp(x[1])*exp(x[2])^(0.30 - 1.0)))", "exp(x[2]) - ((1.0 - 0.025)*exp(x[2]) + exp(x[1])*exp(x[2])^0.30 - exp(x[4]))", "x[3] - (x[4])"]
我尝试了什么:我解决问题的最佳尝试如下
macro make_fn(fn_name, A)
esc(quote
function $(Symbol(fn_name))(f, x)
for i = 1:length($(A))
f[$i] = Meta.parse($(A)[$i])
end
end
end)
end
但这不起作用:当我运行 @make_fn("my_name", A) 时,我收到错误 LoadError: UndefVarError: i not defined。
我发现很难完全理解 Julia 元编程,虽然我很乐意避免使用它,但我认为这个问题是不可避免的。
你能帮我理解我的错误在哪里吗?
谢谢
【问题讨论】:
-
第一个问题非常好!请注意,这里并不认为问候和感谢是必要的,将它们排除在外并不被认为是不礼貌的 - 一个好问题不言自明。
标签: julia metaprogramming