'begin'
	'comment'
		The Whetstone Benchmark.

		See:
		A Synthetic Benchmark, 
		H.J. Curnow and B.A. Whichmann, 
		The Computing Journal, Volume 19  Number 1
					Feb 1976, P. 43-49

		Some results
		(in thousands of Whetstone Instructions per second):

		IBM 3090:  	(Delft ?) Algol Compiler	5000
		Sun 3/60: 	Nase Algol Interpreter		10
				Nase Algol2C			400
		Sparc 2: 	Nase Algol Interpreter		63
				Nase Algol2C			4200
		Pyramid ??: 	Nase Algol Interpreter		20

		``Nase'' indicates NASE A60.
	;

	'real' x1, x2, x3, x4, x, y, z, t, t1, t2;
	'array' e1[1:4];
	'integer' i, j, k, l, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,n11;

	'procedure' pa(e);
	'array' e;
	'begin'
		'integer' j;
		
		j := 0;
	lab:
		e[1] := (e[1] + e[2] + e[3] - e[4]) * t;
		e[2] := (e[1] + e[2] - e[3] + e[4]) * t;
		e[3] := (e[1] - e[2] + e[3] + e[4]) * t;
		e[4] := (- e[1] + e[2] + e[3] + e[4]) / t2;
		j := j + 1;
		'if' j < 6 'then'
			'goto' lab;
	'end';

	'procedure' p0;
	'begin'
		e1[j] := e1[k];
		e1[k] := e1[l];
		e1[l] := e1[j];
	'end';

	'procedure' p3(x, y, z);
	'value' x, y;
	'real' x, y, z;
	'begin'
		x := t * (x + y);
		y := t * (x + y);
		z := (x + y) / t2;
	'end';

	'procedure' pout (n, j, k, x1, x2, x3, x4);
	'value' n, j, k, x1, x2, x3, x4;
	'integer' n, j, k;
	'real' x1, x2, x3, x4;
	'begin'
		outreal (1, n);
		outreal (1, j);
		outreal (1, k);
		outreal (1, x1);
		outreal (1, x2);
		outreal (1, x3);
		outreal (1, x4);
		outstring (1, "\n");
	'end';

	'comment' initialize constants ;

	t := 0.499975;
	t1 := 0.50025;
	t2 := 2.0;

	'comment' read the value of i, controlling total wight: if i = 10 the
		total whight is one million Whetstone instructions ;

	'comment' inreal (2, i) ;

	i := 10;

	n1 := 0;		n2 := 12 * i;		n3 := 14 * i;
	n4 := 345 * i;		n5 := 0;		n6 := 210 * i;
	n7 := 32 * i;		n8 := 899 * i;		n9 := 616 * i;
	n10 := 0;		n11 := 93 * i;

	'comment' module 1: simple identifiers ;

	x1 := 1.0;
	x2 := x3 := x4 := - 1.0;

	'for' i := 1 'step' 1 'until' n1 'do'
	'begin'
		x1 := (x1 + x2 + x3 - x4) * t;
		x2 := (x1 + x2 - x3 + x4) * t;
		x3 := (x1 - x2 + x3 + x4) * t;
		x4 := (- x1 + x2 + x3 + x4) * t;
	'end';

	pout (n1, n1, n1, x1, x2, x3, x4);

	'comment' module 2: array elements ;

	e1[1] := 1.0;
	e1[2] := e1[3] := e1[4] := -1.0;

	'for' i := 1 'step' 1 'until' n2 'do'
	'begin'
		e1[1] := (e1[1] + e1[2] + e1[3] - e1[4]) * t;
		e1[2] := (e1[1] + e1[2] - e1[3] + e1[4]) * t;
		e1[3] := (e1[1] - e1[2] + e1[3] + e1[4]) * t;
		e1[4] := (- e1[1] + e1[2] + e1[3] + e1[4]) * t;
	'end';

	 pout (n2, n3, n2, e1[1], e1[2], e1[3], e1[4]);
	
	'comment' module 3: as array parameter ;

	'for' i:= 1 'step' 1 'until' n3 'do'
		pa(e1);

	pout (n3, n2, n2, e1[1], e1[2], e1[3], e1[4]);

	'comment' module 4: conditional jumps ;

	j := 1;
	'for' i := 1 'step' 1 'until' n4 'do'
	'begin'
		'if' j = 1 'then'
			j := 2
		'else'
			j := 3;

		'if' j > 2 'then'
			j := 0
		'else'
			j := 1;

		'if' j < 1 'then'
			j := 1
		'else'
			j := 0;
	'end';

	pout (n4, j, j, x1, x2, x3, x4);

	'comment' module 5: omitted ;

	'comment' module 6: integer arithmetik ;

	j := 1;	k := 2;	l := 3;

	'for' i := 1 'step' 1 'until' n6 'do'
	'begin'
		j := j * (k - j) * (l - k);
		k := l * k - (l - j) * k;
		l := (l - k) * (k + j) ;	 'comment' typo in TCJ ;
		e1[l-1] := j + k + l;
		e1[k-1] := j * k * l;
	'end';

	pout (n6, j, k, e1[1], e1[2], e1[3], e1[4]);

	'comment' module 7: trig functions ;

	x := y := 0.5;

	'for' i := 1 'step' 1 'until' n7 'do'
	'begin'
		x := t * arctan (t2 * sin (x) * cos (x) /
			(cos (x + y) + cos (x - y) - 1.0));
		y := t * arctan (t2 * sin (y) * cos (y) /
			(cos (x + y) + cos (x - y) - 1.0));
	'end';

	pout (n7, j, k, x, x, y, y);

	'comment' module 8: procedure calls ;

	x := y := z := 1.0;

	'for' i := 1 'step' 1 'until' n8 'do'
		p3 (x, y, z);

	pout (n8, j, k, x, y, z, z);

	'comment' module 9: array references ;

	j := 1;  k := 2;  l := 3;
	e1[1] := 1.0;  e1[2] := 2.0;  e1[3] := 3.0;

	'for' i := 1 'step' 1 'until' n9 'do'
		p0;

	pout (n9, j, k, e1[1], e1[2], e1[3], e1[4]);

	'comment' module 10: integer arithmetik ;

	j := 2;  k := 3;

	'for' i := 1 'step' 1 'until' n10 'do'
	'begin'
		j := j + k;
		k := j + k;
		j := k - j;
		k := k -j -j;
	'end';

	pout (n10, j, k, x1, x2, x3, x4);

	'comment' module 11: standard functions ;

	x := 0.75;
	'for' i := 1 'step' 1 'until' n11 'do'
		x := sqrt (exp (ln (x) / t1));
	
	pout (n11, j, k, x, x, x, x);
'end'

