假设我有一个复合类型的数组,如下所示:
type myType
a::Int
b::Float
end
myArray=myType[]
出于显而易见的原因,我希望能够使用简单的索引来访问复合类型的字段,如下所示:
aVals=myArray[1:3].a
以下宏可以成功完成这种类型的索引,只要我有一个数组的数字迭代:
macro getArray(exp)
iter=eval(exp.args[1].args[2])
exp.args[1].args[2]=:i;
:[$(esc(exp)) for $(esc(:i)) in $iter]
end
如何编写一个类似的宏,它也能够处理带有end
关键字的数组索引,即:
aVals=@getArray myArray[1:end].a
答案 0 :(得分:2)
以下宏不仅解决了索引问题,还解决了正确的输出类型:
macro getArray(exp)
quote
ftype=typeof($(esc(exp.args[1]))[1].($(esc(exp.args[2]))));
ftype[item.($(exp.args[2])) for item in $(esc(exp.args[1]))]
end
end