Vix是一种静态类型、编译型编程语言,结合了函数式编程和面向对象编程的特性。它支持多种后端(LLVM、QBE等),具有简洁的语法和强大的类型系统。
print("Hello,world!")
// 单行注释
/*
多行注释
*/
a = "Hello"
b = 123
c = 3.14
a: i32 = 10
b: f64 = 3.14
c: string = "Hello"
i32- 32位整数i64- 64位整数f32- 32位浮点数f64- 64位浮点数string- 字符串类型bool- 布尔类型ptr- 指针类型
使用mut关键字声明可变变量:
mut x = 10
x = 20 // 可以修改
fn add(a: i32, b: i32) -> i32 {
return a + b
}
fn main() -> i32 {
print("Hello, World!")
return 0
}
fn main(argc: i32, argv: ptr) -> i32 {
for (i in 0 .. argc) {
print(argv[i])
}
return 0
}
a = input(">")
if (a == "10") {
print("a=10")
} elif (a == "20") {
print("a=20")
} else {
print("a not is 10 or 20")
}
a = 0
while (a <= 10) {
print(a)
a += 1
}
// 范围循环
for (i in 1 .. 5) {
print(i)
}
// 嵌套循环
for (x in 1 .. 3) {
for (y in 1 .. 3) {
print("x:", x, "y:", y)
}
}
a = 10
b = 20
if (a == 10 or b == 20) {
print("a is 10 or b is 20")
}
if (a == 10 and b == 20) {
print("a is 10 and b is 20")
}
// 数组声明
a: [i32 * 5] = [1, 2, 3, 4, 5]
// 访问数组元素
print(a[0]) // 1
print(a[1]) // 2
// 修改数组元素
a[1] = 10
print(a[1]) // 10
// 数组长度
print(a.length) // 5
fn arr_loop(arr: [i32], len: i32) {
for (i in 0 .. len) {
print(arr[i])
}
}
fn main() -> i32 {
arr = [5, 2, 8, 1, 9, 10]
arr_loop(arr, arr.length)
return 0
}
// 列表声明
a = ["python", "js", "vix"]
// 访问列表元素
print(a[0]) // "python"
// 列表操作
a.add!(0, "first") // 在索引0处添加元素
b = a.remove(0) // 移除并返回指定索引的元素
a.push!("end") // 在末尾添加元素
c = a.pop() // 弹出并返回最后一个元素
a.replace!(1, "new") // 替换指定位置的元素
// 列表长度
print(a.length)
a = [1, 2, 3]
print(a) // [1, 2, 3]
a.add!(0, 4) // [4, 1, 2, 3]
b = a.remove(0) // b = 1, a = [4, 2, 3]
a.push!(5) // a = [4, 2, 3, 5]
c = a.pop() // c = 5, a = [4, 2, 3]
a.replace!(1, 6) // a = [4, 6, 3]
struct Person {
name: string,
age: i32
}
fn main() -> i32 {
// 使用初始化列表
p1: Person {name: "John", age: 20}
print(p1.name)
print(p1.age)
// 逐字段赋值
p2: Person {}
p2.name = "Jane"
p2.age = 25
print(p2.name)
print(p2.age)
return 0
}
obj PersonA(age: i32, name: string) {
field age = age
field name = name
hello(self) {
print("ciallo ! my name is " + self.name)
}
out_age(self) {
print("I am " + self.age + " years old")
}
}
impl PersonA -> public {
hello as greeting,
out_age as age
}
fn main() -> i32 {
obj p = PersonA(20, "john")
p.greeting()
p.age()
return 0
}
// 取地址:&
x = 10
mut ptr = &x // 获取 x 的地址,赋值需要加上 mut 修饰符
// 解引用:@
value = @ptr // 获取 ptr 指向的值
@ptr = 20 // 修改 ptr 指向的值
arr = [1, 2, 3, 4, 5]
p = &arr[0]
second = @(p + 1) // 获取 arr[1] = 2
print(second)
fn main() {
p: &i32 = nil
if (p == nil) {
print("nil is working...")
}
}
maybe {
error."No Found" {
code: 404,
message: "The requested resource was not found."
}
}
catch error."No Found" as e {
print("Error " + e.code + ": " + e.message)
}
extern "C" {
fn printf(format: ptr, ...) -> i32
fn puts(s: ptr) -> i32
}
fn main(argc: i32, argv: ptr) -> i32 {
printf("Hello World! argc = %d\n", argc)
for (i in 1 .. argc) {
puts(argv[i])
printf("argv[%d] = %s\n", i, argv[i])
}
return 0
}
global counter = 42
global message: str = "Hello World"
global pi: f64 = 3.14159
print(counter)
print(message)
print(pi)
a = toint("123") // 字符串转整数
b = tofloat("3.14") // 字符串转浮点数
a = input(">")
print("Hello, World!")
print("Value:", 42)
fn fib(n: i32) -> i64 {
a = 0
b = 1
for (i in 1 .. n) {
c = a + b
a = b
b = c
}
return b
}
fn main() -> i32 {
print(fib(40))
}
fn swap(a: i32, b: i32) -> i32 {
temp = a
a = b
b = temp
print("a:", a, "b:", b)
return 0
}
更多示例代码可以在项目的examples目录中找到,包括:
- 基本语法示例
- 数据结构示例
- 控制流示例
- 函数示例
- 面向对象示例
- 指针操作示例
- 错误处理示例
欢迎贡献代码和文档!请查看CONTRIBUTING.md了解如何参与项目开发。
本项目采用开源许可证,具体信息请查看LICENSE文件。
详细的版本变更历史请查看CHANGELOG.md。
- CONTRIBUTING.md - 贡献指南
- ABOUTBACKEND.md - 后端实现说明
- DIFF.md - 与不同后端的差异
- command.md - 命令行工具使用说明