+---------------------------------Fortran 95---------------------------------+
純粋プロシージャーには副次作用がないため、コンパイラーが プロシージャーを呼び出す場合、特定の順序に束縛されません。 この例外は次のとおりです。
純粋プロシージャーは、FORALL ステートメントおよび構文で特に有用です。 参照されるすべてのプロシージャーに副次作用が起きないように設計されているからです。
次のコンテキストでは、プロシージャーは純粋でなければなりません。
組み込み関数 (RAND、 XL Fortran 拡張は除く) および MVBITS サブルーチンは必ず純粋となります。 純粋であると明示的に宣言する必要はありません。ステートメント関数は、参照する関数がすべて純粋である場合にのみ、 純粋になります。
純粋関数の specification_part は、すべての仮引き数が INTENT(IN) を持つこと (プロシージャー引き数を除く) および属性が POINTER である引き数を指定しなければなりません。純粋サブルーチンの specification_part は、 プロシージャー引き数、アスタリスク、および POINTER 属性を持つ引き数を除き、 すべての仮引き数のインテントを指定します。このような純粋プロシージャーの ためのインターフェース本体は同様に、 仮引き数の意図を指定しなければなりません。
純粋プロシージャーの execution_part および internal_subprogram_part は、値を変化させるコンテキスト、つまり副次作用を引き起こすコンテキストでは、INTENT(IN) の意図を持つ仮引き数、グローバル変数 (または関連したストレージであるオブジェクト)、またはそのサブオブジェクトを参照できません。純粋関数の execution_part および internal_subprogram_part は、 次のようなコンテキストでは、仮引き数、グローバル変数 (または関連した ストレージであるオブジェクト)、そのサブオブジェクトを使用してはなりません。
純粋プロシージャーは、どのエンティティーも VOLATILE であると指定できません。 また、VOLATILE であるデータへの参照を含める ことはできません。含めた場合、使用関連付けまたは ホスト関連付けを介してアクセス可能になります。 これには、NAMELIST I/O を介して生じるデータへの参照も 含まれます。
純粋プロシージャーでは、内部入出力だけを行うことができます。 したがって、入出力ステートメントの装置識別子をアスタリスク (*) にしたり、外部装置を参照したりしては いけません。 入出力ステートメントには以下があります。
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
+-----------------------------End of Fortran 95------------------------------+