创建表达式
有许多不同的方法可用于创建相同类型的表达式。该表达式的介绍中提到的:()
语法。也许最好的起点是弦乐。这有助于揭示 Julia 中表达式和字符串之间的一些基本相似之处。
从 String 创建表达式
来自 Julia 文档 :
每个 Julia 程序都以字符串开头
换句话说,任何 Julia 脚本都只是写在一个文本文件中,这只是一串字符。同样,输入解释器的任何 Julia 命令只是一串字符。Julia 或任何其他编程语言的作用是以逻辑,可预测的方式解释和评估字符串,以便这些字符串可用于描述程序员希望计算机完成的任务。
因此,创建表达式的一种方法是使用应用于字符串的 parse()
函数。下面的表达式一旦被计算,就会将值 2 赋给符号 x
。
MyStr = "x = 2"
MyExpr = parse(MyStr)
julia> x
ERROR: UndefVarError: x not defined
eval(MyExpr)
julia> x
2
使用:()
语法创建表达式
MyExpr2 = :(x = 2)
julia> MyExpr == MyExpr2
true
请注意,使用此语法,Julia 会自动将对象的名称视为符号。如果我们看一下表达式的 args
,我们可以看到这一点。 (有关表达式中 args
字段的更多详细信息,请参阅表达式对象的字段。)
julia> MyExpr2.args
2-element Array{Any,1}:
:x
2
使用 Expr()
函数创建表达式
MyExpr3 = Expr(:(=), :x, 2)
MyExpr3 == MyExpr
此语法基于前缀表示法 。换句话说,Expr()
函数指定的第一个参数是 head
或前缀。剩下的就是表达的 arguments
。head
确定将对参数执行哪些操作。
有关详细信息,请参阅表达式对象的字段
使用此语法时,区分使用对象的对象和符号很重要。例如,在上面的例子中,表达式将 2
的值赋给符号:x
,这是一个完全合理的操作。如果我们在这样的表达式中使用 x
本身,我们将得到无意义的结果:
julia> Expr(:(=), x, 5)
:(2 = 5)
同样,如果我们检查 args
,我们会看到:
julia> Expr(:(=), x, 5).args
2-element Array{Any,1}:
2
5
因此,Expr()
函数不会像创建表达式的:()
语法那样执行相同的自动变换。
使用 quote...end
创建多行表达式
MyQuote =
quote
x = 2
y = 3
end
julia> typeof(MyQuote)
Expr
请注意,使用 quote...end
,我们可以在 args
字段中创建包含其他表达式的表达式:
julia> typeof(MyQuote.args[2])
Expr
有关此 args
字段的更多信息,请参见表达式对象的字段。