7.93.2 SUBROUTINEについてのコメント/警告
EXECUTEコマンドでサブルーチンに渡すパラメータとして、フィールド名、英数字リテラル、数値リテラル、システム変数、またはプロセス・パラメータを使用できます。
サブルーチン内で定義する(すなわち、PARMSパラメータで指定する)パラメータは、フィールド名でなければなりません。また、PARMSパラメータで指定するすべてのフィールドは、LANSAデータ・ディクショナリ、またはファンクション内でDEFINEコマンドによって定義されていなければなりません。
PARMSパラメータに属性*BOTHまたは*RECEIVEDを指定した場合、EXECUTEコマンドのWITH_PARMSパラメータで指定された値が、サブルーチンの実行直前に、関連付けられたSUBROUTINEコマンドのPARMSパラメータで指定したフィールドにマッピングされます。
サブルーチンの実行が完了すると、SUBROUTINEコマンドのPARMSパラメータで指定したフィールドが、EXECUTEコマンドのWITH_PARMSパラメータで指定された値にマッピングされます。ただし、WITH_PARMS値がリテラル値(英数字または数値)、システム変数、プロセス・パラメータである場合、またはパラメータに属性*RECEIVEDが指定されている場合、フィールドはマッピングされません。
パラメータのデフォルトのマッピング値は*BOTHです。ただし、多少の手間はかかっても、RECEIVEDまたは*RETURNEDを指定すると、パラメータのマッピングに要する時間を短縮することができます。
サブルーチンは、ファンクション内の任意の場所にコーディングできます。また、以下のように、相互にネストすることも可能です。
SUBROUTINE NAME(SUB01)
..........
DISPLAY .. etc, etc
SUBROUTINE NAME(SUB02)
..........
..........
..........
ENDROUTINE (subroutine SUB02)
CHANGE .. etc,etc
..........
SUBROUTINE NAME(SUB03)
..........
..........
..........
ENDROUTINE (subroutine SUB03)
..........
GOTO .....
..........
..........
ENDROUTINE (subroutine SUB01)
ただし、多くのプログラマは、サブルーチンをネストせずに、ファンクションの最後にプログラムすることを好む傾向にあります。
サブルーチンを使用頻度の高いものから順にコーディングすると、パフォーマンスがわずかに向上するという利点が得られます。最も使用頻度の高いサブルーチンを最初にコーディングすれば、サブルーチンの実行を要求した際のオペレーティング・システムの負荷が小さくなります。
上記の例では、サブルーチンSUB02がDISPLAYコマンドとCHANGEコマンドの間にあるにも関わらず、DISPLAYコマンドに「続いて」(すなわち、DISPLAYコマンドの実行後に) CHANGEコマンドが実行されます。この位置にSUB02を配置しても、このサブルーチンは実行されません。SUB02を実行するには、EXECUTEコマンドを使用しなければなりません。
· サブルーチンは、ファンクション内の任意の場所にコーディングしたり、相互にネストしたりできますが、これによって、サブルーチンまたはサブルーチンで宣言されるフィールドの「スコープ」が指定されるわけではありません。「スコープ」または「スコープ指定」は、PL/1など一部のコンピュータ言語の機能で、LANSAでは提供されません。