Pular para o conteúdo

Moldes (`molda`)

Um molde é um tipo composto que agrupa campos de diferentes tipos, semelhante a uma struct em C. A palavra-chave molda declara um novo molde: isto é, define a forma que valores desse tipo devem ter. O suporte atual inclui declaração de tipos, literais com campos nomeados, arrays como campos, acesso com . e atribuição a campos.

molda Pessoa {
textu nomi;
nter idadi;
}

Cada campo usa a mesma forma de declaração de tipo e nome usada em parâmetros e variáveis. O bloco declarado com molda não precisa de ; depois de }.

Nomes de tipos definidos pelo utilizador começam com letra maiúscula. Variáveis, funções e campos continuam a usar identificadores iniciados por letra minúscula ou _.

Campos também podem ser arrays de tamanho fixo:

molda Pessoa {
textu nomi;
nter[2] flags;
}

Valores de um molde são criados com um literal associado ao tipo:

Pessoa pessoa = Pessoa::{nomi: "jose", idadi: 60};

Todos os campos são obrigatórios por agora. Campos repetidos, campos desconhecidos ou valores com tipos incompatíveis são erros em tempo de compilação.

Se um campo for array, o literal [ ... ] recebe o tipo esperado a partir do campo:

Pessoa pessoa = Pessoa::{nomi: "jose", flags: [0, 1]};

Usa . para ler ou alterar um campo:

mostran(pessoa.nomi);
mostran(pessoa.idadi);
pessoa.idadi = 61;
pessoa.idadi += 1;

O acesso pode ser encadeado com outros campos e índices de array:

molda Enderesu {
textu rua;
nter numero;
}
molda Pessoa {
Enderesu[2] enderesus;
}
Pessoa pessoa = Pessoa::{
enderesus: [
Enderesu::{rua: "antigu", numero: 10},
Enderesu::{rua: "nobu", numero: 44}
]
};
pessoa.enderesus[0].rua = "medio";
pessoa.enderesus[0].numero += 5;

Valores de moldes são passados para funções por cópia. Alterar um parâmetro dentro de uma função não altera o valor original fora dela. O uso de referências explícitas com ref será tratado numa fase futura.

molda Pessoa {
textu nomi;
nter idadi;
}
fn proxima_idadi(Pessoa pessoa) nter {
divolvi pessoa.idadi + 1;
}
fn inisiu() {
Pessoa pessoa = Pessoa::{nomi: "jose", idadi: 60};
mostra(pessoa.nomi);
mostra(" ");
mostran(proxima_idadi(pessoa));
}
  • Métodos e blocos fazi ainda não estão implementados.
  • Valores de moldes ainda não têm uma representação direta em mostra ou f-strings; imprime campos individuais.
  • Arrays de valores de moldes podem ser guardados e indexados, mas não são imprimíveis como um todo.
  • Herança não está prevista.