@@ -6,7 +6,7 @@
|
||||
|
||||
<!-- section-id: syntax-04-001 -->
|
||||
|
||||
回答“普通变量怎样直接使用、`var` 在什么位置出现、常量必须怎样初始化、哪些名字一旦绑定就不能再赋值”。
|
||||
回答“普通变量怎样直接使用、`var` 在什么位置出现、常量必须怎样初始化、`global` 怎样跨函数共享,以及运行时常量怎样冻结一次调用中的表达式结果”。
|
||||
|
||||
## 核心规则
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
- 右侧数组元素也可以是数组;拆出来的变量会直接得到对应子数组。
|
||||
- 多参数赋值也可以出现在函数调用参数里。
|
||||
- `{$explicit+}` 开启后,后续变量必须先用 `var` 声明;未声明变量会报 `variable not defined`。
|
||||
- `global x, y;` 声明当前任务中的全局变量;每个需要访问它的函数都要再次写 `global` 声明。
|
||||
- `const name := expression;` 是运行时常量:进入所属函数时计算,当前调用内不可再次赋值;不要与编译时常量 `const name = expression;` 混写。
|
||||
|
||||
## 可直接照写示例
|
||||
|
||||
@@ -178,6 +180,71 @@ const kMaxRetries = 3 + 4;
|
||||
value := kMaxRetries;
|
||||
```
|
||||
|
||||
### 全局变量 `global`
|
||||
|
||||
<!-- section-id: syntax-04-009 -->
|
||||
|
||||
<!-- tags: 全局变量, 跨函数共享变量, 不同函数访问同一变量, global 声明 -->
|
||||
|
||||
`global` 让同一运行任务中的不同函数访问同一变量。每个需要读写该变量的函数都要声明它;漏写时,同名标识符会按局部变量处理。
|
||||
|
||||
代码块身份:可直接照写示例
|
||||
|
||||
```tsl
|
||||
global shared_value;
|
||||
shared_value := 37;
|
||||
writeLn(ReadShared());
|
||||
|
||||
function ReadShared();
|
||||
begin
|
||||
global shared_value;
|
||||
return shared_value;
|
||||
end;
|
||||
```
|
||||
|
||||
代码块身份:输出片段
|
||||
|
||||
```text
|
||||
37
|
||||
```
|
||||
|
||||
本节只拥有“当前任务内跨函数共享”和“每个引用函数都要声明”的规则;不要从中推断跨任务持久化、线程隔离或进程级生命周期。
|
||||
|
||||
### 运行时常量 `const name := expression`
|
||||
|
||||
<!-- section-id: syntax-04-010 -->
|
||||
|
||||
<!-- tags: 运行时常量, 表达式常量, 每次调用重新计算, 初始化后不能修改 -->
|
||||
|
||||
运行时常量使用 `:=` 初始化,可以依赖参数、变量或函数调用。它在每次进入所属函数时重新计算一次,随后在本次调用内不可修改。
|
||||
|
||||
代码块身份:可直接照写示例
|
||||
|
||||
```tsl
|
||||
writeLn(FreezeValue(2));
|
||||
writeLn(FreezeValue(5));
|
||||
|
||||
function FreezeValue(value);
|
||||
begin
|
||||
const fixed := value + 1;
|
||||
return fixed;
|
||||
end;
|
||||
```
|
||||
|
||||
代码块身份:输出片段
|
||||
|
||||
```text
|
||||
3
|
||||
6
|
||||
```
|
||||
|
||||
边界:
|
||||
|
||||
- 编译时常量写 `const name = expression;`;运行时常量写 `const name := expression;`
|
||||
- 运行时常量声明放在函数 `begin ... end` 语句体中,不放在函数头后的 `const` 声明段
|
||||
- 运行时常量不作为类成员写法
|
||||
- 初始化后再次赋值会破坏常量约束,不要生成
|
||||
|
||||
### 多参数赋值
|
||||
|
||||
<!-- section-id: syntax-04-006 -->
|
||||
@@ -331,6 +398,9 @@ items := array(1, 2, 3);
|
||||
- 以为 `const` 可以只声明名字,不写初始化表达式。
|
||||
- 以为单变量拆包可以写成 `[a] := array(...)`。
|
||||
- 以为 `{$explicit+}` 开启后仍然可以继续直接写未声明变量。
|
||||
- 只在脚本顶层声明一次 `global`,却忘记在读取它的函数里再次声明。
|
||||
- 把运行时常量 `const name := expression;` 写进函数头后的编译时 `const` 声明段。
|
||||
- 把运行时常量当成可重新赋值的普通变量或类成员。
|
||||
|
||||
代码块身份:反例 / 不可照写
|
||||
|
||||
|
||||
Reference in New Issue
Block a user