我有一个结构,我想重复访问这些字段,我将它们加载到当前空间中,如下所示(其中M是带字段X和Y的类型):
X = M.X
Y = M.Y
在R中,我经常使用with
命令来做到这一点。现在我只想拥有一个用于扩展代码的宏,就像那样
@attach(M,[:X,:Y])
我只是不确定如何做到这一点。
答案 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