💡 示例程序

从 Hello World 到闭包与继承 —— 通过示例学习 Vora 的各种特性。

👋 Hello, World 基础

最简单的 Vora 程序。使用 print() 输出文本。

print("Hello, World!")
print("你好,世界!")
$ vora hello.va
Hello, World!
你好,世界!
📦 变量与类型 基础

let 声明变量,支持 7 种运行时类型。数字支持 0x/0o/0b 前缀。

let n = 42              // Number (double)
let f = 3.14            // Number
let b = true            // Boolean
let s = "hello"         // String
let arr = [1, 2, 3]    // Array
let nothing = null

// 数字前缀
let hex = 0xFF      // 255(十六进制)
let oct = 0o77      // 63(八进制)
let bin = 0b101     // 5(二进制)
✨ 字符串插值 基础

${...} 语法在字符串中嵌入表达式,支持变量和属性访问。

let name = "Vora"
let version = 11
print("Welcome to ${name} v0.${version}!")

// 属性访问
Obj Point(x, y) { this.x = x; this.y = y }
let p = Point(10, 20)
print("Position: (${p.x}, ${p.y})")
Welcome to Vora v0.11!
Position: (10, 20)
🔀 条件分支 控制流

if/else 判断条件。可与三元运算符 ? : 组合使用。

let score = 85

if (score >= 90) {
    print("A")
} else if (score >= 80) {
    print("B")
} else {
    print("C")
}

// 三元运算符:右结合,短路求值
let grade = score > 90 ? "A" : score > 80 ? "B" : "C"
print(grade)  // "B"
🔄 循环 控制流

Vora 提供 while 循环和 for-in 迭代,支持 break/continue

// while 循环
let i = 0
while (i < 5) {
    print(i)
    i += 1
}

// for-in:数组
for item in [1, 2, 3] {
    print(item)
}

// for-in:字符串
for ch in "Vora" {
    print(ch)   // V, o, r, a
}

// for-in:range()
for i in range(5) {
    print(i)   // 0, 1, 2, 3, 4
}

// range(start, stop, step)
for i in range(10, 0, -2) {
    print(i)   // 10, 8, 6, 4, 2
}
🔒 函数与闭包 中级

Vora 函数是一等公民。内层函数通过闭包捕获外层变量。

// 基础函数
func add(a, b) {
    return a + b
}
print(add(3, 4))  // 7

// 闭包:计数器
func makeCounter() {
    let count = 0
    return func() {
        count = count + 1
        return count
    }
}
let c = makeCounter()
print(c())  // 1
print(c())  // 2

// 闭包:函数工厂
func makeMultiplier(factor) {
    return func(x) { return x * factor }
}
let double = makeMultiplier(2)
let triple = makeMultiplier(3)
print(double(5))  // 10
print(triple(5))  // 15
🌀 递归 中级
func factorial(n) {
    if (n <= 1) return 1
    return n * factorial(n - 1)
}
print(factorial(5))  // 120

// 斐波那契
func fib(n) {
    if (n <= 1) return n
    return fib(n - 1) + fib(n - 2)
}
for i in range(10) {
    print(fib(i))  // 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
}
🏛️ 对象与继承 进阶

Obj 定义类,: 实现单继承。构造函数链从根到叶执行。

Obj Animal(name) {
    this.name = name
    func speak() { print("...") }
    func getName() { return this.name }
}

Obj Dog : Animal (name, breed) {
    this.breed = breed
    func speak() {
        print("Woof! I'm " + this.name + " the " + this.breed)
    }
}

Obj Puppy : Dog (name, breed, toy) {
    this.toy = toy
}

let d = Dog("Rex", "Husky")
d.speak()       // Woof! I'm Rex the Husky
print(d.name)   // Rex(父类构造函数设置)
print(d.getName())  // Rex(继承的方法)

let p = Puppy("Buddy", "Golden", "Ball")
print(p.toy)    // Ball
p.speak()        // Woof! I'm Buddy the Golden(多层继承)
⚠️ 异常处理 进阶

try/catch/finally 三种组合。自定义错误对象通过 throw 抛出。

// 基本 try/catch
try {
    throw "something went wrong"
} catch (e) {
    print("Caught: " + e)
} finally {
    print("This always runs")
}

// 自定义错误对象
Obj ValidationError(msg) {
    this.message = msg
}

func validateAge(age) {
    if (age < 0) {
        throw ValidationError("Age cannot be negative")
    }
    if (age > 150) {
        throw ValidationError("Age out of range")
    }
    return true
}

try {
    validateAge(-5)
} catch (e) {
    print("Invalid: " + e.message)  // Invalid: Age cannot be negative
}
📋 数组操作 中级

数组通过 [] 创建和索引。+/+= 合并或追加。

let arr = [1, "hello", true, null]
print(arr[0])  // 1
print(arr[1])  // hello

arr[0] = 42        // 索引赋值

// 数组合并
let a = [1, 2]
let b = [3, 4]
let c = a + b      // [1, 2, 3, 4]

// 追加元素
a += 99           // [1, 2, 99]

// 嵌套数组
let matrix = [[1, 2], [3, 4]]
print(matrix[0][1])  // 2
🌐 Unicode 标识符 特色

Vora 原生支持中文、日文等多语言标识符。

let 名字 = "小明"
let 年龄 = 20

func 打印信息(姓名, 岁数) {
    print("${姓名} 今年 ${岁数} 岁")
}
打印信息(名字, 年龄)

// 日文标识符
let ユーザー名 = "tanaka"
let café = "espresso"

// 混合使用
Obj 学生(姓名, 分数) {
    this.姓名 = 姓名
    this.分数 = 分数
}
let s = 学生("小红", 95)
print(s.姓名 + " 的分数: " + s.分数)
🎯 运算符一览 参考
// 算术:+ - * / % **
10 + 3    // 13
10 - 3    // 7
10 * 3    // 30
10 / 3    // 3.333...
10 % 3    // 1
2 ** 8    // 256(幂运算,右结合)

// 比较:< <= > >= == !=
5 < 10     // true
5 == 5    // true
"a" != "b"  // true

// 逻辑:&& || !(短路求值)
let a = false && neverCalled()  // neverCalled 不执行
let b = true || neverCalled()   // neverCalled 不执行

// 自增/自减:++ --(前缀/后缀)
let x = 5
print(x++)   // 5(先返回后自增)
print(x)     // 6
print(++x)   // 7(先自增后返回)

// 复合赋值:+= -= *= /= %=
x += 3    // x = x + 3
x *= 2    // x = x * 2
🧰 内建函数 参考
// print(...) — 变参输出
print("Hello", 42, true)  // Hello 42 true

// clock() — 时间戳(秒,毫秒精度)
let start = clock()
// ... 执行一些代码 ...
print("Elapsed: " + (clock() - start) + "s")

// input(prompt?) — 读取标准输入
let name = input("Your name: ")
print("Hello " + name)

// int(value) / float(value) — 类型转换
print(int(3.14))       // 3
print(int("42"))       // 42
print(float("3.14"))   // 3.14

// range(...) — 生成数字数组
range(3)              // [0, 1, 2]
range(2, 5)           // [2, 3, 4]
range(0, 10, 2)       // [0, 2, 4, 6, 8]
range(10, 0, -2)     // [10, 8, 6, 4, 2]

// bin(num) / oct(num) / hex(num) — 进制转换
print(hex(255))    // "0xFF"
print(bin(5))      // "0b101"
print(oct(63))     // "0o77"

// assert(cond, msg?) — 断言
assert(2 + 2 == 4)           // 通过
assert(2 + 2 == 5, "Math broken!")  // 抛出 RuntimeError