🧙‍♂️发生了什么

表达式

表达式是一个储存了一系列委托与一系列运算符的容器,当表达式解析时,所有委托被执行并转换为元素,然后重复使用优先级最高的运算符计算其相关的两个元素,重复这一过程直到所有运算符都被处理过,表达式解析结束,表达式的结果是剩下的唯一元素。

委托

每次解析表达式时,执行的相同函数也可能会产生不同结果(比如说random()),因此表达式解析前函数只会作为一个执行函数的委托存于表达式中,在表达式解析开始时才会转换为元素,委托有以下类型:

  • CALL_SELF 调用自身,格式:元素()

  • CALL_METHOD 调用函数,格式:元素.method()

  • GET_FIELD 获取属性,格式:元素.field

  • PARSE_VARIABLE 检查文本是不是变量

  • SUB_EXPRESSION 处理执行的子表达式

(-5).abs()+random()
运算符 [+]
委托:
- Int@-5 -> CALL_METHOD abs()
- String@random -> PARSE_VARIABLE -> CALL_SELF

调用函数时

在了解委托后你可能可以很容易的理解,函数 random() 其实只是文本 random 执行了 PARSE_VARIABLE 委托,真正的函数存在全局变量中。

最后更新于