Slide 13 de 74

Funções

Declarando e chamando
proc main(): void {
	echo grade(7)
	echo factorial(5)
}

func grade(frames: Int): Str {
	if frames > 10 {
		return "forte"
	} else if frames > 3 {
		return "crescendo"
	}
	return "fraca"   // sem isto, um caminho terminaria sem nada para responder
}

func factorial(n: Int): Int {
	if n <= 1 {
		return 1
	}
	return n * factorial(n - 1)
}
O que encerra um caminho
func sign(n: Int): Int {
	if n > 0 {
		return 1
	} else if n < 0 {
		return -1
	}
	// assert n == 0     // não serviria: um assert que vale segue adiante
	return 0
}

func settings(path: Str): Str {
	if path != "" {
		return path
	}
	echo "nenhum arquivo de configuração informado"
	hive.term.exit(2)    // encerra o programa, então encerra este caminho também
}

proc main(): void {
	echo sign(-4)
	echo settings("hive.toml")
}

Um chamável é declarado com func ou proc, um nome, seus parâmetros como nome: Tipo, e o tipo com que ele responde — void quando não responde com nada, já que o tipo de retorno é sempre escrito. Eles podem ser declarados em qualquer lugar do arquivo, em qualquer ordem, e podem chamar a si mesmos. Um parâmetro é imutável dentro do corpo, e uma chamada espera o chamado terminar.

As duas palavras-chave diferem em uma coisa só, que é o que um chamável pode escrever que o chamador consegue ver; o slide sobre func e proc trata disso. Até lá, escreva func, e proc para o main.

Um chamável que responde com um valor precisa encerrar todo caminho pelo seu corpo. Um caminho termina com return, com panic, com uma chamada a hive.term.exit — que encerra o programa inteiro — ou com um if/else cujos ramos todos terminam. Um assert não termina um caminho: uma asserção que vale segue adiante, então uma função que acaba em assert ainda tem um caminho que não retorna nada, e é recusada.