跳过正文
  1. Lumesh 文档/
  2. 语法/

Lumesh 语法概览

2119 字·5 分钟
目录

Lumesh 是一个现代化的 shell 和脚本语言,采用 Pratt 解析器实现复杂的表达式解析。

基础语法结构
#

运算符优先级系统
#

Lumesh 使用精确定义的运算符优先级,从低到高排列:

  1. 赋值运算符 (优先级 1): =, :=, +=, -=, *=, /=
  2. 重定向和管道 (优先级 2): |, |_, |>, |^, >>, >!
  3. 错误处理 (优先级 3): ?., ?+, ??, ?>, ?!
  4. Lambda 表达式 (优先级 4): ->
  5. 条件运算符 (优先级 5): ?:
  6. 逻辑或 (优先级 6): ||
  7. 逻辑与 (优先级 7): &&
  8. 比较运算 (优先级 8): ==, !=, >, <, >=, <=
  9. 四则运算...

数据类型
#

基础类型
#

Lumesh 支持多种基础数据类型:

 1# 整数
 2let num = 42
 3let negative = -100
 4
 5# 浮点数
 6let pi = 3.14159
 7let percent = 85%
 8
 9
10# 字符串
11let str1 = "双引号字符串,\n支持转义"
12let str2 = '单引号原始字符串,\n不转义'
13let template = `模板字符串 $var ${var + 1}`
14
15# 布尔值
16let flag = True
17let disabled = False
18
19# 空值
20let empty = None
21
22# 文件大小
23let a = 3000K

集合类型
#

 1# 列表 (List)
 2let arr = [1, 2, 3, "mixed", True]
 3let nested = [[1, 2], [3, 4]]
 4
 5# 哈希映射 (HMap) - 无序,快速查找
 6# let hmap = H{name: "Alice", age: 25}
 7
 8# 有序映射 (Map) - 有序,支持范围查询
 9let map = {a: 1, b: 2, c: 3}
10
11# 范围 (Range)
12let range1 = 1..10      # 1 到 9 (不包含 10)
13let range2 = 1..=10     # 1 到 10 (包含 10)
14let range3 = 1..10:2    # 1, 3, 5, 7, 9 (步长为 2)
15
16let array = 1...10      # 从范围直接建立数组

变量和赋值
#

基本赋值
#

1# 变量声明和赋值
2let x = 10
3let name = "Lumesh"
4
5# 多变量赋值
6let a, b, c = 1, 2, 3
7let x, y = getValue()

延迟赋值
#

Lumesh 独有的延迟赋值功能:

 1# 使用 := 进行延迟赋值,表达式不会立即执行
 2let cmd := ls -l /tmp
 3let calculation := 2 + 3 * 4
 4
 5# 需要时才执行
 6eval(cmd)           # 执行 ls -l /tmp
 7eval(calculation)   # 计算得到 14
 8
 9# 如果是命令,也可以直接执行
10cmd

解构赋值
#

支持数组和映射的解构赋值:

 1# 数组解构
 2let [first, second, *rest] = [1, 2, 3, 4, 5]
 3# first = 1, second = 2, rest = [3, 4, 5]
 4
 5# 映射解构
 6let {name, age} = {name: "Bob", age: 30, city: "NYC"}
 7# name = "Bob", age = 30
 8
 9# 重命名解构
10let {name: username, age: userAge} = user_data

运算符
#

算术运算符
#

1let a = 10 + 5      # 加法: 15
2let b = 10 - 3      # 减法: 7
3let c = 4 * 6       # 乘法: 24
4let d = 15 / 3      # 除法: 5
5let e = 17 % 5      # 取模: 2
6let f = 2 ^ 3       # 幂运算: 8

比较运算符
#

 1# 基本比较
 2a == b      # 相等
 3a != b      # 不等
 4a > b       # 大于
 5a < b       # 小于
 6a >= b      # 大于等于
 7a <= b      # 小于等于
 8
 9# 模式匹配
10text ~: "substring"     # 包含匹配
11text ~: r'regex'        # 正则匹配
12text !~: "substring"    # 不包含匹配
13text !~: r'regex'       # 正则不匹配

逻辑运算符
#

1condition1 && condition2    # 逻辑与
2condition1 || condition2    # 逻辑或
3!condition                  # 逻辑非

管道操作
#

Lumesh 提供多种管道类型,这是其独特特性:

 1# 标准管道 - 传递标准输出 或 结构化数据
 2cmd1 | cmd2
 3
 4# 位置管道 - 替换指定的参数位置
 5data |_ process_func arg1 _ arg3
 6
 7# 循环管道 - 每次派发一个元素,循环执行,可指定参数位置
 8list |> transform(param1, param2, _)
 9
10# PTY 管道 - 用于交互式程序
11cmd1 |^ interactive_program

错误处理
#

Lumesh 内置了强大的错误处理机制:

 1# 忽略错误,继续执行
 2risky_command ?.
 3
 4# 打印错误到标准输出
 5command ?+
 6
 7# 打印错误到标准错误输出
 8command ??
 9
10# 打印错误并覆盖结果
11command ?>
12
13# 遇到错误时终止程序
14command ?!
15
16# 自定义错误处理,可用于提供默认值
17command ?: error_handler

控制流
#

条件语句
#

1# if-else 表达式
2let result = if condition {
3    "true branch"
4} else {
5    "false branch"
6}
7
8# 三元运算符,支持嵌套
9let value = condition ? true_value : false_value

循环结构
#

 1# while 循环
 2while condition {
 3    # 循环体
 4    update_condition()
 5}
 6
 7# for 循环,可用于字符串,字符串切割遵循IFS设置;可使用*通配符
 8for item in collection {
 9    process(item)
10}
11
12# 范围循环
13for i in 0..10 {
14    println(i)
15}
16
17# 无限循环
18loop {
19    if break_condition {
20        break
21    }
22}
23
24# 简单重复
25repeat 10 {a += 1}

模式匹配
#

支持正则

1match value {
2    1 => "one",
3    2, 3 => "two or three",
4    xx => "is symbol/string xx",
5    r'\w' => "is word",
6    r'\d+' => "is digit",
7    _ => "default case"
8}

函数
#

函数定义
#

 1# 基本函数
 2fn greet(name) {
 3    "Hello, " + name
 4}
 5
 6# 带默认参数的函数
 7fn add(a, b = 0) {
 8    a + b
 9}
10
11# 可变参数函数
12fn sum(a, *numbers) {
13    numbers | List.fold(0, (acc, x) -> acc + x)
14}

Lambda 表达式
#

 1# 单参数 lambda
 2let square = x -> x * x
 3
 4# 多参数 lambda
 5let add = (a, b) -> a + b
 6
 7# 复杂 lambda 体
 8let process = data -> {
 9    let filtered = data | List.filter(x -> x > 0)
10    filtered | List.map(x -> x * 2)
11}

函数装饰器
#

支持函数装饰器语法:

1@timing
2@cache(300)
3fn expensive_calculation(input) {
4    # 复杂计算
5    heavy_computation(input)
6}

链式调用
#

支持面向对象风格的链式方法调用:

 1# 字符串链式操作
 2"hello world"
 3    .split(' ')
 4    .map(s -> s.to_upper())
 5    .join('-')
 6
 7# 数据处理链
 8data
 9    .filter(x -> x.active)
10    .sort(x -> x.priority)
11    .take(10)

索引和切片
#

 1# 数组索引
 2let arr = [1, 2, 3, 4, 5]
 3let first = arr[0]          # 1
 4
 5
 6# 数组切片
 7let slice1 = arr[1:4]       # [2, 3, 4]
 8let slice2 = arr[1:]        # [2, 3, 4, 5]
 9let slice3 = arr[:3]        # [1, 2, 3]
10let slice3 = arr[-3:]       # [3, 4, 5]
11let slice4 = arr[::2]       # [1, 3, 5] (步长为2)
12
13# 映射索引
14let obj = {name: "Alice", age: 25}
15let name = obj[name]      # "Alice"
16let ages = obj.age           # 25 (点号访问)
17let age = obj@age           # 25 (@访问)

范围操作
#

1# 基本范围
21..10           # 1 到 10
31..<10          # 1 到 9 (显式不包含)
4
5# 带步长的范围
61..10:2         # 1, 3, 5, 7, 9
70..100:10       # 0, 10, 20, ..., 90

字符串处理
#

 1# 字符串插值
 2let name = "World"
 3let age =18
 4let greeting = `Hello, ${age>18 ? "Mr.":"Dear"} $name !`
 5
 6# 多行字符串
 7let multiline = "
 8这是一个
 9多行字符串
10"
11
12# 原始字符串 (不转义)
13let raw = 'C:\path\to\file'

集合操作
#

 1# 列表操作
 2let numbers = [1, 2, 3, 4, 5]
 3numbers.append(6)             # 添加元素
 4numbers + 6                   # 添加元素
 5# numbers.pop()               # 移除最后一个元素
 6numbers - 4                   # 移除指定元素
 7numbers.len()                 # 获取长度
 8
 9# 映射操作
10let person = {name: "Bob", age: 30}
11# person.city = "NYC"         # 添加属性
12person + {city: "NYC"}         # 添加属性
13# del person.age              # 删除属性
14person.keys()               # 获取所有键

模块系统
#

1# 导入模块
2use my_mod
3use my_mod as a
4
5# 使用模块函数
6Fs.ls("/tmp")
7String.split("hello world", " ")
8Math.sin(Math.PI / 2)

注释
#

1# 单行注释
2let x = 10  # 行末注释

高级特性
#

自定义运算符
#

1# 定义自定义运算符
2let _+ = (a, b) -> a.concat(b)  # 自定义加法
3let __! = x -> Math.sum(x)     # 自定义前缀运算符
4
5# 使用自定义运算符
6[1, 2] _+ [3, 4]    # [1, 2, 3, 4]
7[5,6,7]  __!              # 18

Notes
#

Lumesh 的设计理念是将现代编程语言的优雅语法与 shell 的实用性相结合,提供强大的错误处理、管道操作和模块系统。通过 Pratt 解析器实现的优先级系统确保了复杂表达式的正确解析,而丰富的内置模块和配置选项使其适用于各种场景,从简单的命令行操作到复杂的系统管理脚本。

了解更多:

相关文章