将表达式插入引号内的表达式
Interpolating an expression into an expression inside of a quote
这个问题 用于从宏内部的表达式构建表达式。然而,当引用整个表达时,事情变得有点卡车司机。例如,我想构建表达式 :(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))
,等等。我似乎无法找到如何构建表达式。
我认为您使用 $
标志的次数超出了您的需要。这是您要找的吗?
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
这个问题
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))
,等等。我似乎无法找到如何构建表达式。
我认为您使用 $
标志的次数超出了您的需要。这是您要找的吗?
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