Skip to content

[FEAT] 1-layout: & 一元前缀取址(&x ≡ kv·abs(x)) #283

Description

@miaobyte

背景

获取「中间变量的绝对 KV 路径」目前只能写 kv·abs(x),在链表/树/图这类需要频繁把局部节点拼成指针串的代码里很啰嗦(见 tutorial/12-struct/07-list-local.kv08-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)。操作数须为「位置」:帧内裸名、容器/成员链(xlist·1base·field)。
  • 产物:返回的路径串与现有指针惯例同型("/n1" -> p 那种),可直接 -> p 当指针存、+ "·n" 拼子节点、赋给 next 字段。与 *T 指针类型标注(ref)互补:& 造路径、* 标注该路径指向的目标形态。
  • 区分& 出现在表达式起始/运算符之后 = 一元前缀取址;出现在操作数之后 = 中缀位与。同 C。
  • 优先级:一元前缀,高于全部中缀(并入 + - ! √)。&a·b ≡ &(a·b)(成员链先结合,同 C 的 &a.b)。
  • 层级:纯 layout 改动。runtime 无需改(kv·abs 已在 myrwircaps)。

实现要点(layout)

  1. 符号表 layout/src/symbol.rsbitand 条目 unary: true(使 & 可作前缀,中缀身份不变)。
  2. layout/src/parser.rs::parse_primary_expr 一元前缀分支:special-case & → 下沉为 kv·abs(arg)(类比现有 add/sub 的 special-case),而非 bitand(arg)
  3. 中缀路径不变:a & b 仍走 pratt 中缀 → bitand

先改 spec(本 issue 先落规范,再分支实现)

  • 01-词法/08-运算符基础.kv:一元前缀列表加 &(取址),并说明 & 双身份。
  • 01-词法/09-逻辑位运算与优先级.kv:位运算符 & 注明兼前缀取址;一元前缀清单 + - ! √ → 加 &;补 &x ≡ kv·abs(x) 条款。
  • 附录/05-表达式.kvprefix_unary 文法加 &
  • 附录/07-内建函数.kv / 03-类型系统/16-ptr.kv:注明 &xkv·abs(x) 的语法糖,与 * ref 标注互补。

验收

  • 新增 tutorial 用例演示 &x(取局部节点地址拼链表),输出与手写 kv·abs 版一致。
  • 既有 a & b 位与用例(01-basics/strict_types.kv08-leetcode/371_sum_two.kv)不回归。
  • 全量 tutorial 三后端(shm/fs/redis)保持全绿。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    FEAT新增能力/语法/原语

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions