Funciones
<!-- 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
}
Se escriben los parámetros. Una expresión final es el resultado; La devolución anticipada utiliza 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 UpperCamelCase. 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 siguen siendo 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.