Index: doc/papers/general/Paper.tex
===================================================================
--- doc/papers/general/Paper.tex	(revision c4d4ecf2236c625c2cb2120b42a876a14cc53dff)
+++ doc/papers/general/Paper.tex	(revision 8f67d442595ccba6342b86d7428843dd8b34c353)
@@ -4,19 +4,20 @@
 \usepackage{epic,eepic}
 \usepackage{xspace,calc,comment}
-\usepackage{upquote}									% switch curled `'" to straight
-\usepackage{listings}									% format program code
+\usepackage{upquote}						% switch curled `'" to straight
+\usepackage{listings}						% format program code
+\usepackage[flushmargin]{footmisc}			% support label/reference in footnote
 \usepackage{rotating}
 \usepackage[usenames]{color}
-\usepackage{pslatex}					% reduce size of san serif font
+\usepackage{pslatex}						% reduce size of san serif font
 \usepackage[plainpages=false,pdfpagelabels,pdfpagemode=UseNone,pagebackref=true,breaklinks=true,colorlinks=true,linkcolor=blue,citecolor=blue,urlcolor=blue]{hyperref}
 
 \setlength{\textheight}{9in}
 %\oddsidemargin 0.0in
-\renewcommand{\topfraction}{0.8}		% float must be greater than X of the page before it is forced onto its own page
-\renewcommand{\bottomfraction}{0.8}		% float must be greater than X of the page before it is forced onto its own page
-\renewcommand{\floatpagefraction}{0.8}	% float must be greater than X of the page before it is forced onto its own page
-\renewcommand{\textfraction}{0.0}		% the entire page maybe devoted to floats with no text on the page at all
-
-\lefthyphenmin=4						% hyphen only after 4 characters
+\renewcommand{\topfraction}{0.8}			% float must be greater than X of the page before it is forced onto its own page
+\renewcommand{\bottomfraction}{0.8}			% float must be greater than X of the page before it is forced onto its own page
+\renewcommand{\floatpagefraction}{0.8}		% float must be greater than X of the page before it is forced onto its own page
+\renewcommand{\textfraction}{0.0}			% the entire page maybe devoted to floats with no text on the page at all
+
+\lefthyphenmin=4							% hyphen only after 4 characters
 \righthyphenmin=4
 
@@ -24,7 +25,7 @@
 
 \newcommand{\CFAIcon}{\textsf{C}\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}\xspace} % Cforall symbolic name
-\newcommand{\CFA}{\protect\CFAIcon} % safe for section/caption
-\newcommand{\CFL}{\textrm{Cforall}\xspace} % Cforall symbolic name
-\newcommand{\Celeven}{\textrm{C11}\xspace} % C11 symbolic name
+\newcommand{\CFA}{\protect\CFAIcon} 		% safe for section/caption
+\newcommand{\CFL}{\textrm{Cforall}\xspace} 	% Cforall symbolic name
+\newcommand{\Celeven}{\textrm{C11}\xspace} 	% C11 symbolic name
 \newcommand{\CC}{\textrm{C}\kern-.1em\hbox{+\kern-.25em+}\xspace} % C++ symbolic name
 \newcommand{\CCeleven}{\textrm{C}\kern-.1em\hbox{+\kern-.25em+}11\xspace} % C++11 symbolic name
@@ -56,5 +57,5 @@
 \newcommand{\LstCommentStyle}[1]{{\lst@basicstyle{\lst@commentstyle{#1}}}}
 
-\newlength{\gcolumnposn}				% temporary hack because lstlisting does not handle tabs correctly
+\newlength{\gcolumnposn}					% temporary hack because lstlisting does not handle tabs correctly
 \newlength{\columnposn}
 \setlength{\gcolumnposn}{2.75in}
@@ -72,5 +73,5 @@
 
 % Latin abbreviation
-\newcommand{\abbrevFont}{\textit}	% set empty for no italics
+\newcommand{\abbrevFont}{\textit}			% set empty for no italics
 \newcommand{\EG}{\abbrevFont{e}.\abbrevFont{g}.}
 \newcommand*{\eg}{%
@@ -1116,5 +1117,5 @@
 \CFA disallows the declaration of local variable, \eg @z@, directly within the @switch@ body, because a declaration cannot occur immediately after a @case@ since a label can only be attached to a statement, and the use of @z@ is undefined in @case 1@ as neither storage allocation nor initialization may have occurred.
 
-C @switch@ provides multiple entry points into the statement body, but once an entry point is selected, control continues across \emph{all} @case@ clauses until the end of the @switch@ body, called \newterm{fall through}.
+C @switch@ provides multiple entry points into the statement body, but once an entry point is selected, control continues across \emph{all} @case@ clauses until the end of the @switch@ body, called \newterm{fall through};
 @case@ clauses are made disjoint by the @break@ statement.
 While the ability to fall through \emph{is} a useful form of control flow, it does not match well with programmer intuition, resulting in many errors from missing @break@ statements.
@@ -1538,4 +1539,49 @@
 Therefore, a programmer has the option of either continuing to use traditional C declarations or take advantage of the new style.
 Clearly, both styles need to be supported for some time due to existing C-style header-files, particularly for UNIX-like systems.
+
+The syntax of the new routine prototype declaration follows directly from the new routine definition syntax;
+as well, parameter names are optional, \eg:
+\begin{cfa}
+[ int x ] f ();							$\C{// returning int with no parameters}$
+[ * int ] g (int y);					$\C{// returning pointer to int with int parameter}$
+[ ] h ( int, char );					$\C{// returning no result with int and char parameters}$
+[ * int, int ] j ( int );				$\C{// returning pointer to int and int, with int parameter}$
+\end{cfa}
+This syntax allows a prototype declaration to be created by cutting and pasting source text from the routine definition header (or vice versa).
+Like C, it is possible to declare multiple routine-prototypes in a single declaration, where the return type is distributed across \emph{all} routine names in the declaration list, \eg:
+\begin{cquote}
+\lstDeleteShortInline@%
+\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
+\multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\begin{cfa}
+[double] foo(), foo( int ), foo( double ) {...}
+\end{cfa}
+&
+\begin{cfa}
+double foo1(), foo2( int ), foo3( double );
+\end{cfa}
+\end{tabular}
+\lstMakeShortInline@%
+\end{cquote}
+\CFA allows the last routine in the list to define its body.
+
+Declaration qualifiers can only appear at the start of a \CFA routine declaration,\footref{StorageClassSpecifier} \eg:
+\begin{cfa}
+extern [ int ] f ( int );
+static [ int ] g ( int );
+\end{cfa}
+
+The syntax for pointers to \CFA routines specifies the pointer name on the right, \eg:
+\begin{cfa}
+* [ int x ] () fp;						$\C{// pointer to routine returning int with no parameters}$
+* [ * int ] (int y) gp;					$\C{// pointer to routine returning pointer to int with int parameter}$
+* [ ] (int,char) hp;					$\C{// pointer to routine returning no result with int and char parameters}$
+* [ * int,int ] ( int ) jp;				$\C{// pointer to routine returning pointer to int and int, with int parameter}$
+\end{cfa}
+While parameter names are optional, \emph{a routine name cannot be specified};
+for example, the following is incorrect:
+\begin{cfa}
+* [ int x ] f () fp;					$\C{// routine name "f" is not allowed}$
+\end{cfa}
 
 
@@ -1764,4 +1810,97 @@
 \end{cfa}
 }%
+
+
+\section{Libraries}
+
+\subsection{I/O}
+\label{s:IOLibrary}
+
+The goal of \CFA I/O is to simplify the common cases, while fully supporting polymorphism and user defined types in a consistent way.
+The approach combines ideas from \CC and Python.
+The \CFA header file for the I/O library is @fstream@.
+
+The common case is printing out a sequence of variables separated by whitespace.
+\begin{cquote}
+\lstDeleteShortInline@%
+\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
+\multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{\CC}}	\\
+\begin{cfa}
+int x = 1, y = 2, z = 3;
+sout | x `|` y `|` z | endl;
+\end{cfa}
+&
+\begin{cfa}
+
+cout << x `<< " "` << y `<< " "` << z << endl;
+\end{cfa}
+\\
+\begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
+1` `2` `3
+\end{cfa}
+&
+\begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
+1 2 3
+\end{cfa}
+\end{tabular}
+\lstMakeShortInline@%
+\end{cquote}
+The \CFA form has half the characters of the \CC form, and is similar to Python I/O with respect to implicit separators.
+Similar simplification occurs for tuple I/O, which prints all tuple values separated by ``\lstinline[showspaces=true]@, @''.
+\begin{cfa}
+[int, [ int, int ] ] t1 = [ 1, [ 2, 3 ] ], t2 = [ 4, [ 5, 6 ] ];
+sout | t1 | t2 | endl;					$\C{// print tuples}$
+\end{cfa}
+\begin{cfa}[showspaces=true,aboveskip=0pt]
+1`, `2`, `3 4`, `5`, `6
+\end{cfa}
+Finally, \CFA uses the logical-or operator for I/O as it is the lowest-priority overloadable operator, other than assignment.
+Therefore, fewer output expressions require parenthesis.
+\begin{cquote}
+\lstDeleteShortInline@%
+\begin{tabular}{@{}ll@{}}
+\textbf{\CFA:}
+&
+\begin{cfa}
+sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
+\end{cfa}
+\\
+\textbf{\CC:}
+&
+\begin{cfa}
+cout << x * 3 << y + 1 << `(`z << 2`)` << `(`x == y`)` << (x | y) << (x || y) << (x > z ? 1 : 2) << endl;
+\end{cfa}
+\\
+\textbf{output:}
+&
+\begin{cfa}[showspaces=true,aboveskip=0pt]
+3 3 12 0 3 1 2
+\end{cfa}
+\end{tabular}
+\lstMakeShortInline@%
+\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.
+
+The implicit separator character (space/blank) is a separator not a terminator.
+The rules for implicitly adding the separator are:
+\begin{list}{\footnotesize$\bullet$}{\itemsep=2pt\parsep=0pt}
+\item
+A separator does not appear at the start or end of a line.
+\item
+A separator does not appear before or after a character literal or variable.
+\item
+A separator does not appear before or after a null (empty) C string, which is a local mechanism to disable insertion of the separator character.
+\item
+A separator does not appear before a C string starting with the characters: \lstinline[mathescape=off,basicstyle=\tt]@([{=$@
+\item
+A seperator does not appear after a C string ending with the characters: \lstinline[basicstyle=\tt]@,.;!?)]}%@
+\item
+{\lstset{language=CFA,deletedelim=**[is][]{`}{`}}
+A seperator does not appear before or after a C string begining/ending with the quote or whitespace characters: \lstinline[basicstyle=\tt,showspaces=true]@`'": \t\v\f\r\n@
+}%
+\item
+There are routines to set and get the separator string, and manipulators to toggle separation on and off in the middle of output.
+\end{list}
+
 
 \section{Evaluation}
