从宏中的符号生成符号

时间:2015-02-27 09:00:18

标签: macros metaprogramming julia

我不确定如何表达这一点。我有一个像这样的宏:

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

即。请注意,数据框中索引查找中使用的符号不正确。

如何从宏中获得所需的结果?我对符号插值有什么不了解?

1 个答案:

答案 0 :(得分:3)

在使用符号生成带符号的表达式

之前,请尝试引用该符号
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做了什么(它引用了{{}}中没有出现的各种数量{1}}表达)。