{- 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 -> n
  | \ 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)

{- The := operator sets the value on the left to be
syll = vowel | consonant vowel | vowel "'" | consonant vowel "'"
word = syll syll (rep.6.syll)


{- Fixing a value -}

{- Identifiers prefixed by 'fixed' stay the same: -}

n = 1 | 2
fixed m = 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"
pronoun.Female = "she"
pronoun.NB     = "they"

person.Male   = "man"
person.Female = "woman"
person.NB     = "person"

fixed gender = Male | Female | NB
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}."
