语法指南
LuminaLang v0.8.0 完整语法参考
简介
LuminaLang 是一门简洁的强类型解释型编程语言,仅支持 i32(32 位有符号整数)类型。语法设计直观,学习曲线平缓,适合教学与脚本编程。
设计理念:少即是多。只保留最必要的特性,让程序员专注于逻辑本身。
安装
前往 Codeberg Releases 页面,下载对应平台的可执行文件:
| 平台 | 文件名 |
|---|---|
| Windows (amd64) | luminalang.exe |
下载后,在终端运行:
./luminalang.exe yourfile.lum
第一个程序
创建文件 hello.lum:
hello.lum
fn main() i32 { out 42 back 0 }
运行:
C:\> ./luminalang.exe hello.lum 42
类型系统
LuminaLang 是强类型语言,支持三种类型:
| 类型 | 说明 | 范围/示例 |
|---|---|---|
i32 | 32 位有符号整数 | -2,147,483,648 ~ 2,147,483,647 |
bool | 布尔类型 | true 或 false |
"..." | 字符串字面量 | 任意文本,支持 \n \t \" \\ 转义 |
变量和函数参数可以声明为 i32 或 bool 类型,表达式中可以使用字符串字面量。字符串支持拼接(+)和比较(==、!=)。
布尔类型
LuminaLang 支持布尔类型 bool,包含两个字面量:true 和 false。布尔值既可作为条件表达式,也可用作变量类型或函数返回类型。
布尔变量与字面量
fn main() i32 { let flag: bool = true out flag // 输出 true out false // 输出 false back 0 }
比较运算返回布尔值
所有比较运算符(==、!=、<、>、<=、>=)的返回值均为 bool:
fn main() i32 { out 3 > 5 // 输出 false out 3 < 5 // 输出 true out 10 == 10 // 输出 true out "a" != "b" // 输出 true back 0 }
布尔类型作为函数返回类型
函数返回值也可以声明为 bool:
fn is_positive(n: i32) bool { back n > 0 } fn main() i32 { if is_positive(5) { out "positive!" } back 0 }
变量
声明变量
使用 let 关键字声明变量,必须指定类型:
fn main() i32 { let x: i32 = 10 let y: i32 = 42 back 0 }
赋值
使用 = 给已声明的变量赋值:
fn main() i32 { let x: i32 = 5 x = x + 1 out x // 输出 6 back 0 }
注意:变量必须先声明后使用,未声明的变量赋值会产生编译错误。
函数
定义函数
fn add(a: i32, b: i32) i32 { back a + b }
调用函数
fn main() i32 { let r: i32 = add(3, 5) out r // 输出 8 back 0 }
递归
阶乘示例
fn factorial(n: i32) i32 { if n == 1 { back 1 } back n * factorial(n - 1) }
main 函数
每个程序必须包含一个 main 函数,它是程序的入口点。返回值为程序的退出码。
分支与循环
if / elif / else
fn main() i32 { let x: i32 = 1 if x > 0 { out 1 } elif x == 0 { out 0 } else { out -1 } back 0 }
while 循环
fn main() i32 { let i: i32 = 0 while i < 5 { out i i = i + 1 } back 0 }
halt / skip
在循环内部,可以使用 halt 和 skip 控制执行流程:
halt — 跳出循环
halt 立即退出整个循环体,程序继续执行循环之后的代码:
fn main() i32 { let i: i32 = 0 while i < 100 { i = i + 1 if i == 5 { halt } } out i // 输出 5 back 0 }
skip — 跳过本次迭代
skip 跳过当前迭代剩余语句,直接进入下一次循环判断:
fn main() i32 { let i: i32 = 0 while i < 5 { i = i + 1 if i == 3 { skip // 跳过本次迭代,输出 1 2 4 5 } out i } back 0 }
for...in 遍历
for...in 循环用于遍历字符串中的每个字符:
fn main() i32 { for ch in "hello" { out ch // 依次输出 h e l l o } back 0 }
注意:
for...in 仅支持字符串遍历,每次迭代将一个字符赋值给循环变量。运算符
| 类型 | 运算符 | 说明 |
|---|---|---|
| 算术 | + - * / | 加、减、乘、除(整数除法) |
| 字符串拼接 | + | 字符串 + 字符串,如 "hello" + " " + "world" |
| 比较 | == != < > <= >= | 整数比较;字符串仅支持 == 和 != |
| 负号 | - | 一元负号,如 -x |
注意:比较运算的结果是
bool 类型,输出时显示 true 或 false。输入输出
输出
使用 out 语句输出一个值,自动换行。支持整数和字符串:
fn main() i32 { out 42 out "hello world" back 0 }
输入
使用 input() 读取一个整数输入:
fn main() i32 { out "enter a number:" let x: i32 = input() out x back 0 }
字符串
字符串字面量由双引号包裹,支持转义序列:
| 转义 | 含义 |
|---|---|
\n | 换行 |
\t | 制表符 |
\" | 双引号 |
\\ | 反斜杠 |
拼接
使用 + 拼接字符串:
use io::println fn main() i32 { println("hello" + " " + "world") // 输出 hello world back 0 }
比较
字符串可以用 == 和 != 比较:
fn main() i32 { out "abc" == "abc" // 输出 true out "abc" != "def" // 输出 true back 0 }
注释
LuminaLang 支持两种注释语法:
单行注释
fn main() i32 { // 这是一行注释,不会被执行 out 42 // 行内注释也支持 back 0 }
多行注释
/* 这是多行注释 可以跨越多行 */ fn main() i32 { /* 也可以放在一行里 */ back 0 }
标准库
使用 use 语句导入标准库函数:
// 导入单个函数 use math::abs // 导入多个函数 use math::abs,gcd // 通配符导入(导入模块所有函数) use math::*
math 数学运算
| 函数 | 说明 |
|---|---|
abs(x) | 绝对值 |
max(a,b) | 最大值 |
min(a,b) | 最小值 |
pow(b,e) | b 的 e 次方 |
sqrt(x) | 整数平方根 |
gcd(a,b) | 最大公约数 |
lcm(a,b) | 最小公倍数 |
mod(a,b) | 取模 |
clamp(x,lo,hi) | 数值钳位 |
sign(x) | 符号函数(正为1,负为-1,零为0) |
bits 位运算
| 函数 | 说明 |
|---|---|
and(a,b) | 按位与 |
or(a,b) | 按位或 |
xor(a,b) | 按位异或 |
not(a) | 按位取反 |
shl(a,b) | 左移 |
shr(a,b) | 右移 |
bit(a,n) | 获取第 n 位(0 或 1) |
setbit(a,n) | 设置第 n 位为 1 |
clrbit(a,n) | 清除第 n 位为 0 |
popcount(a) | 二进制中 1 的个数 |
io 输入输出扩展
| 函数 | 说明 |
|---|---|
println(x) | 输出并换行 |
print(x) | 输出不换行 |
readint() | 读取整数 |
readline() | 读取一行字符串输入 |
eprint(x) | 输出到标准错误 |
eprintln(x) | 输出到标准错误并换行 |
flush() | 刷新输出缓冲区 |
time 时间操作
| 函数 | 说明 |
|---|---|
now() | 当前 Unix 时间戳(秒) |
year() | 当前年份 |
month() | 当前月份(1-12) |
day() | 当前日期(1-31) |
hour() | 当前小时(0-23) |
minute() | 当前分钟(0-59) |
second() | 当前秒(0-59) |
weekday() | 星期几(0=周日,6=周六) |
sleep_ms(ms) | 睡眠指定毫秒 |
os 系统信息
| 函数 | 说明 |
|---|---|
exit(code) | 以指定退出码退出程序 |
pid() | 当前进程 ID |
ppid() | 父进程 ID |
args_count() | 命令行参数个数 |
sep() | 路径分隔符(Windows 为 \,其他为 /) |
is_windows() | 是否为 Windows 系统(1 是,0 否) |
getenv(name) | 获取环境变量值 |
cwd() | 当前工作目录 |
指南结束。更多示例请参考 examples/ 目录。