metaprogramming - 消除Julia元编程中的各种引用机制

标签 metaprogramming julia quoting

有人可以清楚地说明在Julia中可用于元编程的各种报价机制,并用一个最小的例子来说明每个报价机制吗?

这样就很清楚在哪种情况下使用哪个...

据我所知:

  • :(someExpr; maybeMore)
  • quote; ...expressions... end;与上面的几乎相同,只是行号用于调试目的
  • Expr(:quote, x)(according to @totalverb)等于Meta.quot(x)
  • QuoteNode(according to Jeff Bezanson)“仅在内部AST表示中使用,而不是在宏中使用。除非您在编译器的后续阶段中工作,否则安全地忽略。”

  • 这份 list 是否全面?我会错过任何其他表示形式吗?

    最佳答案

    :...是默认的报价机制。它解析一个表达式并返回AST。

    :x == Symbol("x")
    
    :(x + y) == Expr(:call, :+, :x, :y)
    
    :(x; y; z) == Expr(:block, :x, :y, :z)
    
    eval(:<expr>)应该返回与<expr>相同的内容(假设<expr>是当前全局空间中的有效表达式)
    eval(:(1 + 2)) == 1 + 2
    
    eval(:(let x=1; x + 1 end)) == let x=1; x + 1 end
    
    quote ... end:(begin ... end)相同
    Expr(:quote, x)用于表示引号内的引号。
    Expr(:quote, :(x + y)) == :(:(x + y))
    
    Expr(:quote, Expr(:$, :x)) == :(:($x))
    
    QuoteNode(x)Expr(:quote, x)相似,但是它可以防止插值。
    eval(Expr(:quote, Expr(:$, 1))) == 1
    
    eval(QuoteNode(Expr(:$, 1))) == Expr(:$, 1)
    

    这是使用所有宏的宏:
    macro quoted(expression)
        quote
            println("received expression: :(", $(QuoteNode(expression)), ")")
            $(Expr(:quote, expression))
        end
    end
    

    用法:
    julia> x = 1
    1
    
    julia> @quoted $x + 1
    received expression: :($(Expr(:$, :x)) + 1)
    :(1 + 1)
    
    julia> @quoted :(x + 1)
    received expression: :($(Expr(:quote, :(x + 1))))
    :($(Expr(:quote, :(x + 1))))
    

    编辑:Meta.quot(x)确实与Expr(:quote, x)相同。它没有记录,也没有在任何地方提及,但是它是对Base(https://github.com/JuliaLang/julia/pull/1755)导出的函数的有意识的补充,而且我还没有看到任何弃用它的计划,因此可以使用它。

    关于metaprogramming - 消除Julia元编程中的各种引用机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41089019/

    相关文章:

    c++ - 基于标志的多重继承

    c++ - const 值作为模板参数

    julia - 如何使用 Julia 将两个字典合并到一个表达式中?

    julia - 在 iJulia 笔记本结果中提供文件下载链接

    php - 在 PHP 中将 CSV 写入不带附件的文件

    python - 如何在 Python 类中制作抽象的 protected 字段?

    c++ - 编译时计算 (C++ v. C)

    具有不同大小向量的 Julia 数组

    bash - 如何转义 ssh/remote bash 命令中的单引号字符?

    bash - cd wslpath as bash function shell 引用问题