# Booleans

In Toit, the boolean type is `bool` and its two values are written `true` and `false`.

Whenever built-in constructs need to evaluate a condition (for example in an `if` or a `while`), then Toit first "boolifies" the given value. The values `false` and `null` are treated like `false` and every other value is converted to `true`. So in a condition context, `null` is falsy and other non-booleans are truthy.

```main:
t := true
if t:
print "This is printed because t boolifies to true."
f := false
if f:
// 'f' boolifies to false.
unreachable
n := null
if n:
// null in a condition boolifies to false.
unreachable
str := ""
if str:
// Strings, like every non-false non-null, object
// boolify to true.
print "This branch is executed."
z := 0
if z:
// As before: 0, neither being false, nor being null, is
// boolified to true.
print "This branch is executed"
list := []
if list:
print "This branch is reached"

// Boolification only occurs in `if`, `for`, and `while`
// conditions, and the first operand of the ternary `?:`
// operator:
b1 /bool := null // Error: null is not a bool!
b2 /bool := s    // Error: A string is not a bool!
b3 /bool := z    // Error: A number is not a bool!
b4 /bool := list // Error: A list is not a bool!
print (list ? "foo" : "bar")  // Prints "foo", because lists are truthy.
print (null ? "foo" : "bar")  // Prints "bar", because null is falsy.
print (0 ? "foo" : "bar")     // Prints "foo", because zero is truthy.```