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

标签 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未定义。我尝试在没有 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

关于macros - 将表达式插入到引号内的表达式中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39812895/

相关文章:

clojure - "regular"和 "reader"宏有什么区别?

vba - 如何优化在大量记录上运行的宏?

F#如何将代码引用编译为程序集

macros - 如何扩展Crystal语言语法?

c++ - 使用元数据/继承来提取跨多个类的代码

Ruby 字符串用正则表达式拆分

random - 如何从 Julia 中的元素列表中随机选择 n 个唯一元素

mysql - julia mysql.jl 使用非默认端口

dataframe - Julia 图/statsplot 确实显示默认标签而不是列名称

C++:生成模板参数?