在宏中处理数组索引的end关键字

时间:2015-06-14 11:53:19

标签: metaprogramming julia

假设我有一个复合类型的数组,如下所示:

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

1 个答案:

答案 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