Julia元编程:生成带符号关键字参数的call类型Expr的插值方法
解决方案
要实现需求只需在插值时手动给目标符号套一层QuoteNode,模拟Julia解析器处理字面量符号:时的自动封装逻辑即可:
julia> x = :u :u julia> dump(:(func(something; a=$(QuoteNode(x))))) Expr head: Symbol call args: Array{Any}((3,)) 1: Symbol func 2: Expr head: Symbol parameters args: Array{Any}((1,)) 1: Expr head: Symbol kw args: Array{Any}((2,)) 1: Symbol a 2: QuoteNode value: Symbol u 3: Symbol something
原理说明
之前直接插值$x时,是把Symbol类型的x直接插入了表达式树,而字面量写法a=:b中,Julia解析器会自动把:b封装为QuoteNode(Symbol(:b))再插入表达式树,两者结构差异就是问题的核心原因。
也可以用嵌套插值的简写形式实现相同效果,写法更简洁:
dump(:(func(something; a=$(:($x)))))
上述两种写法生成的表达式结构和手动写的func(something; a=:b)完全一致,求值时会直接使用符号本身,不会尝试查找对应变量。
内容的提问来源于stack exchange,提问作者dantheman
相关产品推荐
相关产品推荐

