Slide 17 de 74

Funções nativas

Medindo, crescendo e encolhendo
proc main(): void {
	echo len(["pear", "apple", "kiwi"])   // 3
	echo bytes("café")                     // 5

	mut Str[dyn] basket = ["pear"]
	append(basket, "apple")
	prepend(value: "kiwi", vector: basket) // nomeados, em qualquer ordem
	echo basket

	// os dois limites de drop são provados como um índice, que é o próximo slide:
	// aqui a guarda é que basket tem um primeiro elemento.
	if basket bounds 0 {
		echo drop(basket, 0, 0)            // ["kiwi"]
	}
	echo basket                            // ["pear", "apple"]
}
Juntando, dividindo, encontrando e reescrevendo
proc main(): void {
	fruit := ["pear", "apple", "kiwi"]
	line := join(fruit, ", ")
	echo split(line, ", ")

	if indexOf(fruit, "apple") is Result.Ok(i) {
		echo fruit[i]          // uma posição Ok não precisa de guarda
	}

	caminho := "a/b/c"
	echo replaceFirst(caminho, "/", " > ")   // a > b/c
	echo replaceAll(caminho, "/", " > ")     // a > b > c
	echo caminho                             // a/b/c — uma Str é um valor
}
Uma declaração sua vence
// A nossa. Seus próprios parâmetros, sua própria aridade, e é o que toda
// chamada solta a len neste arquivo significa daqui em diante.
func len(label: Str, extra: Int): Str {
	return "{label}{extra}"
}

proc main(): void {
	Str[dyn] v = ["a", "b"]

	echo len("x", 2)          // a nossa: x2
	echo hive.len(v)          // a nativa, pelo nome longo: 2
	echo hive.join(v, "-")    // o nome longo funciona tendo sombreado ou não
}

Estas estão sempre no escopo, sem import:

  • len conta os elementos de um vetor, os caracteres de uma Str ou os pares de um mapa; bytes conta o armazenamento de um vetor ou o UTF-8 de uma Str.
  • append e prepend fazem crescer um vetor mut [dyn] em uma das pontas; drop(v, low, high) remove um intervalo, as duas pontas inclusivas, e devolve o que removeu.
  • join(vector, sep) junta um vetor de Str com um separador; split(str, sep) é o inverso, e split(s, "") são todos os caracteres.
  • replaceFirst e replaceAll reescrevem uma ocorrência ou todas, respondendo com uma string nova.
  • indexOf encontra o primeiro elemento igual — ou, em uma Str, a primeira ocorrência, contada em caracteres — como um Result, cuja posição Ok é sempre segura para indexar.
  • map, filter, filterMap e sort percorrem um vetor, no próximo slide; row, column e toTable são para tabelas, e spawn, at e kill para serviços, e hide, bypass e reveal para segredos, cada um no seu slide.

Uma função nativa só pode ser chamada: várias são sobrecarregadas, então um len solto ou um join(_, ",") parcial não é um valor — embrulhe-a em um func seu. Os argumentos dela podem ser nomeados como os de qualquer chamada, com os nomes acima — join(sep: ", ", vector: fruit) — e uma posição sobrecarregada atende a cada um dos seus nomes, então len(str: s) e len(vector: v) são ambos len.

Uma declaração sua — um func, proc, query ou type com um desses nomes — vence em toda chamada sem qualificação, e a função nativa continua acessível como hive.<nome>.