キーワード:ユーザー定義手続が副作用を持たないことを宣言します。純粋手続は,FUNCTION または SUBROUTINE 文中で,PURE (または ELEMENTAL) 接頭辞を使って指定されたユーザー定義手続です。純粋手続は Fortran 95 の機能です。
純粋手続は副作用を持ちません。純粋手続は以下の点を除けば,プログラムの状態に何の影響も与えません。
関数の場合,値を返します。
サブルーチンの場合,INTENT(OUT) および INTENT(INOUT) パラメタを変更します。
以下の組込みおよびライブラリー手続は,暗黙のうちに純粋手続となります。
すべての組込み関数
要素別処理組込みサブルーチン MVBITS
文関数は,その関数が引用するすべての関数が純粋である場合にのみ純粋となります。
規則と振る舞い
手続引数とポインタ引数を除き,手続の宣言部のすべての仮引数に対して,次の INTENT を宣言する必要があります。
関数:INTENT(IN)
サブルーチン:任意の INTENT (IN,OUT,または INOUT)
純粋手続中で宣言される局所変数 (任意の内部手続中で宣言される変数を含む) は,以下のことを行ってはなりません。
SAVE 属性を宣言する
型宣言文または DATA 文で初期化される
以下の変数は,純粋手続 (および任意の内部手続) での使用に制約があります。
大域変数
INTENT(IN) を持つ (または INTENT が宣言されていない) 仮引数
大域変数の任意の部分に記憶域が結合されているオブジェクト
これらの変数は,以下の文脈では使用できません。
値の変更を引き起こす文脈。たとえば,以下の用途に使うことはできません。
代入文またはポインタ代入文の左辺
INTENT(OUT),INTENT(INOUT),または POINTER 属性を持つ仮引数に結合された実引数
DO 文,FORALL 文,または DO 形反復の指標変数
ASSIGN 文の変数
READ 文の入力項目
WRITE 文の内部ファイル装置
ALLOCATE,DEALLOCATE,または NULLIFY 文のオブジェクト
I/O 文中の IOSTAT あるいは SIZE 指定子,または ALLOCATE あるいは DEALLOCATE 文の STAT 指定子
その変数へのポインタを作成する文脈。たとえば,以下の用途に使うことはできません。
ポインタ代入文の指示先
構造型が任意のレベルでポインタ構成要素を持つ場合,その構造型変数 (構造型へのポインタを含む) への代入の右辺
純粋手続は,以下のものを含んでいてはなりません。
任意の外部 I/O 文 (I/O 装置が外部ファイル装置番号か * である READ または WRITE 文を含む)
PAUSE 文
STOP 文
純粋手続は,他の手続が制約されるような文脈で使用することができます。
FORALL 文で直接に呼び出したり,FORALL 文の選別式で使用したりすることができます。
純粋手続から呼び出すことができます。純粋手続は他の純粋手続しか呼び出すことができません。
純粋手続への実引数として渡すことができます。
手続がこれらの文脈で使用される場合,そのインタフェースは明示的でなくてはならず,そのインタフェースで純粋として宣言されていなくてはなりません。
関連情報
ELEMENTAL,FORALL,FUNCTION,SUBROUTINE
例
次に純粋関数を示します。
PURE FUNCTION DOUBLE(X) REAL, INTENT(IN) :: X DOUBLE = 2 * X END FUNCTION DOUBLE
以下に他の例を示します。
PURE INTEGER FUNCTION MANDELBROT(X) COMPLEX, INTENT(IN) :: X COMPLEX :: XTMP INTEGER :: K ! SHARED_DEFS は宣言 INTEGER ITOL を含んでいると仮定 USE SHARED_DEFS K = 0 XTMP = -X DO WHILE (ABS(XTMP) < 2.0 .AND. K < ITOL) XTMP = XTMP**2 - X K = K + 1 END DO ITER = K END FUNCTION
次に,上記の関数をインタフェース宣言で使用している例を示します。
INTERFACE PURE INTEGER FUNCTION MANDELBROT(X) COMPLEX, INTENT(IN) :: X END FUNCTION MANDELBROT END INTERFACE
次に,MANDELBROT 関数を呼び出して,配列のすべての要素を更新している FORALL 構文を示します。
FORALL (I = 1:N, J = 1:M) A(I,J) = MANDELBROT(COMPLX((I-1)*1.0/(N-1), (J-1)*1.0/(M-1))) END FORALL