Slide 30 de 74

Argumentos nomeados

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.