func add(a: Int64, b: Int64): Int64 {
    return a + b
}

main() {
    println("hello world")
    var a1 = 1
    var b1 = 2
    var c1 = add(a1, b1)
    println(c1)

    let arr = [0, 1, 2, 3, 4, 5]
    for (i in arr) {
        println("The element is ${i}")
    }

    arr[0] = 3
    println("The first element is ${arr[0]}")

    println("--------------------------------------")
    
    // VArray<T, $N>(initElement: (Int64) -> T)
    let vb = VArray<Int64, $5>({ i => i}) 
    // [0, 1, 2, 3, 4]
    // VArray<T, $N>(item!: T)
    let vc = VArray<Int64, $5>(item: 0) 
    // [0, 0, 0, 0, 0]
    var va: VArray<Int64, $3> = [1, 2, 3]
    // 使用index遍历VArray
    for (i in 0..va.size) {
        println("The index is ${i}, the element is ${va[i]}")
    }

    println("--------------------------------------")

    // Range<T>(start: T, end: T, step: Int64, hasStart: Bool, hasEnd: Bool, isClosed: Bool)
    let r1 = Range<Int64>(0, 10, 1, true, true, true) 
    // r1 contains 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    let r2 = Range<Int64>(0, 10, 1, true, true, true) 
    // r2 contains 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    let r3 = Range<Int64>(10, 0, -2, true, true, false) 
    // r3 contains 10, 8, 6, 4, 2

    for (i in r1) {
        println("The element is ${i}")
    }
    println("--------------------------------------")


    let n = 10
    let r11 = 0..10 : 1   // r1 contains 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    let r21 = 0..=n : 1   // r2 contains 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    let r31 = n..0 : -2   // r3 contains 10, 8, 6, 4, 2
    let r41 = 10..=0 : -2 // r4 contains 10, 8, 6, 4, 2, 0

    let r5 = 0..10   // the step of r5 is 1, and it contains 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    //let r6 = 0..10 : 0 
    // Error, step cannot be 0

    let r7 = 10..0 : 1 // r7 to r10 are empty ranges
    let r8 = 0..10 : -1
    let r9 = 10..=0 : 1
    let r10 = 0..=10 : -1

    println("--------------------------------------")

    //  输出你好
    let he: Rune = '\u{4f60}'
    let llo: Rune = '\u{597d}'
    print(he)
    print(llo)

    println("--------------------------------------")   
    let slash: Rune = '\\'
    let newLine: Rune = '\n'
    let tab: Rune = '\t'

    println("*********************************************")
    println("Hello${slash}World${newLine}nihao${tab}wo${tab}de${tab}hao")
    println("*********************************************")
    let s1: String = ""
// let s2 = 'Hello Cangjie Lang'
let s3 = "\"Hello Cangjie Lang\""
// let s4 = 'Hello Cangjie Lang\n'

let s11: String = """
    Hello,
    Cangjie Lang
    """
/*
let s21 = '''
    Hello,
    Cangjie Lang'''
*/
let s12: String = #""#
// let s22 = ##'\n'##
let s32 = ###"
    Hello,
    Cangjie
    Lang"###

/*
    //mismatched types expected 'UInt8', found 'Struct-String'
    var bt: Byte = "0"
    print(bt)
    bt = "1"
    print(bt)
    var ru: Rune = "0"
    print(ru)
    ru = "1"
    print(ru)
*/

    println("--------------------------------------")

    let fruit = "apples"
    let count = 10
    let s = "There are ${count * count} ${fruit}"
    println(s)

    let r = 2.4
    let area = "The area of a circle with radius ${r} is ${let PI = 3.141592; PI * r * r}"
    println(area)

    println("--------------------------------------")   
    let x: (Int64, Float64) = (3, 3.141592)
    let y: (Int64, Float64, String) = (3, 3.141592, "PI")
    println("${x[0]}, ${x[1]}")
    println("${y[0]}, ${y[1]}, ${y[2]}")
    println("--------------------------------------")   
    var a: Int64
    var b: String
    var c: Unit
    var f = { => ((1, "abc"), ())}
    ((a, b), c) = f() // value of a is 1, value of b is "abc", value of c is '()'
    ((a, b), _) = ((2, "def"), 3.0) // value of a is 2, value of b is "def", 3.0 is ignored
    println("-----------------------------------------")
    func getFruitPrice (): (name: String, price: Int64) {
        return ("banana", 10)
    }



}