Slide 8 de 74

Operadores

Aritmética e comparação
proc main(): void {
	echo 7 + 3 * 2        // 13 — * liga mais forte que +
	echo 7 / 2            // 3 — divisão de Int trunca
	echo 7 % 2            // 1 — o resto
	echo 2 ** 3 ** 2      // 512 — ** agrupa pela direita
	echo -2 ** 2          // -4 — ** liga mais forte que o menos unário

	echo 3 < 4            // ordenação: Int, Float e Str
	echo "bee" == "bee"   // igualdade estrutural
	echo [1, 2] != [2, 1]
}
Texto e vetores se juntam com o mesmo +
proc main(): void {
	echo "hive" + " " + "tour"   // Str: juntadas
	echo [1, 2] + [3]             // vetores: um novo, os tamanhos somados
}
Lógica, e negação
proc main(): void {
	ready := true
	warm := false

	echo ready && warm
	echo ready || warm
	echo !warm

	// Mais forte que qualquer comparação, então estes dois precisam dos parênteses.
	echo !(ready && warm)
	echo !(1 == 2)
}
Avançando uma variável
proc main(): void {
	mut n := 10
	n += 5
	n -= 3
	n *= 2
	n /= 4
	n++
	n--
	echo n          // 6

	mut greeting := "olá"
	greeting += ", bee"
	echo greeting
}

Cada operador é definido para certos tipos, e usá-lo em qualquer outra coisa é um erro de compilação:

  • + soma dois números, junta duas Strs, e junta dois vetores em um novo cujo tamanho é a soma dos dois.
  • - * / % ** são aritmética, sobre Int ou Float.
  • == e != comparam dois valores de um mesmo tipo estruturalmente — elemento por elemento ao longo de um vetor, campo por campo através de um tipo declarado. Dois valores de função não podem ser comparados, e dois tipos diferentes são um erro, não um false silencioso.
  • < > <= >= ordenam um Int, um Float ou uma Str, e nada mais.
  • && e || recebem Bools e fazem curto-circuito. Não existe truthiness: um Int, uma Str, um Atom ou um vetor não é uma condição.
  • O - unário nega um número; o ! unário inverte um Bool.

Do mais fraco ao mais forte: ||, &&, depois is e bounds, depois as comparações, + -, * / %, o pipe |, o - e o ! unários, e o mais forte, **. Então !found && ready é (!found) && ready, -2 ** 2 é -(2 ** 2), e ** agrupa pela direita: 2 ** 3 ** 2 é 2 ** 9. Comparações não se encadeiam — 1 < x < 3 é um erro de compilação — e ! não pode ser aplicado a uma expressão que contenha um is, já que o que um casamento vincula nunca poderia ser preenchido; escreva o else em vez disso.

Uma variável mut avança com += -= *= /=, cada um atalho para x = x <op> …, e um Int com ++ e --. += também junta uma Str. Nenhum deles converte um número pelas suas costas: hive.math.max(0, health) com um health Int é um erro de compilação em vez de uma surpresa.