Lumesh 是一个现代化的 shell 和脚本语言,采用 Pratt 解析器实现复杂的表达式解析。
基础语法结构#
运算符优先级系统#
Lumesh 使用精确定义的运算符优先级,从低到高排列:
- 赋值运算符 (优先级 1):
=,:=,+=,-=,*=,/= - 重定向和管道 (优先级 2):
|,|_,|>,|^,>>,>! - 错误处理 (优先级 3):
?.,?+,??,?>,?! - Lambda 表达式 (优先级 4):
-> - 条件运算符 (优先级 5):
?: - 逻辑或 (优先级 6):
|| - 逻辑与 (优先级 7):
&& - 比较运算 (优先级 8):
==,!=,>,<,>=,<= - 四则运算...
数据类型#
基础类型#
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] __! # 18Notes#
Lumesh 的设计理念是将现代编程语言的优雅语法与 shell 的实用性相结合,提供强大的错误处理、管道操作和模块系统。通过 Pratt 解析器实现的优先级系统确保了复杂表达式的正确解析,而丰富的内置模块和配置选项使其适用于各种场景,从简单的命令行操作到复杂的系统管理脚本。
了解更多: