The following ALGOL library, compiled as OBJECT/SAMPLE/DYNAMICLIB, uses dynamic and indirect provision. This library references the library OBJECT/SAMPLE/LIBRARY in the preceding example:
BEGIN
TASK LIB1TASK, LIB2TASK;
LIBRARY SAMLIB(TITLE= “OBJECT/SAMPLE/LIBRARY.”);
INTEGER PROCEDURE FACT(N);
INTEGER N;
LIBRARY SAMLIB;
PROCEDURE DYNLIB1;
% LIBRARY PROVIDED DYNAMICALLY AND INDIRECTLY
BEGIN % PRINTS DATE WITH TIME.
LIBRARY SAMLIB (TITLE=“OBJECT/SAMPLE/LIBRARY.”);
PROCEDURE DAYTIME(TOARRAY, WHERE);
ARRAY TOARRAY[*];
INTEGER WHERE;
LIBRARY SAMLIB;
EXPORT DAYTIME;
FREEZE(TEMPORARY);
END; % OF DYNLIB1.
PROCEDURE DYNLIB2;
% LIBRARY PROVIDED DYNAMICALLY
BEGIN % PRINTS DATE WITHOUT TIME.
PROCEDURE DAYTIME(TOARRAY, WHERE);
ARRAY TOARRAY[*];
INTEGER WHERE;
BEGIN
REAL T;
T:= TIME(7);
REPLACE POINTER(TOARRAY, 8) + WHERE
BY T.[35:6] FOR 2 DIGITS, “-”,
T.[29:6] FOR 2 DIGITS, “-”,
T.[47:12] FOR 4 DIGITS;
END; % OF DAYTIME.
EXPORT DAYTIME;
FREEZE(TEMPORARY);
END; % OF DYNLIB2
% THE SELECTION PROCEDURE.
PROCEDURE THESELECTIONPROC(LIBPARSTR, NAMINGPROC);
VALUE LIBPARSTR;
EBCDIC STRING LIBPARSTR;
PROCEDURE NAMINGPROC(LIBTASK);
TASK LIBTASK; FORMAL;
BEGIN
IF LIBPARSTR EQL “WITH TIME” THEN
BEGIN
IF LIB1TASK.STATUS NEQ VALUE(FROZEN) THEN
PROCESS DYNLIB1 [LIB1TASK];
NAMINGPROC(LIB1TASK);
DISPLAY(“ *** CALLING DYNLIB1 “);
END
ELSE
BEGIN
IF LIB2TASK.STATUS NEQ VALUE(FROZEN) THEN
PROCESS DYNLIB2 [LIB2TASK];
NAMINGPROC(LIB2TASK);
DISPLAY(“ *** CALLING DYNLIB2 “);
END;
END; % OF THE SELECTION PROCEDURE
PROCEDURE DAYTIME(TOARRAY, WHERE);
ARRAY TOARRAY[*];
INTEGER WHERE;
BY CALLING THESELECTIONPROC;
EXPORT FACT % PROVIDED INDIRECTLY.
,DAYTIME; % PROVIDED DYNAMICALLY
FREEZE(TEMPORARY);
END.
