gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:04:17 25 4
gpt4 key购买 nike

有人可以清楚地说明在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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com