背景
连续的同源赋值要逐条书写,冗余且易错:
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, b ≡ a -> x、b -> 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 条 Instruction(parse_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 取此形态、不引解构语法(无元组类型)。
背景
连续的同源赋值要逐条书写,冗余且易错:
期望一次写完:
语法与语义
读槽侧写顶层逗号列表时,展开为 N 条单赋值指令:左右按位置一一配对、个数必须相等、从左到右保序。
≡
=形态同理:x, y = a, b≡a -> x、b -> y。multi-assignment arity mismatch),不静默截断、不补 None。_N),展开保序。与「写参扇出」的区别(本 issue 的判据核心)
spec 已有扇出语义:一个表达式写多个位置、单条指令多写槽([[指令架构]] 已载
a + b -> sum, backup)。多赋值是多个表达式各写一个位置、N 条指令。二者靠读槽侧顶层是否含逗号区分:a + b -> sum, backupx, y -> sum, backupf(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 条Instruction(parse_inst的调用点由单条改为可追加多条)。写槽侧collect_write_list/collect_writes_until_arrow已支持逗号列表,无需改。multi-assignment arity mismatch(error 级,拒装载)。->/=的唯一裁决处,避免 lower 再引一套状态。锚例:
tutorial/12-struct/01-fields.kv(本 issue 由它触发);新增 tutorial 用例覆盖=形态、个数不等报错、含函数调用的展开保序。五语言对照
a, b = 1, 2✅a, b = 1, 2✅let (a, b) = (1, 2);✅(解构)[a, b] = [1, 2]✅(解构)四家皆以「顶层逗号列表」表达多赋值,kvlang 取此形态、不引解构语法(无元组类型)。