背景
获取「中间变量的绝对 KV 路径」目前只能写 kv·abs(x),在链表/树/图这类需要频繁把局部节点拼成指针串的代码里很啰嗦(见 tutorial/12-struct/07-list-local.kv、08-leetcode/002,021,083,…:几乎每个都要先 kv·abs(x) -> base 再手工拼 base + "·n")。
C 用一元前缀 &x 取址、二元中缀 a & b 位与,靠位置区分。kvlang 已把 & 登记为位与(bitand,中缀,precedence 80)。本 issue 让 & 兼作一元前缀取址,&x ≡ kv·abs(x),与 C 完全对齐,且不与位与冲突(前缀 vs 中缀由 parser 按位置判定,同现有 +/- 的一元/二元双身份)。
设计
- 语义:
&loc 求值为 loc 所在节点的绝对 KV 路径字符串,等价 kv·abs(loc)。操作数须为「位置」:帧内裸名、容器/成员链(x、list·1、base·field)。
- 产物:返回的路径串与现有指针惯例同型(
"/n1" -> p 那种),可直接 -> p 当指针存、+ "·n" 拼子节点、赋给 next 字段。与 *T 指针类型标注(ref)互补:& 造路径、* 标注该路径指向的目标形态。
- 区分:
& 出现在表达式起始/运算符之后 = 一元前缀取址;出现在操作数之后 = 中缀位与。同 C。
- 优先级:一元前缀,高于全部中缀(并入
+ - ! √)。&a·b ≡ &(a·b)(成员链先结合,同 C 的 &a.b)。
- 层级:纯 layout 改动。runtime 无需改(
kv·abs 已在 myrwircaps)。
实现要点(layout)
- 符号表
layout/src/symbol.rs:bitand 条目 unary: true(使 & 可作前缀,中缀身份不变)。
layout/src/parser.rs::parse_primary_expr 一元前缀分支:special-case & → 下沉为 kv·abs(arg)(类比现有 add/sub 的 special-case),而非 bitand(arg)。
- 中缀路径不变:
a & b 仍走 pratt 中缀 → bitand。
先改 spec(本 issue 先落规范,再分支实现)
01-词法/08-运算符基础.kv:一元前缀列表加 &(取址),并说明 & 双身份。
01-词法/09-逻辑位运算与优先级.kv:位运算符 & 注明兼前缀取址;一元前缀清单 + - ! √ → 加 &;补 &x ≡ kv·abs(x) 条款。
附录/05-表达式.kv:prefix_unary 文法加 &。
附录/07-内建函数.kv / 03-类型系统/16-ptr.kv:注明 &x 是 kv·abs(x) 的语法糖,与 * ref 标注互补。
验收
- 新增 tutorial 用例演示
&x(取局部节点地址拼链表),输出与手写 kv·abs 版一致。
- 既有
a & b 位与用例(01-basics/strict_types.kv、08-leetcode/371_sum_two.kv)不回归。
- 全量 tutorial 三后端(shm/fs/redis)保持全绿。
背景
获取「中间变量的绝对 KV 路径」目前只能写
kv·abs(x),在链表/树/图这类需要频繁把局部节点拼成指针串的代码里很啰嗦(见tutorial/12-struct/07-list-local.kv、08-leetcode/002,021,083,…:几乎每个都要先kv·abs(x) -> base再手工拼base + "·n")。C 用一元前缀
&x取址、二元中缀a & b位与,靠位置区分。kvlang 已把&登记为位与(bitand,中缀,precedence 80)。本 issue 让&兼作一元前缀取址,&x ≡ kv·abs(x),与 C 完全对齐,且不与位与冲突(前缀 vs 中缀由 parser 按位置判定,同现有+/-的一元/二元双身份)。设计
&loc求值为loc所在节点的绝对 KV 路径字符串,等价kv·abs(loc)。操作数须为「位置」:帧内裸名、容器/成员链(x、list·1、base·field)。"/n1" -> p那种),可直接-> p当指针存、+ "·n"拼子节点、赋给next字段。与*T指针类型标注(ref)互补:&造路径、*标注该路径指向的目标形态。&出现在表达式起始/运算符之后 = 一元前缀取址;出现在操作数之后 = 中缀位与。同 C。+ - ! √)。&a·b ≡ &(a·b)(成员链先结合,同 C 的&a.b)。kv·abs已在 myrwircaps)。实现要点(layout)
layout/src/symbol.rs:bitand条目unary: true(使&可作前缀,中缀身份不变)。layout/src/parser.rs::parse_primary_expr一元前缀分支:special-case&→ 下沉为kv·abs(arg)(类比现有add/sub的 special-case),而非bitand(arg)。a & b仍走 pratt 中缀 →bitand。先改 spec(本 issue 先落规范,再分支实现)
01-词法/08-运算符基础.kv:一元前缀列表加&(取址),并说明&双身份。01-词法/09-逻辑位运算与优先级.kv:位运算符&注明兼前缀取址;一元前缀清单+ - ! √→ 加&;补&x ≡ kv·abs(x)条款。附录/05-表达式.kv:prefix_unary文法加&。附录/07-内建函数.kv/03-类型系统/16-ptr.kv:注明&x是kv·abs(x)的语法糖,与*ref 标注互补。验收
&x(取局部节点地址拼链表),输出与手写kv·abs版一致。a & b位与用例(01-basics/strict_types.kv、08-leetcode/371_sum_two.kv)不回归。