ALGOL Circular Client Programs

The following ALGOL programs invoke each other. The first program is the client program.

BEGIN
LIBRARY L(TITLE=“OBJECT/MYLIB1”);
PROCEDURE PLIB1_A (R);
   VALUE R;
   REAL R;
   LIBRARY L;
REAL X;
.......
PLIB1_A (X);
.......
END.

The second program (MYLIB1) is a library that uses another library.

BEGIN
LIBRARY L(TITLE=“OBJECT/MYLIB2”);
REAL PROCEDURE PLIB2_A (R);
   VALUE R;
   REAL R;
   LIBRARY L;

REAL PROCEDURE PLIB1_A (R);
   VALUE R;
   REAL R;
   BEGIN
 .......
   PLIB1_A:= PLIB2_A (R);    %% Invokes a procedure in MYLIB2.
   END;

PROCEDURE PLIB1_B (P1, P2);
   VALUE P1;
   REAL P1, P2;
   BEGIN
 .......
   END;

EXPORT PLIB1_A, PLIB1_B;
FREEZE(TEMPORARY);
END.

The third program (MYLIB2) is a library that uses another library (MYLIB1).

BEGIN
LIBRARY L(TITLE=“OBJECT/MYLIB1”);
REAL PROCEDURE PLIB1_B (A, B);
   VALUE A;
   REAL A, B;
   LIBRARY L;

REAL PROCEDURE PLIB2_A (R);
   VALUE R;
   REAL R;
   BEGIN
   REAL X, Y;
 .......
   PLIB1_B (X, Y)             %% Procedure in MYLIB1; circular linkage
 .......                    %% is allowed, because MYLIB1 is frozen.
   PLIB2_A:=Y;
   END;

BOOLEAN PROCEDURE PLIB2_B (X);
   VALUE X;
   REAL X;
   BEGIN
 .......
   END;

EXPORT PLIB2_A, PLIB2_B;
FREEZE(TEMPORARY);
END.