> For the complete documentation index, see [llms.txt](https://chaoses-ib.gitbook.io/directory-opus/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://chaoses-ib.gitbook.io/directory-opus/guan-fang-shou-ce/readme.zh-9/grammar.zh.md).

# 求值器语法

求值器的语法类似于 JScript (Javascript) 和 C++。

### 简介

通常，表达式从左到右进行求值。标准 BODMAS 规则适用于数学运算符——可以使用括号 `()` 更改计算顺序。如果求值表达式包含多个子句，每个子句都必须以分号 `;` 结尾。

可以使用 `if`, `elseif` 和 `else` 来测试条件并根据结果执行不同的计算。要测试的条件必须出现在括号 `()` 内。还可以使用 `?:` *三元运算符*（也称为 *条件运算符*）。

可以使用 `{` 标记在 `if`, `elseif` 或 `else` 后打开一个 *作用域*，并使用 `}` 关闭它。作用域用于允许在测试结果中计算多个子句。

可以使用 `=` 分配变量。无需预先声明变量。变量是 [类型的](/directory-opus/guan-fang-shou-ce/readme.zh-9/variable_types.zh.md)，但没有强类型——类型将被推断，类型之间的转换是自动的。还可以使用 `as` 运算符进行显式转换。

求值器提供了许多 [函数](/directory-opus/guan-fang-shou-ce/readme.zh-10/readme.zh-4.md)。要调用函数，函数名后面需要跟括号 `()`。如果函数接受任何参数，这些参数必须用逗号分隔并出现在括号内——但即使函数不接受参数也需要括号。

可以使用注释，求值器会忽略它们——它们必须以 `//` 开头。

### 返回值

调用求值器的大多数上下文都希望获得返回值。例如，用于修改按钮标签的求值表达式会返回一个字符串以用作按钮的标签。

可以使用 `return` 关键字将求值表达式的结果返回给调用者。

```
return "Button Label";
```

如果未使用 `return` 关键字，求值表达式还具有 *隐式返回值*——如果没有明确指明，则将返回最后引用的函数、运算符或变量的值。这样可以节省空间。

例如，可以使用代码 `{=source=}` 将求值器变量“source”的值直接插入命令行中。这等效于 `{=return source;=}`。

### 运算符

支持以下数学运算符：

|     |         |
| --- | ------- |
| +   | 加法 / 连接 |
| -   | 减法      |
| \*  | 乘法      |
| /   | 除法      |
| Mod | 取模      |

支持以下赋值运算符：

|     |      |
| --- | ---- |
| =   | 直接赋值 |
| +=  | 加法赋值 |
| -=  | 减法赋值 |
| \*= | 乘法赋值 |
| /=  | 除法赋值 |

支持前缀和后缀递增和递减运算符：

|    |    |
| -- | -- |
| ++ | 递增 |
| -- | 递减 |

（前缀递增，例如 `++a`，返回递增值；后缀递增，例如 `a++`，返回前一个值）。

支持以下关系（比较）运算符：

| ==              | 等于    |
| --------------- | ----- |
| <p>!=<br><></p> | 不等于   |
| >               | 大于    |
| <               | 小于    |
| >=              | 大于或等于 |
| <=              | 小于或等于 |

支持以下逻辑运算符：

| <p>And<br>&&</p> | 逻辑 AND |      |       |
| ---------------- | ------ | ---- | ----- |
| <p>Or<br>        |        | </p> | 逻辑 OR |
| <p>Not<br>!</p>  | 逻辑 NOT |      |       |

支持以下按位运算符：

|    |        |
| -- | ------ |
| &  | 按位 AND |
| \| | 按位 OR  |
| \~ | 按位 NOT |
| ^  | 按位 XOR |

其它运算符：

|      |                                                                             |
| ---- | --------------------------------------------------------------------------- |
| ?:   | 三元运算符根据条件返回一个值，例如 `x = a ? b : c;` 如果 `a` 为真，将 `x` 设置为 `b`，否则将 `x` 设置为 `c`。 |
| As   | 转换运算符。允许将变量转换为显式类型。也可以用来格式化数字、大小和日期。                                        |
| :    | 单独使用时（而不是作为三元运算符的一部分），这提供了一种将变量初始化为显式类型的方式。                                 |
| \[ ] | 用于定义 *值容器*。值容器是一个可以包含其它变量的变量——有点类似于 C++ 中的 *结构* 或 Javascript 对象数组。          |
| .    | 用于访问 *值容器* 的成员变量。                                                           |

### If / ElseIf / Else

求值器中的主要流程控制形式以 `if` 子句开头。要测试的条件必须出现在括号内。条件（其中可以包括函数调用和数学运算）将计算为真或假。如果结果为真，则会进入 `if` 之后紧接着的代码分支。如果该代码分支需要包含多个子句，则必须使用 `{` 大括号字符打开一个作用域。

```
// 简单测试，如果 x 等于 5，则向调用我们的人返回字符串“five”
```

if (x == 5) return "five";

// 更复杂的测试，如果 x 加 y 大于 20... if (x + y > 20) { // 我们打开一个范围，以便可以有多个子句 Output("是的，它大于 20！"); return "大于 20"; }

如果 `if` 子句测试的条件求值为 false，则求值器将跳过下一个子句（或下一个范围，如果打开了范围）。然后它将寻找 `elseif` 或 `else` 关键字。`Elseif` 允许您提供另一个要测试的条件 - 与 `if` 相同，它也适用于同样的行为。

if (x + y > 20) return "大于 20"; elseif (x == 5) return "five";

可以包含任意数量的 `elseif` 子句。求值器将按顺序继续求值每个子句的条件，直到找到求值为 true 的条件。

如果提供了 `else` 子句，则仅当前面的条件之一未求值为 true 时，才执行其后的代码。

if (x + y > 20) return "大于 20"; elseif (x == 5) return "five"; else return "其它";

请注意，块中只有一个（最多）`if`、`elseif` 或 `else` 子句会执行其代码。如果块不以 `else` 结束，则块内可能没有任何代码被执行（即如果所有条件都求值为 false）。

### 三元运算符

*三元* 或 *比较* 运算符是唯一带有三个参数而不是两个参数的运算符。它基本上是 `if`/`else` 的简写形式。

return (x == 5) ? "five" : "something else";

`?` 左侧的表达式立即被求值为 true 或 false。如果求值为 true，则返回 `?` 右侧的值 - 否则，返回 `:` 右侧的值。

如果需要，可以将多个三元运算符串联在一起：

return (x + y > 20) ? "more than twenty" : (x == 5) ? "five" : "something else";

记住，求值是从左到右进行的，在上面的示例中：

* `x + y` 的结果是否大于 20？如果是，则返回“大于 20”
* 否则，`x` 是否等于 5？如果是，则返回“five”
* 否则，返回“其它”
