do deep copy on init and assign

func main
    test_copy_on_init()
    test_copy_on_assign()
    test_copy_primitives()
    test_copy_on_index_access()
end

func test_copy_on_init
    t := ((1, 2), 3)
    var t2 := t
    t2[0][0] = 42
    println(t[0][0])
    println(t2[0][0])
end

func test_copy_on_assign
    t := ((1, 2), 3)
    var t2 := ((-1, -2), -3)
    t2 = t
    t2[0][0] = 42
    println(t[0][0])
    println(t2[0][0])
end

func test_copy_primitives
    i := 42
    var i2 := i
    i2 = 53
    var i3 := 0
    i3 = i
    i3 = 64
    println(i)
    println(i2)
    println(i3)
end

func test_copy_on_index_access
    t := (((1, 2), 3), 4)
    var t2 := t[0]
    t2[0][0] = 42
    print(t[0][0][0])
    print(t2[0][0])
end