Index: doc/theses/jiada_liang_MMath/test.ml
===================================================================
--- doc/theses/jiada_liang_MMath/test.ml	(revision 41f4e2d6244cadb06a6ec8623208e8b2c9740652)
+++ doc/theses/jiada_liang_MMath/test.ml	(revision f3b67b61c77cdbc02930ce3fa8b8ccb9124f9ec5)
@@ -1,45 +1,63 @@
-type s = { i :  int; }
-type fred = I of int | D of float | S of s
-type mary = I of int | D of int | S of int
-type weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun
-let day : weekday = Mon
-let take_class( d : weekday ) =
-	if d <= Fri then				(* Gregor *)
-		Printf.printf "weekday\n"
-	else if d >= Sat then			(* Gregor *)
-		Printf.printf "weekend\n";
+open Printf
+
+type s = { i : int; j : int }
+let sv : s = { i = 3; j = 5 }
+type adt =
+	I of int |
+	F of float |
+	S of s
+let adtprt( adtv : adt ) =
+	match adtv with (* pattern matching *)
+		I i -> printf "%d\n" i |
+		F f -> printf "%g\n" f |
+		S sv -> printf "%d %d\n" sv.i sv.j
+
+let silly( adtv : adt ) =
+	if adtv <= F(3.5) then
+		printf "<= F\n"
+	else if adtv >= S(sv) then
+		printf ">= S\n"
+
+let adtv : adt = I(3) let _ = adtprt( adtv ); silly( adtv )
+let adtv : adt = F(3.5) let _ = adtprt( adtv ); silly( adtv )
+let adtv : adt = S(sv) let _ = adtprt( adtv ); silly( adtv )
+
+type week = Mon | Tue | Wed | Thu | Fri | Sat | Sun [@@deriving enumerate]
+let _ = List.iter ( fun e -> printf "%d" (to_val e) ) all_of_week
+
+let day : week = Mon
+
+let take_class( d : week ) =
+	if d <= Fri then
+		printf "weekday\n"
+	else if d >= Sat then
+		printf "weekend\n";
 	match d with
-		Mon | Wed -> Printf.printf "CS442\n" |
-		Tue | Thu -> Printf.printf "CS343\n" |
-		Fri -> Printf.printf "Tutorial\n" |
-		_ -> Printf.printf "Take a break\n"
+		Mon | Wed -> printf "CS442\n" |
+		Tue | Thu -> printf "CS343\n" |
+		Fri -> printf "Tutorial\n" |
+		_ -> printf "Take a break\n"
 
 let _ = take_class( Mon ); take_class( Sat );
 
-type colour = Red | Green of string | Blue of int * float
-let c = Red
-let _ = match c with Red -> Printf.printf "Red, "
-let c = Green( "abc" )
-let _ = match c with Green g -> Printf.printf "%s, " g
-let c = Blue( 1, 1.5 )
-let _ = match c with Blue( i, f ) -> Printf.printf "%d %g\n" i f
+type weekday = Mon | Tue | Wed | Thu | Fri
+type weekend = Sat | Sun of float
+type week = Weekday of weekday | Weekend of weekend
+let day : week = Weekend (Sun 3.5)
 
-let check_colour(c: colour): string =
-	if c < Green( "xyz" ) then		(* Gregor *)
-		Printf.printf "green\n";
-	match c with
-		Red -> "Red" |
-		Green g -> g |
-		Blue(i, f) -> string_of_int i ^ string_of_float f
-let _ = check_colour( Red ); check_colour( Green( "xyz" ) );
-
-type stringList = Empty | Pair of string * stringList
-let rec len_of_string_list(l: stringList): int =
-	match l with
-		Empty -> 0 |
-		Pair(_ , r) -> 1 + len_of_string_list r
+let take_class( d : week ) =
+	if d <= Weekday Fri then
+		printf "weekday\n"
+	else if d >= Weekend Sat then
+		printf "weekend\n";
+	match d with
+		Weekday Mon | Weekday Wed -> printf "CS442\n" |
+		Weekday Tue | Weekday Thu -> printf "CS343\n" |
+		Weekday Fri -> printf "Tutorial\n" |
+		_ -> printf "Take a break\n"
+let _ = take_class( day )
 
 let _ = for i = 1 to 10 do
-	Printf.printf "%d, " i
+	printf "%d, " i
 done
 
Index: doc/theses/jiada_liang_MMath/test.pas
===================================================================
--- doc/theses/jiada_liang_MMath/test.pas	(revision f3b67b61c77cdbc02930ce3fa8b8ccb9124f9ec5)
+++ doc/theses/jiada_liang_MMath/test.pas	(revision f3b67b61c77cdbc02930ce3fa8b8ccb9124f9ec5)
@@ -0,0 +1,54 @@
+program test(Output);
+const Three = 2 + 1;   NULL = NIL;   PI = 3.14159;   Plus = '+';   Fred = 'Fred';
+type Week = ( Mon, Tue, Wed, Thu, Fri, Sat, Sun );
+	Weekday = Mon..Fri;
+	Weekend = Sat..Sun;
+type Count = ( Zero, One, Two, Ten = 10, Eleven );
+var day	  : Week;
+	wday  : Weekday;
+	wend  : Weekend;
+	lunch : array[Week] of Integer;
+	cnt	  :  Count;
+begin
+	day := Sat;
+	wday := day; // invalid but allowed
+	wend := day; // valid
+	day := Mon;
+	wday := day; // valid
+	wend := day; // invalid but allowed
+	day := wday; // valid
+	day := wend; // valid
+	if day = wday then
+		Writeln( day );
+	if day <= Fri then
+		Writeln( 'weekday');
+	case day of
+	  Mon..Fri :
+		Writeln( 'weekday');
+	  Sat..Sun :
+		Writeln( 'weekend')
+	end;
+	day := Mon;
+	while day <= Sat do begin
+		Write( day, ' ' );
+		day := succ( day );
+	end;
+	Writeln();
+	for day := Mon to Sat do begin
+		Write( day, ' ' );
+	end;
+	Writeln();
+	for day := Mon to Sat do
+		Write( lunch[day], ' ' );
+	Writeln();
+	for cnt := Zero to Eleven do begin
+		Write( ord( cnt ), ' ' );
+	end;
+	Writeln();
+end.
+
+{ Local Variables: }
+{ tab-width: 4 }
+{ pascal-indent-level: 4 }
+{ compile-command: "fpc test.pas" }
+{ End: }
Index: doc/theses/jiada_liang_MMath/test2.cfa
===================================================================
--- doc/theses/jiada_liang_MMath/test2.cfa	(revision 41f4e2d6244cadb06a6ec8623208e8b2c9740652)
+++ doc/theses/jiada_liang_MMath/test2.cfa	(revision f3b67b61c77cdbc02930ce3fa8b8ccb9124f9ec5)
@@ -1,13 +1,14 @@
 #include <fstream.hfa>
 #include <stdlib.hfa>
+#include <enum.hfa>
 
 struct MR { double mass, radius; };
 
-enum( MR ) Planet {
+enum( MR ) Planet {										// typed enumeration
 	//          mass (kg)  radius (km)
 	MERCURY = { 0.330_E24, 2.4397_E6 },
 	VENUS   = { 4.869_E24, 6.0518_E6 },
 	EARTH   = { 5.976_E24, 6.3781_E6 },
-	MOON    = { 7.346_E22, 1.7380_E6 }, // not a planet
+	MOON    = { 7.346_E22, 1.7380_E6 },					// not a planet
 	MARS    = { 0.642_E24, 3.3972_E6 },
 	JUPITER = { 1898._E24, 71.492_E6 },
@@ -15,10 +16,11 @@
 	URANUS  = { 86.86_E24, 25.559_E6 },
 	NEPTUNE = { 102.4_E24, 24.746_E6 },
+	PLUTO   = { 1.303_E22, 1.1880_E6 },					// not a planet
 };
 
-enum( double ) { G = 6.6743_E-11 }; // universal gravitational constant (m3 kg-1 s-2)
+enum( double ) { G = 6.6743_E-11 };						// universal gravitational constant (m3 kg-1 s-2)
 
 static double surfaceGravity( Planet p ) with( p ) {
-	return G * mass / ( radius \ 2 ); // exponentiation
+	return G * mass / ( radius \ 2 );					// no qualification, exponentiation
 }
 static double surfaceWeight( Planet p, double otherMass ) {
@@ -27,25 +29,22 @@
 
 int main( int argc, char * argv[] ) {
-	if ( argc != 2 ) exit | "Usage: " | argv[0] | "earth-weight";
+	if ( argc != 2 ) exit | "Usage: " | argv[0] | "earth-weight"; // terminate program
 
 	double earthWeight = convert( argv[1] );
 	double earthMass = earthWeight / surfaceGravity( EARTH );
 
-	Planet p = fromInt( prng( SizeE(Planet) ) ); // select a random orbiting body
-//	Planet p = fromInt( prng( 9 ) ); // select a random orbiting body
-	choose( p ) {
+	Planet rp = fromInt( prng( countof( Planet ) ) );	// select random orbiting body
+	choose( rp ) {										// implicit breaks
 	  case MERCURY, VENUS, EARTH, MARS:
-		sout | labelE( p ) | "is a rocky planet";
+		sout | label( rp ) | "is a rocky planet";
 	  case JUPITER, SATURN, URANUS, NEPTUNE:
-		sout | labelE( p ) | "is a gas-giant planet";
+		sout | label( rp ) | "is a gas-giant planet";
 	  default:
-		sout | labelE( p ) | "is not a planet";
+		sout | label( rp ) | "is not a planet";
 	}
 
-//	for ( Planet p = MERCURY; posE(p) <= posE(NEPTUNE); p = succ( p ) ) {
-	for ( p; enum Planet ) {
-		sout | "Your weight on" | (p == MOON ? "the" : "") | labelE(p)
-//		sout | "Your weight on" | labelE(p)
-			 | "is" | wd( 1,1, surfaceWeight( p, earthMass ) ) | "kg";
+	for ( p; Planet ) {									// enumerate
+		sout | "Your weight on" | ( p == MOON ? "the" : " " ) | label( p )
+			 | "is" | wd( 1,1,  surfaceWeight( p, earthMass ) ) | "kg";
 	}
 }
