RosettaCodeData/Task/Accumulator-factory/Simula/accumulator-factory.simula
2023-07-01 13:44:08 -04:00

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.