# Boolean expressions

Quick examples:

``````if first.isJust then first else second

c && (!a || !b) == c && !(a && b)
``````

## Booleans and `if`

`true` and `false` (all lower case) are the values of type `Boolean`. `if` expressions have the following form:

```if expression then expression else expression
```

The condition must be of type `Boolean`. There is no implicit conversion to `Boolean` from, for example, `Integer`. The types of the `then` and `else` branches must be the same.

Every `if` must have an `else` branch, there is no `if-then`. The `else` branch will extend as far as possible.

Example: To clarify by what “as far as possible” means, the following code:

`````` if condition
then foo
else bar ++ if condition2
then foo2
else bar2 ++ more
``````

will parse as

`````` if (condition)
then (foo)
else (bar ++ if (condition2)
then (foo2)
else (bar2 ++ more))
``````

## Logical operators

The standard C-style boolean operators are present:

```expression && expression
expression || expression
!expression
```

These operators DO short-circuit evaluation.

Again, the operands must be of type `Boolean`, there are no implicit conversions. The not operator binds more tightly than the and operator, which binds more tightly than the or operator, as you would expect.

## Comparison operators

All comparison operators bind more tightly than logical operators and produce `Boolean` values.

The following comparison operators work on types `Integer`, `Float`, and `String`:

```expression < expression
expression <= expression
expression > expression
expression >= expression
expression == expression
expression != expression
```

String comparison is lexicographical, and does pay attention to case. Equality and inequality will also work with `Boolean`s, but the other comparison operators will not.