ILE-RPGではIF文も進化していてこれまでは
SURYO IFGT *ZERO
のように演算項目 1と 2の両方を使って比較していたのだが
演算項目2 だけを使う IF文として
IF SURYO > 0
のように書くことができる。
このIF命令は組込み関数の記述もサポートしていて
今まではある文字フィールド : STRING の先頭の1文字が
* であるかどうか検査するには
MOVEL STRING FLD1 1 FLD1 IFEQ '*' : ENDIF
のように一旦別のフィールド: FLD1 に取り出してから
調べる必要があったが IF文を使うと
IF %SUBST(STRING:1:1) = '*' : ENDIF
のようにして一発で調べることができ、このほうが
直感的でわかりやすい記述になる。
しかし、それならばと
%SUBST(STRING:1:1) IFEQ '*' '*' IFEQ %SIBST(STRING:1:1)
という演算は仕様として許可されていない。
ところで
IF %SUBST(STRING:1:1) = '*' : ENDIF
と記述すると IF文の演算項目は演算項目2 + 3 の長さとなるので
長く使えるのだがそれでも長さが不足してしまう場合がある。
IF %TRIMR(%SUBST:STRING:1:10)) = NULL
など組込み関数を複合化したり特に QUALIFIED したDS(=データ・ストラクチャー)
を定義したりすると
IF %SUBST(FORMAT.INDCATOR:1:5) = '12345'
のような記述となると演算項目の入力欄が足りなくなってしまう。
そこで登場するのがフリー・フォーマットである。
フリー・フォーマットであれば
/FREE IF %SUBST(FORMAT.INDCATOR:1:5) = '12345'; : ENDIF; /END-FREE
のように演算項目全体を使って記述することができるので
十分長いエリアを使うことができ、入力欄に困ることはない。
新しいIF文を使う場合でもやはりフリー・フォーマットが有効なようである。