69 lines
2.1 KiB
Text
69 lines
2.1 KiB
Text
BEGIN
|
|
|
|
! ABSTRACTION FOR SIMULA'S TWO NUMERIC TYPES ;
|
|
CLASS NUMBER;
|
|
VIRTUAL:
|
|
PROCEDURE OUT IS PROCEDURE OUT;;
|
|
BEGIN
|
|
END NUMBER;
|
|
|
|
NUMBER CLASS INTEGERNUMBER(INTVAL); INTEGER INTVAL;
|
|
BEGIN
|
|
PROCEDURE OUT; OUTINT(INTVAL, 10);
|
|
END INTEGERNUMBER;
|
|
|
|
NUMBER CLASS REALNUMBER(REALVAL); REAL REALVAL;
|
|
BEGIN
|
|
PROCEDURE OUT; OUTFIX(REALVAL, 4, 10);
|
|
END REALNUMBER;
|
|
|
|
|
|
! SIMULA CANNOT RETURN FUNCTIONS - SIMULATE FUNCTIONS WITH CLASSES ;
|
|
CLASS ACCUMULATOR(ACC); REF(NUMBER) ACC;
|
|
BEGIN
|
|
|
|
PROCEDURE SWITCHTOREAL(Y); REAL Y;
|
|
BEGIN
|
|
REF(REALNUMBER) NEWACC;
|
|
NEWACC :- NEW REALNUMBER(ACC QUA INTEGERNUMBER.INTVAL);
|
|
NEWACC.REALVAL:= NEWACC.REALVAL + Y;
|
|
ACC :- NEWACC;
|
|
END SWITCHTOREAL;
|
|
|
|
REF(NUMBER) PROCEDURE ACCUMULATE(OTHERNUM); REF(NUMBER) OTHERNUM;
|
|
BEGIN
|
|
INSPECT ACC
|
|
WHEN INTEGERNUMBER DO
|
|
BEGIN
|
|
INSPECT OTHERNUM
|
|
WHEN INTEGERNUMBER DO
|
|
ACC QUA INTEGERNUMBER.INTVAL
|
|
:= ACC QUA INTEGERNUMBER.INTVAL + INTVAL
|
|
WHEN REALNUMBER DO
|
|
SWITCHTOREAL(REALVAL)
|
|
END
|
|
WHEN REALNUMBER DO
|
|
BEGIN
|
|
INSPECT OTHERNUM
|
|
WHEN INTEGERNUMBER DO
|
|
ACC QUA REALNUMBER.REALVAL
|
|
:= ACC QUA REALNUMBER.REALVAL + INTVAL
|
|
WHEN REALNUMBER DO
|
|
ACC QUA REALNUMBER.REALVAL
|
|
:= ACC QUA REALNUMBER.REALVAL + REALVAL
|
|
END;
|
|
ACCUMULATE :- ACC;
|
|
END ACCUMULATE;
|
|
|
|
PROCEDURE OUT; ACC.OUT;
|
|
|
|
END FOO;
|
|
|
|
|
|
REF(ACCUMULATOR) FOO;
|
|
FOO :- NEW ACCUMULATOR(NEW INTEGERNUMBER(1)); FOO.OUT; OUTIMAGE;
|
|
FOO.ACCUMULATE(NEW INTEGERNUMBER(5)); FOO.OUT; OUTIMAGE;
|
|
NEW ACCUMULATOR(NEW INTEGERNUMBER(3));
|
|
FOO.ACCUMULATE(NEW REALNUMBER(2.3)); FOO.OUT; OUTIMAGE;
|
|
|
|
END.
|