Next: Faster Integers, Up: Data Representation in Scheme
The simplest way to meet the above requirements 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:
->type == integer
.
->value.integer
.
->type == vector
.
->value.vector.elts[0]
to refer to its first element.
->value.pair.car
to extract its car.