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)
在朱莉娅,我写了两个问题:
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
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.再次感谢你!
在@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)
| 归档时间: |
|
| 查看次数: |
501 次 |
| 最近记录: |