| 1 | fn map_cb(s string) string { |
| 2 | return 'CB: ${s}' |
| 3 | } |
| 4 | |
| 5 | fn filter_cb(n int) bool { |
| 6 | return n < 4 |
| 7 | } |
| 8 | |
| 9 | fn variadic(args ...int) { |
| 10 | println(args) |
| 11 | println(args[0]) |
| 12 | println(args[1]) |
| 13 | } |
| 14 | |
| 15 | fn vararg_test() { |
| 16 | variadic(1, 2, 3) |
| 17 | } |
| 18 | |
| 19 | // TODO: Remove `fn main` once vet supports scripts |
| 20 | fn main() { |
| 21 | vararg_test() |
| 22 | |
| 23 | // index initializations |
| 24 | list1 := []string{len: 3, init: 'Item ${index}'} |
| 25 | list2 := []string{len: 3, init: 'Item ${index}'} |
| 26 | list3 := []int{len: 3, init: index} |
| 27 | list4 := []string{len: 4, init: '${index}:${index * 2}'} |
| 28 | println(list1) |
| 29 | println(list2) |
| 30 | println(list1 == list2) |
| 31 | println(list3) |
| 32 | println(list4) |
| 33 | |
| 34 | arr1 := ['Hello', 'JS', 'Backend'] |
| 35 | mut arr2 := [1, 2, 3, 4, 5] |
| 36 | |
| 37 | // Array slices |
| 38 | slice1 := unsafe { arr1[1..3] } |
| 39 | slice2 := unsafe { arr2[..3] } |
| 40 | slice3 := unsafe { arr2[3..] } |
| 41 | |
| 42 | // Array indexes |
| 43 | idx1 := slice1[1] |
| 44 | arr2[0] = 1 |
| 45 | arr2[0 + 1] = 2 |
| 46 | println(arr2) |
| 47 | |
| 48 | // TODO: This does not work for now |
| 49 | // arr2[0..1] = arr2[3..4] |
| 50 | // println(arr2) |
| 51 | |
| 52 | // Array push operator |
| 53 | arr2 << 6 |
| 54 | arr2 << [7, 8, 9] |
| 55 | println(arr2) |
| 56 | println('\n\n') |
| 57 | |
| 58 | // String slices |
| 59 | mut slice4 := unsafe { idx1[..4] } |
| 60 | print('Back\t=> ') |
| 61 | println(slice4) // 'Back' |
| 62 | |
| 63 | // String indexes |
| 64 | idx2 := slice4[0] |
| 65 | print('66\t=> ') |
| 66 | println(idx2) |
| 67 | // TODO: |
| 68 | // slice4[3] = `c` |
| 69 | |
| 70 | // Maps |
| 71 | mut m := map[string]string{} |
| 72 | key := 'key' |
| 73 | m[key] = 'value' |
| 74 | val := m['key'] |
| 75 | print('value\t=> ') |
| 76 | println(val) |
| 77 | |
| 78 | // 'in' / '!in' |
| 79 | print('true\t=> ') |
| 80 | println('JS' in arr1) |
| 81 | print('false\t=> ') |
| 82 | println(3 !in arr2) |
| 83 | print('true\t=> ') |
| 84 | println('key' in m) |
| 85 | print('true\t=> ') |
| 86 | println('badkey' !in m) |
| 87 | |
| 88 | // for in |
| 89 | for _ in arr1 {} |
| 90 | println('0 to 8\t=>') |
| 91 | for i, _ in arr2 { |
| 92 | println(i) |
| 93 | } |
| 94 | println('\n\n4 to 5\t=> ') |
| 95 | for _, v in slice3 { |
| 96 | println(v) |
| 97 | } |
| 98 | |
| 99 | println(int(1.5)) |
| 100 | |
| 101 | println('\n\n') |
| 102 | |
| 103 | // map |
| 104 | a := arr1.map('VAL: ${it}') |
| 105 | b := arr1.map(map_cb) |
| 106 | c := arr1.map(map_cb(it)) |
| 107 | d := arr1.map(fn (a string) string { |
| 108 | return 'ANON: ${a}' |
| 109 | }) |
| 110 | // I don't know when this would ever be used, |
| 111 | // but it's what the C backend does ¯\_(ツ)_/¯ |
| 112 | e := arr1.map(456) |
| 113 | |
| 114 | println(a) |
| 115 | println(b) |
| 116 | println(c) |
| 117 | println(d) |
| 118 | println(e) |
| 119 | |
| 120 | println('\n\n') |
| 121 | |
| 122 | // filter |
| 123 | aa := arr2.filter(it < 4) |
| 124 | bb := arr2.filter(filter_cb) |
| 125 | cc := arr2.filter(filter_cb(it)) |
| 126 | dd := arr2.filter(fn (a int) bool { |
| 127 | return a < 4 |
| 128 | }) |
| 129 | |
| 130 | println(aa) |
| 131 | println(bb) |
| 132 | println(cc) |
| 133 | println(dd) |
| 134 | |
| 135 | // fixed arrays: implemented as normal arrays |
| 136 | f1 := [1, 2, 3, 4, 5]! |
| 137 | mut f2 := [8]f32{} |
| 138 | f2[0] = f32(1.23) |
| 139 | f3 := ['foo', 'bar']! |
| 140 | f4 := [u64(0xffffffffffffffff), 0xdeadface]! |
| 141 | |
| 142 | println(' |
| 143 | ${f1} |
| 144 | ${f2} |
| 145 | ${f3} |
| 146 | ${f4}') |
| 147 | } |
| 148 | |