GLOBAL DECLARE Alive : INTEGER ENDGLOBAL CLASS Box Value : INTEGER OVERLOAD PROCEDURE NEW() Alive <- Alive + 1 ENDPROCEDURE OVERLOAD IMPLICIT PROCEDURE NEW(Number : INTEGER) Value <- Number Alive <- Alive + 1 ENDPROCEDURE OVERLOAD PROCEDURE NEW(BYREF Other : Box) Value <- Other.Value Alive <- Alive + 1 ENDPROCEDURE PROCEDURE DELETE() Alive <- Alive - 1 ENDPROCEDURE ENDCLASS FUNCTION Read(Value : Box) RETURNS INTEGER RETURN Value.Value ENDFUNCTION OVERLOAD FUNCTION Pick(Value : Box) RETURNS INTEGER RETURN 100 + Value.Value ENDFUNCTION OVERLOAD FUNCTION Pick(Value : INTEGER) RETURNS INTEGER RETURN 200 + Value ENDFUNCTION OVERLOAD FUNCTION Only(Value : Box) RETURNS INTEGER RETURN Value.Value ENDFUNCTION OVERLOAD FUNCTION OPERATOR+(A : Box, B : Box) RETURNS INTEGER RETURN A.Value + B.Value ENDFUNCTION OVERLOAD FUNCTION OPERATOR=(A : Box, B : Box) RETURNS BOOLEAN RETURN A.Value = B.Value ENDFUNCTION FUNCTION Make() RETURNS Box RETURN 9 ENDFUNCTION PROCEDURE Exercise() DECLARE B : Box B <- 7 OUTPUT B.Value, ":", Read(8), ":", Pick(1), ":", Only(6), ":", B + 2 OUTPUT Read(Make()) CASE OF B 7 : OUTPUT TRUE OTHERWISE : OUTPUT FALSE ENDCASE ENDPROCEDURE FUNCTION Fail() RETURNS INTEGER THROW ENDFUNCTION PROCEDURE Pair(Value : Box, Number : INTEGER) ENDPROCEDURE CALL Exercise() OUTPUT Alive TRY CALL Pair(1, Fail()) CATCH OUTPUT Alive ENDTRY