Skip to content

[FEAT] 1-layout: 多赋值语法糖(顶层逗号列表展开为 N 条单赋值) #291

Description

@miaobyte

背景

连续的同源赋值要逐条书写,冗余且易错:

d·name -> dn
d·age -> da
d·active -> dac

期望一次写完:

d·name, d·age, d·active -> dn, da, dac

语法与语义

读槽侧写顶层逗号列表时,展开为 N 条单赋值指令:左右按位置一一配对、个数必须相等、从左到右保序。

d·name, d·age, d·active -> dn, da, dac

d·name   -> dn
d·age    -> da
d·active -> dac

= 形态同理:x, y = a, ba -> xb -> y

  • 个数不等是 layout 错误(左 2 右 3 报 multi-assignment arity mismatch),不静默截断、不补 None。
  • 纯语法糖:不引入新 opcode,落 kvspace 后与逐条书写逐字节等价
  • 中间含函数调用时按 lower 的常规嵌套调用摊平(临时槽 _N),展开保序。

与「写参扇出」的区别(本 issue 的判据核心)

spec 已有扇出语义:一个表达式写多个位置、单条指令多写槽([[指令架构]] 已载 a + b -> sum, backup)。多赋值是多个表达式各写一个位置、N 条指令。二者靠读槽侧顶层是否含逗号区分:

形态 含义 指令数
a + b -> sum, backup 扇出 1 条(多写槽)
x, y -> sum, backup 多赋值 2 条

f(a, b) -> x, y 的逗号在括号内(仍是单个表达式),故为扇出、非多赋值。

落地范围

spec 已改(本 issue 同批):

  • 04-layout语义/01-指令架构.kv:新增「多赋值(顶层逗号列表)」段。
  • 附录/04-指令.kv:文法加 read_list = expr { "," expr }

实现(layout 单侧,runtime 无感):

  • parser.rs::parse_inst —— 当前读槽是单个 parse_pratt(0);改为解析 read_list,顶层逗号 >1 时按位置与 writes 配对,产出 N 条 Instructionparse_inst 的调用点由单条改为可追加多条)。写槽侧 collect_write_list / collect_writes_until_arrow 已支持逗号列表,无需改。
  • 个数不等 → 新增诊断 multi-assignment arity mismatch(error 级,拒装载)。
  • 展开点选在 parser 而非 lower:副作用是「一次书写 → 多条指令」,parser 已是 ->/= 的唯一裁决处,避免 lower 再引一套状态。

锚例:tutorial/12-struct/01-fields.kv(本 issue 由它触发);新增 tutorial 用例覆盖 = 形态、个数不等报错、含函数调用的展开保序。

五语言对照

语言 多赋值
C 无(逐条)
Python a, b = 1, 2
Go a, b = 1, 2
Rust let (a, b) = (1, 2); ✅(解构)
JS/TS [a, b] = [1, 2] ✅(解构)

四家皆以「顶层逗号列表」表达多赋值,kvlang 取此形态、不引解构语法(无元组类型)。

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