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)
}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.