+---------------------------------Fortran 95---------------------------------+
PURE プロシージャーには副次作用がないため、コンパイラーがプロシージャーを呼び出す場合、特定の順序に束縛されません。この例外は次のとおりです。
純粋プロシージャーは、FORALL ステートメントおよび FORALL 構造体で特に有用です。参照されるすべてのプロシージャーに副次作用が起きないように設計されているからです。
次のコンテキストでは、プロシージャーは純粋でなければなりません。
組み込み関数 (RAND、 XL Fortran 拡張は除く) および MVBITS サブルーチンは必ず純粋となります。 PURE 属性を持つと明示的に宣言する必要はありません。ステートメント関数は、参照する関数がすべて純粋である場合にのみ、純粋になります。
純粋関数の specification_part は、すべての仮引き数が IN の意図を持つこと (プロシージャー引き数を除く)、および属性が POINTER である引き数を指定しなければなりません。純粋のサブルーチンの specification_part は、すべての仮引き数 (プロシージャー引き数を除く)、アスタリスク、および POINTER 引き数を持つ引き数の意図を指定しなければなりません。このような純粋プロシージャーのためのインターフェース本体は同様に、仮引き数の意図を指定しなければなりません。
純粋プロシージャーの execution_part および internal_subprogram_part は、値を変化させるコンテキスト、つまり副次作用を引き起こすコンテキストでは、IN の意図を持つ仮引き数、グローバル変数 (または関連したストレージであるオブジェクト)、またはそのサブオブジェクトを参照できません。純粋関数の execution_part および internal_subprogram_part は、次のようなコンテキストでは、仮引き数、グローバル変数 (または関連したストレージであるオブジェクト)、そのサブオブジェクトを使用してはなりません。
純粋プロシージャーは、どのエンティティーも VOLATILE であると指定できません。また、VOLATILE であるデータへの参照を含めることはできません。含めた場合、使用関連付けまたはホスト関連付けを介してアクセス可能になります。これには、NAMELIST I/O を介して生じるデータへの参照も含まれます。
純粋プロシージャーでは、内部 I/O だけを行うことができます。したがって、I/O ステートメントの装置識別子をアスタリスク (*) にしたり、外部装置を参照したりすることはできません。 I/O ステートメントは、BACKSPACE、ENDFILE、REWIND、OPEN、CLOSE、INQUIRE、READ、PRINT、WAIT、および WRITE です。 PAUSE ステートメントおよび STOP ステートメントは、純粋プロシージャーでは使用できません。
純粋関数と純粋サブルーチンには、次の 2 つの違いがあります。
プロシージャーが純粋として定義されていない場合、インターフェース本体で純粋と宣言することはできません。しかし、その逆は真ではありません。プロシージャーが純粋と定義される場合、インターフェース本体で純粋と宣言する必要はありません。もちろん、インターフェース本体がプロシージャーを純粋と宣言しない場合、そのプロシージャー (明示的インターフェースを介して参照するとき) は、純粋プロシージャー参照だけが許可されるところでは参照として使用できません (たとえば、FORALL ステートメントの中)。
PROGRAM ADD INTEGER ARRAY(20,256) INTERFACE ! Interface required for PURE FUNCTION PLUS_X(ARRAY) ! a pure procedure INTEGER, INTENT(IN) :: ARRAY(:) INTEGER :: PLUS_X(SIZE(ARRAY)) END FUNCTION END INTERFACE INTEGER :: X X = ABS(-4) ! Intrinsic function ! is always pure FORALL (I=1:20, I /= 10) ARRAY(I,:) = I + PLUS_X(ARRAY(I,:)) ! Procedure references in ! FORALL must be pure END FORALL END PROGRAM PURE FUNCTION PLUS_X(ARRAY) INTEGER, INTENT(IN) :: ARRAY(:) INTEGER :: PLUS_X(SIZE(ARRAY)),X INTERFACE PURE SUBROUTINE PLUS_Y(ARRAY) INTEGER, INTENT(INOUT) :: ARRAY(:) END SUBROUTINE END INTERFACE X=8 PLUS_X = ARRAY+X CALL PLUS_Y(PLUS_X) END FUNCTION PURE SUBROUTINE PLUS_Y(ARRAY) INTEGER, INTENT(INOUT) :: ARRAY(:) ! Intent must be specified INTEGER :: Y Y=6 ARRAY = ARRAY+Y END SUBROUTINE
+------------------------------Fortran 95 の終り------------------------------+