type Colony {
name: Str
apiary: Str
frames: Int
}
func banner(text: Str, width: Int, fill: Str): Str {
return fill + " " + text + " " + fill + " ({width})"
}
func noisy(label: Str): Str {
echo "calculando {label}"
return label
}
proc main(): void {
echo banner(width: 40, text: "Hive", fill: "~") // qualquer ordem, se todos nomeados
echo banner("Hive", fill: "~", width: 40) // o não nomeado preenche `text`
c := Colony(name: "north", apiary: "orchard", frames: 11)
echo c.frames
echo join(sep: noisy(" / "), vector: [noisy("a"), "b"]) // " / " é calculado primeiro
echo hive.math.clamp(high: 1.0, value: 3.0, low: 0.0) // 1
}Toda chamada aceita seus argumentos por nome: um func, um proc, uma query, o construtor de um tipo, uma função nativa e toda chamada hive.*. Um argumento nomeado pode aparecer em qualquer lugar da lista; só os não nomeados precisam estar em ordem, e eles preenchem os parâmetros que os nomes não reivindicaram. Um nome precisa existir e não pode se repetir — um escrito errado é recusado junto com os nomes que existem — e, uma vez que uma chamada nomeia algo, ela precisa cobrir a lista inteira de parâmetros, então nada pode ser lido como um valor padrão que sumiu sem avisar. Os argumentos são calculados na ordem em que são escritos, qualquer que seja a ordem dos parâmetros.
Os nomes de uma função nativa são os do slide dela, e os de uma chamada da biblioteca os da sua assinatura: join(sep: ", ", vector: names), hive.math.clamp(value: x, low: 0.0, high: 1.0). Um valor de função é a única chamada sem nada para nomear — o tipo dele lista o que ele recebe, não como cada coisa se chama.
O tour que você está lendo é escrito assim: cada slide é um Slide(title: …, titlePt: …, explanation: …) em vez de uma fileira de strings cujo significado depende de contá-las.