#### 9.2.1 A Simple Representation

The simplest way to represent Scheme values in C would be to represent
each value as a pointer to a structure containing a type indicator,
followed by a union carrying the real value. Assuming that `SCM`

is
the name of our universal type, we can write:

enum type { integer, pair, string, vector, ... };
typedef struct value *SCM;
struct value {
enum type type;
union {
int integer;
struct { SCM car, cdr; } pair;
struct { int length; char *elts; } string;
struct { int length; SCM *elts; } vector;
...
} value;
};

with the ellipses replaced with code for the remaining Scheme types.

This representation is sufficient to implement all of Scheme’s
semantics. If `x` is an `SCM`

value:

- To test if
`x` is an integer, we can write `x`->type == integer

.
- To find its value, we can write
`x`->value.integer

.
- To test if
`x` is a vector, we can write `x`->type == vector

.
- If we know
`x` is a vector, we can write
`x`->value.vector.elts[0]

to refer to its first element.
- If we know
`x` is a pair, we can write
`x`->value.pair.car

to extract its car.