在Julia中引用-ququin成语并连接Expr对象

vuk*_*ung 5 macros metaprogramming julia

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

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

在朱莉娅,我写了两个问题:

  1. 如何将生成的Expr对象收集到块中?(在Lisp中,这是通过拼接与列表进行,@progn).我能想出的最好的是创建一个Expr(:block),并将其设置为args到列表中,但是这是远远优雅.
  2. 我需要使用变量的名称和值.字符串内部的插值和引用的表达式都使用$,这使问题复杂化,但即使我string用于连接,我也无法打印变量的名称 - 至少:($v)不会像',v在CL 中那样做...

我当前的宏看起来像这样:

macro dprint(vars...)
  ex = Expr(:block)
  ex.args = [:(println(string(:($v), " = ", $v))) for v in vars]
  ex
end
Run Code Online (Sandbox Code Playgroud)

查看宏扩展显示了问题:

julia> macroexpand(:(@dprint x y))
quote 
    println(string(v," = ",x))
    println(string(v," = ",y))
end
Run Code Online (Sandbox Code Playgroud)

我想得到

quote 
    println(string(:x," = ",x))
    println(string(:y," = ",y))
end
Run Code Online (Sandbox Code Playgroud)

任何提示?

编辑:结合答案,解决方案似乎如下:

macro dprint(vars...)
  quote
    $([:(println(string($(Meta.quot(v)), " = ", $v))) for v in vars]...)
  end
end
Run Code Online (Sandbox Code Playgroud)

......即使用$(Meta.quot(v))到的效果',v,并$(expr...),@expr.再次感谢你!

Lyn*_*ite 7

@show宏已经存在此.能够自己实现它是有帮助的,所以稍后你可以做其他喜欢如make一个将显示数组的大小.

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

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

见:

julia> a=2; b=3;

julia> @dprint a
a = 2

julia> @dprint a b
a = 2
b = 3
Run Code Online (Sandbox Code Playgroud)