この規格ページの目次
52
X 3003-1993
定義関数名を引用するどの文よりも早い位置に,その内部関数定義,又はその定義関数名を含む内部
function宣言のdeclare文のどちらかを書かなければならない。
(31) 定義関数名がdef行によって定義されている場合,そのプログラム単位中でその定義関数名を引用す
るどの文よりも早い位置に,そのdef行,又はその定義関数名を含むdef宣言のdeclare文のどちらか
を書かなければならない。
(32) 再帰的な関数定義の中では,その関数自身を宣言する必要がない。すなわち,ある関数定義が,定義
しようとしている関数自身の引用を含む場合,その定義関数名を含む宣言指定を書く必要がない。
(33) xit-function文は,関数定義の中にだけ書くことができる。
(34) ef行を除くすべての関数定義の中には,数値関数定義let文又は文字列関数定義let文を少なくとも1
回以上書かなければならない。この数値関数定義let文又は文字列関数定義let文の中の定義関数名は,
その関数定義の内部function行又はexternal-function行に書いた定義関数名と同じでなければならな
い。
(35) 数値関数引用及び文字列関数引用の中に書く値実引き数の個数及び型は,対応する関数定義における
値仮引き数の個数及び型に一致していなければならない。すなわち,
(a) 値実引き数の個数は,値仮引き数の個数と同じでなければならない。
(b) 値実引き数部の中の値実引き数は,値仮引き数部の中の対応する値仮引き数に結び付けられる(対
応付けは,最初の実引き数は最初の仮引き数に,2番目の実引き数は2番目の仮引き数に,という
ように行われる。)。型の対応は,表のとおりでなければならない。
仮引き数 実引き数
数値単純変数名 数値式
文字列単純変数名 文字列式
仮配列宣言(数値) 実配列名(数値)
実配列名(文字列)
仮配列宣言(文字列)
(36) 実配列の次元数は,対応する仮配列の次元数と同じでなければならない。仮配列の次元数は,その仮
配列宣言中のコンマの個数より1だけ大きい数とする。仮配列の次元数は,3次元まで(すなわち,
コンマ2個まで)とする。
(37) 数値型の実引き数を,別のプログラム単位の対応する仮引き数に渡す場合,両方のプログラム単位に
おいて有効なarithmetic選択子は,一致していなければならない。
(38) 数値型の外部関数定義のarithmetic選択子は,それを呼び出すプログラム単位のarithmetic選択子と
一致していなければならない。
(39) 同じ値仮引き数の名前を,一つの値仮引き数部に,2回以上書いてはならない。
値仮引き数を,その内部関数定義又は外部関数定義の中で,declare文やdim文に書いてはならない。
(40) ef宣言及び内部function宣言に書く定義関数名は,同じプログラム単位中のどこか別の場所で,内
部関数定義によって定義しておかなければならない。
(41) xternal-function宣言に書く定義関数名は,プログラム中のどこか別の場所で,外部関数定義によっ
て定義しておかなければならない。
9.1.3 例 構文の例を次に示す。
DEF E=2.7182818 (5)
DEF AVERAGE(X,Y)=(X+Y)/2 (5)
DEF FNA$(S$,T$)=S$ & T$ (7)
DEF Right$(A$, n)=A$(Len(A$)−n+1:Len(A$)) (7)
――――― [JIS X 3003 pdf 56] ―――――
53
X 3003-1993
100 EXTERNAL FUNCTION ANSWER(A$)
120 SELECT CASE UCASE$(As)
130 CASE ”YES”
140 LET ANSWER=1
150 CASE ”NO”
(pdf 一覧ページ番号 )
160 LET ANSWER=2
170 CASE ELSE
180 LET ANSWER=3
190 END SELECT
200 END FUNCTION
FUNCTION AVERAGE, REVERSE$ (21)
9.1.4 意味 関数定義 (function-def) は,関数の値を,値仮引き数 (function-parameter) 及び必要ならその
他の変数や定数を含む式の値として定義する。
(1) 関数の引き数
(1.1) 定義関数 (defined function) を引用すると,値実引き数 (function-argument) があればそれは左から右
に順に評価され,その値が関数定義の対応する値仮引き数に代入される。すなわち,値実引き数は,
値仮引き数に値によって (by value) 渡される。
(1.2) 仮配列 (formal array) の次元数は,仮配列宣言に書いたコンマの個数より1だけ大きい数とする。
関数定義が呼ばれる際には,仮配列は,対応する実配列 (actual array) と同じ上下限をもつ。値仮
引き数の文字列単純変数及び文字列配列は,文字列の最大長として処理系定義の省略時想定値をも
つ。
(2) 関数の評価
(2.1) 関数がdef文 (def-statement) で定義されている場合,def文の式が評価され,その値が関数の値とな
る。
(2.2) 関数が内部関数定義 (internal-function-def) 又は外部関数定義 (external-function-def) で定義されて
いる場合,内部function行又はexternal-function行に続く行が,次のいずれかになるまで,順番に
実行される。
(a) 行の実行によって,他の動作が指示される。
(b) 続行不能な例外状態になる。
(c) hain文又はstop文が実行される。
(d) xit-function文が実行される。
(e) nd-function行に到達する。
(2.3) 定義関数の値は,数値関数定義let文 (numeric-function-let-statement) 又は文字列関数定義let文
(string-function-let-statement) の実行によって定められ,関数定義の実行が終了する時点でその定義
関数名に最後に代入された値となる。その時点で値が代入されていない場合は,処理系定義とする。
ただし,その処理系の定義は,初期設定されていない変数の引用と同様に,一貫していなければな
らない。
(2.4) 関数定義から返される文字列値の最大長は,文字列定義関数名に続けて書いた最大長指定によって
――――― [JIS X 3003 pdf 57] ―――――
54
X 3003-1993
定められる。最大長指定を書かない場合,最大長は,最大長指定をもたない文字列変数に対する長
さと同じになる。
(2.5) xit-function文 (exit-function-statement) を実行すると,その関数定義の実行が終了する。end-function
行は,関数定義の物理的な終りを示すとともに,関数定義の実行も終了させる。関数定義の中でstop
文を実行すると,プログラム全体の実行が終了する。
(2.6) 関数定義は,直接又は間接に自分自身を引用してもよい。すなわち,再帰的な関数呼出しが許され
る。
(2.7) 関数定義中の行は,その関数が引用されない限り,実行されることはない。プログラムの実行がdef
行に到達すると,何もしないで次の行に進む。プログラムの実行が内部function行に到達すると,
何もしないで対応するend-function行の次の行に進む。
(3) 変数,配列,経路番号及び内部データの有効範囲
(3.1) 関数定義の値仮引き数部に書く仮引き数は,その関数定義の毎回の呼出しに対して局所的とする。
すなわち,関数定義の外部で使われている同じ名前の変数や配列とは,別のものとする。
(3.2) 関数定義において仮引き数に指定されていない変数と配列の扱いは,その関数定義が内部関数定義
か外部関数定義かによって異なる。
関数定義が外部関数定義である場合,これらの変数と配列は,そのプログラム単位の毎回の呼出
しに対して局所的とする。すなわち,その関数定義の外部で使われている名前,又は,それ以前の
その関数定義の呼出しのときにその中で使われた名前とは,たとえ同じつづりであっても別のもの
とする。更に,これらの変数や配列が関数定義の呼出しのたびに初期化されるか否かは,処理系定
義とする。ただし,その処理系の定義は,主プログラム又は並行単位における変数や配列の初期化
と,一貫していなければならない。
関数定義が内部関数定義である場合,これらの変数と配列とはそのプログラム単位に広域的とし,
代入された値は関数定義の呼出しのたびに保存される。すなわち,これらの値が内部関数定義の実
行中に変えられたならば,呼び出したプログラム単位に戻った後でもこの変更は有効とする。
(3.3) 経路番号(channel-number,9.2参照)の有効範囲は,(ゼロ番の経路を除き)常にプログラム単位と
する。ゼロ番でない経路番号は,外部関数定義においては毎日の呼出しに対して局所的とし,内部
関数定義においてはその関数定義を含むプログラム単位に広域的とする。
ゼロ番の経路は,プログラム全体に広域的とする。
ファイルは,使用する前にあらかじめopen文によって,プログラム単位中のゼロ番でない経路
に割り当てられていなければならない。関数定義に対して局所的な経路に割り当てられたファイル
は,その関数定義の実行が終了する時点で自動的に閉じられる。
(3.4) 内部データの有効範囲は,常にプログラム単位とする。
外部関数定義中のdata文のデータ要素は,そのプログラム単位の毎日の呼出しに対して局所的と
する。したがって,このような関数定義中のread文及びrestore文は,その関数定義中のdata文の
データ要素だけを参照し,他のプログラム単位中のデータ要素を参照することはない。このような
関数定義中のデータ列に対する指示子は,関数定義が呼び出されるたびにデータ列の先頭に戻され
る(10.1参照)。
内部関数定義中のdata文のデータ要素は,そのプログラム単位におけるデータ列の一部分とする。
そして,このような関数定義中のread文やrestore文は,そのプログラム単位のデータ列全体を参
照する。
――――― [JIS X 3003 pdf 58] ―――――
55
X 3003-1993
9.1.5 例外状態 例外状態は,次による。
(1) 文字列関数定義let文を用いて,文字列定義関数にその文字列の最大長より長い値を代入しようとす
る。(1106,続行不能。)
9.1.6 注意 注意は,次による。
(1) 呼び出すプログラム単位と呼び出されるプログラム単位との間で,collate選択子が異なる指定をして
いてもよい。そのとき,その間で文字列型引き数の受け渡しをしてもよい。collate選択子は,文字列
の内部表現を指定するものではなく,文字列比較における大小順序及び関数CHR$や関数ORDの結果
を指定するだけのものとする。
(2) 内部関数定義で定義したりdeclare文で宣言したりした関数を,そのプログラム単位で一度も引用し
なくても誤りではない。
(3) 内部関数定義を,その内部関数の名前を含むdef宣言や内部function宣言をもつdeclare文より前に書
いても誤りではない。
(4) ある内部関数に対するどの引用よりも早い位置にその関数に対する定義を書けば,その定義関数名に
対する内部function宣言又はdef宣言を省略してもよい。
(5) 内部関数及び外部関数の両方に対して,関数が引用されるより前に宣言又は定義しなければならない
という規定は,プログラム中の幾つかのプログラム単位が外部関数と同じ名前の内部関数を含むこと
を許す。これによって,プログラマがライブラリ中の関数を使うときに,すべての外部関数の名前を
知らなくても使えるようになる。
9.2 副プログラム
9.2.1 概要 副プログラム (subprogram) は,プログラムを論理的に分割する。論理的に分割されたプロ
グラム間では,引き数の受け渡しができる。定義関数と同様に,副プログラムには,プログラム単位内部
のものとプログラム単位外部のものとがある。
9.2.2 構文 構文は,次による。
(1) 副プログラム定義=内部副プログラム定義|外部副プログラム定義
(2) 内部副プログラム定義=内部sub行 区* end-sub行
(3) 内部sub行=行番号 sub文 行末部
(4) ub文=SUB 副プログラム名 参照仮引き数部?
(5) 副プログラム名=ルーチン識別名
(6) 参照仮引き数部=左括弧 参照仮引き数{コンマ 参照仮引き数}* 右括弧
(7) 参照仮引き数⊃単純変数名|仮配列宣言|経路番号
(8) 経路番号=番号記号 符号なし整数
(9) nd-sub行=行番号 end-sub文 行末部
(10) nd-sub文=END SUB
(11) xit-sub文=EXIT SUB
(12) 外部副プログラム定義=external-sub行 手続区* end-sub行
(13) xternal-sub行=行番号 EXTERNAL sub文 行末部
(14) all文=CALL 副プログラム名 参照実引き数部?
(15) 参照実引き数部=左括弧 参照実引き数{コンマ 参照実引き数}* 右括弧
(16) 参照実引き数=式|実配列名|経路式
(17) 宣言指定⊃内部sub宣言|external-sub宣言
――――― [JIS X 3003 pdf 59] ―――――
56
X 3003-1993
(18) 内部sub宣言=SUB 副プログラム名並び
(19) xternal-sub宣言=EXTERNAL SUB 副プログラム名並び
(20) 副プログラム名並び=副プログラム名{コンマ 副プログラム名}*
(21) 内部副プログラム定義の外部の行番号分岐中の行番号は,内部副プログラム定義の内部にある行を参
照してはならない。ただし,内部sub行は,参照してもよい。内部副プログラム定義の内部の行番号
分岐中の行番号は,その内部副プログラム定義の外部にある行及びその先頭の内部sub行を参照して
はならない。
(22) 外部副プログラム定義の内部の行番号分岐中の行番号は,その先頭のexternal-sub行を参照してはな
らない。
(23) 一つのプログラム中で,同じ名前の外部副プログラムを2回以上定義してはならない。一つのプログ
ラム単位中で,同じ名前の内部副プログラムを2回以上定義してはならない。
(24) 一つのプログラム単位中で,同じ名前の(内部又は外部)副プログラムを2回以上宣言したり定義し
たりしてはならない。
(25) 副プログラム名が外部副プログラム定義によって定義されている場合,プログラム単位中でその副プ
ログラム名を引用するどのcall文よりも早い位置に,その副プログラム名を含むexternal-sub宣言の
declare文を書かなければならない。
(26) 副プログラム名が内部副プログラム定義によって定義されている場合,そのプログラム単位中でその
副プログラム名を引用するどの文よりも早い位置に,その内部副プログラム定義,又はその副プログ
ラム名を含む内部sub宣言のdeclare文のどちらかを書かなければならない。
(27) 再帰的な副プログラム定義の中では,その副プログラム自身を宣言する必要がない。すなわち,ある
副プログラム定義が,定義しようとしている副プログラム自身を引用するcall文を含む場合,その副
プログラム名を含む宣言指定を書く必要がない。
(28) xit-sub文は,副プログラム定義の中にだけ書くことができる。
(29) all文中に書く参照実引き数の個数及び型は,対応する副プログラム定義における参照仮引き数の個
数及び型に一致していなければならない。すなわち,
(a) 参照実引き数の個数は,参照仮引き数の個数と同じでなければならない。
(b) 参照実引き数部の中の参照実引き数は,参照仮引き数部の中の対応する参照仮引き数に結び付けら
れる(対応付けは,最初の実引き数は最初の仮引き数に,2番目の実引き数は2番目の仮引き数に,
というように行われる。)。型の対応は,表のとおりでなければならない。
仮引き数 実引き数
数値単純変数名 数値式
文字列単純変数名 文字列式
仮配列宣言(数値)実配列名(数値)
実配列名(文字列)
仮配列宣言(文字列)
経路番号 経路式
(30) 実配列の次元数は,対応する仮配列の次元数と同じでなければならない。その仮配列の次元数は,仮
配列宣言中のコンマの個数より1だけ大きい数とする。
(31) 数値型の実引き数を,別のプログラム単位の対応する仮引き数に渡す場合,両方のプログラム単位に
おいて有効なarithmetic選択子は,一致していなければならない。
(32) 一つの参照仮引き数に,同じ参照仮引き数の名前を,2回以上書いてはならない。
参照仮引き数を,その内部副プログラム定義又は外部副プログラム定義の内部で,declare文又は
――――― [JIS X 3003 pdf 60] ―――――
次のページ PDF 61
JIS X 3003:1993の引用国際規格 ISO 一覧
- ISO/IEC 10279:1991(IDT)
JIS X 3003:1993の国際規格 ICS 分類一覧
- 35 : 情報技術.事務機械 > 35.060 : 情報技術に使用される言語
JIS X 3003:1993の関連規格と引用規格一覧
- 規格番号
- 規格名称
- JISX0201:1997
- 7ビット及び8ビットの情報交換用符号化文字集合
- JISX0301:2002
- 情報交換のためのデータ要素及び交換形式―日付及び時刻の表記