从宏中的符号生成符号
Produce a symbol from a symbol in a macro
我不知道该如何表达。我有一个这样的宏:
macro dothing(xxxx)
# create a new symbol
ZC_xxxx = symbol("ZC_"*string(xxxx))
# esc so that variables are assigned in calling scope
return esc(quote
# assign something to the new symbol
$ZC_xxxx = [555.0, 666.0, 777.0]
# Store in a the dataframe
t[:(:($ZC_xxxx))] = $ZC_xxxx
end)
end
t = DataFrame()
@dothing(ABCD)
我希望宏做两件事:在调用范围内创建一个新变量,称为 ZC_ABCD;使用此名称和返回值的值向数据框添加一个新列。即我希望从宏返回的表达式如下所示:
ZC_ABCD = [555.0, 666.0, 777.0]
t[:ZC_ABCD] = ZC_ABCD
对于上面的显示,如果我在从宏返回之前添加对 show(expr)
的调用,它会显示:
ZC_ABCD = [555.0, 666.0, 777.0]
t[:ZC_xxxx] = ZC_ABCD
即请注意,数据帧中索引查找中使用的符号不正确。
如何从宏中获得想要的结果?我对符号插值有什么不了解?
在使用符号生成表达式之前尝试引用符号:
macro dothing(xxxx)
# create a new symbol
ZC_xxxx = symbol("ZC_"*string(xxxx))
q = Expr(:quote, ZC_xxxx)
# esc so that variables are assigned in calling scope
return esc(quote
# assign something to the new symbol
$ZC_xxxx = [555.0, 666.0, 777.0]
# Store in a the dataframe
t[$q] = $ZC_xxxx
end)
end
也就是说,从风格上讲,这种变量操作有点冒险,因为真的很难仅通过查看调用来猜测 @dothing
做了什么(它引用了未出现在@dothing(ABCD)
表达式)。
我不知道该如何表达。我有一个这样的宏:
macro dothing(xxxx)
# create a new symbol
ZC_xxxx = symbol("ZC_"*string(xxxx))
# esc so that variables are assigned in calling scope
return esc(quote
# assign something to the new symbol
$ZC_xxxx = [555.0, 666.0, 777.0]
# Store in a the dataframe
t[:(:($ZC_xxxx))] = $ZC_xxxx
end)
end
t = DataFrame()
@dothing(ABCD)
我希望宏做两件事:在调用范围内创建一个新变量,称为 ZC_ABCD;使用此名称和返回值的值向数据框添加一个新列。即我希望从宏返回的表达式如下所示:
ZC_ABCD = [555.0, 666.0, 777.0]
t[:ZC_ABCD] = ZC_ABCD
对于上面的显示,如果我在从宏返回之前添加对 show(expr)
的调用,它会显示:
ZC_ABCD = [555.0, 666.0, 777.0]
t[:ZC_xxxx] = ZC_ABCD
即请注意,数据帧中索引查找中使用的符号不正确。
如何从宏中获得想要的结果?我对符号插值有什么不了解?
在使用符号生成表达式之前尝试引用符号:
macro dothing(xxxx)
# create a new symbol
ZC_xxxx = symbol("ZC_"*string(xxxx))
q = Expr(:quote, ZC_xxxx)
# esc so that variables are assigned in calling scope
return esc(quote
# assign something to the new symbol
$ZC_xxxx = [555.0, 666.0, 777.0]
# Store in a the dataframe
t[$q] = $ZC_xxxx
end)
end
也就是说,从风格上讲,这种变量操作有点冒险,因为真的很难仅通过查看调用来猜测 @dothing
做了什么(它引用了未出现在@dothing(ABCD)
表达式)。