Files
Endorphin-Document/guide/08-expressions-and-bindings.md
T

69 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 8. 表达式与绑定
表达式描述计算并产生值。let 将表达式结果绑定到局部名称,后续表达式可以使用这个结果。
## 8.1 表达式形式
本文语法包含以下表达式:
| 形式 | 示例 | 含义 |
| --- | --- | --- |
| 字面量 | `100`、`"商品"`、`.title` | 直接表达一个值 |
| 名称引用 | `amount` | 使用已解析的名称 |
| 一元表达式 | `-4` | 对值使用一元负号 |
| 算术表达式 | `100 - 10` | 计算数值 |
| 成员访问 | `product.price` | 使用字段或成员 |
| 调用 | `discountedPrice(100, 10)` | 调用逻辑并取得结果 |
| 分组 | `(100 - 10) * 2` | 改变表达式组合方式 |
具体名称和成员必须存在并符合类型要求。调用的参数和返回规则见[函数与调用](09-functions-and-calls.md)。
## 8.2 运算与优先级
从高到低的组合顺序为:
| 顺序 | 形式 |
| --- | --- |
| 1 | 分组中的表达式 |
| 2 | 成员访问与调用 |
| 3 | 一元负号 |
| 4 | 乘法、除法 |
| 5 | 加法、减法 |
同级二元算术运算在本文草案中按从左到右组合。`100 - 10 * 2` 先做乘法,结果为 `80`;`(100 - 10) * 2` 的结果为 `180`。
数值溢出、除法、隐式转换和其他运算符的规则见[规范状态](../appendices/specification-status.md#词法与表达式)。
## 8.3 let 绑定
函数体片段:
```endorphin
let amount = 100 - 10
let payable = amount - 5
```
第一行将结果 `90` 绑定到 amount,第二行使用它得到 `85`。每个绑定包含关键字 `let`、局部名称、等号和表达式。
let 是结果绑定,不是 namespace 声明。本文函数文法将绑定放在函数体内;顶层绑定、重新赋值与可变性不由该语句推导。
## 8.4 成员访问
`值.成员名` 访问该值的字段或其他可用成员。类型检查决定访问是否合法。
`product.price` 使用 Product 的字段。`Product.get(...)` 则在形式上是先找到类成员,再调用;成员调用的形式不会自动为 Product 创建 get 方法,详见[数据读取](10-data-access.md)。
## 8.5 结果依赖
当一个表达式使用前一个调用的结果时,存在数据依赖:
```text
第一次调用 → 结果绑定 → 使用该结果的第二次调用
```
inflight 必须在结果可用后使用它,不能将未就绪状态替换为伪造成功值。Preflight 检查表达式结构与类型,不能据此保证所有实际调用成功。
表达式是否带有业务修改效果,以及失败、等待与取消的表示方式,由调用语义定义。算术的组合顺序不自动确定所有调用参数的求值顺序。
[上一章:类型与类](07-types-and-classes.md) · [下一章:函数与调用](09-functions-and-calls.md) · [目录](../README.md)