Slide 18 de 37

Genéricos

func first(v: T[]): Result<T, Bool> {
	if len(v) > 0 {
		return Result.Ok(v[0])
	}
	return Result.Error(false)
}

proc main(): void {
	a := first([1, 2, 3])       // first_Int
	b := first(["x", "y"])      // first_Str, uma cópia separada
	echo "{a} {b}"
}
Um nome em uma assinatura que não é nem uma função nativa nem um tipo declarado é uma variável de tipo, e ela torna o chamável genérico. Uma variável é fixada por onde ela aparece nos parâmetros — inclusive dentro do próprio tipo de função de um parâmetro. Nada nisso é dinâmico em tempo de execução: todo local de chamada é resolvido em tempo de compilação, e uma cópia concreta é emitida para cada conjunto distinto de argumentos de tipo — first_Str, first_Int — sem boxing e sem despacho.