From 8f518e17cc4f0bf0e5d8584fc119db32d0afa6d6 Mon Sep 17 00:00:00 2001 From: CGrakeski Date: Fri, 27 Mar 2026 20:53:10 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20LSR-000-A.md=EF=BC=8C?= =?UTF-8?q?=E5=85=B3=E4=BA=8E=E6=8A=A5=E9=94=99=E7=9A=84=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- store/LSR-000-A.md | 591 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 591 insertions(+) create mode 100644 store/LSR-000-A.md diff --git a/store/LSR-000-A.md b/store/LSR-000-A.md new file mode 100644 index 0000000..eebd195 --- /dev/null +++ b/store/LSR-000-A.md @@ -0,0 +1,591 @@ +# LSR-000: Lamina 语言语法文档 + +## 基本信息 + +- LSR 编号 000 +- 标题 LSR的目的和准则 +- 作者 Ziyang-Bai, Ange1PLSGreet, CGrakeski +- 状态 应用 +- 类型 标准规范类 +- 创建日期 08-06-2025 +- 归属项目 通用 + +## 前言 + +Lamina 是一门专注于精确数学计算,与科学计算的动态类型语言,设计理念强调**精确性**(默认分数运算)、**不可变性**(优先推荐 `let` 声明)和**函数式风格**(通过高阶函数与管道运算符处理数据流)。本 LSR 文档涵盖语言全部语法细节,包括数据类型、函数定义、数学运算、逻辑控制等核心内容。 +请注意,LSR 遵循封闭性原则,凡 LSR 未明确说明支持的语法、功能或行为,默认为“不支持”或“否”,**不存在任何基于直觉或类比的语义暗示**。您在实现或使用 Lamina 时实现或尝试的所有 LSR 文档均未提及的语法、功能或行为,均为**未定义行为**,在未来的版本更迭中极可能被修复或禁用。 请始终以本手册定义的标准语法为准。敬请留意。 + +## 1. 基本符号 + +| 类别 | 符号/函数 | 说明 | +| --------- | ------------------------- | ----------------------------------------------------- | +| 四则运算 | `+, -, *, /` | 加、减、乘、除(`/` 默认生成分数,非小数除法) | +| 比较与赋值 | `==, !=, >, <, >=, <=, =` | 比较运算(`!=` 等价于 `≠`,`>=` 等价于 `≥`,`<=` 等价于 `≤`);`=` 为赋值符 | +| 向量/矩阵专用运算 | `·, ×, .*` | 点乘(`·` 或 `dot()`)、叉乘(`×` 或 `cross()`)、元素级乘法(`.*`) | +| 幂运算 | `^` | 指数运算(如 `x^2` 表示 `x²`) | +| 其他符号/函数 | ` | >, "", '', ,, ', decimal()` | + +## 2. 变量与数据类型 + +### 2.1 变量声明 + +- **默认可变变量**:直接赋值,可重新赋值。 +- **不可变变量**:用 `let` 声明,绑定后不可重新赋值(推荐优先使用)。 +- **类型后置**:可选类型声明(`:` 类型名),属于注释,用于对表达式约束类型 + +```lamina +# 默认可变变量 +a = 10 +a = 20 # 合法:允许重新赋值 + +# 不可变变量(推荐) +let b = 3.14 +# b = 4.5 # 报错:不可变变量禁止重新赋值 + +# 带类型声明的变量 +c = 3/2 : num # 可变变量,指定类型为 num(分数) +let d = "text" : text # 不可变变量,指定类型为 text +``` + +### 2.2 核心数据类型 + +| 类型 | 说明 | 可变性 | +| --------- | --------------------- | --------------------------------------- | +| `text` | 文本类型(字符串) | 默认可变;`let` 声明后内容不可修改 | +| `num` | 数字类型(含整数、分数、小数、无理数常数) | 分数/常数默认不可变;小数默认可变,`let` 声明后不可变 | +| `table` | 复合表结构,支持任意类型索引和随机访问 | 默认可变(支持修改元素);`let` 声明后引用不可变(元素可变性取决于自身) | +| `set` | 数学集合(无序、唯一元素) | 默认可变;`let` 声明后引用不可变 | +| `bool` | 布尔类型(`true`/`false`) | 默认不可变 | +| `vector` | 向量(有序数值集合,支持线性代数运算) | 默认可变;`let` 声明后引用不可变 | +| `matrix` | 矩阵(二维数值集合,双层方括号表示) | 默认可变;`let` 声明后引用不可变 | +| `complex` | 复数(实部+虚部,虚数单位 `i`) | 默认可变;`let` 声明后引用不可变 | +| `unit` | 类型合集(用于单位系统,关联物理量与单位) | 必须显式声明,不可变 | +| `const` | 常量合集(用于常量系统,存储常量) | 必须显式声明,不可变 | + +### 2.3 内置数学常数 + +- **`pi`**:圆周率(π ≈ 3.1415926535...),精确存储,支持任意精度小数转换。 +- **`e`**:自然常数(e ≈ 2.7182818284...),精确存储,支持任意精度小数转换。 + +```lamina +let pi_exact = pi # 精确值 π(不可变) +let pi_dec = decimal(pi, 6) # 3.141593(保留6位小数,不可变) +let e_squared = e ^ 2 # e²(精确表达式,不可变) +``` + +### 2.4 合集 + +#### 2.4.1 单位 + +用于定义单位及转换规则,支持含特殊符号的单位(需用双引号包裹)。 + +##### 2.4.1.1 单位定义 + +```lamina +# 时间单位 +unit time { + s num # 秒 + ms num # 毫秒 + us num # 微秒 +} + +# 带特殊符号的单位(如 m/s、kg·m/s²) +unit speed { + "m/s" num # 米每秒 + "km/h" num # 千米每小时 +} + +unit force { + "N" num # 牛顿 + "kg·m/s²" num # 复合单位(与牛顿等效) +} +``` + +##### 2.4.1.2 单位转换函数 + +用 `::` 绑定转换函数,支持带特殊符号的单位(需用 `::"单位名"`)。 + +```lamina +# 时间单位转换:秒 → 毫秒(1s = 1000ms) +fn time::s_ms(s): s * 1000 + +# 速度单位转换:m/s → km/h(1m/s = 3.6km/h) +fn speed::"m/s_km/h"(mps): decimal(mps * 3.6, 2) # 保留2位小数 + +# 力单位转换:kg·m/s² → N(等效单位) +fn force::"kg·m/s²_N"(val): val +``` + +##### 2.4.1.3 单位使用示例 + +```lamina +let t = 2.5s # 2.5秒(不可变) +let t_ms = t::ms # 转换为毫秒:2500ms(不可变) + +let v = 20 "m/s" # 20米每秒(不可变) +let v_kmh = v::"km/h" # 转换为千米每小时:72.00 km/h(不可变) +``` + +##### 2.4.1.4 量纲检查 + +加减一致性:只有同属于一个 unit 定义的数值才能进行加减运算。 + +```lamina +5m + 10m +5m + 2s # Error: Dimensional Mismatch +``` + +#### 2.4.2 常量 + +const 关键字用于定义具名的常量合集。其设计逻辑与 unit 类似,旨在为科学计算提供静态的、不可变的参考数值,并支持可选的单位标注。 + +##### 2.4.2.1 常量定义 + +使用 const 块定义常量。每个条目由 常量名、数值、单位(可选) 组成。 + +```lamina +# 物理常数集 +const physics { + g_earth 9.8 "N/kg" + G 6.674e-11 "N·m²/kg²" + c 299792458 "m/s" +} + +# 转换比例或数学常数 +const math_ext { + phi 1.618 + sqrt2 1.414 +} +``` + +##### 2.4.2.2 使用规则 + +访问方式:通过 集合名::常量名 访问特定常量。 +不可变性:const 块内定义的值在程序运行期内不可重新赋值。 +量纲关联:若常量在定义时带有单位字符串(如 "N/kg"),该常量在参与运算时将自动携带该量纲,并触发 unit 系统的量纲检查。 +封闭性:不支持在 const 块外动态增加常量条目。 + +##### 2.4.2.3 代码实例 + +```lamina +let mass = 70kg +# 自动通过 physics 常量计算重力,结果将带有 N 单位 +let weight = mass * physics::g_earth + +let radius = 10m +let area = math_ext::phi * radius^2 +``` + +## 3. 函数定义 + +函数参数默认为不可变(类似 `let` 声明),支持多种定义方式。 + +### 3.1 普通函数(`func`) + +```lamina +func add(a, b) { + return a + b +} + +let sum = add(3/2, 5/4) # 结果:11/4(分数,不可变) +``` + +### 3.2 数学函数(表达式简写) + +直接定义数学表达式,编译期自动转换为函数。 + +```lamina +func square(x): x^2 # 等价于 func square(x) { return x^2 } +func half(x): x / 2 # 默认返回分数 + +let s = square(pi) # 结果:π²(不可变) +let h = half(5) # 结果:5/2(不可变) +``` + +### 3.3 分段函数(`section`) + +基于条件返回不同表达式,编译期自动转换为函数。 + +```lamina +func f(x) = section { + x < -1 : 2 - x + -1<=x<=1/2 : -3*x + x > 1/2 : x/2 +} + +let val = piecewise(3) # 结果:3/2(不可变) +``` + +### 3.4 Lambda 函数(匿名函数) + +支持简洁的匿名函数定义,常用于高阶函数参数。 + +```lamina +|x| x * 2 # 单参数,隐式返回 +do |a, b| { a + b } # 多参数,显式返回 +do { print("hello") } # 无参数 + +# 配合高阶函数使用 +let doubled = [1,2,3] |> map(|x| x * 2) # [2,4,6](不可变) +``` + +### 3.5 逻辑推导函数(`pred`) + +专用于逻辑证明,返回 `bool` 类型,包含 `may`(假设)和 `proof`(结论)块。 + +```lamina +pred prove_abs_non_negative(x) { +may: + case1 = x >= 0 + case2 = x < 0 + if (case1) { conclusion1 = x >= 0 } + if (case2) { conclusion2 = -x >= 0 } + let total = conclusion1 || conclusion2 +proof(total): + print("绝对值非负性成立") + return total +} + +let res = prove_abs_non_negative(-3) # true(不可变) +``` + +### 3.6 组合数学函数 + +- **`nPr(n, r)`**:排列数,公式 `n! / (n-r)!`(`n` 为总元素数,`r` 为选取数)。 +- **`nCr(n, r)`**:组合数,公式 `n! / (r!·(n-r)!)`。 + +```lamina +let perm = nPr(5, 2) # 5×4 = 20(结果:20/1,不可变) +let comb = nCr(5, 2) # (5×4)/(2×1) = 10(结果:10/1,不可变) +``` + +### 3.7 对数函数 + +- **`log(x)`**:常用对数(底 10),即 `log10(x)`。 +- **`ln(x)`**:自然对数(底 `e`),即 `log_e(x)`。 +- **`logBASE(base, x)`**:自定义底对数,即 `log_base(x)`。 + +```lamina +let log10_100 = log(100) # 2(不可变) +let ln_e = ln(e) # 1(不可变) +let log2_8 = logBASE(2, 8) # 3(不可变) +let log_pi = logBASE(pi, pi^2) # 2(不可变) +``` + +### 3.8 常用高阶函数 + +- **`map(f, iter)`**:对可迭代对象 `iter` 的每个元素应用 `f`,返回新列表。 +- **`filter(f, iter)`**:用 `f`(返回 `bool`)筛选 `iter`,保留满足条件的元素。 +- **`fold(f, init, iter)`**:累积 `iter` 元素,`f(acc, x)` 接收累积值和当前元素。 + +```lamina +let nums = [1,2,3,4] +let squares = map(|x| x^2, nums) # [1,4,9,16](不可变) +let evens = filter(|x| x%2==0, nums) # [2,4](不可变) +let sum = fold(|acc, x| acc+x, 0, nums) # 10(不可变) +``` + +## 4. 逻辑控制与循环 + +### 4.1 条件语句(`if`) + +支持多分支判断,条件表达式可包含任意数据类型的比较。 + +```lamina +let x = 3/2 +if (x > 1 && x < 2) { + print("x在(1,2)区间内") +} else if (x == 1) { + print("x等于1") +} else { + print("其他情况") +} +``` + +### 4.2 循环替代方案 + +Lamina 无命令式 `for/while`,通过**高阶函数**和**递归**实现循环逻辑(推荐用 `let` 存储结果)。 + +#### 4.2.1 高阶函数处理迭代 + +```lamina +# 生成0-9的平方列表 +let squares = range(0,10) |> map(|x| x^2) # [0,1,4,...,81](不可变) + +# 筛选偶数并求和 +let even_sum = range(0,10) + |> filter(|x| x%2==0) + |> fold(|acc,x| acc+x, 0) # 20(不可变) +``` + +#### 4.2.2 递归替代条件循环 + +```lamina +# 递归计算阶乘 +func factorial(n) { + if (n == 0) 1 # 基准条件 + else n * factorial(n-1) +} + +let fact5 = factorial(5) # 120(不可变) +``` + +## 5. 管道运算符(`|>`) + +用于数据流链式处理,将左侧结果作为右侧函数的第一个参数。 + +```lamina +# 示例:筛选→转换→求和 +let result = range(1, 11) + |> filter(|x| x%2==1) # 保留奇数:[1,3,5,7,9] + |> map(|x| x*2) # 乘以2:[2,6,10,14,18] + |> fold(|acc,x| acc+x, 0) # 求和:50(不可变) + +x |> f(a,_) # f(a,x) +x |> f() # f(x) +``` + +## 6. 集合运算 + +支持数学集合的基本操作,内置常用集合类型。 + +### 6.1 集合运算符 + +| 运算符 | 含义 | 示例 | +| --- | ---- | ----------------------------- | +| ` | ` | 并集 | +| `&` | 交集 | `{1,2,3} & {2,3,4}` → `{2,3}` | +| `-` | 差集 | `{1,2,3} - {2}` → `{1,3}` | +| `^` | 对称差集 | `{1,2} ^ {2,3}` → `{1,3}` | + +### 6.2 预定义集合 + +| 集合符号 | 含义 | +| -------- | --------- | +| `{}` | 空集 | +| `{R}` | 实数集 | +| `{N}` | 自然数集 | +| `{Z}` | 整数集 | +| `{Q}` | 有理数集(含分数) | +| `{C}` | 复数集 | +| `{Z+}` | 正整数集 | +| `{R>=0}` | 非负实数集 | + +### 6.3 集合关系函数 + +- **`sbelong(A, B)`**:判断集合 `A` 与 `B` 的关系(子集/超集等)。 +- **`oinclude(x, S)`**:判断元素 `x` 是否属于集合 `S`(返回 `1` 或 `0`)。 + +```lamina +let S = {1,2,3,4} +let is_in = oinclude(2, S) # 1(属于,不可变) +let T = {3,4,5} +let union = S | T # {1,2,3,4,5}(不可变) +``` + +## 7. 分数与小数操作 + +### 7.1 分数运算(默认行为) + +`/` 运算符默认生成分数(精确无误差),自动保持最简形式。 + +```lamina +let a = 3/2 # 3/2(不可变) +let b = 6/4 # 自动化简为 3/2(不可变) +let c = a + b # 3/2 + 3/2 = 3/1(不可变) +``` + +### 7.2 小数转换(`decimal()`) + +将分数/常数转换为小数,支持指定保留位数(默认10位)。 + +```lamina +let frac = 1/3 +let dec1 = decimal(frac) # 0.3333333333(默认10位,不可变) +let dec2 = decimal(frac, 4) # 0.3333(保留4位,不可变) +let pi_dec = decimal(pi, 6) # 3.141593(不可变) +``` + +### 7.3 表达式化简 + +- **`simplify(expr)`**:化简数学表达式(含分数、常数、函数)。 +- **`f_simple(frac)`**:手动化简分数(通常无需调用,自动化简)。 + +```lamina +let expr = (x^2 - 4)/(x - 2) +let simplified = simplify(expr) # x + 2(不可变) + +let complex_frac = 12/18 +let simple_frac = f_simple(complex_frac) # 2/3(不可变) +``` + +## 8. 向量操作 + +### 8.1 定义与访问 + +```lamina +# 可变向量 +v_mutable = vec[1, 2/3, pi] +v_mutable[0] = 10 # 合法 + +# 不可变向量(推荐) +let v_immutable = vec[1/2, decimal(e, 2), 3] +# v_immutable[0] = 5 # 报错 + +# 行向量(转置符 ') +let v_row = vec[1,2,3]' # 行向量(不可变) + +# 访问元素(下标从0开始) +let first = v_immutable[0] # 1/2(不可变) +``` + +### 8.2 向量运算 + +| 运算 | 符号/函数 | 示例 | 结果(不可变) | +| ------ | --------------- | ------------------- | ----------------- | +| 点乘(内积) | `·` 或 `dot()` | `[1,2] · [3,4]` | `1×3 + 2×4 = 11` | +| 叉乘(外积) | `×` 或 `cross()` | `[1,0,0] × [0,1,0]` | `[0,0,1]`(三维向量特有) | +| 加法 | `+` | `[1,2] + [3,4]` | `[4,6]` | +| 数乘 | `*` | `2 * [1,2]` | `[2,4]` | +| 模长 | `norm()` | `norm([3,4])` | `5`(√(3²+4²)) | + +## 9. 矩阵操作 + +### 9.1 定义与访问 + +```lamina +# 可变矩阵 +m_mutable = mat[ + [1, 2], + [3, 4] +] : matrix +m_mutable[0][1] = 5 # 合法 + +# 不可变矩阵(推荐) +let m_immutable = mat[ + [1/2, pi], + [e, 3] +] : matrix +# m_immutable[0][1] = 10 # 报错 + +# 访问元素(行索引, 列索引) +let elem = m_immutable[1][0] # e(不可变) +``` + +### 9.2 矩阵运算 + +| 运算 | 符号/函数 | 示例 | 结果(不可变) | +| ----- | --------------- | -------------------------------- | --------------------- | +| 加法 | `+` | `[[1,2],[3,4]] + [[5,6],[7,8]]` | `[[6,8],[10,12]]` | +| 矩阵乘法 | `*` | `[[1,2],[3,4]] * [[5],[6]]` | `[[17],[39]]` | +| 元素级乘法 | `.*` | `[[1,2],[3,4]] .* [[5,6],[7,8]]` | `[[5,12],[21,32]]` | +| 转置 | `'` 或 `trans()` | `[[1,2],[3,4]]'` | `[[1,3],[2,4]]` | +| 逆矩阵 | `inv()` | `inv([[1,2],[3,4]])` | `[[-2,1],[1.5,-0.5]]` | +| 行列式 | `det()` | `det([[1,2],[3,4]])` | `-2` | + +## 10. 复数操作 + +复数由实部和虚部组成(虚数单位 `i`),默认不可变。 + +### 10.1 定义 + +```lamina +let z1 = 3 + 4i # 实部3,虚部4(不可变) +let z2 = complex(1/2, -pi) # 实部1/2,虚部-π(不可变) +``` + +### 10.2 复数运算 + +| 运算 | 符号/函数 | 示例 | 结果(不可变) | +| --- | -------- | ----------------- | ------------- | +| 加法 | `+` | `(3+4i) + (1-2i)` | `4 + 2i` | +| 乘法 | `*` | `(1+i) * (1-i)` | `2`(实部2,虚部0) | +| 共轭 | `conj()` | `conj(3+4i)` | `3 - 4i` | +| 实部 | `re()` | `re(3+4i)` | `3` | +| 虚部 | `im()` | `im(3+4i)` | `4` | +| 模长 | `abs()` | `abs(3+4i)` | `5`(√(3²+4²)) | +| 辐角 | `arg()` | `arg(1+i)` | `π/4`(弧度) | + +## 11. 不等式语法 + +### 11.1 基本不等式 + +| 符号 | 含义 | 示例 | +| ---- | ---- | ----------------------- | +| `<` | 小于 | `3/2 < 2` → `true` | +| `>` | 大于 | `pi > 3` → `true` | +| `<=` | 小于等于 | `1/2 <= 0.5` → `true` | +| `>=` | 大于等于 | `e >= 2` → `true` | +| `!=` | 不等于 | `1/3 != 0.333` → `true` | + +### 11.2 复合不等式(区间) + +支持连续不等式和区间符号(与集合联动)。 + +```lamina +let x = 2.5 +let in_range = 1 < x < 3 # true(等价于 x>1 且 x<3) +let in_interval = x belong (1, 3) # true(与上式等价) +let in_closed = x belong [2, 3] # true(2 ≤ x ≤ 3) +``` + +### 11.3 逻辑组合 + +通过 `&&`(与)、`||`(或)组合多个条件。 + +```lamina +let x = 3 +let cond = (x > 0) && (x < 5) && (x%2 == 1) # true(x是0-5之间的奇数) +``` + +### 11.4 向量/矩阵元素级不等式 + +用 `.` 前缀表示元素级比较,返回布尔向量/矩阵。 + +```lamina +let v = [1, 2, 3] +let gt2 = v .> 2 # [false, false, true](不可变) + +let m = [[1,2],[3,4]] +let le3 = m .<= 3 # [[true, true], [true, false]](不可变) +``` + +## 12. 注释 + +- **单行注释**:`# 这是单行注释` +- **多行注释**:`### 这是多行注释 多行内容 ###` + +## 13. 错误规范 + +在 Lamina 中执行非法操作时,会按以下格式输出错误信息: + +```lamina +>>> +Error: +at line , column , in + + +``` + +各字段含义: + +| 字段 | 说明 | +|:---------------------- |:---------------------------------------- | +| `` | 用户输入的非法语句所在行 | +| `` | 错误具体描述 | +| ``、`` | 错误发生的行号和列号 | +| `` | 出错的文件名(如 `` 表示交互式环境) | +| `` | 出错行的完整代码 | +| `` | 用 `^` 标记的错误位置 | + +示例: + +```lamina +>>> 1/ +Error: ParserError: Unexpected character: eof +at line 1, column 3, in +>>> 1/ + ^ +``` + + From 07d79e5e1be75e7c6de719380d2d42a69231b72f Mon Sep 17 00:00:00 2001 From: CGrakeski Date: Fri, 27 Mar 2026 20:55:33 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- store/LSR-000-A.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/store/LSR-000-A.md b/store/LSR-000-A.md index eebd195..d3868f9 100644 --- a/store/LSR-000-A.md +++ b/store/LSR-000-A.md @@ -5,7 +5,7 @@ - LSR 编号 000 - 标题 LSR的目的和准则 - 作者 Ziyang-Bai, Ange1PLSGreet, CGrakeski -- 状态 应用 +- 状态 草案 - 类型 标准规范类 - 创建日期 08-06-2025 - 归属项目 通用 @@ -569,14 +569,14 @@ at line , column , in 各字段含义: -| 字段 | 说明 | -|:---------------------- |:---------------------------------------- | -| `` | 用户输入的非法语句所在行 | -| `` | 错误具体描述 | -| ``、`` | 错误发生的行号和列号 | -| `` | 出错的文件名(如 `` 表示交互式环境) | -| `` | 出错行的完整代码 | -| `` | 用 `^` 标记的错误位置 | +| 字段 | 说明 | +|:---------------------- |:---------------------------- | +| `` | 用户输入的非法语句所在行 | +| `` | 错误具体描述 | +| ``、`` | 错误发生的行号和列号 | +| `` | 出错的文件名(如 `` 表示交互式环境) | +| `` | 出错行的完整代码 | +| `` | 用 `^` 标记的错误位置 | 示例: