Funções

fn add(left: i64, right: i64) -> i64 {
    left + right
}

fn absolute(value: i64) -> i64 {
    if value < 0 { ret -value }
    value
}

Os parâmetros são digitados. Uma expressão final é o resultado; retorno antecipado usa ret, não 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 letras minúsculas. 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.