使用宏来提取Julia中的几个对象字段

时间:2014-08-13 20:55:28

标签: macros field julia

我有一个结构,我想重复访问这些字段,我将它们加载到当前空间中,如下所示(其中M是带字段X和Y的类型):

X = M.X
Y = M.Y
在R中,我经常使用with命令来做到这一点。现在我只想拥有一个用于扩展代码的宏,就像

那样
@attach(M,[:X,:Y])

我只是不确定如何做到这一点。

1 个答案:

答案 0 :(得分:4)

我在这个答案中包含了一个宏,它完全按照你的描述。解释内容的评论是内联的。

macro attach(struct, fields...)
    # we want to build up a block of expressions.
    block = Expr(:block)
    for f in fields
        # each expression in the block consists of
        # the fieldname = struct.fieldname
        e = :($f = $struct.$f)
        # add this new expression to our block
        push!(block.args, e)
    end
    # now escape the evaled block so that the
    # new variable declarations get declared in the surrounding scope.
    return esc(:($block))
end

您可以像这样使用它:@attach M, X, Y

您可以看到生成的代码,如下所示:macroexpand(:(@attach M, X, Y))将显示如下内容:

quote
    X = M.X
    Y = M.Y
end