Index: c/examples/rational.cc
===================================================================
--- src/examples/rational.cc	(revision 81912032b17ba009d0af2f3c783bdf37fc024161)
+++ 	(revision )
@@ -1,198 +1,0 @@
-#include "rationalnumber.h"
-
-#include <iostream>
-#include <cstdlib>					// exit
-using namespace std;
-
-static struct {
-    int gcd, con, copy, des, assn, rel, add, sub, mul, div, in, out;
-} stats;						// implicitly initialized to 0
-
-static int gcd( int a, int b ) {
-    for ( ;; ) {
-	int r = a % b;
-      if ( r == 0 ) break;
-	a = b;
-	b = r;
-    } // for
-    stats.gcd += 1;
-    return b;
-} // gcd
-
-void Rationalnumber::statistics() {
-    cerr
-	<< "gcd:"  << stats.gcd  << '\t'
-	<< "con:"  << stats.con  << '\t'
-	<< "copy:" << stats.copy << '\t'
-	<< "des:"  << stats.des  << '\t'
-	<< "assn:" << stats.assn << '\t'
-	<< "rel:"  << stats.rel  << '\t'
-	<< "add:"  << stats.add  << '\t'
-	<< "sub:"  << stats.sub  << '\t'
-	<< "mul:"  << stats.mul  << '\t'
-	<< "div:"  << stats.div  << '\t'
-	<< "in:"   << stats.in   << '\t'
-	<< "out:"  << stats.out
-	<< endl;
-} // Rationalnumber::statistics
-
-bool Rationalnumber::eq( Rationalnumber &r ) {
-    return num * r.denom == denom * r.num;
-} // Rationalnumber::Rationalnumber::eq
-
-bool Rationalnumber::lt( Rationalnumber &r ) {
-    //int temp1 = denom * r.denom, temp2 = num * r.denom, temp3 = denom * r.num;
-    //return temp1 > 0 && temp2 < temp3 || temp1 < 0 && temp2 > temp3;
-    // if denominator is always > 0, only this check is necessary
-    return num * r.denom < denom * r.num;
-} // Rationalnumber::Rationalnumber::lt
-
-void Rationalnumber::common1( int n, int d ) {
-    num = n;
-    denom = d;
-    stats.con += 1;
-} // Rationalnumber::common1
-
-int Rationalnumber::common2( int &n, int &d ) {
-    if ( d == 0 ) {
-	cerr << "Invalid rational number construction: denominator cannot be equal to 0." << endl;
-	exit( EXIT_FAILURE );
-    } // exit
-    if ( d < 0 ) { d = -d; n = -n; }			// move sign to numerator
-    return gcd( abs( n ), d );				// simplify
-} // Rationalnumber::common2
-
-Rationalnumber::Rationalnumber() {
-    common1( 0, 1 );
-} // Rationalnumber::Rationalnumber
-
-Rationalnumber::Rationalnumber( int n ) {
-    common1( n, 1 );
-} // Rationalnumber::Rationalnumber
-
-Rationalnumber::Rationalnumber( int n, int d ) {
-    int temp = common2( n, d );
-    common1( n / temp, d / temp );
-} // Rationalnumber::Rationalnumber
-
-Rationalnumber::Rationalnumber( const Rationalnumber &c ) {
-    num = c.num;
-    denom = c.denom;
-    stats.copy += 1;
-} // Rationalnumber::Rationalnumber
-
-Rationalnumber::~Rationalnumber() {
-    stats.des += 1;
-} // Rationalnumber::~Rationalnumber
-
-Rationalnumber &Rationalnumber::operator=( const Rationalnumber &r ) {
-    num = r.num;
-    denom = r.denom;
-    stats.assn += 1;
-    return *this;
-} // Rationalnumber::operator=
-
-int Rationalnumber::numerator() const {
-    return num;
-} // Rationalnumber::numerator
-
-int Rationalnumber::numerator( int n ) {
-    int prev = num;
-    int temp = gcd( abs( n ), denom );			// simplify
-    num = n / temp;
-    denom = denom / temp;
-    return prev;
-} // Rationalnumber::numerator
-		   
-int Rationalnumber::denominator() const {
-    return denom;
-} // Rationalnumber::denominator
-
-int Rationalnumber::denominator( int d ) {
-    int prev = denom;
-    int temp = common2( num, d );
-    num = num / temp;
-    denom = d / temp;
-    return prev;
-} // Rationalnumber::denominator
-
-bool operator==( Rationalnumber l, Rationalnumber r ) {
-    stats.rel += 1;
-    return l.eq( r );
-} // operator==
-
-bool operator!=( Rationalnumber l, Rationalnumber r ) {
-    stats.rel += 1;
-    return ! ( l.eq( r ) );
-} // operator!=
-
-bool operator<( Rationalnumber l, Rationalnumber r ) {
-    stats.rel += 1;
-    return l.lt( r );
-} // operator<
-
-bool operator<=( Rationalnumber l, Rationalnumber r ) {
-    stats.rel += 1;
-    return l.lt( r ) || l.eq( r );
-} // operator<=
-
-bool operator>( Rationalnumber l, Rationalnumber r ) {
-    stats.rel += 1;
-    return ! ( l.lt( r ) || l.eq( r ) );
-} // operator>
-
-bool operator>=( Rationalnumber l, Rationalnumber r ) {
-    stats.rel += 1;
-    return ! ( l.lt( r ) );
-} // operator>=
-
-Rationalnumber Rationalnumber::operator-() {
-    return Rationalnumber( -num, denom );
-} // Rationalnumber::operator-
-
-Rationalnumber operator+( Rationalnumber l, Rationalnumber r ) {
-    stats.add += 1;
-    if ( l.denom == r.denom ) {				// special case
-	return Rationalnumber( l.num + r.num, l.denom );
-    } else {
-	return Rationalnumber( l.num * r.denom + l.denom * r.num, l.denom * r.denom );
-    } // if
-} // operator+
-
-Rationalnumber operator-( Rationalnumber l, Rationalnumber r ) {
-    stats.sub += 1;
-    if ( l.denom == r.denom ) {				// special case
-	return Rationalnumber( l.num - r.num, l.denom );
-    } else {
-	return Rationalnumber( l.num * r.denom - l.denom * r.num, l.denom * r.denom );
-    } // if
-} // operator-
-
-Rationalnumber operator*( Rationalnumber l, Rationalnumber r ) {
-    stats.mul += 1;
-    return Rationalnumber( l.num * r.num, l.denom * r.denom );
-} // operator*
-
-Rationalnumber operator/( Rationalnumber l, Rationalnumber r ) {
-    stats.div += 1;
-    if ( r.num < 0 ) { r.num = -r.num; r.denom = -r.denom; }
-    return Rationalnumber( l.num * r.denom, l.denom * r.num );
-} // operator/
-
-istream &operator>>( istream &is, Rationalnumber &r ) {
-    stats.in += 1;
-    is >> r.num >> r.denom;
-    int temp = Rationalnumber::common2( r.num, r.denom );
-    r.num /= temp;
-    r.denom /= temp;
-    return is;
-} // operator>>
-
-ostream &operator<<( ostream &os, Rationalnumber r ) {
-    stats.out += 1;
-    return os << r.num << "/" << r.denom;
-} // operator<<
-
-// Local Variables: //
-// compile-command: "make rationalnumber" //
-// End: //
Index: src/libcfa/iostream
===================================================================
--- src/libcfa/iostream	(revision 81912032b17ba009d0af2f3c783bdf37fc024161)
+++ src/libcfa/iostream	(revision c443d1d3435a17963bd6f81fa826d1d31a83512a)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Feb 24 21:09:09 2017
-// Update Count     : 94
+// Last Modified On : Mon Mar  6 17:48:01 2017
+// Update Count     : 97
 //
 
@@ -68,6 +68,9 @@
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const void * );
 
+// tuples
+forall( dtype ostype, otype T, ttype Params | ostream( ostype ) | writeable( T ) | { ostype * ?|?( ostype *, Params ); } ) ostype * ?|?( ostype * os, T arg, Params rest );
+
+// manipulators
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, ostype * (*)( ostype * ) );
-// manipulators
 forall( dtype ostype | ostream( ostype ) ) ostype * endl( ostype * );
 forall( dtype ostype | ostream( ostype ) ) ostype * sepOn( ostype * );
Index: src/libcfa/iostream.c
===================================================================
--- src/libcfa/iostream.c	(revision 81912032b17ba009d0af2f3c783bdf37fc024161)
+++ src/libcfa/iostream.c	(revision c443d1d3435a17963bd6f81fa826d1d31a83512a)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Feb 24 21:09:59 2017
-// Update Count     : 307
+// Last Modified On : Mon Mar  6 17:48:05 2017
+// Update Count     : 312
 //
 
@@ -155,13 +155,13 @@
 	enum { Open = 1, Close, OpenClose };
 	static const unsigned char mask[256] = {
-		// opening delimiters
+		// opening delimiters, no space after
 		['('] : Open, ['['] : Open, ['{'] : Open,
-		['$'] : Open, [(unsigned char)'£'] : Open, [(unsigned char)'¥'] : Open,
+		['$'] : Open, ['='] : Open, [(unsigned char)'£'] : Open, [(unsigned char)'¥'] : Open,
 		[(unsigned char)'¡'] : Open, [(unsigned char)'¿'] : Open, [(unsigned char)'«'] : Open,
-		// closing delimiters
+		// closing delimiters, no space before
 		[','] : Close, ['.'] : Close, [':'] : Close, [';'] : Close, ['!'] : Close, ['?'] : Close,
 		[')'] : Close, [']'] : Close, ['}'] : Close,
 		['%'] : Close, [(unsigned char)'¢'] : Close, [(unsigned char)'»'] : Close,
-		// opening-closing delimiters
+		// opening-closing delimiters, no space before or after
 		['\''] : OpenClose, ['`'] : OpenClose, ['"'] : OpenClose,
 		[' '] : OpenClose, ['\f'] : OpenClose, ['\n'] : OpenClose, ['\r'] : OpenClose, ['\t'] : OpenClose, ['\v'] : OpenClose, // isspace
@@ -198,4 +198,13 @@
 
 
+// tuples
+forall( dtype ostype, otype T, ttype Params | ostream( ostype ) | writeable( T ) | { ostype * ?|?( ostype *, Params ); } )
+ostype * ?|?( ostype * os, T arg, Params rest ) {
+	os | arg | ", ";
+	os | rest;
+} // ?|?
+
+
+// manipulators
 forall( dtype ostype | ostream( ostype ) )
 ostype * ?|?( ostype * os, ostype * (* manip)( ostype * ) ) {
