Funzioni

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

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

I parametri vengono digitati. Il risultato è un'espressione finale; la restituzione anticipata utilizza ret, non return. Omettere -> significa void.

Metodi e distruttori

struct counter { value: i64 }

@borrow
fn counter.current() -> i64 {
    self.value
}

fn counter.drop() {
    // consuming implicit self
}

self è implicito e non deve comparire nell'elenco dei parametri. @borrow offre un prestito per ricevitore lessicale condiviso. Un distruttore consuma il suo proprietario ed viene eseguito esattamente una volta durante la pulizia strutturata, a meno che il valore non sia stato spostato o eliminato manualmente.

Generi e tratti

trait identity {
    fn id() -> i64
}

fn identify<t: identity>(value: t) -> i64 {
    value.id()
}

I parametri generici e i nomi trait/type utilizzano maiuscole e minuscole. Le implementazioni vengono controllate per completezza, corrispondenza della firma, coerenza e regole orfane. Il dispatch è staticamente monomorfizzato senza vtables o allocazione nascosta.

Funzioni straniere

extern "c" fn platform_call(value: i64) -> i64 link_name "platform_call";

Le chiamate straniere richiedono unsafe finché non viene avvolto da una funzione sicura controllata. ABI, gli effetti, la proprietà e la disponibilità della piattaforma appartengono al wrapper e .sdi contratto.

Valori delle funzioni, chiusure e attività

I valori delle funzioni e le chiamate indirette vengono preservati parameter/return proprietà, effetti e linear t contratti. Una chiusura utilizza |parameters| body o || body; contestuale fn(...) -> t i tipi possono dedurre i tipi di parametri.

Le chiusure semplici sono esenti da allocazione e senza fuga. Le loro acquisizioni copiano o si spostano in base alla capacità, rimangono immutabili e vengono pulite esattamente una volta. Utilizzare box |parameters| body per una richiamata conservata in uscita; resi di costruzione result<box fn(...) -> t, alloc_error>. I callback boxed sono di solo spostamento, non clonabili, non inviabili e non possono sfuggire a una regione attiva.

I valori richiamabili del seme portano code/environment descrittori. C/platform i puntatori a funzione rimangono sottili e accettano solo funzioni con nome. Le chiusure ricorsive e l'acquisizione per riferimento non sono supportate.

spawn { ... } delinea a void corpo del compito; maniglia option/result fallimenti al suo interno perché ? non può oltrepassare il confine del compito.