RATFOR版
# doudf.f -- undefine macro include ratfor.def subroutine doudf(argstk,i,j) integer i,j,argstk(ARGSIZE) integer a2 include cmacro.r4 if (j-i .lt. 1) return a2 = argstk(i + 2) call uninst(evalst(a2)) return end
WATCOM Fortran 77版は以下の通り。
c doudf.f -- undefine macro include ratfor.def subroutine doudf(argstk,i,j) integer i,j,argstk(ARGSIZE) integer a2 include cmacro.fi if (j-i .lt. 1) then return end if a2 = argstk(i + 2) call uninst(evalst(a2)) return end
組み込み関数"ifdef"の実装は、以下の通り。
RATFOR版
# doifd.r4 -- define if macro is defined include ratfor.def subroutine doifd(argstk,i,j) integer i,j,argstk(ARGSIZE) integer lookup integer a2,a3,a4 character junk(MAXDEF) include cmacro.fi if (j-i .lt. 4) return a2 = argstk(i + 2) a3 = argstk(i + 3) a4 = argstk(i + 4) if (lookup(evalst(a2),junk) .eq. YES) call pbstr(evalst(a3)) else call pbstr(evalst(a4)) return end
WATCOM Fortran 77版は以下の通り。
# doifd.r4 -- define if macro is defined include ratfor.def subroutine doifd(argstk,i,j) integer i,j,argstk(ARGSIZE) integer lookup integer a2,a3,a4 character junk(MAXDEF) include cmacro.fi if (j-i .lt. 4) return a2 = argstk(i + 2) a3 = argstk(i + 3) a4 = argstk(i + 4) if (lookup(evalst(a2),junk) .eq. YES) call pbstr(evalst(a3)) else call pbstr(evalst(a4)) return end
マクロの応用を紹介する。
文字列の長さを返す"len"。再帰的定義になっているが、込み入ってない。
define(len,[ifelse($1,,0,[incr(len(substr($1,2)))])])
文字列を定義する"string"。
string(name,"STRING")
とすると
integer name(6) data name(1)/LETS/ data name(2)/LETT/ data name(3)/LETR/ data name(4)/LETN/ data name(5)/LETG/ data name(6)/EOS/
と展開される。"string"の定義は、以下の通り。
define(string,[integer $1(len(substr($2,2))) str($1,substr($2,2),0) data $1(len(substr($2,2)))/EOS/ ])
下請けルーチンの"str"は、以下の通り。
define(str,[ifelse($2,",, data $1(incr($3))/[LET]substr($2,1,1)/ [str($1,substr($2,2),incr($3))])])
macro.r4中の
string(balp,"()")は、うまく展開できない。
セコメントをする