PURE

キーワード:ユーザー定義手続が副作用を持たないことを宣言します。純粋手続は,FUNCTION または SUBROUTINE 文中で,PURE (または ELEMENTAL) 接頭辞を使って指定されたユーザー定義手続です。純粋手続は Fortran 95 の機能です。

純粋手続は副作用を持ちません。純粋手続は以下の点を除けば,プログラムの状態に何の影響も与えません。

以下の組込みおよびライブラリー手続は,暗黙のうちに純粋手続となります。

文関数は,その関数が引用するすべての関数が純粋である場合にのみ純粋となります。

規則と振る舞い

手続引数とポインタ引数を除き,手続の宣言部のすべての仮引数に対して,次の INTENT を宣言する必要があります。

純粋手続中で宣言される局所変数 (任意の内部手続中で宣言される変数を含む) は,以下のことを行ってはなりません。

以下の変数は,純粋手続 (および任意の内部手続) での使用に制約があります。

これらの変数は,以下の文脈では使用できません。

純粋手続は,以下のものを含んでいてはなりません。

純粋手続は,他の手続が制約されるような文脈で使用することができます。

手続がこれらの文脈で使用される場合,そのインタフェースは明示的でなくてはならず,そのインタフェースで純粋として宣言されていなくてはなりません。

関連情報

ELEMENTALFORALLFUNCTIONSUBROUTINE

次に純粋関数を示します。

	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