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:
bash
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
xis an integer, we can writex->type == integer. - To find its value, we can write
x->value.integer. - To test if
xis a vector, we can writex->type == vector. - If we know
xis a vector, we can writex->value.vector.elts[0]to refer to its first element. - If we know
xis a pair, we can writex->value.pair.carto extract its car.