【问题标题】:Dealing with end keyword in macros for array indices处理数组索引的宏中的 end 关键字
【发布时间】:2015-08-29 23:54:26
【问题描述】:

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

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

【问题讨论】:

    标签: metaprogramming julia


    【解决方案1】:

    以下宏不仅解决了索引问题,还设置了正确的输出类型:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 2017-09-08
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多