创建表达式

有许多不同的方法可用于创建相同类型的表达式。该表达式的介绍中提到的:() 语法。也许最好的起点是弦乐。这有助于揭示 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 或前缀。剩下的就是表达的 argumentshead 确定将对参数执行哪些操作。

有关详细信息,请参阅表达式对象的字段

使用此语法时,区分使用对象的对象和符号很重要。例如,在上面的例子中,表达式将 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 字段的更多信息,请参见表达式对象的字段。

有关创建表达式的更多信息

此示例仅提供了创建表达式的基础知识。有关创建更复杂和高级表达式的更多信息,另请参见插值和表达式以及表达式对象的字段