LSR 014 - 多值变量/表达式

基本信息

  • LSR 编号 014
  • 标题 多值变量/表达式
  • 作者 CGrakeski
  • 状态 草案
  • 类型 标准规范
  • 创建日期 10-18-2025
  • Lamina 版本 未决议

摘要

在Lamina发展的过程中,为了统一“数”与“多个数”的表示格式,并解决函数传递多个参数时可能出现的类型不匹配问题,编写此LSR。本规范引入多值变量/表达式,允许一个变量同时代表多个可能的值,在运算时自动对所有值进行计算,从而简化代码并增强语言表达能力。

技术规范

多值变量/表达式的定义与使用

一个多值变量/表达式表示,对一个变量/表达式,其有多重的值,在运算或者进行其他操作时,对每个值都进行运算。在Lamina中,它由竖线 | 分隔的多个值定义:

MultiValueA = 1 | 2 | 3

多值表达式可以与其他表达式相运算:

print(MultiValueA + 2) // 输出 3 | 4 | 5
print(MultiValueA * 2) // 输出 2 | 4 | 6
print(MultiValueA!) // 输出 1 | 2 | 6

若多个多值表达式相互运算,则将每种值都考虑到:

MultiValueB = 3 | 6 | 9
print(MultiValueA + MultiValueB) // 输出 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12

对两个数之间可以构成多值表达式,多值表达式也可通过竖线|构成多值表达式:

print(MultiValueA | MultiValueB) // 输出 1 | 2 | 3 | 6 | 9

另外,多值表达式可以存放不同类型的值:

Everything = 1 | 'Multi' | [1, 2, 3] | (do |x, y| { return x + y; }) | null

若多值表达式在书写时有相同值,则自动化简,按从小到大的顺序排列,数字在前,其余的按类型名字典序与字符串化后的字典序排序:

EqualThings = 2 | 1 | 2 | 2 | 1 | 1 | 2 | 'b' | 'a' | 'b'
print(EqualThings) // 输出 1 | 2 | 'a' | 'b'

若多值表达式中有一些不能参与运算的值,此时进行运算,将会:

print(Everything / 3)
/* 报错:
Error: The element 'Multi' of 'Everything' causes the error(s):
    Error: Arithmetic operation '/' requires numeric operands
*/

多值表达式的列表化

对一个多值表达式,将其转为列表,需要使用*运算符:

print(*EqualThings) // 输出 [1, 2]