显式的Expr构造函数

时间:2014-08-21 21:49:40

标签: julia

根据标准函数 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)

1 个答案:

答案 0 :(得分:4)

Expr()构造函数不会将输入直接映射到Expr类型的字段。相反,第一个输入成为头部,其余输入成为args。因此,要使用Expr构造函数构造表达式x + y,您可以这样做:

Expr(:call, :(+), :x, :y)