JIS X 3001-1:2009 プログラム言語Fortran―第1部:基底言語 | ページ 13

                                                                                                   47
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
R448 型束縛手続部 is CONTAINS 文
[ 束縛 PRIVATE 文 ]
手続束縛文 [ 手続束縛文 ] ...
R449 束縛 PRIVATE 文 is PRIVATE
C455 (R448) 束縛 PRIVATE 文は,型定義がモジュールの宣言部にあるときだけ書くことができる。
R450 手続束縛文 is 個別束縛
or 総称束縛
or 後始末束縛
R451 個別束縛 is PROCEDURE [ ( 引用仕様名 ) [ [ , 束縛属性並び ] :: ]
束縛名 [ => 手続名 ]
C456 (R451) “=> 手続名” を書いたとき,区切りの 2 連コロンを省略してはならない。
C457 (R451) “=> 手続名” を書いたとき,引用仕様名を書いてはならない。
C458 (R451) 手続名は,参照可能なモジュール手続名か 又は 明示的引用仕様をもった外部手続名でなければ
ならない。
“=> 手続名” も引用仕様名も書かないとき,“=> 手続名” の手続名に束縛名が書かれたときと同じになる。
R452 総称束縛 is GENERIC [ , 参照許可属性 ] :: 総称指定 => 束縛名並び
C459 (R452) モジュールの宣言部内で,それぞれの総称束縛は,その派生型において同じ総称指定をもつ他の
すべての総称束縛と同じ参照許可属性を,明示的 又は 暗黙的に指定しなければならない。
C460 (R452) 束縛名並びの束縛名は,その型の個別束縛の名前でなければならない。
C461 (R452) 総称指定が総称名でないとき,それぞれの個別束縛は,当該実体仮引数 (4.5.3.3) をもたなけれ
ばならない。
C462 (R452) 総称指定が OPERATOR(利用者定義演算子) であるとき,それぞれの束縛の引用仕様は 12.3.2.1.1
で示す指定方法に従っていなければならない。
C463 (R452) 総称指定が ASSIGNMENT(=) であるとき,それぞれの束縛の引用仕様は 12.3.2.1.2 で示す指定方
法に従っていなければならない。
C464 (R452) 総称指定が派生型入出力総称指定であるとき,それぞれ束縛の引用仕様は 9.5.3.7 で示す指定方
法に従っていなければならない。引数 dtv(9.5.3.7.2 参照)の型は,その派生型定義の型名でなければ
ならない。
R453 束縛属性 is PASS [ ( 引数名 )
or NOPASS
or NON OVERRIDABLE
or DEFERRED
or 参照許可指定子
C465 (R453) 同じ束縛属性は,一つの束縛属性並び中に 2 回以上書いてはならない。
C466 (R451) 束縛の引用仕様が定義している型の仮引数をもたないとき,NOPASS を書かなければならない。
C467 (R451) ASS(引数名) を書いたとき,束縛の引用仕様には,引数名をもった仮引数を書かなければなら
ない。
C468 (R453) 一つの束縛属性並びに PASS と NOPASS を同時に書いてはならない。
C469 (R453) 一つの束縛属性並びに NON OVERRIDABLE と DEFERRED を同時に書いてはならない。

――――― [JIS X 3001-1 pdf 61] ―――――

  48
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
C470 (R453) 引用仕様名を書いたときに限り DEFERRED を書かなければならない。DEFERRED を書いたときに
限り,引用仕様名を書かなければならない。
C471 (R451) 上書き束縛 (4.5.6.2) は,上書きするものの束縛が遅延するときだけ,DEFERRED 属性を指定
しなければならない。
C472 (R451) ON OVERRIDABLE 属性をもった継承束縛 (4.5.6.1) を上書きしてはならない。
手続束縛文での束縛は,型束縛手続 (type-bound procedure) を指定する。型束縛手続は,当該実体仮引数 (4.5.3.3)
をもってもよい。総称束縛は,その個別束縛に対して型束縛の総称引用仕様を指定する。DEFERRED 属性をもつ束
縛は,遅延束縛 (deferred binding) とする。遅延束縛は,抽象型 (4.5.6) の定義中にだけ書かなければならない。
型束縛手続は,型定義の有効範囲の中で束縛名 (binding name) で識別してもよい。この名前は,個別束縛に対し
ては束縛名とし,総称指定が総称名である総称束縛に対しては総称名とする。後始末束縛 又は 総称指定が総称名と
異なる総称束縛は,束縛名をもたない。
個別束縛の引用仕様は,手続名によって指定された手続の引用仕様 又は 引用仕様名によって指定された手続の引
用仕様とする。
例 4.42 型 及び 型束縛手続の例
TYPE POINT
REAL :: X, Y
CONTAINS
PROCEDURE, PASS :: LENGTH => POINT_LENGTH
END TYPE POINT
...
ここで,次の定義が同じモジュールのモジュール副プログラム部の中にあるとする。
REAL FUNCTION POINT_LENGTH (A, B)
CLASS (POINT), INTENT (IN) :: A, B
POINT_LENGTH = SQRT ( (A%X - B%X)**2 + (A%Y - B%Y)**2 )
END FUNCTION POINT_LENGTH
一つの派生型定義内の複数の総称束縛に,同じ総称指定を書いてもよい。同じ総称指定をもつ追加された総称束縛
は,総称引用仕様を拡張する。
注記 4.43 総称手続名の場合とは異なり,総称型束縛手続名は,それと同じ型をもつ個別型束縛手続名と
同じ名前であってはならない(16.2 参照)。
型定義が束縛 PRIVATE 文を含むとき,型の手続束縛の暗黙の参照許可属性は非公開とし,束縛 PRIVATE 文を含
まないとき,公開とする。手続束縛の参照許可属性は,参照許可指定子によって明示的に指定してもよい。明示的な
指定がない場合は,宣言された暗黙の型定義による参照許可属性とする。
公開の型束縛手続は,その型のすべての参照可能な型の実体から参照可能とする。非公開の型束縛手続は,その型
定義を含むモジュールの中でだけ参照可能とする。
注記 4.44 型束縛手続の参照許可属性は,成分定義部の PRIVATE 文の影響を受けない。データ成分の参
照許可属性は,型束縛手続部の PRIVATE 文の影響を受けない。
4.5.5 後始末サブルーチン
R454 後始末束縛 is FINAL [ :: ] 後始末サブルーチン名並び
C473 (R454) 後始末サブルーチン名は,ちょうど一つの仮引数をもつモジュール手続の名前でなければなら

――――― [JIS X 3001-1 pdf 62] ―――――

                                                                                                   49
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
ない。その引数は,省略不可であり,定義しようとする派生型の,ポインタでもなく,割付け変数でもな
く,多相的でもない変数でなければならない。仮引数は,INTENT(OUT) であってはならない。
C474 (R454) 同じ型に対して,後始末サブルーチン名を 2 回以上指定してはならない。
C475 (R454) 同じ型に対して,同じ種別型パラメタ 及び 同じ次元数をもった仮引数をもつ後始末サブルーチ
ン名を 2 回以上指定してはならない。
キーワード FINAL は,後始末サブルーチン (nal subroutine) の並びを指定する。後始末サブルーチンは,その型
のデータ要素が後始末されるときに実行される(4.5.5.1 参照)。
派生型が後始末可能 (nalizable) であるとは,後始末サブルーチンをもっているか,又は ポインタでもなく割付け
成分でもない,後始末可能である型の成分をもっている場合とする。ポインタでないデータ要素は,その型が後始末
可能であるとき,後始末可能とする。
注記 4.45 後始末サブルーチンは,結果的には常に参照可能である。その型の参照許可属性,他の型束縛
手続 又は サブルーチン名自体によらず,要素を後始末するために後始末サブルーチンが呼ばれる。
注記 4.46 後始末サブルーチンは,型拡張による継承も上書きもできない。親型の後始末サブルーチンは,
直接拡張型の後始末サブルーチンが呼ばれた後に呼ばれる。
4.5.5.1 後始末の処理
後始末可能な要素だけが,後始末できる。要素が後始末される (nalized) とき,次の手順が順番に実施される。
(1) 要素の実行時の型が後始末サブルーチンをもち,その仮引数が後始末される要素と同じ種別型パラメタ 及び 同
じ次元数をもつ場合,その要素を実引数として後始末サブルーチンが呼び出される。そうでなくて,仮引数が後
始末される要素と同じ種別型パラメタをもつ要素別後始末サブルーチンが存在する場合は,その要素を実引数と
して後始末サブルーチンが呼び出される。そうでもなければ,この時点でサブルーチンは呼び出されない。
(2) 型定義に書かれた後始末可能な成分が,後始末される。後始末されようとしている要素が配列のとき,要素の配
列要素の後始末可能な成分が,個別に後始末される。
(3) 要素が直接拡張型であって,その親型が後始末可能であるとき,親成分は,後始末される。
複数の要素が,4.5.5.2 で示す条件の結果として後始末されるとき,後始末される順序は,処理系依存とする。後
始末サブルーチンは,既に後始末されている実体を引用も確定もしてはならない。
実体が後始末されていないとき,定義された状態は保持され,不定になることはない。
4.5.5.2 後始末される時期
ポインタが解放されると,その指示先は後始末される。割付け要素が解放されると,その要素は後始末される。
仮引数でも関数結果でもない,ポインタでもなく割付け実体でもない実体は,RETURN 文 又は END 文の実行に
よって未定義になる(16.5.6 の (3) 参照)直前に後始末される。実体がモジュール内で定義され,かつ そのモジュー
ルを参照する活動状態にある手続が存在しないとき,その実体が後始末されるかどうかは,処理系依存とする。
実行可能な構造構文が関数を参照しているとき,関数結果は,その参照を含む最も内側の実行可能な構造構文の実
行後に後始末される。
実行可能な構造構文が構造体構成子 又は 配列構成子を参照しているとき,その構成子で生成された要素は,その
参照を含む最も内側の実行可能な構造構文の実行後に後始末される。
有効域内の宣言式が関数を参照しているとき,関数結果は,その有効域内の実行構文の実行の直前に後始末される。
有効域中の宣言式が構造体構成子 又は 配列構成子を引用しているとき,構成子によって生成された要素は,その
有効域の実行構文の実行の前に後始末される。

――――― [JIS X 3001-1 pdf 63] ―――――

  50
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
手続が呼び出されるとき,INTENT(OUT) 属性をもつ仮引数と結合する実引数であり,ポインタでもなく割付け
実体でもない実体は,後始末される。
組込み代入が実行されるとき,変数は,式の評価後 かつ その変数の確定前に後始末される。
注記 4.47 記憶域の管理のために後始末を使うときは,利用者定義代入と組み合わせて使うことが多い。
実体がポインタ割付けによって割り付けられ,その後,ポインタ結合の状態が変更されたためにその実体へのすべ
てのポインタが到達不可能になった場合,後始末されるかどうかは,処理系依存とする。後始末されるときに,後始
末サブルーチンがいつ呼び出されるかは,処理系依存とする。
4.5.5.3 後始末されない要素
誤り条件(例えば,割付け処理の失敗など)又は STOP 文 若しくは END PROGRAM 文の実行のいずれかによっ
てプログラムの実行が終了した場合,終了の直前に存在していた要素は,後始末されない。
注記 4.48 SAVE 属性をもつか 又は 主プログラムで生成された,ポインタでもなく割付け実体でもない
実体は,RETURN 文 又は END 文の実行の直接の結果で後始末されることはない。
モジュール内の変数は,その定義状態 及び 値を保持しているとき,そのモジュールを参照する活
動状態にある手続が存在しなくても,後始末されない。
4.5.6 型の拡張
拡張可能型 (extensible type) は,BIND 属性をもたない非連続の派生型とする。
基底型 (base type) は,EXTENDS 属性をもたない拡張可能型とする。直接拡張型 (extended type) は,EXTENDS
属性をもつ型とする。直接拡張型の親型 (parent type) は,EXTENDS 属性に指定する型名とする。
注記 4.49 親型の名前は,USE 文を使って変更した局所名でもよい。
基底型は,それ自体だけの拡張型 (extension type) とする。直接拡張型は,それ自体 及び その親型が拡張型であ
るすべての型の拡張型とする。
抽象型 (abstract type) は,ABSTRACT 属性をもつ型とする。
例 4.50 遅延束縛 (4.5.4) は,型束縛手続の実現をその型の拡張まで遅延する。遅延束縛は,抽象型のと
きだけ書くことができる。実体の実行時の型は抽象型にならないので,遅延束縛は呼び出されない。
遅延束縛がないときは,抽象型の拡張が抽象型である必要はない。抽象型の例を次に示す。
TYPE, ABSTRACT :: FILE_HANDLE
CONTAINS
PROCEDURE(OPEN_FILE), DEFERRED, PASS(HANDLE) :: OPEN
...
END TYPE
より詳細な例を,C.1.4 に示す。
4.5.6.1 継承
直接拡張型は,親型のすべての型パラメタ,すべての成分,及び 上書き (4.5.6.2) も後始末もしない手続束縛を含
む。これらは,親型から直接拡張型へ継承 (inherit) されるという。継承は,これらが親型においてもっていたすべて
の属性を保持する。直接拡張型の派生型定義によって,型パラメタ,成分 及び 手続束縛を加えることができる。

――――― [JIS X 3001-1 pdf 64] ―――――

                                                                                                   51
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
注記 4.51 親型の参照不可の成分 及び 束縛も継承される。しかし,これらは直接拡張型においても参照
不可のままである。拡張しようとする型が参照結合によって参照され,非公開の要素をもつとき,参
照不可の要素が発生する。
注記 4.52 基底型は,成分,束縛 又は パラメタをもつ必要はない。直接拡張型は,親型より多くの成分,
束縛 又は パラメタをもつ必要はない。
直接拡張型は,親型の型 及び 型パラメタをもつ,スカラであってポインタでも割付け成分でもない親成分 (parent
component) をもつ。この成分の名前は,親型名とする。この成分は,親型の参照許可属性をもつ。親成分の成分は,
親型から継承された対応する成分と継承結合されている (inheritance associated) という(16.4.4 参照)。型の先祖成
分 (ancestor component) は,その型の親成分 又は 親成分の先祖成分とする。
注記 4.53 直接拡張型で宣言された成分 又は 型パラメタの名前は,親型の参照可能な成分 又は 型パラメ
タの名前と同じであってはならない。
例 4.54 直接拡張型の例
TYPE POINT ! 基底型
REAL :: X, Y
END TYPE POINT
TYPE, EXTENDS(POINT) :: COLOR_POINT ! TYPE(POINT) の拡張
! 成分 X,Y 及び 成分名 POINT が親から継承されている。
INTEGER :: COLOR
END TYPE COLOR_POINT
4.5.6.2 型束縛手続の上書き
型定義で指定された総称束縛ではない束縛が,親型の束縛と同じ束縛名をもつとき,その型定義に指定した束縛が,
親型からの束縛を上書き (override) する。
上書きする束縛 及び 上書きされる束縛が満たすべき条件を,次に示す。
(1) 両方とも当該実体仮引数をもっているか,又は 両方とももっていないかでなければならない。
(2) 上書きされる束縛手続が純粋であるとき,上書きする束縛手続も純粋でなければならない。
(3) 両方とも要素別処理手続であるか,又は 両方とも要素別処理手続でないかでなければならない。
(4) 両方とも仮引数の個数が同じでなければならない。
(5) 当該実体仮引数が存在するとき,名前と位置が対応していなければならない。
(6) 位置が対応する仮引数は,当該実体仮引数の型を除いて,同じ名前 及び 特性をもたなければならない。
(7) 両方ともサブルーチンであるか 又は 同じ結果の特性 (12.2.2) をもった関数でなければならない。
(8) 上書き束縛される手続が PUBLIC 属性をもつとき,上書き束縛する手続は,PRIVATE 属性をもってはなら
ない。

――――― [JIS X 3001-1 pdf 65] ―――――

次のページ PDF 66

JIS X 3001-1:2009の引用国際規格 ISO 一覧

  • ISO/IEC 1539-1:2004(IDT)

JIS X 3001-1:2009の国際規格 ICS 分類一覧

JIS X 3001-1:2009の関連規格と引用規格一覧

規格番号
規格名称