The main documentation of the Replicate m4 Macros contains additional explanation of this code listing.
dnl dnl Author: Michael L. Hall dnl P.O. Box 1663, MS-D409, LANL dnl Los Alamos, NM 87545 dnl ph: 505-665-4312 dnl email: hall@lanl.gov dnl dnl Created on: 12/04/98 dnl Date: 03/21/00, 17:18:38 dnl Version: 4.9 dnl Define the REPLICATE macro. define([REPLICATE],[ forloop([i], 0, 7, [define([REP_NUMBER],[i]) REPLICATE_ROUTINE(i)]) ]) dnl Define the REPLICATE_ARRAYS macro. define([REPLICATE_ARRAYS],[ forloop([i], 1, 7, [define([REP_NUMBER],[i]) REPLICATE_ROUTINE(i)]) ]) dnl Define the ARRAY_ONLY macro. define([ARRAY_ONLY], [ifelse( [0], REP_NUMBER, [!], [])]) dnl Define the SCALAR_ONLY macro. define([SCALAR_ONLY], [ifelse( [0], REP_NUMBER, [], [!])]) dnl Define the REP_EXPAND command, which expands text with a glorified do-loop. dnl The arguments are: dnl dnl REP_NUMBER - The number of iterations. dnl $1 - Beginning text that is present if the iteration count is non-zero. dnl $2 - The text to be repeated in each iteration. The iteration variable, dnl i, may be used in this text. dnl $3 - Separator text to be put between iterations. dnl $4 - Final text that is present if the iteration count is non-zero. dnl dnl So, an iteration count of "0" yields no output, and an iteration count dnl of "4" yields: dnl dnl $1$2$3$2$3$2$3$2$4 dnl dnl Note that the separator text ($3) appears only 3 times. define([REP_EXPAND], [ifelse([0], REP_NUMBER, [], [$1[]forloop([i], 1, 1, [$2])])dnl ifelse(m4_eval(REP_NUMBER >= 2), 1, [forloop([i], 2, REP_NUMBER, [$3][$2])])dnl ifelse([0], REP_NUMBER, [], [$4])]) dnl Define the REPLICATE_INTERFACE macro. define([REPLICATE_INTERFACE],[ interface $1 forloop([i], 0, 7, [ module procedure $2_[]i ])dnl end interface ]) dnl Define some useful macros based on the REP_EXPAND macro. dnl REP_DECLARE: form --> real :: var1, var2, var3 dnl dnl $1 - Declaration type (everything up to the double colon). dnl $2 - Variable name to replicate, which should contain an "i" dnl for the iteration number. define([REP_DECLARE], [REP_EXPAND([$1 :: ], [$2], [, ], [])]) dnl REP_ALLOCATE: form --> ALLOCATE(R(var1, var2, var3)) dnl dnl $1 - Variable to allocate. dnl $2 - Dimensioning variable name to replicate, which should dnl contain an "i" for the iteration number. dnl $3 - Name for the status variable. define([REP_ALLOCATE], [REP_EXPAND([ALLOCATE($1(], [$2], [, ], [), stat=$3)])]) dnl REP_ARGS: form --> , var1, var2, var3 dnl dnl $1 - Variable name to replicate, which should contain an "i" dnl for the iteration number. define([REP_ARGS], [REP_EXPAND([, ], [$1], [, ], [])]) dnl Input text used to generate documentation: dnl module test_replicate dnl REPLICATE_INTERFACE([Generic_Routine], [Specific_Routine]) dnl contains dnl dnl define([REPLICATE_ROUTINE],[ dnl function Specific_Routine_$1 (R[]REP_ARGS([var[]i])) dnl type(real,$1) :: R dnl REP_DECLARE([type(integer)], [var[]i]) dnl REP_ALLOCATE(R, [var[]i], [status]) dnl ARRAY_ONLY DEALLOCATE(R) dnl SCALAR_ONLY R = 999. dnl <other routine contents> dnl end function Specific_Routine_$1 dnl dnl ]) dnl REPLICATE dnl end module test_replicate