Pular para o conteúdo

Strings e Interpolação

Um textu guarda uma sequência de caracteres: um nome, uma mensagem, uma linha lida do teclado.

As strings podem ser delimitadas por aspas duplas ou aspas simples:

textu a = "Kualeh, Mundu!";
textu b = 'Cabo Verde';

As duas formas são equivalentes, o que é prático quando o texto contém um dos tipos de aspas: 'ele disse "oi"' dispensa escapes.

Um literal pode conter acentos e qualquer outro carácter UTF-8, incluindo emoji:

mostran("Olá, São Vicente! 🦈");

Para escrever um carácter que não se pode teclar dentro de aspas, usa uma barra invertida:

SequênciaSignificado
\nNova linha
\tTabulação
\rRetorno de carro
\\Barra invertida
\"Aspas duplas
\'Aspas simples
\0Carácter nulo
\{Chaveta { numa f-string
\}Chaveta } numa f-string
mostran("Linha 1\nLinha 2");
mostra("coluna1\tcoluna2");
mostran('it\'s');

As f-strings permitem embutir expressões diretamente numa string, prefixando-a com f:

int n = 42;
textu nome = "Kriol";
mostran(f"O valor é {n} e a linguagem é {nome}.");

O que está entre { } é calculado quando o programa chega ali, e o resultado é convertido em texto e inserido na posição. Sem o f inicial, {n} não é nada de especial: aparece tal e qual no ecrã.

int n = 10;
num x = 2.5;
bool b = sin;
mostran(f"n = {n}");
mostran(f"x = {x}");
mostran(f"b = {b}");
mostran(f"n={n} x={x} b={b}");

Cada valor é escrito como se fosse impresso sozinho: um num sai com 6 dígitos significativos e um bool sai como sin ou nau. Vê como cada tipo aparece no ecrã.

Podes interpolar um array inteiro numa f-string:

int[3] nums = [1, 2, 3];
mostran(f"Números: {nums}"); // Números: [1, 2, 3]

É possível incluir chamadas de função diretamente na interpolação:

fn soma(int a, int b) int { divolvi a + b; }
fn inisiu() {
int n = 10;
mostran(f"Soma de 1 a {n} é {soma(1, n)}.");
}

Dentro de { } cabe qualquer expressão, não só um nome: contas, comparações, acessos a campo e índices de array, como em f"{v[i] * 2}" ou f"{v[i] > 0}".

Para incluir uma chaveta literal { ou } numa f-string, escapa cada uma delas com \:

mostran(f"Usa \{chavetas\} assim.");
// saída: Usa {chavetas} assim.

Não há operador de concatenação: a f-string é a forma de juntar valores num textu. O resultado é um textu como qualquer outro, que se guarda numa variável, se passa a uma função ou se devolve de uma:

textu nomi = "Ana";
textu apelidu = "Silva";
textu completu = f"{nomi} {apelidu}";
mostran(completu); // Ana Silva
FunçãoComportamento
mostra(x)Imprime x sem nova linha no final
mostran(x)Imprime x com nova linha (\n) no final
mostra("a");
mostra("b");
mostra("c");
// saída: abc (tudo na mesma linha)
mostran("linha1");
mostran("linha2");
// saída:
// linha1
// linha2

Ambas aceitam vários valores separados por vírgula, e mostran() sem nada escreve uma linha vazia. Vê mostra e mostran aceitam vários valores.

O textu da versão atual serve para guardar, juntar com f-strings e imprimir. Tudo o resto está por fazer, e convém saber antes de desenhar um programa:

O que gostarias de escreverEstado
a + b para juntar textoNão existe; usa f"{a}{b}"
a == b para comparar textoNão existe; o compilador recusa com ainda não é possível comparar textos com ’==‘
t[0] para um carácterNão existe; [ ] só funciona com arrays
O comprimento de um textoNão existe
Procurar, cortar, substituir, mudar de caixaNão existe

Uma biblioteca padrão com funções de texto está nos planos do projeto. Até lá, muito do que parece precisar de comparar texto resolve-se a converter a entrada num número ou num bool logo à entrada, com tipo::konverti, e a decidir sobre esse valor.