Node:Booleans, Next:, Up:Simple Data Types

### 21.1 Booleans

The two boolean values are `#t` for true and `#f` for false.

Boolean values are returned by predicate procedures, such as the general equality predicates `eq?`, `eqv?` and `equal?` (see Equality) and numerical and string comparison operators like `string=?` (see String Comparison) and `<=` (see Comparison).

```(<= 3 8)
=>
#t

(<= 3 -3)
=>
#f

(equal? "house" "houses")
=>
#f

(eq? #f #f)
=>
#t
```

In test condition contexts like `if` and `cond` (see if cond case), where a group of subexpressions will be evaluated only if a condition expression evaluates to "true", "true" means any value at all except `#f`.

```(if #t "yes" "no")
=>
"yes"

(if 0 "yes" "no")
=>
"yes"

(if #f "yes" "no")
=>
"no"
```

A result of this asymmetry is that typical Scheme source code more often uses `#f` explicitly than `#t`: `#f` is necessary to represent an `if` or `cond` false value, whereas `#t` is not necessary to represent an `if` or `cond` true value.

It is important to note that `#f` is not equivalent to any other Scheme value. In particular, `#f` is not the same as the number 0 (like in C and C++), and not the same as the "empty list" (like in some Lisp dialects).

The `not` procedure returns the boolean inverse of its argument:

 not x Scheme Procedure scm_not (x) C Function
 Return `#t` iff x is `#f`, else return `#f`.

The `boolean?` procedure is a predicate that returns `#t` if its argument is one of the boolean values, otherwise `#f`.

 boolean? obj Scheme Procedure scm_boolean_p (obj) C Function
 Return `#t` iff obj is either `#t` or `#f`.