gpt4 book ai didi

macros - Julia 中的 Quote-unquote 习惯用法和连接 Expr 对象

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

我想编写一个简单的宏来显示变量的名称和值。在 Common Lisp 中,它将是

(defmacro dprint (&rest vars)
`(progn
,@(loop for v in vars
collect `(format t "~a: ~a~%" ',v ,v))))

在 Julia 中,我在写这个时遇到了两个问题:
  • 如何收集生成的 Expr对象变成一个块? (在 Lisp 中,这是通过将列表与 ,@ 拼接成 progn 来完成的。)我能想到的最好方法是创建一个 Expr(:block) ,并设置其 args到列表中,但这远非优雅。
  • 我需要同时使用变量的名称和值。字符串和引用表达式内的插值都使用 $ ,这使问题复杂化,但即使我使用 string对于串联,我无法打印变量的名称 - 至少 :($v)',v 不同在CL...

  • 我当前的宏如下所示:
    macro dprint(vars...)
    ex = Expr(:block)
    ex.args = [:(println(string(:($v), " = ", $v))) for v in vars]
    ex
    end

    查看宏展开显示了问题:
    julia> macroexpand(:(@dprint x y))
    quote
    println(string(v," = ",x))
    println(string(v," = ",y))
    end

    我想得到
    quote 
    println(string(:x," = ",x))
    println(string(:y," = ",y))
    end

    任何提示?

    编辑:结合答案,解决方案似乎如下:
    macro dprint(vars...)
    quote
    $([:(println(string($(Meta.quot(v)), " = ", $v))) for v in vars]...)
    end
    end

    ...即,使用 $(Meta.quot(v))',v 的影响, 和 $(expr...),@expr .再次感谢你!

    最佳答案

    @show为此,宏已经存在。能够自己实现它是有帮助的,所以以后你可以做其他类似的事情,比如 make one 将显示数组的大小。

    对于您的特定变体:
    答案是 Meta.quot ,

    macro dprint(vars...)
    ex = Expr(:block)
    ex.args = [:(println($(Meta.quot(v)), " = ", $v)) for v in vars]
    ex
    end

    见:
    julia> a=2; b=3;

    julia> @dprint a
    a = 2

    julia> @dprint a b
    a = 2
    b = 3

    关于macros - Julia 中的 Quote-unquote 习惯用法和连接 Expr 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39931112/

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