【发布时间】:2017-09-27 12:18:51
【问题描述】:
我想制作一个为我创建一些代码的宏。例如
我有一个向量x = [9,8,7],我想使用宏来生成这段代码vcat(x[1], x[2], x[3]) 并运行它。我希望它适用于任意长度的向量。
我做了如下宏
macro some_macro(a)
quote
astr = $(string(a))
s = mapreduce(aa -> string(astr,"[",aa,"],"), string, 1:length($(a)))
eval(parse(string("vcat(", s[1:(end-1)],")")))
end
end
x = [7,8,9]
@some_macro x
以上工作。但是当我尝试将它包装在一个函数中时
function some_fn(y)
@some_macro y
end
some_fn([4,5,6])
它不起作用并给出错误
UndefVarError: y 未定义
它突出显示以下是罪魁祸首
s = mapreduce(aa -> string(astr,"[",aa,"],"), string, 1:length($(a)))
编辑 见julia: efficient ways to vcat n arrays
对于高级示例,为什么我要这样做而不是使用 splat 运算符
【问题讨论】:
-
你需要
escapea:astr = string($(esc(a)))对第二行做同样的修改。 -
您检查过
@generated函数吗?看来这才是你真正需要的,而不是宏。
标签: julia