Index: doc/theses/aaron_moss_PhD/phd/code/bespoke-generic.c
===================================================================
--- doc/theses/aaron_moss_PhD/phd/code/bespoke-generic.c	(revision 4075228f1dad43acaa6f29142f46e66e9920b4f1)
+++ doc/theses/aaron_moss_PhD/phd/code/bespoke-generic.c	(revision 48b7085ecdfefbf973599bc2ab3d2c330090c910)
@@ -34,4 +34,4 @@
 	struct string_list* sl = NULL;
 	string_list_insert( &sl, "hello" );
-	printf("%s\n", string_list_head(sl) );
+	printf("%s\n", string_list_head(sl));
 }
Index: doc/theses/aaron_moss_PhD/phd/code/cfa-generic.cfa
===================================================================
--- doc/theses/aaron_moss_PhD/phd/code/cfa-generic.cfa	(revision 48b7085ecdfefbf973599bc2ab3d2c330090c910)
+++ doc/theses/aaron_moss_PhD/phd/code/cfa-generic.cfa	(revision 48b7085ecdfefbf973599bc2ab3d2c330090c910)
@@ -0,0 +1,27 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+forall(otype T) struct list { T value; list(T)* next; };
+
+// single polymorphic implementation of each function
+// overloading reduces need for namespace prefixes
+
+forall(otype T) void insert( list(T)** ls, T x ) {
+	list(T)* node = alloc();  // type-inferring alloc
+	(*node){ x, *ls };  // concise constructor syntax
+	*ls = node;
+}
+
+forall(otype T) T head( const list(T)* ls ) { return ls->value; }
+
+// use is clear and efficient
+
+int main() {
+	list(int)* il = 0;
+	insert( &il, 42 );  // inferred polymorphic T
+	printf("%d\n", head(il));
+	
+	list(const char*)* sl = 0;
+	insert( &sl, "hello" );
+	printf("%s\n", head(sl));
+}
Index: doc/theses/aaron_moss_PhD/phd/code/macro-generic.c
===================================================================
--- doc/theses/aaron_moss_PhD/phd/code/macro-generic.c	(revision 4075228f1dad43acaa6f29142f46e66e9920b4f1)
+++ doc/theses/aaron_moss_PhD/phd/code/macro-generic.c	(revision 48b7085ecdfefbf973599bc2ab3d2c330090c910)
@@ -33,4 +33,4 @@
 	struct list(string)* sl = NULL;
 	list_insert(string)( &sl, "hello" );
-	printf("%s\n", list_head(string)(sl) );
+	printf("%s\n", list_head(string)(sl));
 }
Index: doc/theses/aaron_moss_PhD/phd/code/void-generic.c
===================================================================
--- doc/theses/aaron_moss_PhD/phd/code/void-generic.c	(revision 4075228f1dad43acaa6f29142f46e66e9920b4f1)
+++ doc/theses/aaron_moss_PhD/phd/code/void-generic.c	(revision 48b7085ecdfefbf973599bc2ab3d2c330090c910)
@@ -35,4 +35,4 @@
 	struct list* sl = NULL;
 	list_insert( &sl, "hello", string_copy );
-	printf("%s\n", (char*)list_head(sl) );
+	printf("%s\n", (char*)list_head(sl));
 }
