根据标准函数 names , Expr 类型据说遵循这个简单的结构:
julia> names(Expr)
3-element Array{Symbol,1}:
:head
:args
:typ
因此,我希望能够通过以下简单方法直接调用 Expr 构造函数来构建 Expr ,来自另一个 Expr :
julia> exp1 = :(x+y);
julia> exp2 = Expr(exp1.head,exp1.args,exp1.typ)
:(({:+,:x,:y})(Any))
但是得到的exp2不包含与exp1相同的 args ; Expr 从exp1.args和exp1.typ构建新的 args :
julia> exp2.args
2-element Array{Any,1}:
{:+,:x,:y}
Any
VS
julia> exp1.args
3-element Array{Any,1}:
:+
:x
:y
我做错了什么?
编辑:
在documentation的Varargs部分之后,还可以将可迭代对象拼接成函数调用。所以在我的情况下,它只是:
julia> Expr(:call,exp1.args...)
:(x+y)
答案 0 :(得分:4)
Expr()
构造函数不会将输入直接映射到Expr类型的字段。相反,第一个输入成为头部,其余输入成为args。因此,要使用Expr构造函数构造表达式x + y
,您可以这样做:
Expr(:call, :(+), :x, :y)