Funciones

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

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

Se escriben los parámetros. Una expresión final es el resultado; La devolución anticipada utiliza ret, no return. Omitir -> significa void.

Métodos y destructores

struct counter { value: i64 }

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

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

self está implícito y no debe aparecer en la lista de parámetros. @borrow ofrece un préstamo de receptor léxico compartido. Un destructor consume a su propietario y se ejecuta exactamente una vez en la limpieza estructurada, a menos que el valor se haya movido o eliminado manualmente.

Genéricos y rasgos

trait identity {
    fn id() -> i64
}

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

Los parámetros genéricos y los nombres trait/type utilizan minúsculas tipo serpiente. Se verifica que las implementaciones estén completas, coincidan con las firmas, sean coherentes y tengan reglas huérfanas. El envío está monomorfizado estáticamente sin vtables ni asignaciones ocultas.

Funciones extranjeras

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

Las llamadas al extranjero requieren unsafe hasta que esté envuelto por una función segura auditada. ABI, los efectos, la propiedad y la disponibilidad de la plataforma pertenecen al contenedor y .sdi contrato.

Valores de funciones, cierres y tareas.

Los valores de función y las llamadas indirectas se conservan. parameter/return propiedad, efectos y linear t contratos. Un cierre utiliza |parameters| body o || body; contextual fn(...) -> t Los tipos pueden inferir sus tipos de parámetros.

Los cierres simples no tienen asignación ni escape. Sus capturas se copian o se mueven según su capacidad, permanecen inmutables y se limpian exactamente una vez. Utilice box |parameters| body para una devolución de llamada retenida de escape; devoluciones de construcción result<box fn(...) -> t, alloc_error>. Las devoluciones de llamada en caja son de solo movimiento, no se pueden clonar, no se pueden enviar y no pueden escapar de una región activa.

Los valores exigibles de semillas llevan code/environment descriptores. C/platform Los punteros de función permanecen delgados y solo aceptan funciones con nombre. No se admiten cierres recursivos ni captura por referencia.

spawn { ... } describe un void cuerpo de tareas; manejar option/result fallos en su interior porque ? no puede cruzar el límite de la tarea.