(* The Great Win32 Language Shootout http://dada.perl.it/shootout/ contributed by Isaac Gouy (Modula2 novice) To build: xc =m except To run: except 200000 *) MODULE Except; <* procinline + *> (* Prefer unqualified procedures *) FROM LanguageShootout IMPORT N; IMPORT EXCEPTIONS; FROM STextIO IMPORT WriteString, WriteLn; FROM SWholeIO IMPORT WriteCard; VAR lo, hi: CARDINAL; n, i: CARDINAL; source: EXCEPTIONS.ExceptionSource; TYPE Exceptions = (Lo_Exception, Hi_Exception); PROCEDURE Exception(): Exceptions; BEGIN RETURN VAL(Exceptions, EXCEPTIONS.CurrentNumber(source)); END Exception; PROCEDURE BlowUp(i: CARDINAL); BEGIN IF ODD(i) THEN EXCEPTIONS.RAISE(source, ORD(Hi_Exception), "HI Exception"); ELSE EXCEPTIONS.RAISE(source, ORD(Lo_Exception), "LO Exception"); END; END BlowUp; PROCEDURE Lo_Function(i: CARDINAL); BEGIN BlowUp(i); EXCEPT IF Exception() = Lo_Exception THEN INC(lo); RETURN; END; END Lo_Function; PROCEDURE Hi_Function(i: CARDINAL); BEGIN Lo_Function(i); EXCEPT IF Exception() = Hi_Exception THEN INC(hi); RETURN; END; END Hi_Function; PROCEDURE Some_Function(i: CARDINAL); BEGIN Hi_Function(i); EXCEPT WriteString("We shouldn't get here!"); WriteLn; RETURN; END Some_Function; BEGIN n := N(); lo := 0; hi := 0; EXCEPTIONS.AllocateSource(source); WHILE n > 0 DO DEC(n); Some_Function(i); END; WriteString("Exceptions: HI="); WriteCard(hi,1); WriteString(" / LO="); WriteCard(lo,1); WriteLn; END Except.