Index: doc/papers/general/Paper.tex
===================================================================
--- doc/papers/general/Paper.tex	(revision d52a55bf2a648f0a8e04111bde526f1d746496a1)
+++ doc/papers/general/Paper.tex	(revision 3d60c08ac51fee59e5e460399d8f60bfa15e20c6)
@@ -59,4 +59,7 @@
 %\DeclareTextCommandDefault{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}
 \renewcommand{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}
+
+\renewcommand*{\thefootnote}{\Alph{footnote}} % hack because fnsymbol does not work
+%\renewcommand*{\thefootnote}{\fnsymbol{footnote}}
 
 \makeatletter
@@ -174,4 +177,10 @@
 \lstMakeShortInline@%
 
+\let\OLDthebibliography\thebibliography
+\renewcommand\thebibliography[1]{
+  \OLDthebibliography{#1}
+  \setlength{\parskip}{0pt}
+  \setlength{\itemsep}{4pt plus 0.3ex}
+}
 
 \title{\texorpdfstring{\protect\CFA : Adding Modern Programming Language Features to C}{Cforall : Adding Modern Programming Language Features to C}}
@@ -191,6 +200,7 @@
 The C programming language is a foundational technology for modern computing with millions of lines of code implementing everything from commercial operating-systems to hobby projects.
 This installation base and the programmers producing it represent a massive software-engineering investment spanning decades and likely to continue for decades more.
-Nevertheless, C, first standardized over thirty years ago, lacks many features that make programming in more modern languages safer and more productive.
-The goal of the \CFA project is to create an extension of C that provides modern safety and productivity features while still ensuring strong backwards compatibility with C and its programmers.
+Nevertheless, C, first standardized almost forty years ago, lacks many features that make programming in more modern languages safer and more productive.
+
+The goal of the \CFA project (pronounced ``C-for-all'') is to create an extension of C that provides modern safety and productivity features while still ensuring strong backwards compatibility with C and its programmers.
 Prior projects have attempted similar goals but failed to honour C programming-style; for instance, adding object-oriented or functional programming with garbage collection is a non-starter for many C developers.
 Specifically, \CFA is designed to have an orthogonal feature-set based closely on the C programming paradigm, so that \CFA features can be added \emph{incrementally} to existing C code-bases, and C programmers can learn \CFA extensions on an as-needed basis, preserving investment in existing code and programmers.
@@ -226,5 +236,5 @@
 Love it or hate it, C is extremely popular, highly used, and one of the few systems languages.
 In many cases, \CC is often used solely as a better C.
-Nevertheless, C, first standardized over thirty years ago, lacks many features that make programming in more modern languages safer and more productive.
+Nevertheless, C, first standardized almost forty years ago~\cite{ANSI89:C}, lacks many features that make programming in more modern languages safer and more productive.
 
 \CFA (pronounced ``C-for-all'', and written \CFA or Cforall) is an evolutionary extension of the C programming language that adds modern language-features to C, while maintaining both source and runtime compatibility with C and a familiar programming model for programmers.
@@ -239,5 +249,5 @@
 All languages features discussed in this paper are working, except some advanced exception-handling features.
 Not discussed in this paper are the integrated concurrency-constructs and user-level threading-library~\cite{Delisle18}.
-\CFA is an \emph{open-source} project implemented as an source-to-source translator from \CFA to the gcc-dialect of C~\cite{GCCExtensions}, allowing it to leverage the portability and code optimizations provided by gcc, meeting goals (1)--(3).
+\CFA is an \emph{open-source} project implemented as a source-to-source translator from \CFA to the gcc-dialect of C~\cite{GCCExtensions}, allowing it to leverage the portability and code optimizations provided by gcc, meeting goals (1)--(3).
 Ultimately, a compiler is necessary for advanced features and optimal performance.
 % @plg2[9]% cd cfa-cc/src; cloc ArgTweak CodeGen CodeTools Common Concurrency ControlStruct Designators GenPoly InitTweak MakeLibCfa.cc MakeLibCfa.h Parser ResolvExpr SymTab SynTree Tuples driver prelude main.cc 
@@ -292,5 +302,5 @@
 The \CFA tests are 290+ files and 27,000+ lines of code.
 The tests illustrate syntactic and semantic features in \CFA, plus a growing number of runtime benchmarks.
-The tests check for correctness and are used for daily regression testing of commits (3800+).
+The tests check for correctness and are used for daily regression testing of 3800+ commits.
 
 Finally, it is impossible to describe a programming language without usages before definitions.
@@ -313,5 +323,5 @@
 There are only two hard things in Computer Science: cache invalidation and \emph{naming things} -- Phil Karlton
 \end{quote}
-\vspace{-10pt}
+\vspace{-9pt}
 C already has a limited form of ad-hoc polymorphism in the form of its basic arithmetic operators, which apply to a variety of different types using identical syntax. 
 \CFA extends the built-in operator overloading by allowing users to define overloads for any function, not just operators, and even any variable;
@@ -324,8 +334,8 @@
 int max( int a, int b ) { return a < b ? b : a; }  $\C{// (3)}$
 double max( double a, double b ) { return a < b ? b : a; }  $\C{// (4)}\CRT$
-max( 7, -max );						$\C[2.75in]{// uses (3) and (1), by matching int from constant 7}$
+max( 7, -max );						$\C{// uses (3) and (1), by matching int from constant 7}$
 max( max, 3.14 );					$\C{// uses (4) and (2), by matching double from constant 3.14}$
-max( max, -max );					$\C{// ERROR: ambiguous}$
-int m = max( max, -max );			$\C{// uses (3) and (1) twice, by matching return type}\CRT$
+max( max, -max );					$\C{// ERROR, ambiguous}$
+int m = max( max, -max );			$\C{// uses (3) and (1) twice, by matching return type}$
 \end{cfa}
 
@@ -336,10 +346,10 @@
 As is shown later, there are a number of situations where \CFA takes advantage of available type information to disambiguate, where other programming languages generate ambiguities.
 
-\Celeven added @_Generic@ expressions, which is used in preprocessor macros to provide a form of ad-hoc polymorphism;
+\Celeven added @_Generic@ expressions~\cite[\S~6.5.1.1]{C11}, which is used with preprocessor macros to provide ad-hoc polymorphism;
 however, this polymorphism is both functionally and ergonomically inferior to \CFA name overloading. 
 The macro wrapping the generic expression imposes some limitations;
 \eg, it cannot implement the example above, because the variables @max@ are ambiguous with the functions @max@. 
 Ergonomic limitations of @_Generic@ include the necessity to put a fixed list of supported types in a single place and manually dispatch to appropriate overloads, as well as possible namespace pollution from the dispatch functions, which must all have distinct names.
-For backwards compatibility, \CFA supports @_Generic@ expressions, but it is an unnecessary mechanism. \TODO{actually implement that}
+\CFA supports @_Generic@ expressions for backwards compatibility, but it is an unnecessary mechanism. \TODO{actually implement that}
 
 % http://fanf.livejournal.com/144696.html
@@ -369,10 +379,10 @@
 \begin{cfa}
 forall( otype T `| { T ?+?(T, T); }` ) T twice( T x ) { return x `+` x; }  $\C{// ? denotes operands}$
-int val = twice( twice( 3.7 ) );
+int val = twice( twice( 3.7 ) );  $\C{// val == 14}$
 \end{cfa}
 which works for any type @T@ with a matching addition operator.
 The polymorphism is achieved by creating a wrapper function for calling @+@ with @T@ bound to @double@, then passing this function to the first call of @twice@.
 There is now the option of using the same @twice@ and converting the result to @int@ on assignment, or creating another @twice@ with type parameter @T@ bound to @int@ because \CFA uses the return type~\cite{Cormack81,Baker82,Ada} in its type analysis.
-The first approach has a late conversion from @double@ to @int@ on the final assignment, while the second has an eager conversion to @int@.
+The first approach has a late conversion from @double@ to @int@ on the final assignment, while the second has an early conversion to @int@.
 \CFA minimizes the number of conversions and their potential to lose information, so it selects the first approach, which corresponds with C-programmer intuition.
 
@@ -420,7 +430,7 @@
 \begin{cfa}
 forall( otype T | { int ?<?( T, T ); } ) void qsort( const T * arr, size_t size ) { /* use C qsort */ }
-{
+int main() {
 	int ?<?( double x, double y ) { return x `>` y; } $\C{// locally override behaviour}$
-	qsort( vals, size );					$\C{// descending sort}$
+	qsort( vals, 10 );							$\C{// descending sort}$
 }
 \end{cfa}
@@ -428,5 +438,5 @@
 Hence, programmers can easily form local environments, adding and modifying appropriate functions, to maximize reuse of other existing functions and types.
 
-To reducing duplication, it is possible to distribute a group of @forall@ (and storage-class qualifiers) over functions/types, so each block declaration is prefixed by the group (see example in Appendix~\ref{s:CforallStack}).
+To reduce duplication, it is possible to distribute a group of @forall@ (and storage-class qualifiers) over functions/types, so each block declaration is prefixed by the group (see example in Appendix~\ref{s:CforallStack}).
 \begin{cfa}
 forall( otype `T` ) {							$\C{// distribution block, add forall qualifier to declarations}$
@@ -470,5 +480,6 @@
 \end{cquote}
 
-In fact, the set of @summable@ trait operators is incomplete, as it is missing assignment for type @T@, but @otype@ is syntactic sugar for the following implicit trait:
+Note, the @sumable@ trait does not include a copy constructor needed for the right side of @?+=?@ and return;
+it is provided by @otype@, which is syntactic sugar for the following trait:
 \begin{cfa}
 trait otype( dtype T | sized(T) ) {  // sized is a pseudo-trait for types with known size and alignment
@@ -488,5 +499,5 @@
 Instead, each polymorphic function (or generic type) defines the structural type needed for its execution (polymorphic type-key), and this key is fulfilled at each call site from the lexical environment, which is similar to Go~\cite{Go} interfaces.
 Hence, new lexical scopes and nested functions are used extensively to create local subtypes, as in the @qsort@ example, without having to manage a nominal-inheritance hierarchy.
-(Nominal inheritance can be approximated with traits using marker variables or functions, as is done in Go.)
+% (Nominal inheritance can be approximated with traits using marker variables or functions, as is done in Go.)
 
 % Nominal inheritance can be simulated with traits using marker variables or functions:
@@ -515,5 +526,4 @@
 
 
-\vspace*{-2pt}
 \section{Generic Types}
 
@@ -534,7 +544,7 @@
 \begin{cquote}
 \lstDeleteShortInline@%
-\begin{tabular}{@{}l|@{\hspace{2\parindentlnth}}l@{}}
-\begin{cfa}
-forall( otype R, otype S ) struct pair {
+\begin{tabular}{@{}l|@{\hspace{\parindentlnth}}l@{}}
+\begin{cfa}
+`forall( otype R, otype S )` struct pair {
 	R first;	S second;
 };
@@ -561,5 +571,6 @@
 Concrete types have a fixed memory layout regardless of type parameters, while dynamic types vary in memory layout depending on their type parameters.
 A \newterm{dtype-static} type has polymorphic parameters but is still concrete.
-Polymorphic pointers are an example of dtype-static types, \eg @forall(dtype T) T *@ is a polymorphic type, but for any @T@, @T *@  is a fixed-sized pointer, and therefore, can be represented by a @void *@ in code generation.
+Polymorphic pointers are an example of dtype-static types;
+given some type variable @T@, @T@ is a polymorphic type, as is @T *@, but @T *@ has a fixed size and can therefore be represented by @void *@ in code generation.
 
 \CFA generic types also allow checked argument-constraints.
@@ -578,6 +589,5 @@
 \begin{cfa}
 struct _pair_conc0 {
-	const char * first;
-	int second;
+	const char * first;  int second;
 };
 \end{cfa}
@@ -587,6 +597,5 @@
 \begin{cfa}
 struct _pair_conc1 {
-	void * first;
-	void * second;
+	void * first, * second;
 };
 \end{cfa}
@@ -645,5 +654,5 @@
 \begin{cquote}
 \lstDeleteShortInline@%
-\begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
+\begin{tabular}{@{}l|@{\hspace{\parindentlnth}}l@{}}
 \begin{cfa}
 forall( dtype Unit ) struct scalar { unsigned long value; };
@@ -661,5 +670,5 @@
 							half_marathon;
 scalar(litres) two_pools = pool + pool;
-`marathon + pool;`	// compilation ERROR
+`marathon + pool;`	// ERROR, mismatched types
 \end{cfa}
 \end{tabular}
@@ -947,13 +956,13 @@
 }
 \end{cfa}
-One more step permits the summation of any summable type with all arguments of the same type:
-\begin{cfa}
-trait summable( otype T ) {
+One more step permits the summation of any sumable type with all arguments of the same type:
+\begin{cfa}
+trait sumable( otype T ) {
 	T ?+?( T, T );
 };
-forall( otype R | summable( R ) ) R sum( R x, R y ) {
+forall( otype R | sumable( R ) ) R sum( R x, R y ) {
 	return x + y;
 }
-forall( otype R, ttype Params | summable(R) | { R sum(R, Params); } ) R sum(R x, R y, Params rest) {
+forall( otype R, ttype Params | sumable(R) | { R sum(R, Params); } ) R sum(R x, R y, Params rest) {
 	return sum( x + y, rest );
 }
@@ -1006,20 +1015,15 @@
 \begin{cfa}
 forall( dtype T0, dtype T1 | sized(T0) | sized(T1) ) struct _tuple2 {
-	T0 field_0;								$\C{// generated before the first 2-tuple}$
-	T1 field_1;
+	T0 field_0;  T1 field_1;					$\C{// generated before the first 2-tuple}$
 };
 _tuple2(int, int) f() {
 	_tuple2(double, double) x;
 	forall( dtype T0, dtype T1, dtype T2 | sized(T0) | sized(T1) | sized(T2) ) struct _tuple3 {
-		T0 field_0;							$\C{// generated before the first 3-tuple}$
-		T1 field_1;
-		T2 field_2;
+		T0 field_0;  T1 field_1;  T2 field_2;	$\C{// generated before the first 3-tuple}$
 	};
 	_tuple3(int, double, int) y;
 }
 \end{cfa}
-{\sloppy
-Tuple expressions are then simply converted directly into compound literals, \eg @[5, 'x', 1.24]@ becomes @(_tuple3(int, char, double)){ 5, 'x', 1.24 }@.
-\par}%
+Tuple expressions are then converted directly into compound literals, \eg @[5, 'x', 1.24]@ becomes @(_tuple3(int, char,@ @double)){ 5, 'x', 1.24 }@.
 
 \begin{comment}
@@ -1106,5 +1110,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{C}}	\\
 \begin{cfa}
 case 2, 10, 34, 42:
@@ -1121,5 +1125,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{C}}	\\
 \begin{cfa}
 case 2~42:
@@ -1174,19 +1178,19 @@
 \centering
 \lstDeleteShortInline@%
-\begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\begin{tabular}{@{}l|@{\hspace{\parindentlnth}}l@{}}
+\multicolumn{1}{@{}c|@{\hspace{\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{C}}	\\
 \begin{cfa}
 `choose` ( day ) {
   case Mon~Thu:  // program
 
-  case Fri:  // program
+  case Fri:    // program
 	wallet += pay;
 	`fallthrough;`
-  case Sat:  // party
+  case Sat:   // party
 	wallet -= party;
 
   case Sun:  // rest
 
-  default:  // error
+  default:    // print error
 }
 \end{cfa}
@@ -1196,13 +1200,13 @@
   case Mon: case Tue: case Wed: case Thu:  // program
 	`break;`
-  case Fri:  // program
+  case Fri:    // program
 	wallet += pay;
 
-  case Sat:  // party
+  case Sat:   // party
 	wallet -= party;
 	`break;`
   case Sun:  // rest
 	`break;`
-  default:  // error
+  default:    // print error
 }
 \end{cfa}
@@ -1220,6 +1224,6 @@
 \centering
 \lstDeleteShortInline@%
-\begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{non-terminator}}	& \multicolumn{1}{c}{\textbf{target label}}	\\
+\begin{tabular}{@{}l|@{\hspace{\parindentlnth}}l@{}}
+\multicolumn{1}{@{}c|@{\hspace{\parindentlnth}}}{\textbf{non-terminator}}	& \multicolumn{1}{c@{}}{\textbf{target label}}	\\
 \begin{cfa}
 choose ( ... ) {
@@ -1264,6 +1268,6 @@
 \begin{figure}
 \lstDeleteShortInline@%
-\begin{tabular}{@{\hspace{\parindentlnth}}l@{\hspace{\parindentlnth}}l@{\hspace{\parindentlnth}}l@{}}
-\multicolumn{1}{@{\hspace{\parindentlnth}}c@{\hspace{\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{@{\hspace{\parindentlnth}}c}{\textbf{C}}	\\
+\begin{tabular}{@{\hspace{\parindentlnth}}l|@{\hspace{\parindentlnth}}l@{\hspace{\parindentlnth}}l@{}}
+\multicolumn{1}{@{\hspace{\parindentlnth}}c|@{\hspace{\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{@{\hspace{\parindentlnth}}c@{}}{\textbf{C}}	\\
 \begin{cfa}
 `LC:` {
@@ -1349,5 +1353,5 @@
 \subsection{Exception Handling}
 
-The following framework for \CFA exception handling is in place, excluding some runtime type-information and virtual functions.
+The following framework for \CFA exception-handling is in place, excluding some runtime type-information and virtual functions.
 \CFA provides two forms of exception handling: \newterm{fix-up} and \newterm{recovery} (see Figure~\ref{f:CFAExceptionHandling})~\cite{Buhr92b,Buhr00a}.
 Both mechanisms provide dynamic call to a handler using dynamic name-lookup, where fix-up has dynamic return and recovery has static return from the handler.
@@ -1360,6 +1364,6 @@
 \begin{cquote}
 \lstDeleteShortInline@%
-\begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{Resumption}}	& \multicolumn{1}{c}{\textbf{Termination}}	\\
+\begin{tabular}{@{}l|@{\hspace{\parindentlnth}}l@{}}
+\multicolumn{1}{@{}c|@{\hspace{\parindentlnth}}}{\textbf{Resumption}}	& \multicolumn{1}{c@{}}{\textbf{Termination}}	\\
 \begin{cfa}
 `exception R { int fix; };`
@@ -1477,5 +1481,5 @@
 If an exception is raised and caught, the handler is run before the finally clause.
 Like a destructor (see Section~\ref{s:ConstructorsDestructors}), a finally clause can raise an exception but not if there is an exception being propagated.
-Mimicking the @finally@ clause with mechanisms like RAII is non-trivially when there are multiple types and local accesses.
+Mimicking the @finally@ clause with mechanisms like RAII is non-trivial when there are multiple types and local accesses.
 
 
@@ -1530,10 +1534,10 @@
 with ( s, t ) {
 	j + k;									$\C{// unambiguous, s.j + t.k}$
-	m = 5.0;								$\C{// unambiguous, t.m = 5.0}$
-	m = 1;									$\C{// unambiguous, s.m = 1}$
-	int a = m;								$\C{// unambiguous, a = s.i }$
-	double b = m;							$\C{// unambiguous, b = t.m}$
+	m = 5.0;								$\C{// unambiguous, s.m = 5.0}$
+	m = 1;									$\C{// unambiguous, t.m = 1}$
+	int a = m;								$\C{// unambiguous, a = t.m }$
+	double b = m;							$\C{// unambiguous, b = s.m}$
 	int c = s.i + t.i;						$\C{// unambiguous, qualification}$
-	(double)m;								$\C{// unambiguous, cast}$
+	(double)m;								$\C{// unambiguous, cast s.m}$
 }
 \end{cfa}
@@ -1559,7 +1563,7 @@
 and implicitly opened \emph{after} a function-body open, to give them higher priority:
 \begin{cfa}
-void ?{}( S & s, int `i` ) with ( s ) `with( $\emph{\color{red}params}$ )` {
+void ?{}( S & s, int `i` ) with ( s ) `{` `with( $\emph{\color{red}params}$ )` {
 	s.i = `i`; j = 3; m = 5.5;
-}
+} `}`
 \end{cfa}
 Finally, a cast may be used to disambiguate among overload variables in a @with@ expression:
@@ -1629,5 +1633,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{C}}	\\
 \begin{cfa}
 `[5] *` int x1;
@@ -1657,12 +1661,12 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{C}}	\\
 \begin{cfa}
 `*` int x, y;
-int y;
-\end{cfa}
-&
-\begin{cfa}
-int `*`x, `*`y;
+int z;
+\end{cfa}
+&
+\begin{cfa}
+int `*`x, `*`y, z;
 
 \end{cfa}
@@ -1670,5 +1674,6 @@
 \lstMakeShortInline@%
 \end{cquote}
-The downside of the \CFA semantics is the need to separate regular and pointer declarations.
+% The downside of the \CFA semantics is the need to separate regular and pointer declarations.
+The separation of regular and pointer declarations by \CFA declarations enforces greater clarity with only slightly more syntax.
 
 \begin{comment}
@@ -1677,5 +1682,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{C}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{C}}	\\
 \begin{cfa}
 [ 5 ] int z;
@@ -1719,5 +1724,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{C}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{C}}	\\
 \begin{cfa}
 extern const * const int x;
@@ -1744,5 +1749,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{C}}	\\
 \begin{cfa}
 y = (* int)x;
@@ -1772,5 +1777,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{C}}	\\
 \begin{cfa}
 [double] foo(), foo( int ), foo( double ) {...}
@@ -1790,10 +1795,7 @@
 * [ * int ] ( int y ) gp;		$\C{// pointer to function returning pointer to int with int parameter}$
 * [ ] ( int, char ) hp;			$\C{// pointer to function returning no result with int and char parameters}$
-* [ * int, int ] ( int ) jp;	$\C{// pointer to function returning pointer to int and int with int parameter}$
-\end{cfa}
-Note, a function name cannot be specified:
-\begin{cfa}
-* [ int x ] f () fp;			$\C{// function name "f" is disallowed}\CRT$
-\end{cfa}
+* [ * int, int ] ( int ) jp;	$\C{// pointer to function returning pointer to int and int with int parameter}\CRT$
+\end{cfa}
+Note, the name of the function pointer is specified last, as for other variable declarations.
 
 Finally, new \CFA declarations may appear together with C declarations in the same program block, but cannot be mixed within a specific declaration.
@@ -1852,21 +1854,6 @@
 This provides a much more orthogonal design for library implementors, obviating the need for workarounds such as @std::reference_wrapper@.
 Secondly, \CFA references are rebindable, whereas \CC references have a fixed address.
-\newsavebox{\LstBox}
-\begin{lrbox}{\LstBox}
-\lstset{basicstyle=\footnotesize\linespread{0.9}\sf}
-\begin{cfa}
-int & r = *new( int );
-...											$\C{// non-null reference}$
-delete &r;									$\C{// unmanaged (programmer) memory-management}$
-r += 1;										$\C{// undefined reference}$
-\end{cfa}
-\end{lrbox}
 Rebinding allows \CFA references to be default-initialized (\eg to a null pointer\footnote{
-While effort has been made into non-null reference checking in \CC and Java, the exercise seems moot for any non-managed languages (C/\CC), given that it only handles one of many different error situations:
-\begin{cquote}
-\usebox{\LstBox}
-\end{cquote}
-}%
-) and point to different addresses throughout their lifetime, like pointers.
+While effort has been made into non-null reference checking in \CC and Java, the exercise seems moot for any non-managed languages (C/\CC), given that it only handles one of many different error situations, \eg using a pointer after its storage is deleted.}) and point to different addresses throughout their lifetime, like pointers.
 Rebinding is accomplished by extending the existing syntax and semantics of the address-of operator in C.
 
@@ -1880,5 +1867,5 @@
 \begin{itemize}
 \item
-if @R@ is an rvalue of type {@T &@$_1 \cdots$@ &@$_r$} where $r \ge 1$ references (@&@ symbols) than @&R@ has type {@T `*`&@$_{\color{red}2} \cdots$@ &@$_{\color{red}r}$}, \\ \ie @T@ pointer with $r-1$ references (@&@ symbols).
+if @R@ is an rvalue of type {@T &@$_1 \cdots$@ &@$_r$} where $r \ge 1$ references (@&@ symbols) then @&R@ has type {@T `*`&@$_{\color{red}2} \cdots$@ &@$_{\color{red}r}$}, \\ \ie @T@ pointer with $r-1$ references (@&@ symbols).
 	
 \item
@@ -1914,5 +1901,5 @@
 \end{cfa}
 This allows complex values to be succinctly and efficiently passed to functions, without the syntactic overhead of explicit definition of a temporary variable or the runtime cost of pass-by-value.
-\CC allows a similar binding, but only for @const@ references; the more general semantics of \CFA are an attempt to avoid the \newterm{const hell} problem, in which addition of a @const@ qualifier to one reference requires a cascading chain of added qualifiers.
+\CC allows a similar binding, but only for @const@ references; the more general semantics of \CFA are an attempt to avoid the \newterm{const poisoning} problem~\cite{Taylor10}, in which addition of a @const@ qualifier to one reference requires a cascading chain of added qualifiers.
 
 
@@ -1928,5 +1915,4 @@
 \begin{tabular}{@{}l@{\hspace{3em}}l|l@{}}
 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{C Type Nesting}}	& \multicolumn{1}{c|}{\textbf{C Implicit Hoisting}}	& \multicolumn{1}{c}{\textbf{\CFA}}	\\
-\hline
 \begin{cfa}
 struct S {
@@ -2008,8 +1994,8 @@
 The symbol \lstinline+^+ is used for the destructor name because it was the last binary operator that could be used in a unary context.}.
 The name @{}@ comes from the syntax for the initializer: @struct S { int i, j; } s = `{` 2, 3 `}`@.
-Like other \CFA operators, these names represent the syntax used to call the constructor or destructor, \eg @?{}(x, ...)@ or @^{}(x, ...)@.
+Like other \CFA operators, these names represent the syntax used to explicitly call the constructor or destructor, \eg @s{...}@ or @^s{...}@.
 The constructor and destructor have return type @void@, and the first parameter is a reference to the object type to be constructed or destructed.
 While the first parameter is informally called the @this@ parameter, as in object-oriented languages, any variable name may be used.
-Both constructors and destructors allow additional parametes after the @this@ parameter for specifying values for initialization/de-initialization\footnote{
+Both constructors and destructors allow additional parameters after the @this@ parameter for specifying values for initialization/de-initialization\footnote{
 Destruction parameters are useful for specifying storage-management actions, such as de-initialize but not deallocate.}.
 \begin{cfa}
@@ -2018,6 +2004,6 @@
 void ^?{}( VLA & vla ) with ( vla ) { free( data ); } $\C{// destructor}$
 {
-	VLA x;									$\C{// implicit:  ?\{\}( x );}$
-} 											$\C{// implicit:  ?\^{}\{\}( x );}$
+	VLA x;									$\C{// implicit:\ \ x\{\};}$
+} 											$\C{// implicit:\ \textasciicircum{}x\{\};}$
 \end{cfa}
 @VLA@ is a \newterm{managed type}\footnote{
@@ -2044,11 +2030,11 @@
 appropriate care is taken to not recursively call the copy constructor when initializing the second parameter.
 
-\CFA constructors may be explicitly call, like Java, and destructors may be explicitly called, like \CC.
+\CFA constructors may be explicitly called, like Java, and destructors may be explicitly called, like \CC.
 Explicit calls to constructors double as a \CC-style \emph{placement syntax}, useful for construction of member fields in user-defined constructors and reuse of existing storage allocations.
-While existing call syntax works for explicit calls to constructors and destructors, \CFA also provides a more concise \newterm{operator syntax} for both:
+Like the other operators in \CFA, there is a concise syntax for constructor/destructor function calls:
 \begin{cfa}
 {
 	VLA  x,            y = { 20, 0x01 },     z = y;	$\C{// z points to y}$
-	//      ?{}( x );   ?{}( y, 20, 0x01 );   ?{}( z, y ); 
+	//    x{};         y{ 20, 0x01 };          z{ z, y }; 
 	^x{};									$\C{// deallocate x}$
 	x{};									$\C{// reallocate x}$
@@ -2057,5 +2043,5 @@
 	y{ x };									$\C{// reallocate y, points to x}$
 	x{};									$\C{// reallocate x, not pointing to y}$
-	// ^?{}(z);  ^?{}(y);  ^?{}(x);
+	//  ^z{};  ^y{};  ^x{};
 }
 \end{cfa}
@@ -2078,5 +2064,5 @@
 In these cases, \CFA provides the initialization syntax \lstinline|S x `@=` {}|, and the object becomes unmanaged, so implicit constructor and destructor calls are not generated. 
 Any C initializer can be the right-hand side of an \lstinline|@=| initializer, \eg \lstinline|VLA a @= { 0, 0x0 }|, with the usual C initialization semantics.
-The same syntax can be used in a compound literal, \eg \lstinline|a = VLA`@`{ 0, 0x0 }|, to create a C-style literal.
+The same syntax can be used in a compound literal, \eg \lstinline|a = (VLA)`@`{ 0, 0x0 }|, to create a C-style literal.
 The point of \lstinline|@=| is to provide a migration path from legacy C code to \CFA, by providing a mechanism to incrementally convert to implicit initialization.
 
@@ -2134,5 +2120,5 @@
 
 In C, @0@ has the special property that it is the only ``false'' value;
-from the standard, any value that compares equal to @0@ is false, while any value that compares unequal to @0@ is true. 
+by the standard, any value that compares equal to @0@ is false, while any value that compares unequal to @0@ is true. 
 As such, an expression @x@ in any boolean context (such as the condition of an @if@ or @while@ statement, or the arguments to @&&@, @||@, or @?:@\,) can be rewritten as @x != 0@ without changing its semantics.
 Operator overloading in \CFA provides a natural means to implement this truth-value comparison for arbitrary types, but the C type system is not precise enough to distinguish an equality comparison with @0@ from an equality comparison with an arbitrary integer or pointer. 
@@ -2169,5 +2155,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{postfix function}}	& \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{constant}}	& \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{variable/expression}}	& \multicolumn{1}{c}{\textbf{postfix pointer}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{postfix function}}	& \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{constant}}	& \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{variable/expression}}	& \multicolumn{1}{c@{}}{\textbf{postfix pointer}}	\\
 \begin{cfa}
 int |?`h|( int s );
@@ -2214,6 +2200,6 @@
 \lstset{language=CFA,moredelim=**[is][\color{red}]{|}{|},deletedelim=**[is][]{`}{`}}
 \lstDeleteShortInline@%
-\begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{\CC}}	\\
+\begin{tabular}{@{}l@{\hspace{1.25\parindentlnth}}l@{}}
+\multicolumn{1}{@{}c@{\hspace{1.25\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{\CC}}	\\
 \begin{cfa}
 struct W {
@@ -2259,5 +2245,5 @@
 	W w, heavy = { 20 };
 	w = 155|_lb|;
-	w = 0b1111|_lb|;       // error, binary unsupported
+	// binary unsupported
 	w = 0${\color{red}\LstBasicStyle{'}}$233|_lb|;          // quote separator
 	w = 0x9b|_kg|;
@@ -2289,5 +2275,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{Definition}}	& \multicolumn{1}{c}{\textbf{Usage}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{Definition}}	& \multicolumn{1}{c@{}}{\textbf{Usage}}	\\
 \begin{cfa}
 const short int `MIN` = -32768;
@@ -2307,11 +2293,9 @@
 \begin{cquote}
 \lstDeleteShortInline@%
-\begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\begin{tabular}{@{}l@{\hspace{\parindentlnth}}l@{}}
+\multicolumn{1}{@{}c@{\hspace{\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{C}}	\\
 \begin{cfa}
 MIN
-
 MAX
-
 PI
 E
@@ -2319,8 +2303,6 @@
 &
 \begin{cfa}
-SCHAR_MIN, CHAR_MIN, SHRT_MIN, INT_MIN, LONG_MIN,
-	LLONG_MIN, FLT_MIN, DBL_MIN, LDBL_MIN
-SCHAR_MAX, UCHAR_MAX, SHRT_MAX, INT_MAX, LONG_MAX,
-	LLONG_MAX, FLT_MAX, DBL_MAX, LDBL_MAX
+CHAR_MIN, SHRT_MIN, INT_MIN, LONG_MIN, LLONG_MIN, FLT_MIN, DBL_MIN, LDBL_MIN
+UCHAR_MAX, SHRT_MAX, INT_MAX, LONG_MAX, LLONG_MAX, FLT_MAX, DBL_MAX, LDBL_MAX
 M_PI, M_PIl
 M_E, M_El
@@ -2338,5 +2320,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{Definition}}	& \multicolumn{1}{c}{\textbf{Usage}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{Definition}}	& \multicolumn{1}{c@{}}{\textbf{Usage}}	\\
 \begin{cfa}
 float `log`( float x );
@@ -2357,5 +2339,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{C}}	\\
 \begin{cfa}
 log
@@ -2385,5 +2367,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{Definition}}	& \multicolumn{1}{c}{\textbf{Usage}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{Definition}}	& \multicolumn{1}{c@{}}{\textbf{Usage}}	\\
 \begin{cfa}
 unsigned int `abs`( int );
@@ -2404,5 +2386,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{C}}	\\
 \begin{cfa}
 abs
@@ -2427,5 +2409,5 @@
 an allocation with a specified character.
 \item[resize]
-an existing allocation to decreased or increased its size.
+an existing allocation to decrease or increase its size.
 In either case, new storage may or may not be allocated and, if there is a new allocation, as much data from the existing allocation is copied.
 For an increase in storage size, new storage after the copied data may be filled.
@@ -2441,4 +2423,6 @@
 
 \begin{table}
+\caption{Storage-Management Operations}
+\label{t:StorageManagementOperations}
 \centering
 \lstDeleteShortInline@%
@@ -2460,12 +2444,9 @@
 \lstDeleteShortInline~%
 \lstMakeShortInline@%
-\caption{Storage-Management Operations}
-\label{t:StorageManagementOperations}
 \end{table}
 
 \begin{figure}
 \centering
-\begin{cquote}
-\begin{cfa}[aboveskip=0pt]
+\begin{cfa}[aboveskip=0pt,xleftmargin=0pt]
 size_t  dim = 10;							$\C{// array dimension}$
 char fill = '\xff';							$\C{// initialization fill value}$
@@ -2473,7 +2454,7 @@
 \end{cfa}
 \lstDeleteShortInline@%
-\begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
-\begin{cfa}
+\begin{tabular}{@{}l@{\hspace{\parindentlnth}}l@{}}
+\multicolumn{1}{@{}c@{\hspace{\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{C}}	\\
+\begin{cfa}[xleftmargin=-10pt]
 ip = alloc();
 ip = alloc( fill );
@@ -2490,19 +2471,18 @@
 &
 \begin{cfa}
-ip = (int *)malloc( sizeof( int ) );
-ip = (int *)malloc( sizeof( int ) ); memset( ip, fill, sizeof( int ) );
-ip = (int *)malloc( dim * sizeof( int ) );
-ip = (int *)malloc( sizeof( int ) ); memset( ip, fill, dim * sizeof( int ) );
-ip = (int *)realloc( ip, 2 * dim * sizeof( int ) );
-ip = (int *)realloc( ip, 4 * dim * sizeof( int ) );
-			memset( ip, fill, 4 * dim * sizeof( int ) );
-ip = memalign( 16, sizeof( int ) );
-ip = memalign( 16, sizeof( int ) ); memset( ip, fill, sizeof( int ) );
-ip = memalign( 16, dim * sizeof( int ) );
-ip = memalign( 16, dim * sizeof( int ) ); memset( ip, fill, dim * sizeof( int ) );
-\end{cfa}
-\end{tabular}
-\lstMakeShortInline@%
-\end{cquote}
+ip = (int *)malloc( sizeof(int) );
+ip = (int *)malloc( sizeof(int) ); memset( ip, fill, sizeof(int) );
+ip = (int *)malloc( dim * sizeof(int) );
+ip = (int *)malloc( sizeof(int) ); memset( ip, fill, dim * sizeof(int) );
+ip = (int *)realloc( ip, 2 * dim * sizeof(int) );
+ip = (int *)realloc( ip, 4 * dim * sizeof(int) ); memset( ip, fill, 4 * dim * sizeof(int));
+
+ip = memalign( 16, sizeof(int) );
+ip = memalign( 16, sizeof(int) ); memset( ip, fill, sizeof(int) );
+ip = memalign( 16, dim * sizeof(int) );
+ip = memalign( 16, dim * sizeof(int) ); memset( ip, fill, dim * sizeof(int) );
+\end{cfa}
+\end{tabular}
+\lstMakeShortInline@%
 \caption{\CFA versus C Storage-Allocation}
 \label{f:StorageAllocation}
@@ -2517,5 +2497,5 @@
 S * as = anew( dim, 2, 3 );					$\C{// each array element initialized to 2, 3}$
 \end{cfa}
-Note, \CC can only initialization array elements via the default constructor.
+Note, \CC can only initialize array elements via the default constructor.
 
 Finally, the \CFA memory-allocator has \newterm{sticky properties} for dynamic storage: fill and alignment are remembered with an object's storage in the heap.
@@ -2534,5 +2514,5 @@
 \lstDeleteShortInline@%
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{\CC}}	\\
+\multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{\CC}}	\\
 \begin{cfa}
 int x = 1, y = 2, z = 3;
@@ -2589,5 +2569,5 @@
 \end{cquote}
 There is a weak similarity between the \CFA logical-or operator and the Shell pipe-operator for moving data, where data flows in the correct direction for input but the opposite direction for output.
-
+\begin{comment}
 The implicit separator character (space/blank) is a separator not a terminator.
 The rules for implicitly adding the separator are:
@@ -2608,4 +2588,5 @@
 }%
 \end{itemize}
+\end{comment}
 There are functions to set and get the separator string, and manipulators to toggle separation on and off in the middle of output.
 
@@ -2622,6 +2603,6 @@
 \centering
 \lstDeleteShortInline@%
-\begin{tabular}{@{}l@{\hspace{2\parindentlnth}}@{\hspace{2\parindentlnth}}l@{}}
-\multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{@{\hspace{2\parindentlnth}}c}{\textbf{C}}	\\
+\begin{tabular}{@{}l@{\hspace{3\parindentlnth}}l@{}}
+\multicolumn{1}{@{}c@{\hspace{3\parindentlnth}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{}}{\textbf{C}}	\\
 \begin{cfa}
 #include <gmp>
@@ -2656,10 +2637,13 @@
 
 
-\section{Evaluation}
+\section{Polymorphism Evaluation}
 \label{sec:eval}
 
-Though \CFA provides significant added functionality over C, these features have a low runtime penalty.
-In fact, \CFA's features for generic programming can enable faster runtime execution than idiomatic @void *@-based C code.
-This claim is demonstrated through a set of generic-code-based micro-benchmarks in C, \CFA, and \CC (see stack implementations in Appendix~\ref{sec:BenchmarkStackImplementations}).
+\CFA adds parametric polymorphism to C.
+A runtime evaluation is performed to compare the cost of alternative styles of polymorphism.
+The goal is to compare just the underlying mechanism for implementing different kinds of polymorphism.
+% Though \CFA provides significant added functionality over C, these features have a low runtime penalty.
+% In fact, it is shown that \CFA's generic programming can enable faster runtime execution than idiomatic @void *@-based C code.
+The experiment is a set of generic-stack micro-benchmarks~\cite{CFAStackEvaluation} in C, \CFA, and \CC (see implementations in Appendix~\ref{sec:BenchmarkStackImplementations}).
 Since all these languages share a subset essentially comprising standard C, maximal-performance benchmarks should show little runtime variance, differing only in length and clarity of source code.
 A more illustrative comparison measures the costs of idiomatic usage of each language's features.
@@ -2692,9 +2676,9 @@
 \end{figure}
 
-The structure of each benchmark implemented is: C with @void *@-based polymorphism, \CFA with the presented features, \CC with templates, and \CC using only class inheritance for polymorphism, called \CCV.
+The structure of each benchmark implemented is: C with @void *@-based polymorphism, \CFA with parametric polymorphism, \CC with templates, and \CC using only class inheritance for polymorphism, called \CCV.
 The \CCV variant illustrates an alternative object-oriented idiom where all objects inherit from a base @object@ class, mimicking a Java-like interface;
 hence runtime checks are necessary to safely down-cast objects.
 The most notable difference among the implementations is in memory layout of generic types: \CFA and \CC inline the stack and pair elements into corresponding list and pair nodes, while C and \CCV lack such a capability and instead must store generic objects via pointers to separately-allocated objects.
-Note that the C benchmark uses unchecked casts as there is no runtime mechanism to perform such checks, while \CFA and \CC provide type-safety statically.
+Note, the C benchmark uses unchecked casts as C has no runtime mechanism to perform such checks, while \CFA and \CC provide type-safety statically.
 
 Figure~\ref{fig:eval} and Table~\ref{tab:eval} show the results of running the benchmark in Figure~\ref{fig:BenchmarkTest} and its C, \CC, and \CCV equivalents.
@@ -2711,7 +2695,7 @@
 
 \begin{table}
-\centering
 \caption{Properties of benchmark code}
 \label{tab:eval}
+\centering
 \newcommand{\CT}[1]{\multicolumn{1}{c}{#1}}
 \begin{tabular}{rrrrr}
@@ -2726,8 +2710,9 @@
 The C and \CCV variants are generally the slowest with the largest memory footprint, because of their less-efficient memory layout and the pointer-indirection necessary to implement generic types;
 this inefficiency is exacerbated by the second level of generic types in the pair benchmarks.
-By contrast, the \CFA and \CC variants run in roughly equivalent time for both the integer and pair of @short@ and @char@ because the storage layout is equivalent, with the inlined libraries (\ie no separate compilation) and greater maturity of the \CC compiler contributing to its lead.
+By contrast, the \CFA and \CC variants run in roughly equivalent time for both the integer and pair because of equivalent storage layout, with the inlined libraries (\ie no separate compilation) and greater maturity of the \CC compiler contributing to its lead.
 \CCV is slower than C largely due to the cost of runtime type-checking of down-casts (implemented with @dynamic_cast@);
-The outlier in the graph for \CFA, pop @pair@, results from the complexity of the generated-C polymorphic code.
-The gcc compiler is unable to optimize some dead code and condense nested calls; a compiler designed for \CFA could easily perform these optimizations.
+The outlier for \CFA, pop @pair@, results from the complexity of the generated-C polymorphic code.
+The gcc compiler is unable to optimize some dead code and condense nested calls;
+a compiler designed for \CFA could easily perform these optimizations.
 Finally, the binary size for \CFA is larger because of static linking with the \CFA libraries.
 
@@ -2741,9 +2726,11 @@
 Line-count is a fairly rough measure of code complexity;
 another important factor is how much type information the programmer must specify manually, especially where that information is not compiler-checked.
-Such unchecked type information produces a heavier documentation burden and increased potential for runtime bugs, and is much less common in \CFA than C, with its manually specified function pointer arguments and format codes, or \CCV, with its extensive use of untype-checked downcasts, \eg @object@ to @integer@ when popping a stack.
+Such unchecked type information produces a heavier documentation burden and increased potential for runtime bugs, and is much less common in \CFA than C, with its manually specified function pointer arguments and format codes, or \CCV, with its extensive use of un-type-checked downcasts, \eg @object@ to @integer@ when popping a stack.
 To quantify this manual typing, the ``redundant type annotations'' line in Table~\ref{tab:eval} counts the number of lines on which the type of a known variable is respecified, either as a format specifier, explicit downcast, type-specific function, or by name in a @sizeof@, struct literal, or @new@ expression.
 The \CC benchmark uses two redundant type annotations to create a new stack nodes, while the C and \CCV benchmarks have several such annotations spread throughout their code.
 The \CFA benchmark is able to eliminate all redundant type annotations through use of the polymorphic @alloc@ function discussed in Section~\ref{sec:libraries}.
 
+We conjecture these results scale across most generic data-types as the underlying polymorphism implement is constant.
+
 
 \section{Related Work}
@@ -2751,4 +2738,11 @@
 
 \subsection{Polymorphism}
+
+ML~\cite{ML} was the first language to support parametric polymorphism.
+Like \CFA, it supports universal type parameters, but not the use of assertions and traits to constrain type arguments.
+Haskell~\cite{Haskell10} combines ML-style polymorphism, polymorphic data types, and type inference with the notion of type classes, collections of overloadable methods that correspond in intent to traits in \CFA.
+Unlike \CFA, Haskell requires an explicit association between types and their classes that specifies the implementation of operations.
+These associations determine the functions that are assertion arguments for particular combinations of class and type, in contrast to \CFA where the assertion arguments are selected at function call sites based upon the set of operations in scope at that point.
+Haskell also severely restricts the use of overloading: an overloaded name can only be associated with a single class, and methods with overloaded names can only be defined as part of instance declarations.
 
 \CC provides three disjoint polymorphic extensions to C: overloading, inheritance, and templates.
@@ -2804,5 +2798,5 @@
 Go does not have tuples but supports MRVF.
 Java's variadic functions appear similar to C's but are type-safe using homogeneous arrays, which are less useful than \CFA's heterogeneously-typed variadic functions.
-Tuples are a fundamental abstraction in most functional programming languages, such as Standard ML~\cite{sml} and~\cite{Scala}, which decompose tuples using pattern matching.
+Tuples are a fundamental abstraction in most functional programming languages, such as Standard ML~\cite{sml}, Haskell, and Scala~\cite{Scala}, which decompose tuples using pattern matching.
 
 
@@ -2835,10 +2829,8 @@
 Finally, we demonstrate that \CFA performance for some idiomatic cases is better than C and close to \CC, showing the design is practically applicable.
 
-There is ongoing work on a wide range of \CFA features, including arrays with size, runtime type-information, virtual functions, user-defined conversions, concurrent primitives, and modules.
-While all examples in the paper compile and run, a public beta-release of \CFA will take another 8--12 months to finalize these extensions.
-There are also interesting future directions for the polymorphism design.
-Notably, \CC template functions trade compile time and code bloat for optimal runtime of individual instantiations of polymorphic functions.
-\CFA polymorphic functions use dynamic virtual-dispatch;
-the runtime overhead of this approach is low, but not as low as inlining, and it may be beneficial to provide a mechanism for performance-sensitive code.
+While all examples in the paper compile and run, a public beta-release of \CFA will take 6--8 months to reduce compilation time, provide better debugging, and add a few more libraries.
+There is also new work on a number of \CFA features, including arrays with size, runtime type-information, virtual functions, user-defined conversions, and modules.
+While \CFA polymorphic functions use dynamic virtual-dispatch with low runtime overhead (see Section~\ref{sec:eval}), it is not as low as \CC template-inlining.
+Hence it may be beneficial to provide a mechanism for performance-sensitive code.
 Two promising approaches are an @inline@ annotation at polymorphic function call sites to create a template-specialization of the function (provided the code is visible) or placing an @inline@ annotation on polymorphic function-definitions to instantiate a specialized version for some set of types (\CC template specialization).
 These approaches are not mutually exclusive and allow performance optimizations to be applied only when necessary, without suffering global code-bloat.
@@ -2849,9 +2841,10 @@
 
 The authors would like to recognize the design assistance of Glen Ditchfield, Richard Bilson, Thierry Delisle, Andrew Beach and Brice Dobry on the features described in this paper, and thank Magnus Madsen for feedback on the writing.
-This work is supported by a corporate partnership with Huawei Ltd.\ (\url{http://www.huawei.com}), and Aaron Moss and Peter Buhr are partially funded by the Natural Sciences and Engineering Research Council of Canada.
-
-
+Funding for this project has been provided by Huawei Ltd.\ (\url{http://www.huawei.com}), and Aaron Moss and Peter Buhr are partially funded by the Natural Sciences and Engineering Research Council of Canada.
+
+{%
+\fontsize{9bp}{12bp}\selectfont%
 \bibliography{pl}
-
+}%
 
 \appendix
