Slide 8 of 74

Operators

Arithmetic and comparison
proc main(): void {
	echo 7 + 3 * 2        // 13 — * binds tighter than +
	echo 7 / 2            // 3 — Int division truncates
	echo 7 % 2            // 1 — the remainder
	echo 2 ** 3 ** 2      // 512 — ** groups from the right
	echo -2 ** 2          // -4 — ** binds tighter than unary minus

	echo 3 < 4            // ordering: Int, Float and Str
	echo "bee" == "bee"   // structural equality
	echo [1, 2] != [2, 1]
}
Text and vectors join with the same +
proc main(): void {
	echo "hive" + " " + "tour"   // Str: joined
	echo [1, 2] + [3]             // vectors: a new one, the lengths added
}
Logic, and negation
proc main(): void {
	ready := true
	warm := false

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

	// Tighter than every comparison, so both of these need their parentheses.
	echo !(ready && warm)
	echo !(1 == 2)
}
Stepping a variable
proc main(): void {
	mut n := 10
	n += 5
	n -= 3
	n *= 2
	n /= 4
	n++
	n--
	echo n          // 6

	mut greeting := "hello"
	greeting += ", bee"
	echo greeting
}

Each operator is defined on particular types, and using it on anything else is a compile error:

  • + adds two numbers, joins two Strs, and joins two vectors into a new one whose length is the two added.
  • - * / % ** are arithmetic, on Int or Float.
  • == and != compare two values of one type structurally — element by element down a vector, field by field through a declared type. Two function values cannot be compared, and two different types are an error rather than a silent false.
  • < > <= >= order an Int, a Float or a Str, and nothing else.
  • && and || take Bools and short-circuit. There is no truthiness: an Int, a Str, an Atom or a vector is not a condition.
  • Unary - negates a number; unary ! inverts a Bool.

From loosest to tightest: ||, &&, then is and bounds, then the comparisons, + -, * / %, the pipe |, unary - and !, and tightest **. So !found && ready is (!found) && ready, -2 ** 2 is -(2 ** 2), and ** groups from the right: 2 ** 3 ** 2 is 2 ** 9. Comparisons do not chain — 1 < x < 3 is a compile error — and ! may not be applied to an expression containing an is, since what a match binds could never be set; write the else instead.

A mut variable steps with += -= *= /=, each shorthand for x = x <op> …, and an Int with ++ and --. += joins a Str too. None of these ever converts a number behind your back: hive.math.max(0, health) with an Int health is a compile error rather than a surprise.