Skip to content

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions