🐛 fix(tsl-syntax-reference): close verified syntax gaps
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
<!-- quickstart-rule: index-origins -->
|
||||
|
||||
- `array(...)` 既可以写顺序数组,也可以写字符串键表;顺序数组和 `binary(...)` 二进制缓冲区下标从 `0` 开始,字符串下标从 `1` 开始。
|
||||
- 数组元素可以是混合类型;给不存在的下标赋值会扩张数组。显式整数键可写成 `array(0: value0, 1: value1)`。
|
||||
- `s[0]` 在运行时会越界,不要把字符串当成 0 基下标。
|
||||
- 字符串取子串用 `s[start:end]`,并且 `end` 是包含在结果里的。
|
||||
- 字符串替换子串用 `s[start:end] := "..."`。
|
||||
@@ -36,6 +37,8 @@
|
||||
- `U""` 不是宽串;需要在 UTF8、宽串、普通串之间显式转换时,继续用 `utf8ToUnicode(...)`、`utf8ToAnsi(...)`、`ansiToUtf8(...)`、`unicodeToUtf8(...)`、`string(...)`、`wideString(...)`。
|
||||
- `#number` 可以直接把字符码拼进字符串。
|
||||
- `\0` 和 `#0` 都能把 ASCII `0` 放进字符串,并且不会把字符串截断。
|
||||
- 字符串 `like` 的右侧按正则表达式解释,不是 SQL `%` / `_` 通配,也不要把正则里的 `*` 当成独立的 glob 通配符;默认匹配不区分大小写。
|
||||
- 数值 `like` 表示近似相等;`likeEps` 和 `likeEpsRate` 分别控制绝对误差与相对误差阈值,默认值都是 `1e-6`。
|
||||
|
||||
## 可直接照写示例
|
||||
|
||||
@@ -170,6 +173,33 @@ C
|
||||
|
||||
代码块说明:顺序数组 `items` 从 `0` 开始,字符串键表 `row` 用字符串键访问,字符串 `s` 从 `1` 开始。
|
||||
|
||||
数组按写入下标扩张:
|
||||
|
||||
代码块身份:可直接照写示例
|
||||
|
||||
```tsl
|
||||
items := array(1);
|
||||
items[3] := 4;
|
||||
keyed := array(0: 2, 1: 3);
|
||||
writeLn(length(items));
|
||||
writeLn(items[1] = nil);
|
||||
writeLn(items[3]);
|
||||
writeLn(keyed[0]);
|
||||
writeLn(keyed[1]);
|
||||
```
|
||||
|
||||
代码块身份:输出片段
|
||||
|
||||
```text
|
||||
2
|
||||
1
|
||||
4
|
||||
2
|
||||
3
|
||||
```
|
||||
|
||||
说明:`length(items)` 统计已有项数,不等于“最大整数键 + 1”;下标 `1` 没有写入,因此读取为 `nil`。
|
||||
|
||||
### 字符串边界规则
|
||||
|
||||
<!-- section-id: syntax-03-004 -->
|
||||
@@ -416,20 +446,20 @@ A=1 B=2.34 C=AAA
|
||||
- 纯小数可能走科学计数法:`"_" $ 0.0000005 $ ","` 返回 `"_5E-7,"`
|
||||
- 带整数部分的小数保留精度:`"_" $ 1.0000005 $ ","` 返回 `"_1.0000005,"`
|
||||
|
||||
### 字符串 `like` 模式匹配
|
||||
### 字符串与数值 `like`
|
||||
|
||||
<!-- section-id: syntax-03-007 -->
|
||||
|
||||
<!-- tags: 通配符匹配, 正则匹配, 正则表达式, 模糊匹配, 判断是否符合模式 -->
|
||||
<!-- tags: 正则匹配, 正则表达式, 模糊匹配, 判断是否符合模式, 默认不区分大小写, 数值近似相等, like 精度 -->
|
||||
|
||||
`like` 用于判断字符串是否符合指定模式(支持通配符和正则表达式):
|
||||
字符串 `like` 的右侧是正则表达式;默认匹配不区分大小写:
|
||||
|
||||
代码块身份:可直接照写示例
|
||||
|
||||
```tsl
|
||||
result1 := "hello" like "he*";
|
||||
result2 := "HELLO" like "he*";
|
||||
result3 := "test@example.com" like "*@*";
|
||||
result1 := "a" like "A";
|
||||
result2 := "HELLO" like "hello";
|
||||
result3 := "2009-1-1" like "\\d+-\\d+-\\d+";
|
||||
writeLn("result1:", result1);
|
||||
writeLn("result2:", result2);
|
||||
writeLn("result3:", result3);
|
||||
@@ -439,22 +469,49 @@ writeLn("result3:", result3);
|
||||
|
||||
```text
|
||||
result1: 1
|
||||
result2: 0
|
||||
result2: 1
|
||||
result3: 1
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- `like` 大小写敏感,`"hello" like "he*"` 返回 `1`(真),`"HELLO" like "he*"` 返回 `0`(假)
|
||||
- `*` 是通配符,匹配任意字符序列
|
||||
- `like` 也支持正则表达式模式(如 `"\\d{4}-\\d{2}-\\d{2}"` 匹配日期格式)
|
||||
- 默认情况下,`"a" like "A"` 和 `"HELLO" like "hello"` 都返回 `1`(真)
|
||||
- `"\\d+-\\d+-\\d+"` 是正则表达式,匹配示例中的日期形态
|
||||
- 正则量词 `*` 只修饰它前面的原子;不要把 `"he*"` 解释成“`he` 后面任意字符”的 glob 模式,需要任意字符序列时写成 `.*`
|
||||
- 匹配控制标志可以改变大小写规则;控制标志的精确 API、参数与目标 scope 使用 `tsl-api-reference` skill 核对
|
||||
|
||||
数值 `like` 用于近似相等判断:
|
||||
|
||||
代码块身份:可直接照写示例
|
||||
|
||||
```tsl
|
||||
old_abs_eps := likeEps;
|
||||
old_rate_eps := likeEpsRate;
|
||||
likeEps := 0.1;
|
||||
likeEpsRate := 0;
|
||||
writeLn(1.05 like 1);
|
||||
likeEps := old_abs_eps;
|
||||
likeEpsRate := old_rate_eps;
|
||||
```
|
||||
|
||||
代码块身份:输出片段
|
||||
|
||||
```text
|
||||
1
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- `likeEps` 和 `likeEpsRate` 都可读写,默认值均为 `1e-6`
|
||||
- 两数绝对差小于 `likeEps`,或“绝对差 / 两数绝对值的平均值”小于 `likeEpsRate` 时,数值 `like` 返回真
|
||||
- 临时修改阈值后要恢复旧值,避免影响同一运行时中的后续比较
|
||||
|
||||
`not like` 是取反形式(TSL 2025/8 版本起支持):
|
||||
|
||||
代码块身份:可直接照写示例
|
||||
|
||||
```tsl
|
||||
result := "abc" not like "xyz*";
|
||||
result := "abc" not like "xyz.*";
|
||||
writeLn(result);
|
||||
```
|
||||
|
||||
@@ -547,6 +604,10 @@ items := array(1, 2, 3);
|
||||
- 把普通字符串里的 `\uXXXX` 直接当成宽串单字符。
|
||||
- 把 `U""` 当成宽串;需要宽串时按本页转换链处理。
|
||||
- 把 `#0` / `\0` 当成 C 风格字符串终止符。
|
||||
- 把字符串 `like` 误写成默认区分大小写;默认行为是不区分大小写。
|
||||
- 把 `like` 只理解成字符串模式匹配,遗漏数值近似相等语义。
|
||||
- 修改 `likeEps` / `likeEpsRate` 后不恢复,导致后续代码继承意外的比较阈值。
|
||||
- 以为给较大整数下标赋值后,中间所有位置都会自动生成实际元素;未写入的位置仍为 `nil`。
|
||||
|
||||
代码块身份:反例 / 不可照写
|
||||
|
||||
|
||||
Reference in New Issue
Block a user