Fonctions

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

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

Les paramètres sont saisis. Une expression finale est le résultat ; le retour anticipé utilise ret, et non return. Omettre -> signifie void.

Méthodes et destructeurs

struct counter { value: i64 }

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

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

self est implicite et ne doit pas apparaître dans la liste des paramètres. @borrow accorde un prêt de récepteur lexical partagé. Un destructeur consomme son propriétaire et s'exécute exactement une fois lors d'un nettoyage structuré, sauf si la valeur a été déplacée ou supprimée manuellement.

Génériques et traits

trait identity {
    fn id() -> i64
}

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

Les paramètres génériques et les noms trait/type utilisent la casse serpent inférieure. Les implémentations sont vérifiées pour leur exhaustivité, leur correspondance de signature, leur cohérence et leurs règles orphelines. Dispatch est statiquement monomorphisé sans tables virtuelles ni allocation cachée.

Fonctions étrangères

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

Les appels à l'étranger nécessitent unsafe jusqu'à ce qu'il soit enveloppé par une fonction sûre auditée. ABI, les effets, la propriété et la disponibilité de la plateforme appartiennent au wrapper et .sdi contrat.

Valeurs de fonction, fermetures et tâches

Les valeurs de fonction et les appels indirects sont préservés parameter/return propriété, effets et linear t contrats. Une fermeture utilise |parameters| body ou || body; contextuel fn(...) -> t les types peuvent déduire ses types de paramètres.

Les fermetures simples sont sans allocation et sans fuite. Leurs captures se copient ou se déplacent selon leurs capacités, restent immuables et nettoient exactement une fois. Utilisez box |parameters| body pour un rappel conservé d'échappement ; la construction renvoie result<box fn(...) -> t, alloc_error>. Les rappels encadrés sont uniquement de déplacement, non clonables, non envoyables et ne peuvent pas échapper à une région active.

Les valeurs de départ appelables sont transportées code/environment descripteurs. C/platform les pointeurs de fonction restent minces et acceptent uniquement les fonctions nommées. Les fermetures récursives et la capture par référence ne sont pas prises en charge.

spawn { ... } décrit un corps de tâche void ; gérer les échecs de option/result à l'intérieur car ? ne peut pas franchir la limite de la tâche.