主页 指南 Codeberg

语法指南

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 是强类型语言,支持三种类型:

类型说明范围/示例
i3232 位有符号整数-2,147,483,648 ~ 2,147,483,647
bool布尔类型truefalse
"..."字符串字面量任意文本,支持 \n \t \" \\ 转义

变量和函数参数可以声明为 i32bool 类型,表达式中可以使用字符串字面量。字符串支持拼接(+)和比较(==!=)。

布尔类型

LuminaLang 支持布尔类型 bool,包含两个字面量:truefalse。布尔值既可作为条件表达式,也可用作变量类型或函数返回类型。

布尔变量与字面量

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

在循环内部,可以使用 haltskip 控制执行流程:

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 类型,输出时显示 truefalse

输入输出

输出

使用 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/ 目录。