# 发生了什么

## 表达式

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

## 委托

每次解析表达式时，执行的相同函数也可能会产生不同结果（比如说`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` 委托，真正的函数存在全局变量中。
