+which hold the values, and types which classify the values stored and
+manipulatd by executables.
+
+### Types
+
+Values come in a wide range of types, with more likely to be added.
+Each type needs to be able to parse and print its own values (for
+convenience at least) as well as to compare two values, at least for
+equality and possibly for order. For now, values might need to be
+duplicated and freed, though eventually such manipulations will be
+better integrated into the language.
+
+Rather than requiring every numeric type to support all numeric
+operations (add, multiple, etc), we allow types to be able to present
+as one of a few standard types: integer, float, and fraction. The
+existance of these conversion functions enable types to determine if
+they are compatible with other types.
+
+###### ast
+
+ struct type {
+ char *name;
+ struct value (*init)(struct type *type);
+ struct value (*parse)(struct type *type, char *str);
+ void (*print)(struct value val);
+ int (*cmp_order)(struct value v1, struct value v2);
+ int (*cmp_eq)(struct value v1, struct value v2);
+ struct value (*dup)(struct value val);
+ void (*free)(struct value val);
+ struct type *(*compat)(struct type *this, struct type *other);
+ long long (*to_int)(struct value *v);
+ double (*to_float)(struct value *v);
+ int (*to_mpq)(mpq_t *q, struct value *v);
+ ## type fields
+ };