proc main(): void {
v := ["a", "b", "c"] // Str[3] — um tamanho estático, inferido
mut Str[dyn] w = ["a", "b"] // dinâmico — o único tipo que append aceita
append(w, "c")
echo v[0] // a
echo v[0:1] // ["a", "b"] — os dois limites inclusivos
echo v[1:] // ["b", "c"]
echo v == ["a", "b", "c"] // true — elemento por elemento
Str[3][2] grid = [["a", "b", "c"], ["d", "e", "f"]]
echo grid[1][2] // f — duas linhas de três
}Um vetor guarda elementos de um só tipo, lado a lado na memória, e seu tipo diz o tamanho dele:
Str[3] é estático: exatamente três, sempre. v := ["a", "b", "c"] é um — um tamanho lido do valor é um tamanho do mesmo jeito.Str[dyn] é dinâmico: não promete nada sobre o tamanho, e é o único tipo que append, prepend e drop alteram. Ele precisa ser escrito, como mut Str[dyn] v = ….Str[] é uma grafia só para parâmetros, que aceita qualquer um dos dois.Um vetor de vetores se lê da esquerda para a direita: Str[3][2] são dois vetores de três, então grid[1][2] é a última célula da segunda linha. v[i] lê um elemento e v[lo:hi] fatia com os dois limites inclusivos, então v[0:1] são dois elementos; qualquer um dos limites pode ser omitido. Todo índice e toda fatia são provados dentro dos limites quando o programa compila — o próximo slide mostra como. + junta dois vetores em um novo, e == os compara elemento por elemento.