Funções
<!-- verified-against: seed-llvm; examples: docs-examples-test -->
fn add(left: i64, right: i64) -> i64 {
left + right
}
fn absolute(value: i64) -> i64 {
if value < 0 { return -value }
value
}
Os parâmetros são digitados. Uma expressão final é o resultado; retorno antecipado usa return. Omitir -> significa void.
Métodos e destruidores
struct Counter { value: i64 }
@borrow
fn Counter.current() -> i64 {
self.value
}
fn Counter.drop() {
// consuming implicit self
}
self está implícito e não deve aparecer na lista de parâmetros. @borrow fornece um empréstimo de receptor lexical compartilhado. Um destruidor consome seu proprietário e é executado exatamente uma vez na limpeza estruturada, a menos que o valor tenha sido movido ou descartado manualmente.
Genéricos e características
trait Identity {
fn id() -> i64
}
fn identify<T: Identity>(value: T) -> i64 {
value.id()
}
Parâmetros genéricos e nomes trait/type usam UpperCamelCase. As implementações são verificadas quanto à integridade, correspondência de assinatura, coerência e regras órfãs. O despacho é estaticamente monomorfizado sem vtables ou alocação oculta.
Funções estrangeiras
extern "c" fn platform_call(value: i64) -> i64 link_name "platform_call";
Chamadas estrangeiras exigem unsafe até ser envolvido por uma função segura auditada. ABI, efeitos, propriedade e disponibilidade da plataforma pertencem ao wrapper e .sdi contrato.
Valores de função, fechamentos e tarefas
Valores de função e chamadas indiretas preservam parameter/return propriedade, efeitos e linear T contratos. Um fechamento usa |parameters| body ou || body; contextual fn(...) -> T tipos podem inferir seus tipos de parâmetros.
Os fechamentos simples são livres de alocação e sem escape. Suas capturas são copiadas ou movidas por capacidade, permanecem imutáveis e são limpas exatamente uma vez. Use box |parameters| body para um retorno de chamada retido de escape; construção retorna Result<box fn(...) -> T, alloc_error>. Os retornos de chamada em caixa são somente para movimentação, não podem ser clonados, não podem ser enviados e não podem escapar de uma região ativa.
Os valores iniciais que podem ser chamados são transportados code/environment descritores. C/platform ponteiros de função permanecem finos e aceitam apenas funções nomeadas. Fechamentos recursivos e captura por referência não são suportados.
spawn { ... } descreve um void corpo da tarefa; manusear option/result falhas dentro dele porque ? não pode cruzar o limite da tarefa.