Skip to content

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 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.