    (** Some example programs in the Matzo language
     *
     * It is important to note that, in the Matzo language, the value of a
     * variable is generally not a single value, but one of a set of values.
     * Every time a variable is used, an element is drawn from this set;
     * so the following program can print 1, 2, 3, 10, 20, or 30. *)

    x := 1 | 2 | 3;
    f := { n => x }
       | { n => n * 10 };
    puts f(x);

    (** The Aquan language program *)

    (* The ::= operator is for the common case that we want to select from a
     * whole bunch of literal characters or words. It is referred to as the
     * 'literal assignment operator'. *)
    vowel ::= a e i o u;
    consonant ::= p t k w h m n l;

    (* Normally, each alternative has equal weight, but explicit weights can be
     * given; weights which are not given are considered to be 1. *)
    syll := 4: vowel | 4: consonant vowel
          | vowel "'" | consonant vowel "'";

    (* The `n @ value` syntax represents 1 to n possible repetitions of value.
     * e.g. 3 @ ("a" | "b") is the same as
     * ( ("a" | "b")
     * | ("a" | "b") ("a" | "b")
     * | ("a" | "b") ("a" | "b") ("a" | "b") )
     * and is given special syntax because it is a common case in word generation.
     * Below, it means that every word will have at least three and at most eight
     * syllables. *)
    word := syll syll (6 @ syll);
    puts word;

    (** Fixing a value *)

    (* The built-in pseudo-function `choose` allows you to force a value
     * to stay the same. *)

    n := 1 | 2;
    m := choose(n);
    (* The following could print either "1,2", "2,1" "1,1" or "2,2" *)
    puts "{n},{n}"
    (* The following can only print "1,1" or "2,2" *)
    puts "{m},{m}"

    (** A random person description *)

    (* Identifiers that begin with capitals are symbols. Symbols can be
     * compared and matched against. It is not allowed to use an identifier
     * that begins with a capital as a variable. *)

    pronoun :=
      { Male => "he"
      | Female => "she"
      };
    person :=
      { Male => "man"
      | Female => "woman"
      };

    gender := choose(Male | Female);
    hair ::= long short;
    hair_color ::= brown black blonde red white;
    eye_color ::= blue black brown green;
    mood ::= happy sad angry;

    puts "This {person(gender)} has {hair}, {hair_color} hair and "
         "{eye_color} eyes; {pronoun(gender)} appears to be "
         "quite {mood}.";