Funzioni

<!-- 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
}

I parametri vengono digitati. Il risultato è un'espressione finale; il reso anticipato utilizza 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 UpperCamelCase. 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.