🐛 fix(tsl_syntax): repair lookup engine and reconcile reference facts

lookup.py: exempt code-anchored ASCII identifiers from the mixed
zh/en gate so exact hits are no longer dropped; dedup parent/child
sections in results; validate write-prelude anchors in --check.

references: correct interpreter-verified facts (case-as-expression,
control-flow semicolons, __line__/__stack_frame, tslObjects order,
destroy timing, ErrDefine, truncated outputs), fix headings, scope
qualifiers and reversed quotes; strip dead preamble metadata from all
24 pages.

packaging: exclude __pycache__/*.pyc from playbook and bundle copies;
update build test file-count assertion to match.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
csh
2026-07-13 09:16:57 +08:00
co-authored by Claude Fable 5
parent 923bce91b0
commit b597edfc70
29 changed files with 356 additions and 256 deletions
@@ -1,20 +1,15 @@
# TSL 矩阵深水专题
文档类型:语法深水专题
是否可直接用于生成代码:是
是否含可直接照写示例:是
是否含不可照写反例:是
这一篇只讲矩阵专用语法主干:矩阵初始化、数列构造、矩阵逆/广义逆、矩阵乘除乘方、矩阵转置、矩阵拼接、矩阵尺寸与索引、矩阵遍历、子矩阵和 `mfind` 查找。它和 [12_matrix_and_collections.md](12_matrix_and_collections.md) 的分工是:`12` 讲普通数组与集合关系,这一篇讲矩阵专用构造、运算、遍历、子矩阵和矩阵查找接口。
## 本篇职责
回答怎样直接构造全零矩阵、全一矩阵、随机矩阵、单位矩阵、空矩阵和数列数组,怎样写矩阵逆/广义逆,怎样进行矩阵乘除乘方,怎样转置矩阵,怎样拼接矩阵,怎样拿到矩阵的行数、列数、行索引和列索引,怎样遍历矩阵、取/改子矩阵,以及怎样用 `mfind` 找到或替换符合条件的单元格”。
回答怎样直接构造全零矩阵、全一矩阵、随机矩阵、单位矩阵、空矩阵和数列数组,怎样写矩阵逆/广义逆,怎样进行矩阵乘除乘方,怎样转置矩阵,怎样拼接矩阵,怎样拿到矩阵的行数、列数、行索引和列索引,怎样遍历矩阵、取/改子矩阵,以及怎样用 `mfind` 找到或替换符合条件的单元格”。
## 智能体矩阵深水判断流程
1. 先判断要写矩阵初始化、数列构造、矩阵逆/广义逆、矩阵尺寸与索引读取、矩阵遍历、子矩阵,还是 `mfind` 查找/替换。
2. 基础数组矩阵样比较先回看 `12_matrix_and_collections.md`
2. 基础数组矩阵样比较的事实在 [12_matrix_and_collections.md](12_matrix_and_collections.md)
3. `mrows` / `mcols` / `msize` 等函数只照文档返回形态写。
4. 需要逐单元执行语句块时用 `matrix::begin ... end`;需要把表达式结果写回每个单元时用 `matrix ::= expression`
5. 需要遍历到嵌套数组最深层时用 `matrix:.begin ... end``matrix:.= expression`
@@ -25,8 +20,8 @@
## 核心规则
- 矩阵初始化函数的参数规格使用 `tsl-api-reference` skill 按名查询;本页只保留矩阵行为示例返回形态边界。
- `zeros(...)``ones(...)``rand(...)``nils(...)``eye(...)` 都可以直接用于矩阵初始化。
- 矩阵初始化和基础函数的具体参数规格使用 `tsl-api-reference` skill 按名查询;本页只保留矩阵行为示例返回形态边界和跨函数通用的广播 / `ErrDefine` / `ErrReplace` 机制
- `zeros(...)``ones(...)``rand(...)``nils(...)``eye(...)` 都可以直接用于矩阵初始化;全 `nil` 单元的“空矩阵”用 `nils(...)` 构造
- `zeros(3)``ones(3)``nils(2)` 这类单参数写法可以直接生成一维结果。
- `zeros(2, 3)``rand(2, 3)` 这类双参数写法可以直接生成二维矩阵。
- `zeros(2, array("A", "B"))` 这种写法可以直接生成带列名的二维结果。
@@ -525,7 +520,7 @@ B
0
```
### 矩阵乘法、除法、乘方:`:*`、`:/`、`:^`
### 矩阵乘法、除法、左除、乘方:`:*`、`:/`、`:\`、`:^`
`:*` 是矩阵乘法(区别于逐元素乘 `*`):
@@ -603,7 +598,7 @@ writeLn(result[1][0]);
说明:
- `:\` 左除用于解线性方程组 `A * X = B`,等价于 `X = A^(-1) * B`
- `:\` 左除用于解线性方程组 AX = B(数学记法),等价于先求逆再矩阵乘:`!a :* b`
- **右侧 `b` 必须是列向量**(用 `array((4), (8))` 而非 `array(4, 8)`
- `a :\ b` 返回 `array((2.0), (2.0))`,即 `X` 的列向量
- 当 A 行数 > 列数时返回最小二乘解,行数 < 列数时返回一个可行解
@@ -699,10 +694,34 @@ array(2.0,NAN,3.0)
说明:
- `sqrt(data, 1, -999)` 中,第二参数 `ErrDefine=1` 表示允许 NIL 不允许错误
- `ErrReplace=-999` 是错误位置的替换值(本例中 `-1` 的平方根为错误,但 `ErrDefine=1` 保留为 NAN
- `ErrDefine` 取值:`0`=不允许错误和 NIL、`1`=允许 NIL 不允许错误、`2`=错误值保留为原值
- `ErrReplace``ErrDefine=0``1` 时生效,用于替换错误/NIL 位置
- `ErrDefine` 取值:`0`=不允许错误和 NIL(两者都替换为 `ErrReplace`)、`1`=允许 NIL 不允许错误NIL 保留,错误替换为 `ErrReplace`)、`2`=错误和 NIL 都保留原值(`ErrReplace` 不生效)
- 「错误」指输入无效(如 NIL、类型不符);数学定义域产生的 `NAN` 结果(如 `sqrt(-1)`)不属于错误位置,任何 `ErrDefine` 档位下都不会被 `ErrReplace` 替换,本例输出保留 `NAN` 即因如此
- 不带 `ErrDefine` / `ErrReplace` 时,无效输入会直接运行报错
无效输入在不同 `ErrDefine` 档位下的替换差异:
代码块身份:可直接照写示例
```tsl
data := array(4, nil, "AAA", 9);
writeLn(tostn(sqrt(data, 0, -999)));
writeLn(tostn(sqrt(data, 1, -999)));
writeLn(tostn(sqrt(data, 2, -999)));
```
代码块身份:输出片段
```text
array(2.0,-999,-999,3.0)
array(2.0,NIL,-999,3.0)
array(2.0,NIL,"AAA",3.0)
```
说明:
- `ErrDefine=0` 把 NIL 和错误值 `"AAA"` 都替换成 `-999`
- `ErrDefine=1` 保留 NIL、只替换错误值
- `ErrDefine=2` 全部保留原值
另一个例子:
@@ -871,7 +890,7 @@ writeLn("(1,3):", result[1][3]);
(1,3): 8
```
`:|` 非完全矩阵补 `nil``|` 不补:
普通 `array` 非完全矩阵`:|` 缺位`nil``|` 直接顺接不补
代码块身份:可直接照写示例
@@ -887,16 +906,17 @@ writeLn("bar 结果 (1,2):", bar_result[1][2]);
代码块身份:输出片段
```text
colon 结果列数: 6
colon (1,2): nil
bar 结果 (1,2): 1
colon 结果列数:6
colon (1,2):<NIL>
bar 结果 (1,2):2
```
说明:
- `union` / `&=` 用于行方向拼接
- `|` / `:|` 用于列方向拼接
- 非完全矩阵(行长度不一致)`:|` 会在缺位补 `nil`,而 `|` 不补
- 普通 `array`非完全矩阵(行长度不一致)`:|` 按原列位置对齐、缺位补 `nil``|` 把两行元素直接顺接(本例第 1 行变成 `(2,3,2,3)`,所以 `[1][2]``2`
- 上述差异只适用于普通 `array``FMArray``|``:|` 行为一致且行数不齐时补 `0`,见 [23_fmarray.md](23_fmarray.md)
- 对应的复合赋值形式:`&=`(行并)、`|=`(列并)、`:|=`(列并补 nil
## 默认生成模板
@@ -923,7 +943,7 @@ matrix_value := zeros(2, 3);
-`::` 期待遍历到任意深度;深度遍历使用 `:.`
- 子矩阵赋值时用形状不匹配的矩阵硬塞。
-`union` 的复合赋值写成 `union=`;正确写法是 `&=`
- 一维数组直接 `union` 期待得到二维结果;需要先双转置 ` `b `` 变成行向量。
- 一维数组直接 `union` 期待得到二维结果;需要先对它连用两次转置前缀(双转置)变成行向量。
- 在基础函数异常参数时用分号分隔;正确写法用逗号:`sqrt(data, 1, -999)`
代码块身份:反例 / 不可照写