将表达式插入到引号内的表达式中

时间:2016-10-02 00:57:58

标签: macros metaprogramming julia

这个问题builds off of a previous SO question用于从宏内部的表达式构建表达式。然而,当引用整个表达时,事情变得有点卡车司机。例如,我想构建表达式:(name = val)。以下内容:

macro quotetest(name,val)
  quote
    nm = Meta.quot($(QuoteNode(name)))
    v = Meta.quot($(QuoteNode(val)))
    println(nm); println(typeof(nm))
    println(v); println(typeof(val))
  end
end

@quotetest x 5 # Test case: build :(x=5)

打印出来

:x
Expr
$(Expr(:quote, 5))
Expr

显示我在正确的路径上:nm和val是我想要在引用中的表达式。但是,我现在似乎无法应用之前的解决方案。例如,

macro quotetest(name,val)
  quote
    nm = Meta.quot($(QuoteNode(name)))
    v = Meta.quot($(QuoteNode(val)))
    println(nm); println(typeof(nm))
    println(v); println(typeof(v))
    println(:($(Expr(:(=),$(QuoteNode(nm)),$(QuoteNode(val))))))
  end
end

失败,说nm is not defined。我尝试在没有QuoteNode的情况下进行插值,避免插值$(esc(nm))等等。我似乎无法找到如何使其构建表达式。

1 个答案:

答案 0 :(得分:3)

我认为您使用的$符号超出了您的需要。这是你在找什么?

julia> macro quotetest(name,val)
           quote
               expr = :($$(QuoteNode(name)) = $$(QuoteNode(val)))
               println(expr)
               display(expr)
               println(typeof(expr))
           end
       end
@quotetest (macro with 1 method)

julia> @quotetest test 1
test = 1
:(test = 1)
Expr