由浅入深,完整展示 xlang 支持的所有写法。
标准库默认可用,无需 import。print 和 println 是全局函数。
// 最简单的 xlang 程序 print("Hello, World!") // 多参数输出 println("xlang", 6, true) // main 函数是程序入口 func main(...) as int print("程序启动") return 0 end
// 单行或 /* ... */ 多行(支持嵌套)。换行和 ; 都是语句分隔符。顶层可执行语句可与 func main 共存(先执行顶层,再调用 main)。模块级变量可在文件顶层声明。C 风格类型前置声明。var 是动态类型,auto 编译期推断。
// 基础类型声明 int a = 42 int64 big = 1_000_000 float pi = 3.14 string name = "xlang" bool ok = true time now = time.now() point ptr = null // 整数细分类型 uint8 byte = 255 int32 coord = -100 float64 precise = 1.2e-3 // 动态类型 var — 运行时携带类型信息 var v = 123 v = "现在是字符串" v = [1, 2, 3] // 类型推断 auto auto x = a + 1 // int auto y = pi * 2.0 // float // 常量 const int maxRetry = 3 // 类型别名 typedef i64 = int64
type t = type(42) 取得表达式的类型。UTF-8 标识符意味着你可以使用中文命名变量。xlang 支持丰富的字面量形式,包括六种字符串和时间字面量。
// 整数(仅小写前缀) 42 // 十进制 1_000_000 // 下划线分隔 0x2A // 十六进制 0o52 // 八进制 0b101010 // 二进制 // 浮点 3.14 1.0e10 1.2e-3
string a = "双引号,支持 \n 转义" string b = '单引号,也支持转义' // raw string — 不处理转义 string c = r"c:\temp\file.txt" // 多行字符串 string d = """ 第一行 第二行 """ // f-string — 表达式插值 string name = "world" print(f"Hello {name}!") // Hello world! print(f"{1 + 2}") // 3 // raw f-string — 插值生效,转义不处理 print(rf"c:\{name}\data")
time date = #2026-06-18# time t = #12:30:45# time dt = #2026-06-18 12:30:45# print(time.year(date)) // 2026 print(time.format(dt))
完整的算术、比较、逻辑、位运算和空值运算符。
// 算术 int a = 10 + 3 * 2 // 16 int b = 10 % 3 // 1 int c = 2 ** 10 // 1024 // 复合赋值 a += 5 a -= 5 a *= 2 a /= 3 a %= 3 a **= 2 // 比较 bool eq = a == b bool ne = a != b bool lt = a < b // 逻辑(关键字形式) if a > 0 and b < 10 then print("both true") end if not ok or a == 0 then print("failed") end // 位运算 int mask = 0xFF & 0x0F int shifted = 1 << 8 // 空值与条件 auto x = maybeNull ?? "default" // 空合并 auto y = cond ? 1 : 0 // 三元 field ?= value // 条件赋值(仅为 null 时赋值) // 安全访问 print(obj?.field) // obj 为 null 时不崩溃 print(arr?[99]) // 越界返回 null // 成员判断 if "key" in dict then print("found") end
if/elseif/else、while、do-while、for-in,全部用 end 闭合块。
// if / elseif / else(必须有 then) if score >= 90 then print("A") elseif score >= 60 then print("B") else print("F") end // while 循环 int i = 0 while i < 5 print(i) i += 1 end // do-while(条件后必须带 end) do i += 1 while i < 10 end // for-in + range for n in range(0, 5) print(n) end // break / continue for n in range(0, 100) if n == 5 then break end if n % 2 == 0 then continue end print(n) end
as 声明返回类型,无 as 表示无返回值。支持默认参数、命名参数、可变参数。
// 无返回值 func greet(string name) print(f"Hello, {name}!") end // 有返回值 func add(int a, int b) as int return a + b end // 默认参数 func log(string text, int level = 1) print(f"[{level}] {text}") end log("hello") // level 默认 1 log("error", 3) // level = 3 // 命名参数(可乱序) func move(int x, int y) print(x, y) end move(y = 2, x = 1) // 命名参数乱序调用 // 数组可变参数 ...(通过 arg 访问) func sum(...) as int int total = 0 for v in arg total += v as int end return total end print(sum(1, 2, 3, 4)) // 10 // 字典可变参数 ***(通过 arg 访问) func configure(string name, ***) as var return arg["mode"] end auto mode = configure("app", mode = "debug", port = 8080)
四种静态泛型容器:array、dict、set、list。字面量简洁直观。
// 数组 — [] 字面量 array<int> nums = [1, 2, 3] auto more = array<int>[4, 5, 6] print(nums[0]) // 1 nums[0] = 99 print(nums?[99]) // 安全索引,越界返回 null // 字典 — {} 字面量 dict<int> scores = {"alice": 90, "bob": 85} scores["carol"] = 78 // 集合 set<int> unique = set<int>{1, 2, 3} // 列表 — int64 稀疏索引 list<string> sparse = list<string>[0: "a", 5: "b"]
// 遍历数组 for value in [10, 20, 30] print(value) end // 遍历字典(键值对) for key, value in {"a": 1, "b": 2} print(key, value) end // 遍历字符串(UTF-8 字符迭代) for i, ch in "你好xlang" print(i, ch) end
44 个标准库函数,UTF-8 原生支持。
string text = "Hello, xlang!" // 基本操作 print(string.len(text)) // UTF-8 字符数 print(string.byteLen(text)) // 原始字节数 print(string.upper(text)) // HELLO, XLANG! print(string.lower(text)) // 查找与判断 print(string.contains(text, "xlang")) // true print(string.startsWith(text, "Hello")) // true print(string.indexOf(text, ",")) // 5 // 分割与拼接 array parts = string.split("a,b,c", ",") print(string.join(parts, "-")) // a-b-c // 截取 print(string.slice(text, 0, 5)) // Hello print(string.trim(" hi ")) // hi // 替换与重复 print(string.replace(text, "xlang", "World")) print(string.repeat("ab", 3)) // ababab
函数可以返回多个值,调用方使用解构声明接收。
// 返回多个值 func divmod(int a, int b) as (int, int) return a / b, a % b end // 解构声明 int quotient = 0 int remainder = 0 quotient, remainder = divmod(17, 5) print(quotient, remainder) // 3 2 // 配合 auto 推断 auto q, r = divmod(100, 7)
函数是一等公民,支持匿名函数、闭包捕获和函数值类型。
// 匿名函数(箭头体) auto inc = func(int a) as int => a + 1 print(inc(41)) // 42 // 闭包捕获外层变量 int base = 100 auto adder = func(int x) as int => base + x print(adder(5)) // 105 // 函数值类型 func add(int a, int b) as int return a + b end func(int, int) as int proc = add print(proc(3, 4)) // 7 // 函数重载(同名不同参数) func process(int v) as int return v * 2 end func process(string s) as int return string.len(s) end
class 定义字段、方法、构造函数。self 引用当前实例。
class Point int x = 0 int y = 0 create(int x, int y) self.x = x self.y = y end func length2() as int return self.x * self.x + self.y * self.y end end // 构造实例 Point p = Point(3, 4) print(p.x, p.y) // 3 4 print(p.length2()) // 25
class 和容器默认按引用传递;基础类型默认按值。byval / byref / out 显式控制。
class Box int count end // 默认共享引用 func shared(Box value) value.count = 10 // 对调用方可见 end // byval — 仍共享同一对象,参数重新绑定只影响局部 func byvalExample(byval Box value) value.count = 20 // 对调用方可见 value = Box() // 只重新绑定局部参数 end // 独立副本必须显式 copy() / clone() func makeCopy(Box value) Box independent = copy(value) independent.count = 30 end // byref — 可改写调用方变量 func replace(byref Box value) value = Box() // 改写调用方变量槽 end // out — 必须赋值后返回 func create(out Box value) value = Box() end Box box = Box() shared(box) replace(byref box) create(out box)
byval 对 class 和容器不创建独立副本,只保留同一受管理引用。需要独立对象时必须显式 copy() / clone()。byref 和 out 的调用点必须显式写出标记。extends 单继承,base() 调用父类构造。public/private 控制访问,static 定义类级成员。
class Base int seed = 0 create(int seed) self.seed = seed end func describe() as string return f"seed={self.seed}" end end class Child extends Base int extra = 0 create(int seed, int extra) base(seed) // 调用父类构造 self.extra = extra end func sum() as int return self.seed + self.extra end end auto c = Child(10, 20) print(c.describe()) // seed=10 print(c.sum()) // 30
class Entity private int raw = 0 // 仅类内部可访问 static int total = 0 // 类级字段 static func of(int v) as Entity Entity.total += 1 Entity e = Entity() e.raw = v return e end end auto e = Entity.of(42) print(Entity.total) // 1
get 定义读取属性,let 定义写入属性。支持多维参数重载。
class Meter private array<int> values = [0, 0, 0] // 零维属性 get first() as int return self.values[0] end let first(int v) self.values[0] = v end // 多维属性 — 像索引一样使用 get value(int idx) as int return self.values[idx] end let value(int idx, int v) self.values[idx] = v end end auto m = Meter() m.first = 42 print(m.first) // 42 m.value[1] = 99 print(m.value[1]) // 99
泛型函数与泛型 class,支持约束语法和 ::<T> 显式实例化。
// 泛型函数 func max<T>(T a, T b) as T if a > b then return a end return b end // 显式实例化 int biggest = max::<int>(10, 20) // 带约束的泛型(is 关键字) func serialize<T is json>(T obj) as string return json.stringify(obj) end // 多约束用 and 组合 class Map<K is comparable and cloneable, V is json and cloneable> // ... end
virtual 声明可重写方法,生成 vtable 支持动态派发。override 重写,final 禁止再重写。
class Shape virtual func area() as float return 0.0 end end class Circle extends Shape float radius = 0 create(float r) self.radius = r end override func area() as float return math.pi * self.radius * self.radius end end class Square extends Shape float side = 0 create(float s) self.side = s end override final func area() as float return self.side * self.side end end // 动态派发 Shape s1 = Circle(5.0) Shape s2 = Square(4.0) print(s1.area()) // 78.54... print(s2.area()) // 16.0
双下划线协议方法实现运算符重载、索引、调用、迭代等自定义行为。
class Vec3 float x = 0 float y = 0 float z = 0 create(float x, float y, float z) self.x = x self.y = y self.z = z end // 加法 func __add__(Vec3 other) as Vec3 return Vec3(self.x + other.x, self.y + other.y, self.z + other.z) end // 相等 func __eq__(Vec3 other) as bool return self.x == other.x and self.y == other.y and self.z == other.z end // 取负 func __neg__() as Vec3 return Vec3(-self.x, -self.y, -self.z) end end auto a = Vec3(1, 2, 3) auto b = Vec3(4, 5, 6) auto c = a + b // Vec3(5, 7, 9) auto n = -a // Vec3(-1, -2, -3)
class Grid int base = 0 create(int base) self.base = base end // 索引读取 func __item__(int x, int y) as int return self.base + x * 10 + y end // 索引写入 func __setItem__(int x, int y, int value) self.base = value + x * 10 + y end // 成员判断 in func __contains__(int value) as bool return value == self.base end // 调用 obj(...) func __call__(int add) as int return self.base + add end end auto g = Grid(100) print(g[2, 3]) // 123 g[2, 3] = 7 print(30 in g) // false print(g(5)) // 105
__add__ __sub__ __mul__ __div__ __mod__ __pow__ __neg__ __pos__ __not__ __eq__ __ne__ __lt__ __le__ __gt__ __ge__一行 derive 自动生成 copy/clone/json 等协议实现,告别手写样板代码。
class Config derive copy // 浅复制 derive clone // 深复制 derive json // JSON 序列化 derive xson // XSON 序列化 derive value // xvalue 互转 derive hash // 哈希 derive equals // 相等比较 int id = 0 string name = "" end auto cfg = Config() cfg.id = 1 cfg.name = "production" // 自动复制 auto copied = copy(cfg) // JSON 序列化 string text = json.stringify(cfg, true) print(text) // JSON 反序列化 auto restored = json.parse::<Config>(text)
class User derive json int id = 0 // 重命名 JSON 字段 string name @json("user_name") = "" // 跳过持久化 string internalToken @persist(skip) = "" end
is 运行时类型判断返回 bool,as 显式向下转换。
var value = 123 // 运行时类型判断 if value is int then print("是整数") end if value is null then print("是空值") end // 向下转换(从 var 转出具体类型) int n = value as int print(n + 1)
class Base end class Child extends Base end Child child = Child() var boxed = child // is 支持 class 继承关系 if boxed is Base then Base base = boxed as Base print("转换成功") end // 取类型值 type t = type(child) print(t)
原生 async/await,future<T> 异步值,task.all/race 组合编排。
async func addAsync(int a, int b) as int return a + b end // await 等待结果 future<int> f = addAsync(20, 22) int result = await f print(result) // 42 // auto 推断 auto autoFuture = addAsync(1, 2) auto value = await autoFuture
// 并发等待全部完成 future<int> a = addAsync(1, 2) future<int> b = addAsync(3, 4) future<int> c = addAsync(5, 6) array<int> all = await task.all([a, b, c]) print(all) // [3, 7, 11] // 竞速 — 取最快完成的 int winner = await task.race([a, b, c]) // 取消 task.cancel(c) // Future 链式 continuation func plusOne(int value) as int return value + 1 end future<int> mapped = a.then(plusOne) future<int> recovered = mapped.catch(func(error e) as int => 0) func cleanup() println("done") end future<int> finalized = recovered.finally(cleanup) // TaskGroup 管理一组 future TaskGroup group = task.group() group.add(finalized) group.waitTimeout(5000) group.close()
yield 惰性求值,generator<T> 类型化。通过 for-in 消费。
func fibonacci(int count) as generator<int> int a = 0 int b = 1 int i = 0 while i < count yield a int temp = a + b a = b b = temp i += 1 end end // for-in 自动消费 for val in fibonacci(10) print(val) end // 输出: 0 1 1 2 3 5 8 13 21 34
channel<T> 线程间安全通信。支持 int、float、bool、string、time、point 等可按值复制类型。
// 创建带缓冲的 channel channel<int> ch = channel::<int>(2) // send 是阻塞发送(满时等待) ch.send(123) // trySend 是非阻塞发送(满时立即返回 false) if not ch.trySend(456) then print("队列已满") end // 阻塞接收 int received = 0 if ch.recvInto(received) then print(received) // 123 end // 非阻塞接收 if not ch.tryRecvInto(received) then print("暂无数据") end // channel<string> 也支持(复制 UTF-8 字节) channel<string> texts = channel::<string>(2) texts.send("你好") ch.close()
send 是阻塞语义(满时等待空间),trySend 是非阻塞(满时立即返回 false)。thread 线程封装、mutex / sem / cond / rwlock 同步原语。
func worker() as int print("working...") return 7 end thread t = thread(worker) t.wait() print(t.exitCode()) // 7
// 互斥锁 mutex m = mutex() m.lock() // 临界区... m.unlock() // 信号量 sem gate = sem(0, 2) gate.post() gate.waitTimeout(100) // 读写锁 rwlock rw = rwlock() rw.readLock() rw.readUnlock() rw.writeLock() rw.downgrade() rw.readUnlock() // 条件变量 cond c = cond() c.signal() c.broadcast()
extern 声明 C 函数、export 导出给 C、native-backed class 对接 C handle。
// extern 声明 C 函数进入 xlang extern "printf" func printf(string fmt, ...) as c_int // 使用 C ABI 精确类型 extern "malloc" func malloc(c_size size) as point extern "free" func free(point ptr) // export 导出 xlang 函数给 C export "xl_greet" func greet(c_int times) as c_int int i = 0 while i < times print("Hello from xlang!") i += 1 end return 0 end
// 对接 C opaque handle 的完整生命周期 class Counter native point handle // C 不透明指针 extern "counter_open" create(int seed) extern "counter_close" destroy() extern "counter_add" func add(int value) as int extern "counter_value" func value() as int end // 使用就像普通 class auto c = Counter(40) print(c.add(2)) // 42 print(c.value()) // 42
xl build main.xl helper.c -o app.exe。CLI 参数 --inc-path / --lib-path / --link / --loadlib 注入 C 依赖。// 导出 package 符号(不进入 C 头文件) export int counter = 0 export const int version = 6 // 同时导出 package 符号和 C ABI 符号 export "app_counter" int appCounter = 0 // 声明 C 全局变量 extern "errno" int errno // 将 C 全局变量以 package 符号重新导出 export extern "host_flag" int hostFlag
try / catch / finally 结构化错误处理。
func risky(int x) as int if x < 0 then throw "x 不能为负数" end return x * 2 end try int r = risky(-1) catch e print(e.kind) // "Error" print(e.message) // "x 不能为负数" finally print("清理完成") end // 断言 int x = 1 assert x > 0 assert x > 0, "x 必须为正数"
#doc ... #end 文档块,进入 ABI 元数据。
#doc desc: 计算两个整数的最大值。 param a: 第一个值。 param b: 第二个值。 return value: a 和 b 中的较大者。 example: print(max(1, 2)) // 2 #end func max(int a, int b) as int if a > b then return a end return b end
desc: param name: return name: note: example:,内容按缩进收集多行文本。C 风格联合体,按 C 兼容布局生成。DEMO6 不提供公开 struct 语句。
union NumberBits int64 integer float64 real end // 使用 NumberBits nb nb.integer = 42 print(nb.real) // 以 float64 视角读取同一内存
xl.dll / xlc.dll 提供 76 个公开 C API,支持 C 宿主嵌入 xlang 运行时。
// C 侧嵌入 xlang XL_ContextOptions opts = xlDefaultContextOptions(); XL_Context* ctx = xlCreateContext(&opts); // 运行脚本 xlRunScriptFile(ctx, "app.xl"); // 运行字符串脚本并传参 xvalue arg = /* array 类型 */; xlRunScriptStringArg(ctx, source, arg); // 编译到 exe xlCompileScriptFileToExe(ctx, "app.xl", "app.exe"); // 注册 C 函数 xlRegisterCFunction(ctx, "my_c_func", &my_c_func); xlDestroyContext(ctx);
创建/销毁语言上下文,支持工作目录、临时目录等配置。
运行 .xl 脚本文件或源码文本,TCC 内存编译即时执行。
运行脚本并传入宿主构造的 xvalue 参数(array 类型)。
编译 XL 源文件为原生可执行程序。
向上下文注册 C 函数,供 XL 代码调用。
注入 include 路径、lib 路径、链接库和运行库。
以上仅为语言核心构造概览。完整的语言参考请参见: