BEGIN MODE MEMO = STRUCT (PROC (INT) BOOL f, INT limit, number, REF [] INT a);
OP NEXT = (REF MEMO m) VOID:
( INT i := limit OF m + 1;
WHILE NOT (f OF m)(i) DO i +:= 1 OD;
IF number OF m = UPB a OF m
THEN HEAP [2 * number OF m] INT b;
b [:number OF m] := a OF m;
a OF m := b
FI;
(a OF m)[number OF m +:= 1] := limit OF m := i );
PROC nextafter = (INT i, REF MEMO m) INT:
( WHILE limit OF m <= i DO NEXT m OD;
INT lo := 1, hi := number OF m, c;
WHILE hi > lo + 1
DO c := (hi + lo)%2; ((a OF m)[c] > i | hi | lo) := c OD;
(a OF m)[hi]);
OP INIT = (PROC (INT) BOOL f) MEMO:
((f, 0, 0, HEAP [1] INT := (0)));
PROC isprime = (INT i) BOOL:
CASE i IN FALSE, TRUE # special cases for 1,2 #
OUT (i MOD 2 = 0 OR i < 0 | FALSE # dispose of even/neg numbers #
| FOR j FROM 3 BY 2 WHILE j*j <= i
DO ( i MOD j = 0 | GOTO out # Bleeagh! # ) OD;
TRUE EXIT
out: FALSE)
ESAC;
MEMO primes := INIT isprime;
INT i := 0;
TO 1000 DO print (i := nextafter (i, primes)) OD
END