Julia 显式表达式构造函数

Julia 显式表达式构造函数,julia,Julia,根据标准函数名,Expr类型据说遵循以下简单结构: julia> names(Expr) 3-element Array{Symbol,1}: :head :args :typ 因此,我希望能够使用以下简单方法,从另一个Expr直接调用Expr构造函数来构建Expr: 但是结果exp2不包含与exp1相同的参数;Expr从exp1.args和exp1.typ生成新的args: julia> exp2.args 2-element Array{Any,1}: {:+,:x,

根据标准函数名,Expr类型据说遵循以下简单结构:

julia> names(Expr)
3-element Array{Symbol,1}:
 :head
 :args
 :typ 
因此,我希望能够使用以下简单方法,从另一个Expr直接调用Expr构造函数来构建Expr:

但是结果exp2不包含与exp1相同的参数;Expr从exp1.args和exp1.typ生成新的args:

julia> exp2.args
2-element Array{Any,1}:
 {:+,:x,:y}
 Any     
vs

我做错了什么

编辑:

在的Varargs部分之后,还可以将iterable对象拼接到函数调用中。所以在我的例子中,它只是这样:

julia> Expr(:call,exp1.args...)
:(x+y)
Expr()
构造函数不会将输入直接映射到Expr类型的字段。相反,第一个输入成为head,其余的输入成为args。因此,要使用Expr构造函数构造表达式
x+y
,您需要执行以下操作:

Expr(:call, :(+), :x, :y)
Expr()
构造函数不会将输入直接映射到Expr类型的字段。相反,第一个输入成为head,其余的输入成为args。因此,要使用Expr构造函数构造表达式
x+y
,您需要执行以下操作:

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

:(+)相当于:+不是吗?是的,但在某些情况下,巴黎人更安全。不过我认为这对加号来说并不重要。如果你需要一个冒号,尽管你需要它们
:(:)
好的,我就是这么想的。读了茱莉亚的《象征的区别》后我有点怀疑。。也许Expr构造函数自2013年以来发生了变化:(+)相当于:+不是吗?是的,但在某些情况下,paren更安全。不过我认为这对加号来说并不重要。如果你需要一个冒号,尽管你需要它们
:(:)
好的,我就是这么想的。读了茱莉亚的《象征的区别》后我有点怀疑。。也许Expr构造函数自2013年以来发生了变化?
Expr(:call, :(+), :x, :y)