>サイトトップへ >このカテゴリの一覧へ

X 3003-1993

(1) 

まえがき

国際標準化機構  (ISO)  と国際電気標準会議  (IEC)  は,世界規模の標準化のための専門組織である。ISO

又は IEC の会員である各国機関は,

専門委員会 (TC) を通じて国際規格の開発に参加する。

専門委員会は,

技術的活動の特定の分野を対象として,それぞれの組織が設立する。ISO と IEC との専門委員会は,相互

の関心のある分野について協力する。これら以外の政府又は非政府の国際組織もまた,ISO 及び IEC の連

絡会員になって,作業に参加している。

情報処理技術の分野では,ISO と IEC は連合技術会議 ISO/IEC JTC1 を結成した。この連合技術会議で

採択された国際規格原案 (DIS) は,各国機関に回付され,投票される。投票した各国機関の 75 パーセン

ト以上の承認が得られれば,国際規格 (International Standard) として発行される。

国際規格 ISO/IEC 10279 は,ISO/IEC JTC1(情報処理技術)が作成した。

国際規格 ISO/IEC 10279 の附属書は,参考である。


X 3003-1993

(1) 

目次

ページ

1.

  適用範囲,適用分野,引用規格等

1

1.1

  適用範囲

1

1.2

  適用分野

1

1.3

  引用規格等

2

1.3.1

  引用規格

2

1.3.2

  対応国際規格

2

1.3.3

  関連規格

2

2.

  規格への合致

2

2.0

  機能単位及び規格合致性

2

2.1

  規格合致プログラム

4

2.2

  規格合致処理系

4

2.3

  誤り

5

2.4

  例外状態

5

3.

  構文の記述法及び用語の定義

6

3.1

  構文の記述法

6

3.2

  用語の定義

8

4.

  プログラム要素

12

4.0

  概要

12

4.1

  文字

12

4.2

  プログラム,行及び区

13

4.3

  プログラムの注釈

15

4.4

  識別名

16

5.

  数値

19

5.0

  概要

19

5.1

  数値定数

19

5.2

  数値変数

20

5.3

  数値式

21

5.4

  数値組込み関数

22

5.5

  数値 let 文

25

5.6

  数値の扱い及び角度

26

6.

  文字列

28

6.0

  概要

28

6.1

  文字列定数

28

6.2

  文字列変数

28

6.3

  文字列式

30


X 3003-1993

目次

(2) 

ページ

6.4

  文字列組込み関数

31

6.5

  文字列 let 文

33

6.6

  文字列宣言

34

7.

  配列

35

7.0

  概要

35

7.1

  配列宣言

35

7.2

  数値配列

37

7.3

  文字列配列

39

8.

  制御構造

41

8.0

  概要

41

8.1

  論理式

41

8.2

  制御文

43

8.3

  繰返し構造

44

8.4

  判定構造

47

9.

  プログラム分割

50

9.0

  概要

50

9.1

  利用者定義関数

50

9.2

  副プログラム

55

9.3

  プログラム連鎖

60

10.

  入出力

61

10.0

  概要

61

10.1

  内部データ

61

10.2

  入力

63

10.3

  出力

66

10.4

  書式付き出力

69

10.5

  配列入出力

73

11.

  ファイル

77

11.0

  ファイル編成及び記録形式

77

11.1

  ファイル操作

81

11.2

  ファイル指示子の操作

91

11.3

  ファイルへのデータ生成

94

11.4

  ファイルからのデータ入力

101

11.5

  ファイルにおけるデータ変更

107

12.

  例外状態処理及びデバッグ

110

12.1

  例外状態処理

110

12.2

  デバッグ

115

13.

  図形

117

13.0

  機能単位

117

13.1

  座標系

118


X 3003-1993

目次

(3) 

ページ

13.2

  属性及び画面制御

121

13.3

  図形出力

127

13.4

  図形入力

130

13.5

  絵及び描点出力

135

14.

  実時間

141

14.0

  概要

141

14.1

  実時間プログラム

141

14.2

  実時間宣言

143

14.3

  並行動作制御

146

14.4

  処理入出力

149

14.5

  共用データ

150

14.6

  通報の受け渡し

151

14.7

  ビット列操作

154

14.8

  資源管理

155

15.

  固定小数点 10 進数

157

15.0

  概要

157

15.1

  固定小数点 10 進数の精度

157

15.2

  固定小数点 10 進数のプログラム分割

159

16.

  編集

161

16.0

  概要

161

16.1

  未整列プログラム

161

16.2

  編集用指令

161

附属書 A(参考)  規格の構成

171

附属書 B(参考)  有効範囲

172

附属書 C(参考)  処理系定義の機能

173

附属書 D(参考)  構文要素索

177

附属書 E(参考)  生成規則一覧

178

附属書 F(参考)  GKS 水準 0b のための BASIC の拡張

195

附属書 G(参考)  基本 BASIC と Full BASIC との相違点

207

附属書 H(参考)  将来の削除を考慮している言語要素

209

附属書 I(参考)  モジュール及び単文字入力

210


日本工業規格

JIS

 X

3003

-1993

電子計算機プログラム言語

Full BASIC

The Programming Language Full BASIC

日本工業規格としてのまえがき 

この規格は,1991 年に第 1 版として発行された ISO/IEC 10279 (Information technology−Programming

languages

−Full BASIC) に基づいて,その技術的内容を変更することなく作成した日本工業規格である。

ISO/IEC 10279

の技術的内容は,ANSI X3.113 から導出されたものである。構文及び意味の具体的な規定

は,ANSI X3.113 を引用する。ISO/IEC 10279 は,簡易図形出力の規定について ECMA-116 BASIC も引用

する。ECMA-116 BASIC の技術的内容は ANSI X3.113 から導出されたものである。

この日本工業規格の構成,箇条番号及び文章表現は,ANSI X3.113 に合わせてある。ISO/IEC 10279 の技

術的内容及び文章表現は,それぞれの箇所に配分し,調整してある。ANSI X3.113 にあって ISO/IEC 10279

で削除されている文章は,

備考又は参考とした。

1.

適用範囲,適用分野,引用規格等

1.1

適用範囲  この規格は,次のとおり,プログラム言語 Full BASIC 及びその部分集合を定める。

(1) Full

BASIC

,その中核機能単位又はその種々の拡張に従って書かれたプログラムの構文

(2) Full

BASIC

で書かれたプログラムによって制御される自動データ処理系が,入力として受け入れるこ

とのできるデータの形式,最低保証される,数値表現の精度と範囲及び最低保証される,文字列の長

さと文字集合

(3) Full

BASIC

で書かれたプログラムによって制御される自動データ処理系が,出力として作り出すこと

のできるデータの形式,最低保証される,数値表現の精度と範囲及び最低保証される,文字列の長さ

と文字集合

(4) Full

BASIC

で書かれたプログラムの意味を解釈する意味規則

(5)

検出されるべき誤り及び例外状態並びにそれらの誤り及び例外状態が処理される仕方

参考  更にこの規格は,Full BASIC プログラムを編集する機能を含む選択機能単位を定める。

BASIC

言語は,元来,主として対話方式で用いるように設計されたものであるが,この規格

は,そのように限定されてはいない言語を定める。この規格は,インタプリタ,逐次形翻訳系,

1

回通読翻訳系など,どの特定の処理系実現手法を採用することをも妨げるつもりはない。

1.2

適用分野  この規格は,さまざまな種類の自動データ処理系の間での,BASIC プログラムの移植可

能性を高めるために,Full BASIC 言語を定める。

参考  この規格に合致したプログラムは,規格 Full BASIC で書かれているという。

この規格は,ISO/IEC 10279 に従い,部分集合の規格合致性について独自に規定する。これ


2

X 3003-1993

は,ANSI X3.113 のものと ECMA-116 のものとの双方を許すように構成されている。

1.3

引用規格等

1.3.1

引用規格  引用規格を,次に示す。

JIS X 0201

  情報交換用符号

JIS X 0301

  日付及び時刻の表記

1.3.2

対応国際規格  対応国際規格を,次に示す。

ISO/TEC 10279 : 1991 (E)

  Information technology−Programming languages−Full BASIC

ANSI X3.113-1987

  Information Systems−Programming Languages−Full BASIC

ANSI X3J2/TIB-1

  BASIC Technical Information Bulletin Number 1

Interpretations of ANSI X3.113-1987 (1991-07-15),

ISO/IEC JTC1/SC22 N1187 (1992-07)

備考  以下の引用箇所では,これを解釈文書又は TIB と略称することがある。アメリカ規格協会

(ANSI)

は,この TIB は規格の一つの解釈を与えるものであり,規格を変更するものではない

と注意を述べている。

ECMA-116

  BASIC−ECMA BASIC-1, ECMA BASIC-2, ECMA Graphics Module (1986)

1.3.3

関連規格  関連規格を,次に示す。

JIS X 0210

  情報交換用文字列による数値表現

JIS X 3003-1982

  電子計算機プログラム言語基本 BASIC

ISO 7942 : 1985

  Information processing systems−Computer graphics−Graphical Kernel System

(GKS) functional description

備考  JIS X 4201[コンピュータグラフィクス中核系 (GKS) 機能記述]-1990 がこの国際規格に対応

している。

ANSI X3.124-1985

  Computer Graphics−Graphical Kernel System (GKS), Functional Description

ANSI/IEEE 726-1982

  Real−time BASIC for CAMAC

ANSI X3.113A-1989

  Information Systems−Programming Languages−Full BASIC−Addendum for

individual character input and modules, DIS 10279 1991 Addendum 1

2.

規格への合致

2.0

機能単位及び規格合致性  機能単位及び規格合致性は,次による。

参考  ISO/IEC 10279 においては,規格合致性の規定以外の技術的内容は,ANSI X3.113 の 3.16.

よる。ANSI X3.113 の 3.2 にある予約語は,規定ではなく参考とする。部分集合中核機能単位

を構成要素とする機能単位の予約語は,ANSI X3.113 の 4.4.2 にあるものを,JIS の 4.4.2(11)

示すもので置き換える。簡易図形出力機能単位の技術的内容は,ECMA-116 の 13.による。

(1)

機能単位  この Full BASIC 言語は,機能単位 (module) によって構成する。規格への合致は,次の 15

個の機能単位の特定の組について定義する(

図 2.1 参照)。

参考  これらの機能単位は,ANSI X3.113 の 2.及び ECMA-116 の 2.にあるものを含む。

(a)

中核機能単位 (core module)。11.の中の拡充ファイルの規定を除いた 4.12.の構文に従うすべての

プログラムを範囲とする。

(b)

部分集合中核機能単位 (subset core module)。4.4.2(11)の予約語の規定を含め,11.の中の拡充ファイ

ルの規定を除いた 4.11.及び 12.2 の構文に従うすべてのプログラムを範囲とする。部分集合中核機


3

X 3003-1993

能単位は,予約語が多く,例外状態処理(12.1 参照)がないこと以外は,中核機能単位と同じであ

る。

(c)

内部形式拡充ファイル機能単位 (enhanced-internal file module)。中核の規定及び 11.の中の内部形式

記録の(

“固”と指定されていない)拡充ファイルの生成規則の構文に従うすべてのプログラムを範

囲とする。

(d)

内部形式拡充ファイル部分集合機能単位  (enhanced-internal file subset module)。部分集合中核の規定

及び 11.の中の内部形式記録の(

“固”と指定されていない)拡充ファイルの生成規則の構文に従う

すべてのプログラムを範囲とする。

(e)

固有形式拡充ファイル機能単位  (enhanced-native file module)。中核の規定及び 11.の中の固有形式記

録の(

“固”と指定されている)拡充ファイルの生成規則の構文に従うすべてのプログラムを範囲と

する。

(f)

固有形式拡充ファイル部分集合機能単位  (enhanced-native file subset module)。部分集合中核の規定及

び 11.の中の固有形式記録の(

“固”と指定されている)拡充ファイルの生成規則の構文に従うすべ

てのプログラムを範囲とする。

(g)

図形機能単位 (graphics module)。中核の規定及び 13.の構文に従うすべてのプログラムを範囲とする。

(h)

図形部分集合機能単位 (graphics subset module)。部分集合中核の規定及び 13.の構文に従うすべての

プログラムを範囲とする。

(i)

簡易図形出力機能単位 (mini graphics module)。中核の規定及び 13.113.3 の括弧【  】で囲まれてい

ない構文に従うすべてのプログラムを範囲とする。

参考  この構文は,ECMA-116 の 13.による。

(j)

簡易図形出力部分集合機能単位 (mini graphics subset module)。部分集合中核の規定及び 13.113.3

の括弧【  】で囲まれていない構文に従うすべてのプログラムを範囲とする。

参考  この構文は,ECMA-116 の 13.による。

(k)

実時間機能単位 (real-time module)。

中核の規定及び 14.の構文に従うすべてのプログラムを範囲とす

る。

(l)

実時間部分集合機能単位 (real-time subset module)。部分集合中核の規定及び 14.の構文に従うすべて

のプログラムを範囲とする。

(m)

固定小数点 10 進数機能単位 (fixed decimal module)。中核の規定及び 15.の構文に従うすべてのプロ

グラムを範囲とする。

(n)

固定小数点 10 進数部分集合機能単位  (fixed decimal subset module)。部分集合中核の規定及び 15.

構文に従うすべてのプログラムを範囲とする。

(o)

編集機能単位 (editing module)。16.の構文に従うすべての未整列プログラム及び編集用指令を範囲と

する。

(2)

規格合致性  機能単位の特定の組に対する二つの規格合致性 (conformance) を定める。一つは BASIC

言語で書かれたプログラムの規格合致性とし,もう一つはそのようなプログラムを処理する処理系の

規格合致性とする。機能単位のある特定の組に規格合致する任意のプログラムが,その同じ組又はそ

れらの機能単位を包含する組に規格合致するどの処理系で実行されても,同じ結果を生成するように,

規格合致性の要件が構成されている。ただし,処理系定義の機能が幾つかある(

附属書 参照)。

参考  ISO/IEC 10279 及びこの規格の意図は,プログラム又は処理系が ANSI X3.113 (Full BASIC)  又

は ECMA-116 (ECMA BASIC) のどちらかに規格合致するならば,そのまま自動的に ISO/IEC 


4

X 3003-1993

10279

及びこの規格に規格合致することにある。

更に,上の(1)に 15 個の機能単位を定める。機能単位は,ANSI X3.113 及び ECMA-116 の 9

個の部分に基づく。これらの機能単位を構成する部分を,

参考表に示す。

ANSI X3.113

に定める中核機能単位及び 6 個の選択機能単位は,(a)(c)(e)(g)(k)(m)

及び(o)に対応する。ECMA-116 に定める 4 個の機能単位は,

参考表に示すとおりである。

2.1

規格合致プログラム  プログラムは,次の条件のすべてを満たすときに限り,機能単位のその組に

対して規格合致とする。

(1)

プログラム及びその中に含まれるおのおのの文その他の構文要素が,規格のその機能単位の構文規則

に正しく従っている。

(2)

全体としてのプログラムが,構文規則の適用に関して,規格のその機能単位で定めるどの広域的制約

(global constraint)

にも違反しない。

2.2

規格合致処理系  規格合致処理系の要件は,次による。

(1)

処理系 (implementation) は,次のすべての条件を満たすときに限り,その機能単位の組に対して規格

合致とする。

(a)

その機能単位の組に対する規格合致プログラムを受け入れて処理する。

(b)

その機能単位の組に規格合致しないプログラムを受け入れない場合に,その理由を報告する。

(c)

誤り及び例外状態を,規格の定めるところに従って解釈する。

(d)

規格合致プログラム中のおのおのの文の意味を,規格の定めるところに従って解釈する。

(e)

規格合致プログラムの全体としての意味を,規格の定めるところに従って解釈する。

(f)

少なくとも規格で定められた精度と範囲の数値を,入力,処理及び出力する。

(g)

少なくとも規格で定められた長さと文字集合の文字列を,入力,処理及び出力する。

(h)

規格の中で“規定しない”又は“処理系定義 (implementation-defined)”とされている機能に対する

動作を記述した,利用者のための文書 (documentation) がある。

(i)

規格で定義された言語に対する拡張 (enhancement) のすべてを記述し識別した,利用者のための文

書がある。

(2)

編集機能単位に規格合致するには,更に次の条件がある。

処理系は,16.の規定に従って,未整列プログラム及び編集用指令を受け入れて処理する。

(3)

この規格は,規格に合致しない文及び全体として規格に合致しないプログラムの意味の解釈に関して,

処理系に対して何も要求しない。

図 2.1  機能単位[2.0(1)参照]


5

X 3003-1993

参考表  機能単位の構成

機能単位

2.0(1)参照]

中核  部分

集合

内部

固有

図形

簡易
図形

実時

固定  編集

(a)

(b)

(c)

(d)

(e)

(f)

(g)

(h)

(i)

(j)

(k)

(l)

(m)

(n)

(o)

(

1

(

2

(

3

(

4

(

1

)  ECMA BASIC-1

(

2

)  ECMA BASIC-1

と ECMA Graphics Module

(

3

)  ECMA BASIC_2

(

4

)  ECMA BASIC-2

と ECMA Graphics Module

2.3

誤り  この規格は,プログラムの本文中の構文上の誤り (error) をいちいち報告することは,処理系

に対して要求しない。

ある機能単位の組に対する規格合致処理系は,拡張された言語で書かれたプログラムを受け入れてもよ

い。この場合に,プログラム中でその機能単位の組に規格合致していない部分をいちいち報告する必要は

ない。

文その他の要素がこの規格に定める構文規則に合致していなくて,かつその文又はその要素が十分に文

書化されて明確な,処理系定義の意味をもたないときには,処理系は,誤りを報告しなければならない。

処理系による誤りの報告は,十分に文書化されて明確なやり方によらなければならない。可能ならば処理

系は,誤りのある文及びその文中の誤りの位置を示すことが望ましい。

2.4

例外状態  例外状態 (exception) は,プログラムの実行中にこの規格の意味規則どおりに動作できな

いこと又は何らかの資源の制限を超えそうになったことを,処理系が認識したときの状態とする。

(1)

処理系は,規格の定めるすべての例外状態を検出,報告及び処理しなければならない。ただし,12.1

に定める機構又は拡張によって備えられた機構が,例外状態の処理のために利用者によって呼び出さ

れる場合を除く。

(2)

処理系は,回復手続き (recovery procedure) がプログラム中に指定されていない例外状態を,規格の定

める回復手続きによって処理しなければならない。規格が回復手続きを定めていない例外状態,及び

処理系のハードウェア又は操作環境の制約によって,規格の定めた回復手続きがとれない例外状態の

処理は,その例外状態がプログラム中のどこで発生したかによる。

(a)

関数,絵又は副プログラムの呼出し中に起こったときには,例外状態は,呼出し側のプログラム単


6

X 3003-1993

位中のその呼び出した文に“伝達”される(12.1 参照)

(b)  (a)

の伝達が主プログラム若しくは並行単位に到達したとき又は例外状態が主プログラム中若しく

は並行単位中で起こったときには,その例外状態によって,そのプログラム又は(実時間プログラ

ムの場合には)その並行単位の実行が終了される。

(3)

組込みの例外処理機構が例外状態を報告する方法は,処理系定義とする。ただし,処理系は報告の内

容として,少なくともその例外状態種別及び例外状態の起こった当初の行の行番号を識別しなければ

ならない。

(4)

プログラム中の一つの文の実行が複数個の例外状態を引き起こす場合,この規格は,ファイルの場合

を除いて,それらを検出,報告又は処理する順序を規定しない。

備考  一般に,入出力の途中で入出力以外の例外状態が起こったとき,その部分的な入出力動作の効

果及びその入出力装置の状態は,処理系定義とする。この規定は,10.及び 11.の入出力全般に

適用する。

参考  ANSI X3.113 では,この備考が明示的には書いてないが,TIB1.3.2 参照)によって補った。

(5)

規格合致プログラム中に,実行すれば必ず例外状態になる文がある場合に,処理系は,利用者に警告

してもよい。しかし,その場合でも処理系は,そのプログラムを,規格の定める通常の意味規則に従

って,受け入れて実行しなければならない。

3.

構文の記述法及び用語の定義

3.1

構文の記述法

3.1.1

生成規則  構文 (syntax) は,生成規則 (production) と呼ぶ書換え規則 (rewriting rule) の集まりに

よって記述する。これは,プログラムや式などのさまざまの構文上の単位の形を定義し,どういう記号の

列がその形に適合するかを定める。

(1)

構文単位名  生成規則においては,日本語の語[日本語の文字及び太字(ボールド体)の英小文字か

らなる語]

,英大文字及び数字を構文単位名 (metaname) すなわち構文上の単位の名称として用いる。

構文単位名の多くは,他の構文単位名への書換えによって定義する。ある種の構文単位名を,終端

構文単位名 (terminal metaname) という。これに対する書換えの規則は,生成規則の中にはなく,書換

えは,そこで終結する。

備考  構文上の単位の名称は,次のとおりである。

終端構文単位名でない構文単位名

構文単位名

英大文字

終端構文単位名である構文単位名

数字

特殊文字の名称

[処理系定義]のもの

終端構文単位名のうち,英大文字,数字及び特殊文字の名称は,すべて 4.1 で定義する。英大文字は,

英大文字自身及びそれに対応する英小文字の双方を指す終端構文単位名とする。ただし,

“英大文字”及び

“英小文字”の生成規則  [4.1.2(9)(10)]  においては,英大文字は英大文字自身だけを,英小文字は英小文字

自身だけを指す。数字は,それ自身を指す終端構文単位名とする。

[処理系定義] (implementation-defined) は,固有の構文単位を指すものではなく,それぞれの生成規則

ごとに,処理系がその構文単位に対して適切なやり方で定める。

[処理系定義]の一部については,対応す

る“注意”の項で,その構文単位に対する表現を推奨する。


7

X 3003-1993

(2)

等号  例を用いて,生成規則の詳細を規定する。5.1 に次のような生成規則がある。

小数部=小数点  符号なし整数

これは,

“小数部”というものを,小数点の次に符号なし整数をおいたものとすることを定める。

“小数点”は,終端構文単位名であり,これを左辺とする生成規則はない。4.1 の“意味”の項で,

小数点の具体的な文字を定義する。

(3)

星印  “符号なし整数”とは何かの定義として,次のような生成規則がある。

符号なし整数=数字  数字

*

これは,

“符号なし整数”というものを,1 個の数字の後ろに 0 個以上の数字をつないだものとする

ことを定める。星印“

*

”は,反復を表す構文演算子 (syntactic operator) とし,その直前の構文単位が

0

回以上何回繰り返されてもよいことを示す。

(4)

縦線  “数字”とは何かの定義として,4.1 に次のような生成規則がある。

数字=0|1|2|3|4|5|6|7|8|9

これは,

“数字”というものを,

“0”

“1”

,…,

“9”のどれか一つとすることを定める。縦線“|”

は,

“又は”を表す構文演算子とし,左辺の構文単位名を右辺のどれか一つで書き換えることを示す。

右辺の“0”∼“9”は,もはやどの生成規則の左辺にも現れない終端構文単位名であるから,

“小数

部”に関する書換えは,これで終結する。4.1 の“意味”の項で,

“0”∼“9”の具体的な文字を定義

する。

(5)

疑問符  疑問符“?”は,星印と似て省略可能を表す構文演算子とし,その直前の構文単位があって

もなくてもよいことを示す。例えば,次のような生成規則がある。

指数部=E  符号?  符号なし整数

これは,

“指数部”というものを,英字“E”又は“e”の後ろに 0 個又は 1 個の符号をおき,その

後ろに符号なし整数をおいたものとすることを定める。

(6)

波括弧  波括弧“{”,“}”は,構文単位名の列を一まとめにして扱うことを示す。例えば,次のよう

な生成規則がある。

変数名並び=変数名  {コンマ  変数名}

*

これは,

“変数名並び”というものを,1 個の変数名の後ろに 0 個以上の変数名をコンマで区切って

つないだものとすることを定める。構文単位をまとめるためでなく,文字の列の中に波括弧を実際に

書きたい場合には,

“左波括弧”又は“右波括弧”という終端構文単位名によって示す。

(7)

優先順位  一つの生成規則の中に幾つもの構文演算子を用いた場合には,優先順位を次のとおりに定

める。疑問符“?”及び星印“

*

”は,その直前の日本語の語である一つの構文単位名,英大文字から

なる一つの英単語(

例  NOT,REST)又は波括弧でくくられた一つの構文式に対して適用する。縦線

“|”は,空白で分けて並べられた語及び構文式の列に対して適用する。その列の左端は,等号,縦

線又はまだ閉じられていない左波括弧のうちの最も近いものとする。例えば,

有効数字部=符号なし整数  小数点?|符号なし整数?  小数部

は,

有効数字部={符号なし整数{小数点}?}|{

{符号なし整数}?  小数部}

と同等とする。

(8)

空白  生成規則中の空白は,構文単位名を区切るのに用いる。BASIC プログラム中の空白の用法に関

しては,特別に規定する(4.1 参照)

(9)

含号  ある種の構文単位名は,二つ以上の生成規則によって定義される。例えば,5.2 に次のような生


8

X 3003-1993

成規則がある。

単純変数名⊃数値単純変数名

更に,6.2 に次のような生成規則がある。

単純変数名⊃文字列単純変数名

この二つの生成規則は,

(ほかに単純変数名の定義が存在しないならば)次のようなただ一つの生成

規則と同等とする。

単純変数名=数値単純変数名|文字列単純変数名

複数個の構文定義を含む等号“=”は,すべて含号“⊃”で置き換えることができる。含号による

構文定義は,それぞれの右辺を縦線“|”で区切って並べた形の一つの右辺をもつ,等号による構文

定義と同等とする。

3.1.2

例示  構文の記述法の例として,この記述法自身の生成規則を示す。ここで現れる終端構文単位名

は,その名前の表す文字とする。

(1)

生成規則=日本語の構文単位名  空白列  {等号|含号}  空白列  構文式

(2)

日本語の構文単位名={英小文字|日本文字}  構文文字

*

(3)

構文文字=英小文字|日本文字|ハイフン

(4)

空白列=空白

*

  行末?  空白

*

  空白

(5)

構文式=構文項  {空白列?  縦線  空白列?  構文項}

*

(6)

構文項=構文因子  {空白列  構文因子}

*

(7)

構文因子=構文一次子  構文反復?

(8)

構文一次子= 日本語の構文単位名|数字  数字

*

|英大文字  英大文字

*

|左波括弧  空白

*

  構文式

空白

*

  右波括弧

(9)

構文反復=星印|疑問符

3.2

用語の定義  この規格で用いる主な用語の定義は,次による。

(1)  BASIC

  ある類似の構文と意味をもった言語の族に対して与えられた名称。Beginner’s All-purpose

Symbolic Instruction Code

の頭文字をとった頭字語である。

(2)

あふれ (overflow)   数値演算の場合,前の演算で絶対値が MAXNUM(5.4.4 参照)を超える結果又

は固定小数点宣言の精度指定によって表現することのできる最大値を超える結果を生成しようとした

状態。

文字列演算の場合,前の演算が処理系定義の最大長より長い文字列の結果を生成しようとした状態。

文字列代入の場合,前の演算が文字列変数又は文字列関数の宣言された最大長又は省略時想定によ

る最大長より長い結果を代入しようとした状態。

(3)

誤り (error)   プログラムが正しくなくなるような,プログラムの構文上の欠陥。

(4)

一括方式 (batch mode)   利用者との対話によらない環境でプログラムを処理する方式。

(5)

印字欄 (print zone)   印字出力行中のある連続した文字位置。print 文による一つの印字項目を評価し

た結果を,ここに配置することができる。

(6)

下位けたあふれ (underflow)   数値演算において,前の演算で絶対値が機械最小値よりも小さく,か

つゼロでない結果を生成しようとした状態。

(7)

外部 (external)   構文的に,より大きいプログラム単位に含まれていない手続きを指す修飾語。

(8)

機械最小値 (machine infinitesimal)    BASIC 処理系が表現でき,かつ処理できる最小の(ゼロでない)

正の値。


9

X 3003-1993

(9)

機能語 (keyword)   プログラム言語で用いる文又は文の構成要素を識別する文字の列。通常,よく使

われる単語や記憶しやすい単語でつづる。

この規格の定めるすべての機能語を

表 3.1 に示す。この規格は,機能単位によって構成されている

ので,必要な機能語は機能単位ごとに異なる。各機能語がどの機能単位に含まれるかをも示す。

機能語のつづりの英大文字の一部又は全部を,英小文字で書いてもよい。

(10)

 (line)   プログラムの行を 2 通りの観点で規定する。一つは物理行 (physical line) とし,もう一つ

は論理行 (logical line) とする。物理行は,順番に並んでいる文字の列とする。行番号又はアンド記号

で始まり,行末で終わる。論理行は,行番号の後ろに BASIC 言語の本文を順番に並べたものとする。

行継続 (line-continuation) は,論理的に,1 文字の空白で置き換える。

(11)

行末 (end-of-line)   行の終りを識別する文字,文字の列又は指示。

行には,プログラムの行,印字の行及び入力応答の行の 3 種類の行がある。行末は,行の種類や環

境に応じて異なっていてもよい。例えばある処理系で,入力応答の行末が,対話方式や一括方式で用

いる入力源に応じて異なっていてもかまわない。

行末の代表的な例としては,復帰 (carriage-return),復改 (carriage-return line-feed) 又はカードの終端

などの記録末  (end of record)  がある。

(12)

切捨て (truncation)   高精度の数値表現から低精度の数値表現を得る方法の一つ。もとの表現中の不

必要な下位のけたを単に取り除く。

(13)

固有 (native)   記録形式において,記録中で欄が特定の構造をもち,同じシステム内の別の言語が生

成した記録と互換性があることを指す修飾語。

数値データや文字列データにおいて,親ハードウェアが直接に実現できるように,ある種の意味規

則(例えば,精度や文字の大小順序)の実現方法が処理系定義に任されていることを指す修飾語。

(14)

識別名 (identifier)   変数,配列,配列値,例外処理区,関数,絵,副プログラム及びプログラムを

命名する文字の列。実時間プログラムにおいては,識別名は,並行単位,事象,構造,処理域,共用

域及び通報域を命名するのにも用いる。

(15)

してもよい (may)   この用語は,処理系に対する許容の意味で用いる。すなわち,規格合致処理系

(standard-conforming implementation)

が,ある機能を実現してもよいし,実現しなくてもよいことを示

す。

(16)

しなければならない (shall)   この用語は,要求の意味で用いる。すなわち,規格合致しているとい

えるために,プログラムがとらなければならない形及び処理系がとらなければならない動作を規定す

ることを示す。

(17)

対話方式 (interactive mode)   プログラムを対話的に処理する方式。利用者は,個々のプログラムの

動作に対して直接に応答ができ,更に,プログラムの実行の開始と終了を制御することができる。

(18)

できる (can)   この用語は,プログラムに対する許容の意味で用いる。すなわち,規格合致プログラ

ム (standard-conforming program) の中に,ある形式を書いてもよく,規格合致処理系がこのプログラ

ムを正しく処理しなければならないことを示す。

(19)

内部 (internal)   記録形式において,データの型及び正確な値を保持して生成し,後の読込み操作で

そのとおりに再入力できるデータ表現を指す修飾語。

手続きにおいて,構文的に,より大きいプログラム単位に含まれて,データを共用する手続きを指

す修飾語。

(20)

プログラム単位 (program unit)   BASIC プログラムの独立した部分。主プログラム(end 文の行まで


10

X 3003-1993

の行の列)

,外部副プログラム定義,外部関数定義,外部絵定義又は並行単位。

(21)

丸め (rounding)   高精度の数値表現から低精度の数値表現を得る方法の一つ。もとの数値のうちの

除去される部分の大きさによって,結果の下位のけたを調整する。例えば,X を最も近い整数値に丸

めるには,INT (X+0.5)  とすることができる(5.4 参照)

(22)

有効数字 (significant digits)   数値表現中の,ゼロでない最高位の数字から最低位の数字までの数字

の列。小数点の位置には無関係である。通常,正規化浮動小数点表現においては,数値表現中の有効

数字だけが,内部表現の仮数部に保持される。固定小数点表現においては,最低位の数字が明示的に

最右端のけたに位置付けられ,有効数字の左側のゼロも保持されることがある。

(23)

予約語 (reserved word)   BASIC プログラム中で,ルーチン識別名,文字列識別名又は数値識別名と

して用いてはならない文字の列。4.4.2(11)参照。次のものがある。

(a)

引き数のない組込み関数名

(b)

配列値の識別名

(c)

ある種の機能語

(24)

例外状態 (exception)   プログラムの実行中に,規格の意味規則どおりに動作できないこと又は何ら

かの資源の制限を超えそうになったことを,処理系が認識したときの状態。ある種の例外状態[続行

可能 (nonfatal) な例外状態]は,規格の定める自動回復手続きで処理することができる。これらも含

めてすべての例外状態は,プログラムで指定する回復手続き (recovery procedure) で処理することもで

きる(12.1 参照)

。規格が回復手続を定めていない例外状態[続行不能 (fatal) な例外状態]及び処理

系のハードウェア又は操作環境の制約によって規格の定めた回復手続きがとれない例外状態は,プロ

グラム中に回復手続きの指定がなければ,その例外状態の発生した環境に従って,次のとおり処理さ

れる。

(a)

関数,絵又は副プログラムの呼出し中に起こったときには,例外状態は,呼出し側のプログラム単

位中のその呼び出した文に“伝達”される(12.1 参照)

(b)  (a)

の伝達が主プログラム若しくは並行単位に到達したとき又は例外状態が主プログラム中若しく

は並行単位中で起こったときには,その例外状態が,そのプログラム又は(実時間プログラムの場

合には)その並行単位の実行を終了させる。


11

X 3003-1993

表 3.1  機能語一覧[3.2(9)参照]

機能単位は,次の略号によって示す。

中:中核,フ:拡充ファイル,図:図形,実:実時間,小:固定小数点,編:編集

ACCESS

  中 EVENT  実 NEXT  中 SELECT  中実

AND

  中 EXCEPTION  中 NOT  中 SEND  実

ANGLE

  中図 EXIT  中図実 NUMERIC  中フ実小 SEQUENTIAL  中

AREA

  図 EXTERNAL  中図小 OF  フ実 SET  中

ARITHMETIC

  中小 EXTRACT  編 OFF  中 SETTER  中

ARRAY

  図 FILETYPE  中 ON  中実 SHARED  実

ASK

  中図 FIRST  編 OPEN  中 SIGNAL  実

AT

  図編 FIXED  小 OPTION  中 SIZE  中図

BASE

  中 FOR  中 OR  中 SKIP  中フ

BEGIN

  中 FROM  実 ORGANIZATION  中 STANDARD  中フ

BREAK

  中 FUNCTION  中小 OUT  実 START  実

CALL

  中 GET  図実 OUTIN  中実 STATUS  図

CASE

  中実 GO  中 OUTPUT  中実 STEP  中編

CAUSE

  中 GOSUB  中 PARACT  実 STOP  中

CELLS

  図 GOTO  中 PARSTOP  実 STREAM  中

CHAIN

  中 GRAPH  図 PICTURE  図 STRING  中フ実

CHOICE

  図 HANDLER  中 PIXEL  図 STRUCTURE  実

CLEAR

  図 HEIGHT  図 PLOT  図 STYLE  図

CLIP

  図 IF  中 POINT  図 SUB  中

CLOSE

  中 IMAGE  中 POINTER  中 TAB  中

COLLATE

  中フ IN  中図実 POINTS  図 TEMPLATE  フ

COLOR

  図 INPUT  中実 PORT  実 TEXT  図

CONNECT

  実 INTERNAL  中 PRINT  中 THEN  中

CONTINUE

  中 IS  中 PROCESS  実 THERE  中

DATA

  中 JUSTIFY  図 PROGRAM  中 TIME  実

DATUM

  中 KEY  フ PROMPT  中 TIMEOUT  中実

DEBUG

  中 KEYED  フ PUT  実 TO  中図実編

DECIMAL

  中 LAST  編 RADIANS  中 TRACE  中

DECLARE

  中実 LENGTH  中 RANDOMIZE  中 UNTIL  中

DEF

  中小 LET  中 RANGE  図 URGENCY  実

DEGREES

  中 LIMIT  図 READ  中 USE  中

DELAY

  実 LINE  中図 RECEIVE  実 USING  中図

DELETE

  フ編 LINES  図 RECORD  フ VALUE  図

DEVICE

  図 LIST  編 RECSIZE  中 VARIABLE  中

DIM

  中 LOCATE  図 RECTYPE  中 VIEWPORT  図

DISCONNECT

  実 LOOP  中 RELATIVE  フ WAIT  実

DISPLAY

  中 MARGIN  中 REM  中 WHEN  中

DO

  中 MAT  中フ図 RENUMBER  編 WHILE  中

DRAW MAX

  図 REST  中 WINDOW  図

ELAPSED

  中 MESSAGE  実 RESTORE  中 WITH  中フ図

ELSE

  中 MISSING  中 RETRY  中 WRITE  中

ELSEIF

  中 MIX  図 RETURN  中 ZONEWIDTH  中

END

  中図実 MULTIPOINT  図 REWRITE  フ

ERASABLE

  中 NAME  中 SAME  中

ERASE

  中 NATIVE  中フ SEIZE  実

参考  ANSI X3.113 には語 MAX がないが,誤りと考えられるので補った。


12

X 3003-1993

4.

プログラム要素

4.0

概要  BASIC プログラムは,行 (line) の列とする。行は,文 (statement) を含む。各行自体は,文

字 (character) の列とする。

4.1

文字

4.1.1

概要  BASIC 用の文字集合 (character set) は,JIS X 0201 の文字で構成する。

4.1.2

構文  構文は,次による。

(1)

プログラム文字=引用符|非引用符文字

(2)

引用文字=二連引用符|非引用符文字

(3)

非引用符文字= 感嘆符|番号記号|ドル記号|パーセント記号|アンド記号|アポストロフィ|

左括弧|右括弧|星印|コンマ|斜線|コロン|セミコロン|小号|等号|大号|

疑問符|山記号|下線|単純文字

(4)

二連引用符=引用符  引用符

(5)

単純文字=空白|単語文字

(6)

単語文字=数字|英字|小数点|正号|負号

(7)

数字=0|1|2|3|4|5|6|7|8|9

(8)

英字=英大文字|英小文字

(9)

英大文字= A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|

X

|Y|Z

(10)

英小文字= a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z

(11)

非プログラム文字=[処理系定義]

(12)

構文の生成規則によって生成されるプログラムは,次の場合にだけ空白を含む。

(a)

注釈文字列の中

(b)

引用文字列,単純文字列及び即値文字列の中

(c)

構文単位名“空白”によって,空白の存在が明示的に示されているところ

(13)

更に,次の場所以外なら,どこに空白を用いてもよい。これは,プログラムの実行には何も影響を与

えない。プログラムの外観を整え,読みやすくするために用いる。空白をおいてはならない場所は,

次のとおりとする。

(a)

行番号の直前

(b)

行番号の途中

(c)

機能語のつづりの途中

(d)

識別名のつづりの途中

(e)

数値定数の途中

(f)  2

文字の比較記号の途中

(g)

行継続における行末とアンド記号との間

参考  この(g)項は,TIB による。

(14)

引用文字列,単純文字列及び書式文字列の中の空白は,意味をもつ。単純文字列に先行又は後続する

空白の列は,その文字列の一部とはみなさない。

(15)

プログラム中の機能語の直前及び直後の文字は,英字,数字,下線又はドル記号であってはならない。

機能語の直後が行末 (end-of-line) であってもよい。

4.1.3

例  なし。


13

X 3003-1993

4.1.4

意味  意味は,次による。

(1)

英字 (letter) は,情報交換用符号  (JIS X 0201)  の位置 4/1∼5/10 にあるローマ文字の英大文字及び位

置 6/1∼7/10 にあるローマ文字の英小文字を用いる。

備考  これらの規定が JIS X 0201 を引用するのは,文字を明確に指定するためである。符号を定める

趣旨ではない。

(2)

数字 (digit) は,情報交換用符号の位置 3/0∼3/9 にある数字を用いる。

(3)

その他のプログラム文字は,情報交換用符号の位置 2/0∼2/15,3/10∼3/15,5/14 及び 5/15 にある

図形

文字を用いる。

(4)

文字の名称は,

表 4.1(163 ページ)による。文字の標準の大小順序 (collating sequence) は,表 4.1 

よる。標準 (standard) の大小順序は,省略時想定の場合及び collate 選択子で明示的に STANDARD を

指定した場合に用いる(6.46.6 及び 8.1 参照)

。固有 (native) の大小順序は,処理系定義とする。

(5)

英字以外の文字は,それ自身を表す。英字は,引用文字列,単純文字列及び行入力応答の中ではそれ

自身を表す。識別名及び機能語において,対応する英大文字と英小文字は等価とする。引用文字列中

の非引用符文字は,それ自身を表す。引用文字列中の二連引用符は,文字列の値としては 1 文字の引

用符を表す。

4.1.5

例外状態  なし。

4.1.6

注意  注意は,次による。

(1)  4.1.2(11)

の非プログラム文字 (other-character) は,処理系が定めて,BASIC 用の文字集合に含めること

ができる。非プログラム文字は,入力の要求に対するデータとして供給したり,関数 CHR$(6.4 参照)

の値として生成したりして,文字列の値中に用いることができる。これらの非プログラム文字の効果

は,処理系定義とする。

(2)

非プログラム文字(行末を示す文字は除く。

)を含むプログラムは,規格合致プログラムではない。

4.2

プログラム,行及び区

4.2.1

概要  プログラムの構成は,次による。

(1) BASIC

プログラムは,行 (line) の列とする。各行は,一意な行番号 (line-number) を含まなければな

らない。行番号は,プログラムの編集用及びその行に含まれる文 (statement) の名札 (label) として使

用される。

(2)

一つの BASIC プログラムは,幾つかのプログラム単位 (program-unit) からなる。先頭のプログラム単

位を主プログラム (main-program) という。主プログラムの最後の行は,end 行 (end-line) でなければ

ならない。主プログラムに続いて,0 個以上の外部副プログラム定義(external-sub-def,9.2 参照)

,外

部関数定義(external-function-def,9.1 参照)又は外部絵定義(external-picture-def,13.5 参照)を書く。

一つの BASIC プログラムは,並行単位(parallel-section,14.1 参照)の一つの列を含んでいてもよい。

この場合,各並行単位は,独立したプログラム単位とする。

(3) BASIC

プログラム中で,ある種の行の論理的な集まりを区 (block) という。

4.2.2

構文  構文は,次による。

(1)

プログラム⊃program 行?  主プログラム  外部手続き単位

*

(2)  program

行=行番号  PROGRAM  プログラム名  値仮引き数部?  行末部

(3)

プログラム名=ルーチン識別名

(4)

主プログラム=手続き区

*

  end 

(5)

手続き区=内部手続き定義|区


14

X 3003-1993

(6)

内部手続き定義⊃内部関数定義|内部副プログラム定義|handler 

(7)

区⊃単純行|繰返し区|if 区|select-case 区|image 行|保護区

(8)

単純行=行番号  単純文  行末部

(9)

行番号=数字  数字

*

(10)

単純文⊃宣言文|単純実行文|条件文

(11)

宣言文⊃空文|data 文|declare 文|dim 文|option 文|rem 

(12)

単純実行文⊃数値関数定義 let 文|文字列関数定義 let 文|例外処理区戻り文|ask 文|break 文|

call

文|cause-exception 文|chain 文|close 文|debug 文|erase 文|exit-do 文|exit-for 文|

exit-function

文|exit-handler 文|exit-sub 文|gosub 文|goto 文|input 文|let 文|line-input 文|

mat

文|mat-input 文|mat-line-input 文|mat-print 文|mat-read 文|mat-write 文|open 文|

print

文|randomize 文|read 文|restore 文|return 文|set 文|stop 文|trace 文|write 

(13) stop

文=STOP

(14)

条件文=if 文|on-gosub 文|on-goto 

(15)

行末部=行末注釈?  行末

(16)

行末=[処理系定義]

(17) end

行=行番号  end 文  行末部

(18) end

文=END

(19)

外部手続き単位=注釈行

*

  外部手続き定義

(20)

外部手続き定義⊃外部関数定義|外部副プログラム定義

(21)

注釈行=行番号  {空文|rem 文}行末

(22)

行⊃単純行|注釈行|case 行|case-else 行|def 行|do 行|else 行|elseif 行|end 行|

end-function

行|end-handler 行|end-if 行|end-select 行|end-sub 行|end-when 行|

external-function

行|external-sub 行|for 行|内部 function 行|handler 行|if-then 行|image 行|

loop

行|next 行|program 行|select-case 行|内部 sub 行|use 行|when-in 行|when-use 

(23)

プログラム単位⊃主プログラム|外部手続き定義

(24)

行継続=アンド記号  空白

*

  行末部  アンド記号

(25)

プログラムは,行の列とする。実時間プログラム以外のプログラムでは,行のうちの一つだけは,end

行でなければならない。先頭から end 行までの行(end 行を含む。

)が主プログラムを構成する。

(26)

行番号は,ゼロであってはならない。先行するゼロ列は,何も効果をもたない。行は,行番号の値の

昇順に並んでいなければならない(16.参照)

。プログラム単位中で行番号を引用するときには,その

プログラム単位中の行の行番号を参照しなければならない。行番号の数字は,1∼5 文字とする。行番

号の値は,1∼50000 とする。

(27)

行末 (end-of-line) の検出方法は,処理系定義とする。行末は,例えば復帰文字,復帰文字と改行文字

の連なり,物理記録の終りなどとしてもよい。

(28)

プログラム中の一つの物理行は,132 個以下の文字からなる。行末の指示は,この文字の個数には数

えない。

(29)

空白を用いてよい場所では,空白を行継続 (line-continuation) で置き換えてもよい。この場合,空白と

しての効果しかもたない。ただし,引用文字列,単純文字列,即値文字列,注釈文字列(4.1 及び 4.3

参照)及び行継続の中の空白は除く。

参考  この“行継続”という言葉は,TIB による。


15

X 3003-1993

(30) program

行 (program-name-line) の値仮引き数を,主プログラム中又は実時間プログラムの先頭の並行

単位(14.1 参照)中の dim 文又は declare 文で,明示的に宣言してはならない。

4.2.3

例  構文の例を次に示す。

100 PROGRAM

  Graphit &  !  This program draws a graph

&

              (x,      &  !  x is x-coordinate

(2)

&

                y)        !  y is y-coordinate

999 END

(15)

4.2.4

意味  意味は,次による。

(1)  program

行は,chain 文の作用対象 (operand) となる(9.3 参照)

。プログラム名と,chain 文中のプロ

グラム指示名 (program-designator) との間の対応付けは,処理系定義とする。program 行の値仮引き

数部の評価は,9.1 による。その有効範囲は,主プログラム又は先頭の並行単位(14.1 参照)とする。

単独で実行されるプログラムのプログラム名は,何も効果をもたない。単独で実行されるプログラム

の program 行の値仮引き数部の効果は,処理系定義とする。

(2)

プログラムは,その先頭の行から始め,次のいずれかになるまで,順番に実行される。

(a)

行の実行によって,他の動作が指示される。

(b)

例外状態になる。ただし,続行可能な例外状態であって,利用者がそれに対して例外処理区を定義

していない場合を除く。

(c)  chain

文が実行される。

(d)  stop

文又は end 文が実行される。

(3)  end

文 (end-statement) は,主プログラムの物理的な終りを示す。これを実行すると,プログラムの実

行が終了する。stop 文 (stop-statement) を実行すると,プログラムの実行が終了する。

4.2.5

例外状態  なし。

4.2.6

注意  プログラム単位中にない行番号の参照は,構文誤りとする。処理系は,これを例外状態とし

て扱ってもよい。その場合には,このことを文書化しておかなければならない。

4.3

プログラムの注釈

4.3.1

概要  BASIC プログラムには,プログラムの行の終りに,又は独立した rem 文 (remark-statement)

によって,注釈 (comment) を付けることができる。

4.3.2

構文  構文は,次による。

(1)  rem

文=REM  注釈文字列

(2)

注釈文字列=プログラム文字

*

(3)

空文=行末注釈

(4)

行末注釈=感嘆符  注釈文字列

(5)

注釈文字列の中では,行継続をしてはならない。

4.3.3

例  構文の例を次に示す。

REM FINAL CHECK

(1)

!COMPUTE AVERAGE

(4)

4.3.4

意味  意味は,次による。

(1)

プログラムの実行が rem 文又は空文 (null-statement) の行に到達すると,

何もしないで次の行に進む。

(2)

行末注釈 (tail-comment) は,それを含む行の実行には何も効果を与えない。行末注釈中の注釈文字列


16

X 3003-1993

(remark-string)

は,ただその行の注釈としての意味をもつだけとする。

4.3.5

例外状態  なし。

4.3.6

注意  なし。

4.4

識別名

4.4.1

概要  識別名 (identifier) は,変数,配列,配列値,関数,プログラム,副プログラム,例外処理

区及び絵を命名する。実時間プログラム (real-time-program) においては,並行単位,事象,構造及び域を

も命名する(14.参照)

4.4.2

構文  構文は,次による。

(1)

識別名⊃数値識別名|文字列識別名|ルーチン識別名

(2)

数値識別名=英字  識別名文字

*

(3)

識別名文字=英字|数字|下線

(4)

文字列識別名=英字  識別名文字

*

  ドル記号

(5)

ルーチン識別名=英字  識別名文字

*

(6)

識別名は,文字列識別名の場合のドル記号をも含めて,31 文字以内とする。

(7)

数値識別名 (numeric-identifier) は,数値単純変数,1∼3 次元の数値配列,数値関数又は数値配列値を

命名する。一つのプログラム単位中では,一つの数値識別名でこれらのうちの二つ以上の対象を命名

してはならない。同様に文字列識別名 (string-identifier) は,文字列単純変数,1∼3 次元の文字列配列,

文字列関数又は文字列配列値を命名する。一つのプログラム単位中では,一つの文字列識別名でこれ

らのうちの二つ以上の対象を命名してはならない。

(8)

識別名は,内部副プログラム定義,内部関数定義,handler 区又は内部絵定義を命名する。一つのプ

ログラム単位中では,一つの識別名でこれらのうちの二つ以上の対象を命名してはならない。

(9)

一つのプログラム中では,一つのルーチン識別名 (routine-identifier) は,外部関数定義,外部副プログ

ラム定義,外部絵定義,主プログラム又は並行単位の二つ以上の対象を命名してはならない。

(10)

外部関数定義を命名する数値識別名を,ルーチン識別名として使ってはならない。

参考  この規格中の“ルーチン識別名”という用語は,“数値識別名”という用語と完全に使い分けら

れているわけではない。

(11)

引き数のない組込み関数又は配列値の名前 CON,DATH,EXLINE,EXTYPE,IDN,MAXNUM,PI,

RND

,TIME,TRANSFORM 及び ZER は,ほかの対象を命名する数値識別名として使ってはならない。

引き数のない組込み関数又は配列値の名前 DATE$,NUL$及び TIME$は,ほかの対象を命名する文字

列識別名として使ってはならない。

機能語 NOT,ELSE,PRINT 及び REM は,識別名として使ってはならない。

更に,部分集合中核機能単位においては,次の機能語もまた,識別名として使ってはならない。

ACCESS, AND, ANGLE, AREA, ARITHMETIC, ASK, AT, BASE, BEGIN, BREAK, CALL, CASE,

CHAIN, CLEAR, CLIP, CLOSE, COLLATE, COLOR, DATA, DATUM, DEBUG, DECIMAL, DECLARE,

DEF, DEGREES, DEVICE, DIM, DISPLAY, DO, ELAPSED, ELSEIF, END, ERASE, ERASABLE, EXIT,

EXTERNAL, FILETYPE, FOR, FUNCTION, GO, GOSUB, GOTO, GRAPH, IF, IMAGE, INPUT,

INTERNAL, IS, LENGTH, LET, LINE, LINES, LOOP, MARGIN, MAT, MISSING, NAME, NATIVE, NEXT,

NUMERIC, OFF, ON, OPEN, OPTION, OR, ORGANIZATION, OUTIN, OUTPUT, POINT, POINTER,

POINTS, PROGRAM, PROMPT, RADIANS, RANDOMIZE, READ, RECSIZE, RECTYPE, REST,

RESTORE, RETURN, SAME, SELECT, SEQUENTIAL, SET, SETTER, SIZE, SKIP, STANDARD, STATUS,


17

X 3003-1993

STEP, STOP, STREAM, STRING, STYLE, SUB, TAB, TEXT, THEN, THERE, TIMEOUT, TO, TRACE,

UNTIL, USING, VARIABLE, VIEWPORT, WHILE, WINDOW, WITH, WRITE, ZONEWIDTH

4.4.3

例  構文の例を次に示す。

X

(2)

sum

(2)

A$

(4)

last_name$

(4)

INVERT

(5)

4.4.4

意味  意味は,次による。

(1)

プログラム単位中で定義された変数,配列,handler 区,内部関数定義,内部副プログラム定義又は

内部絵定義(13.5 参照)を命名する識別名は,それを含むプログラム単位が呼び出されるたびに局所

的 (local) とする。その意味で,各プログラム単位は,他と区別される実体 (entity) とする。これら

の識別名は,別のプログラム単位中では別の対象を命名し,同一プログラム単位の別の回の呼出しで

も別の対象を命名する。ただし,組込み関数又はプログラム単位を命名する識別名は,プログラム全

体に対して広域的 (global) とする。すなわち,それらの識別名は,どこにあっても同じ対象を指名す

る。

参考  あるプログラム単位の名前を,別のプログラム単位の内部で,変数の名前として用いるような

ことはできる。

(2)

組込み関数の名前又は機能語 TAB と同じつづりの名前を,利用者定義関数,配列又は変数の識別名と

して,暗黙的に又は明示的に定義・宣言してもよい。その定義・宣言の有効範囲の中では,指定され

た解釈が,規格であらかじめ規定した解釈に優先する。したがって,その有効範囲の中では,この組

込み関数又は印字の位置指定 TAB は,利用できなくなる。

(3)

一つのプログラム単位中で,英大文字と英小文字が違うだけの識別名は,同じ対象を指示する。例え

ば,X1 は,x1 と同じ対象を識別する。その他の違いのある識別名は,別の対象を指示する。

参考  別の種類の対象であれば,同じつづりの識別名をもつことがありうる[4.4.24.4.6(4)参照]。

4.4.5

例外状態  なし。

4.4.6

注意  注意は,次による。

(1)

この規格に対して,単純変数名として使用できない単語を増やすような処理系定義の拡張をしてはな

らない。

配列や定義関数を引用するプログラム単位中では,すべての配列は宣言しなければならず(7.1 参照)

すべての定義関数もまた宣言・定義しなければならない。したがって,プログラム中におけるこれら

の識別名に対する宣言が,処理系組込みの解釈に優先するのならば,処理系は,この規格で規定され

ている以外の組込み関数を提供することができる。

しかし,処理系が拡張して提供する組込み関数に引き数がなくて,それを使う場合,その名前が単

純変数名と構文的に区別できないことがありうる。そのような組込み関数を提供する処理系は,それ

らの名前を組込み関数名として識別する構文的な手段を提供しなければならない。構文の例としては,

次のようなものが考えられる。

(a)

これらの関数を引用するプログラム単位は,この関数名を明示的に宣言しなければならないことに

する。


18

X 3003-1993

(b)  NEWFUNCTION ( )

というふうに,これらの関数の引用には,空の括弧を書かなければならないこ

とにする。

(2)

オペレーティングシステムは,主プログラムとは独立に翻訳される手続きの識別名の長さ及び形につ

いて,追加の制限を課してもよい。

(3)

組込み関数は,

同じつづりの名前の利用者定義関数又は単純変数が定義された場合には,

無視される。

識別名は,機能語と同じつづりであってもよい。ただし,機能語 PRINT,ELSE,REM 又は NOT と同

じであってはならない。

(4)

同じつづりの識別名が,二つ以上の別の対象を命名してもよい場合及び命名してはならない場合は,

次のようにまとめることができる。

参考  この(4)項は,TIB による。

(a)

一つの文字列識別名は,その有効範囲の中では,二つ以上の文字列対象を命名するのに用いてはな

らない。そして例えば,そのプログラム単位の中で,declare 文の external-function 宣言で宣言し,

引用するのでないならば,外部関数と同じつづりの文字列識別名で内部の対象を命名してもよい。

(b)

一つの数値識別名は,その有効範囲の中では,二つ以上の数値対象を命名するのに用いてはならな

い。そして例えば,そのプログラム単位の中で,declare 文の external-function 宣言で宣言し,引用

するのでないならば,外部関数と同じつづりの数値識別名で内部の対象を命名してもよい。

(c)

ある内部ルーチン(内部副プログラム,内部関数,内部絵及び handler 区)を命名するのに用いた

ルーチン識別名は,そのプログラム単位の有効範囲の中では,ほかの内部ルーチンを命名するのに

用いてはならない。

(d)

内部副プログラム,内部関数又は内部絵を命名するのに用いたルーチン識別名は,そのプログラム

単位の有効範囲の中では,それぞれ外部副プログラム,外部関数又は外部絵を命名するのに用いて

はならない。

(e)

一つのルーチン識別名は,一つのプログラムの中で,二つ以上の外部ルーチン,プログラム又は並

行単位を命名するのに用いてはならない。

(f)

次の対象は,同じルーチン識別名で重ねて命名してもよい。

外部副プログラムと内部関数

外部副プログラムと内部絵

外部副プログラムと内部の handler 

外部絵と内部副プログラム

外部絵と内部関数

外部絵と内部の handler 

主プログラムと内部副プログラム

主プログラムと内部関数

主プログラムと内部絵

主プログラムと内部の handler 

並行単位と内部副プログラム

並行単位と内部関数

並行単位と内部絵

並行単位と内部の handler 


19

X 3003-1993

5.

数値

5.0

概要  数値 (nunber) は,BASIC の基本的な二つのデータ型 (data type) の一つとする(他の一つは,

文字列とする)

。数値は,定数,変数及び組込み関数に結び付けられ,それらによって数値式が構成される。

5.1

数値定数

5.1.1

概要  数値定数 (numeric-contant) は,スカラ数値 (scalar numeric value) を表す。数値定数は,位

取り 10 進数で表現する。数値定数には,次の四つの形式がある。

形式 1  小数点なし指数部なし  (implicit point unscaled)  形式  sdd

形式 2  小数点あり指数部なし (explicit point unscaled) 形式  sddrdd

形式 3  小数点あり指数部あり (explicit point scaled) 形式  sddrddEsdd

形式 4  小数点なし指数部あり  (implicit point scaled)  形式  sddEsdd

ここで,

d

:10 進数字

r

:小数点

s

:省略可能な符号

E

:英字 E 又は e

とする。符号の先行していない数値定数は,正とみなす。

5.1.2

構文  構文は,次による。

(1)

定数⊃数値定数

(2)

数値定数=符号?  符号なし数値定数

(3)

符号=正号|負号

(4)

符号なし数値定数=有効数字部  指数部?

(5)

有効数字部=符号なし整数  小数点?|符号なし整数?  小数部

(6)

符号なし整数=数字  数字

*

(7)

小数部=小数点  符号なし整数

(8)

指数部=E  符号?  符号なし整数

5.1.3

例  構文の例を次に示す。

−21.

(2)

1E10

(4)

5e

−1

(4)

.4E

+1

(4)

500.

(5)

1.2

(5)

.255

(7)

5.1.4

意味  意味は,次による。

(1)

数値定数の値は,その定数によって表現される数値とする。英字 E 及び e は,10 のべき乗を意味する。

ここで,E 又は e の後ろの符号を省略すると,正号が想定される。

(2)

プログラム中では,数値定数の有効数字部 (significand) の数字のけた数は,何けたあってもよい。処

理系は,その数値定数の正確な値,又はそれを処理系定義の精度 (precision) に丸めた値を保持する。

数値定数の処理系定義の精度は,有効な arithmetic 選択子が DECIMAL であるか NATIVE であるかに

対応して,それぞれ 10 進 10 けた以上又は 10 進 6 けた以上とする(5.6 参照)


20

X 3003-1993

数値定数の指数部 (exrad) の数字のけた数は,何けたあってもよい。ただし,ゼロでない定数の絶

対値が,処理系定義の範囲の外にある場合には,例外状態になりうる(5.6 参照)

。絶対値が機械最小

値 (machine infinitesimal) よりも小さい定数は,ゼロで置き換えられる。絶対値が関数 MAXNUM の

値よりも大きい定数は,あふれ (overflow) を報告される。

5.1.5

例外状態  例外状態は,次による。

(1)

数値定数の評価があふれを起こす。

(1001,続行不能。

5.1.6

注意  注意は,次による。

(1)

ゼロでなく,かつ絶対値が機械最小値よりも小さい定数は,処理系が下位けたあふれ (underflow) の

例外状態(1501,続行可能。ゼロで置き換えて処理を続ける。

)として報告し,例外処理区による処理

を許すことを推奨する。

(2)

この規格には,名前付き定数の機能はない。しかし,それは,引き数のない利用者定義関数(9.1 参照)

を用いて書くことができる。

5.2

数値変数

5.2.1

概要  数値変数名 (numeric-variable) は,数値単純変数 (simple numeric variable) 又は数値配列

(numeric array)

の要素に対する参照とする。

5.2.2

構文  構文は,次による。

(1)

変数名⊃数値変数名

(2)

数値変数名=数値単純変数名|数値配列要素名

(3)

数値単純変数名=数値識別名

(4)

数値配列要素名=数値配列名  添字部

(5)

数値配列名=数値識別名

(6)

添字部=左括弧  添字  {コンマ  添字}

*

  右括弧

(7)

添字=指標

(8)

指標=数値式

(9)

単純変数名⊃数値単純変数名

(10)

配列名⊃数値配列名

(11)

添字部の添字の個数は,1∼3 とする。

5.2.3

例  構文の例を次に示す。

X

(3)

sum

(3)

V(4)

(4)

table(i

,j+1) (4)

5.2.4

意味  意味は,次による。

(1)

プログラムの実行中はいつも,一つの数値変数は一つの数値に結び付いている。数値変数に結び付い

た値は,プログラム中で文を実行して,変更することができる。

(2)

数値単純変数名 (simple-numeric-variable) は,単にプログラム単位中に書くだけで暗黙的に宣言される。

数値変数名の有効範囲は,それの書いてあるプログラム単位とする。ただし,内部手続き定義の仮引

き数の場合を除く(9.1 及び 9.2 参照)

参考  ANSI X3.113 では,ここが“内部関数定義”となっているが,誤りであるので,TIB によって

訂正した。


21

X 3003-1993

(3)

指標 (index) は,数値式とし,その値は,最も近い整数値に丸められる。を丸めた値は,INT (x+.

5)

で定義する。

(4)

数値配列要素名 (numeric-array-element) は,添字付き数値変数名ともいい,配列中の要素を添字の値

によって選択して参照する。参照可能な添字の値の範囲は,dim 文又は declare 文によって明示的に宣

言しなければならない(7.1 参照)

。添字の値は,正しい範囲の中になければならない。

(5)

実行を開始する時に数値変数に結び付ける初期値は,処理系定義とする。

5.2.5

例外状態  例外状態は,次による。

(1)

添字の値が,宣言された上下限指定の範囲の中にない。

(2001,続行不能。

5.2.6

注意  注意は,次による。

(1)

変数の初期値については規定しないので,処理系によって異なりうる。したがって,プログラムを移

植可能にするには,変数を含む式の評価に先立って,それらの変数に値を明示的に代入しておくこと

が望ましい。

(2)

初期値を変数に結び付けるには,処理系定義の多くの方式がある。すべての変数の初期値を未定義で

あることがわかるようにしておき,値が明示的に代入されることなしにその変数の値を利用しようと

すると,例外状態(3101,続行可能。処理系定義の値を用いて処理を続ける。

)になる方式を推奨する。

5.3

数値式

5.3.1

概要  数値式 (numeric-expression) は,加算,減算,乗算,除算及びべき乗の演算を用いて,数値

変数名,符号なし数値定数及び数値関数引用で構成する。

5.3.2

構文  構文は,次による。

(1)

式⊃数値式

(2)

数値式=符号?  数値項  {符号  数値項}

*

(3)

数値項=数値因子  {乗除算演算子  数値因子}

*

(4)

数値因子=数値一次子  {山記号  数値一次子}

*

(5)

数値一次子=符号なし数値定数|数値変数名|数値関数引用|左括弧  数値式  右括弧

(6)

数値関数引用⊃数値関数名  値実引き数部?

(7)

数値関数名=数値定義関数名|数値組込み関数名

(8)

値実引き数部=左括弧  値実引き数  {コンマ  値実引き数}

*

  右括弧

(9)

値実引き数=式|実配列名

(10)

実配列名=配列名

(11)

乗除算演算子=星印|斜線

(12)

数値関数引用中の値実引き数の個数及び型は,その数値関数の定義における値仮引き数の個数及び型

と一致していなければならない。実配列は,対応する値仮引き数と同じ次元数をもたなければならな

い。

(13)

数値型の値実引き数を外部関数定義に渡す場合,外部関数定義及びそれを呼び出すプログラム単位に

おいて有効な arithmetic 選択子は,一致していなければならない。

(14)

プログラム単位中の式の中で引用されるすべての数値関数名は,組込み関数名であるか,又はそのプ

ログラム単位中のより早い位置に,内部関数定義による定義若しくは declare 文による宣言がなけれ

ばならない。

5.3.3

例  構文の例を次に示す。

3

*

X

−Y^2

(2)


22

X 3003-1993

cost

*

quantity

+overhead  (2)

2^(

−X)

(4)

SQR(X^2

+Y^2)

(5)

value(X

,Y,a$)

(6)

minimum(Xvector)

(6)

5.3.4

意味  意味は,次による。

(1)

数値式の構成及び評価 (evaluation) は,通常の代数の規則に従う。山記号(^)

,星印(

*

,斜線(/),

正号(+)及び負号(−)は,それぞれ,べき乗,乗算,除算,加算及び減算又は符号反転を表す。

括弧がない限り,最初にべき乗を行い,次に乗算及び除算を行い,最後に加算,減算及び符号反転を

行う。括弧のないときには,同順位の演算は左から右に評価する。

書き方

解釈

A

−B−C (A−B)−C

A^B^C (A^B)^C

A/B/C (A/B)/C

−A+B (−A)+B

−A^B

−(A^B)

(2)

演算子の数学における用法が結合律や交換律を満たすものであれば,処理系は,括弧を用いることで

規制されていない限り,これらの性質を利用して式の評価の順序を変更してもよい。

(3)

数値式を評価する途中で下位けたあふれになると,その演算の結果の値は,ゼロで置き換えられる。

(4) 0^0

の値は,1 と定義する。

(5)

数値関数引用 (numeric-function-ref) は,あらかじめ定められた算法 (algorithm) を呼び出す記法とす

る。関数定義に仮引き数(parameter,5.46.4 及び 9.1 参照)があれば,それは実引き数 (argument) の

値で置き換えられる。数値関数を評価すると,定義されている算法を実行し,一つのスカラ数値が結

果として与えられ,これが数値式の中の数値関数引用の値になる。

5.3.5

例外状態  例外状態は,次による。

(1)

数値式を評価すると,ゼロによる除算になる。

(3001,続行不能。

(2)

数値式を評価すると,あふれになる。

(1002,続行不能。

(3)

べき乗の演算を評価すると,負数の非整数乗になる。

(3002,続行不能。

(4)

べき乗の演算を評価すると,ゼロの負数乗になる。

(3003,続行不能。

5.3.6

注意  注意は,次による。

(1)

数値式を評価するときの精度は,5.6 の制約のもとで,処理系によって異なりうる。

(2)

下位けたあふれは,処理系が例外状態(1502,続行可能。ゼロで置き換えて処理を続ける。

)として報

告し,例外処理区による処理を許すことを推奨する。

(3)

処理系は,数値式の中の数値一次子及び演算を,5.3.4 の意味規定に合致する任意の順序で評価してよ

い。もちろん,演算子の評価に先立って,その作用対象を評価しなければならない。例えば,数値式

A

+B+C+D  *  E では,数値一次子及び加算は,それぞれどんな順序で評価してもよい。しかしここ

で,積 D  *  E は加算の作用対象である。したがって,この乗算は,3 番 E の正号の示す加算に先立っ

て行わなければならない。

5.4

数値組込み関数


23

X 3003-1993

5.4.1

概要  一般的に使用される数値関数 (numeric function) の評価に対し,あらかじめ定められた算法

(algorithm)

が処理系から提供される。数値以外の機能に関連する関数については,6.47.17.212.1

13.5

及び 14.7 で規定する。

5.4.2

構文  構文は,次による。

(1)

数値組込み関数名⊃ ABS|ACOS|ANGLE|ASIN|ATN|CEIL|COS|COSH|COT|CSC|

DATE

|DEG|EPS|EXP|FP|INT|IP|LOG|LOG10|LOG2|MAX|

MAXNUM

|MIN|MOD|PI|RAD|REMAINDER|RND|ROUND|SEC|

SGN

|SIN|SINH|SQR|TAN|TANH|TIME|TRUNCATE

(2)  randomize

文=RANDOMIZE

5.4.3

例  構文の例を次に示す。

  RANDOMIZE  (2)

5.4.4

意味  意味は,次による。

(1)

数値組込み関数 (numeric-supplied-function) の値及び値実引き数の個数は,

表 5.1 による。各関数の数

値型実引き数は,特に断らない限り,最大の正数から絶対値最大の負数までの範囲の値とする。

角度を返す関数(ANGLE,ASIN 及び ATN)の値の単位は,ラジアンとする。ただし,option 文の

angle

選択子で DEGREES が有効な場合(5.6 参照)には,度とする。

πは,円周率  (=3.14159…)  の真

値とする。

表 5.1  数値関数

x

y:数値式;n:指標,すなわち数値式を丸めた整数値

関数

関数値

ABS (x)

x

の絶対値。

ACOS (x)

x

の逆余弦(単位は,ラジアン又は度。5.6 参照)

。関数値の範囲(ラジアンの場合)及び x

の範囲は,次のとおりとする。

0

≦ACOS (x)≦

π,  −1≦x≦1

ANGLE (xy)

原点と座標  (xy)  とを結ぶベクトルが正の 軸となす角(単位は,ラジアン又は度。5.6 
照)

。関数値の範囲(ラジアンの場合)は,次のとおりとする。

π<ANGLE (xy)≦π

x

y=0 であってはならない。逆時計回りを正とする。

例  ANGLE (1, 1)=45 度

ASIN (x)

x

の逆正弦(単位は,ラジアン又は度。5.6 参照)

。関数値の範囲(ラジアンの場合)及び x

の範囲は,次のとおりとする。

π/2≦ASIN (x)≦π/2,      −1≦x≦1

ATN (x)

x

の逆正接(単位は,ラジアン又は度。5.6 参照)

。関数値の範囲(ラジアンの場合)は,

次のとおりとする。

π/2<ATN (x)<π/2

CEIL (x)

x

以上の最小の整数。

COS (x)

x

(単位は,ラジアン又は度。5.6 参照)の余弦。

COSH (x)

x

の双曲線余弦。

COT (x)

x

(単位は,ラジアン又は度。5.6 参照)の余接。

CSC (x)

x

(単位は,ラジアン又は度。5.6 参照)の余割。

DATE 10

進数表示の今日の日付 yyddd。ここで,yy は西暦年数の下 2 けたを,ddd は年の中の通

日を表す。

例 1977 年 5 月 9 日の DATE の値は,77129 である。

日付機能がない場合の DATE の値は,−1 とする。

DEG (x)

x

(単位はラジアン)を,度を単位として表した値。

EPS (x)

x

x'x"及び

σのうちの最大値,。ここで,x'及び x"は,それぞれ の直前の値及び直後


24

X 3003-1993

関数

関数値

の値とする。

σは,表現可能な最小の正数とする。に直前の値がない場合には,x'xx

に直後の値がない場合には,x"とする。EPS (0)  は,処理系によって表現可能な最小の
正数とし,値は,処理系定義とする。option 文の arithmetic 選択子で,異なった指定を書

いた場合には,関数 EPS の値は異なりうる(5.6 参照)

EXP (x)

指数関数,すなわち,自然対数の底 e (=2.71828…)  の 乗。関数値が機械最小値より小さ

いときには,ゼロで置き換えられる。

FP (x)

x

の小数部,すなわち,x−IP (x)。

INT (x)

を超えない最大の整数。

例 INT

(1.3)

=1

INT (

−1.3)=−2

IP (x)

x

の整数部,すなわち,SGN (x) * INT (ABS  (x))。

LOG (x)

x

の自然対数。は正でなければならない。

LOG10 (x)

x

の常用対数。は正でなければならない。

LOG2 (x)

2

を底とする の対数。は正でなければならない。

MAX (xy)

x

と の代数的に大きいほうの値。

MAXNUM

処理系が表現及び操作できる有限の最大の正数。値は,処理系定義とする。option 文の

arithmetic

選択子で,異なった指定を書いた場合には,関数 MAXNUM の値は異なりうる

5.6 参照)

MIN (xy)

x

と,の代数的に小さいほうの値。

MOD (xy)

y

を法とする の値,すなわち,x

* INT (x/y)。は,ゼロであってはならない。

PI

円周率

π (=3.14159…)。

RAD (x)

x

(単位は度)を,ラジアンを単位として表した値。

REMAINDER (xy)

x

を で割った余り,すなわち,x* IP (x/y)。は,ゼロであってはならない。

RND

処理系定義の擬似乱数列における次の擬似乱数。これは,0≦RND<1 の一様擬似乱数とす
る。

ROUND (xn)

x

の値を小数点以下 10 進 けたに丸めた値。が負ならば,小数点の左側−けたに丸め

る。すなわち,INT (* 10^n+.5) /10^n

SEC (x)

x

(単位は,ラジアン又は度。5.6 参照)の正割。

SGN (x)

x

の符号。これは,

x

が負であれば  −1

x

がゼロであれば  0

x

が正であれば  +1

とする。

SIN (x)

x

(単位は,ラジアン又は度。5.6 参照)の正弦。

SINH (x)

x

の双曲線正弦。

SQR (x)

x

の非負の平方根。は,負であってはならない。

TAN (x)

x

(単位は,ラジアン又は度。5.6 参照)の正接。

TANH (x)

x

の双曲線正接。

TIME

その日の午前 0 時からの経過秒数。

  午前 11 時 15 分の TIME の値は,40500 である。

時計機能がない場合の TIME の値は,−1 とする。午前 0 時の関数 TIME の値は,

0

とする。86400 ではない。

TRUNCATE (xn)

x

の値の小数点以下 10 進 けたより後を切り捨てた値。が負ならば,小数点の左側−n

けたより後を切り捨てる。すなわち,IP (x

*

10^n) /10^n

(2)

表 5.1 の関数値の欄における“ラジアン又は度”の説明は,option 文の angle 選択子で DEGREES が有

効な場合,度の意味とする。RADIANS が有効な場合,ラジアンの意味とする。

(3)

周期的な三角関数 SIN,COS,

TAN

SEC

,CSC 及び COT に対する 10 進 m+1 けたの正確度の要求(5.6.4

参照)は,実引き数が−2

πから 2πまでの範囲にあるときだけ適用する。実引き数がこの範囲の外にあ

り,関数値を計算するために実引き数の値の範囲を調整する必要があるとき,関数値の正確度の損失


25

X 3003-1993

は,この調整の際の精度落ちによるものだけが許される。

例  処理系は,SIN (x)  を,SIN (MOD (x, 2

π))  として評価してもよい。ほかの関数も同様である。

(4)  randomize

文 (randomize-statement) を実行してないとき,関数 RND の引用は,プログラムの実行のた

びごとに同じ擬似乱数列を生成する。randomize 文を実行すると,この処理系定義の擬似乱数列が無

効になり,擬似乱数列の中から新たに予測できない出発点が選ばれ,以後の関数 RND で使われる。

擬似乱数列は,プログラム全体に広域的とし,個々のプログラム単位に局所的ではない。

5.4.5

例外状態  例外状態は,次による。

(1)

関数 LOG,LOG10 又は LOG2 の実引き数の値が,ゼロ又は負である。

(3004,続行不能。

(2)

関数 SQR の実引き数の値が,負である。

(3005,続行不能。

(3)

数値組込み関数の値の絶対値が,MAXNUM よりも大きい,又は数学的に無限大になる。

(1003,続行

不能。

(4)

関数 MOD 又は REMAINDER の第 2 実引き数の値が,ゼロである。

(3006,続行不能。

(5)

関数 ACOS 又は ASIN の実引き数の値が,−1 より小さい又は 1 より大きい。

(3007,続行不能。

(6)  ANGLE (0, 0)

を評価しようとした。

(3008,続行不能。

5.4.6

注意  注意は,次による。

(1)

処理系は,実時間時計機能 (real-time clock) のような乱数発生の手掛かりになる機構をもたない場合

に,利用者との対話などの方法によって randomize 文を処理してもよい。

(2)

この規格は,数値組込み関数を評価した結果の最終的な値に対してだけ,処理系があふれを報告する

ことを要求する。すなわち,関数の値を評価する過程で起こる例外状態を報告する必要はない。しか

し,その場合でも関数の最終的な値の正確度を保証するために,処理系は,適切な処置をとらなけれ

ばならない。数値組込み関数の最終的な値に対してあふれを報告する場合には,あふれを起こした関

数の名前も報告することを推奨する。

(3)

数値組込み関数の値がゼロでなく,かつ絶対値が機械最小値よりも小さい場合,処理系が下位けたあ

ふれの例外状態(1503,続行可能。ゼロで置き換えて処理を続ける。

)として報告し,例外処理区によ

る処理を許すことを推奨する。

(4)

関数 DATE 及び TIME で用いる基準時間帯 (time zone) は,処理系定義とする。

(5)

関数 DATE では,西暦年数を 4 けたで表すことはできない。それが必要な場合には,文字列関数

DATE$

を利用する。

5.5

数値 let 

5.5.1

概要  let 文 (let-statement) は,数値式の値を計算し,数値変数の並びに対して同時的に代入する。

5.5.2

構文  構文は,次による。

(1)  let

文⊃数値 let 

(2)

数値 let 文=LET  数値変数名並び  等号  数値式

(3)

数値変数名並び=数値変数名  {コンマ  数値変数名}

*

5.5.3

例  構文の例を次に示す。

LET P

=3.14159

(2)

LET A(X

,3)=SIN(X)* Y+1

(2)

LET A

,Y(I),Z=I+1

(2)

LET T(I

,J),I,J=I+J

(2)


26

X 3003-1993

5.5.4

意味  数値変数名並びの変数名に添字がある場合,それは左から右に順に評価される。次いで,右

辺の数値式(5.3 参照)が評価される。最後に,数値式の値が,必要ならば変数の保持できる最も近い近似

値に丸められた上で,数値変数名並びの各数値変数に左から右に順に代入される。

5.5.5

例外状態  なし。

5.5.6

注意  次の 2 文,

  LET A=1

  LET A,B(A)=2

を実行することは,次の 3 文,

  LET A=1

  LET A=2

  LET B(A)=2

を実行することと等価ではない。

5.6

数値の扱い及び角度

5.6.1

概要  特に指定しない限り,すべての数値変数の値は,論理的に浮動小数点 10 進数として扱われ,

10

進 10 けた以上の処理系定義の精度 (precision) をもつ。option 文 (option-statement) で指定することによ

って,精度は下がるかもしれないがより効率のよい数値表現を選ぶことができる。

特に指定しない限り,三角関数(5.4 参照)及び図形変形関数(13.5 参照)の引き数及び値の単位は,ラ

ジアン (radian) とする。option 文で指定することによって,これらの関数の角度の単位を度 (degree) に変

えることができる。

5.6.2

構文  構文は,次による。

(1)  option

文=OPTION  選択子並び

(2)

選択子並び=選択子  {コンマ  選択子}

*

(3)

選択子⊃ARITHMETIC {DECIMAL|NATIVE|ANGLE{DEGREES|RADIANS}

(4)  declare

文=DECLARE  宣言指定

(5)

宣言指定⊃numeric 宣言

(6)  numeric

宣言⊃NUMERIC  数値宣言  {コンマ  数値宣言}

*

(7)

数値宣言⊃数値単純変数名

(8)  arithmetic

選択子のある option 文を書く場合には,同じプログラム単位中のどの数値式よりも早い位

置,かつ数値配列名又は数値変数名を指定した,どの dim 文及び declare 文よりも早い位置に書かな

ければならない。

参考  ANSI X3.113 では,“数値配列名又は固定小数点宣言”とあるが,誤りと考えられるので訂正し

た。

(9)  arithmetic

選択子は,一つのプログラム単位中では,たかだか 1 回だけ書くことができる。

(10) angle

選択子のある option 文を書く場合には,同じプログラム単位中の,数値組込み関数名及び変形

関数名に対するどの引用よりも早い位置に書かなければならない。

(11)  angle

選択子は,一つのプログラム単位中では,たかだか 1 回だけ書くことができる。

(12) declare

文を書く場合には,そこで宣言される変数名に対するどの参照よりも早い位置に書かなければ

ならない。

5.6.3

例  構文の例を次に示す。

  OPTION ARITHMETIC DECIMAL,ANGLE DEGREES  (1)


27

X 3003-1993

5.6.4

意味  意味は,次による。

(1)  arithmetic

選択子は,その選択子 (option) を含むプログラム単位中での数値の論理的な振舞いを制御

する。

(2)  arithmetic

選択子で DECIMAL を指定するか,又は arithmetic 選択子を指定しない場合,数値変数の

値は,論理的に浮動小数点 10 進数として扱われ,処理系定義の精度(これを けたとする。

)及び範

囲をもつ。この精度は少なくとも 10 進数 10 けた  (m≧10)  とし,範囲は少なくとも 10

38

から 10

38

までとする。

(3) 10

進数演算の結果は,少なくとも 10 進 m+1 けたの精度をもつ浮動小数点 10 進数の中間結果の概念

によって規定する(処理系は,これと同等な別の方法で実現してもよい)。数値変数は,厳密に正確

(exact)

な値をとる。数値定数は,少なくとも 10 進解けたの精度で正確に評価される。数値演算及び

数値関数は,その作用対象や引き数(これら自体,計算された中間結果であることもある。

)から計算

された値について,少なくとも 10 進 m+1 けたの精度で正確に評価される。すべての場合に,評価の

中間結果は,少なくとも 10 進 m+1 けたの精度をもつ浮動小数点 10 進数として表現される。したが

って,真の結果が m+1 けたの有効数字をもつ 10 進数で表現できるとき,計算された結果は,厳密に

正確である。個々の定数,演算及び関数の評価における誤差は,有効数字の m+2 けた日において 5

を超えない。処理系は,

(真の結果に対する)絶対誤差が,これらの規定によって得られる結果の絶対

誤差よりも,常に大きくならない,いかなる数値の評価方法をとってもよい。

(4)  arithmetic

選択子で NATIVE を指定した場合,数値変数及び数値定数の値は,少なくとも 10 進 6 けた

の処理系定義の精度及び少なくとも 2×10

38

から 10

38

までの処理系定義の範囲をもつ処理系定義の

方法で表現され,扱われる。処理系は,誤差がこの精度の限度内である限り,10 進数の値を必ずしも

正確に表現しなくてよい。

(5)  angle

選択子は,その選択子を含むプログラム単位中での三角関数の評価を制御する。angle 選択子で

RADIANS

を指定するか,又は angle 選択子を指定しない場合,数値組込み関数 COS,COT,CSC,

SEC

,SIN 及び TAN,並びに図形変形関数 ROTATE 及び SHEAR は引き数の単位をラジアンとし,数

値組込み関数 ACOS,ANGLE,ASIN 及び ATN は結果の単位をラジアンとする。

(6)  angle

選択子で DEGREES を指定した場合,数値組込み関数 COS,COT,CSC,SEC,SIN 及び TAN,

並びに図形変形関数 ROTATH 及び SHEAR は引き数の単位を度とし,

数値組込み関数 ACOS,

ANGLE

ASIN

及び ATN は結果の単位を度とする。

(7)

プログラムの実行が option 文の行に到達すると,何もしないで次の行に進む。

(8)  numeric

宣言に数値単純変数名を書くと,その変数は数値単純変数になる。

(9)

プログラムの実行が declare 文の行に到達すると,何もしないで次の行に進む。

5.6.5

例外状態  なし。

5.6.6

注意  注意は,次による。

(1)  arithmetic

選択子で NATIVE を指定した場合に処理系が選択する数値の表現は,DECIMAL を指定し

たときと同じであってもよい。

(2)  arithmetic

選択子で NATIVE を指定した場合,数値式及び数値関数の評価における最小の精度は規定

しないが,処理系は少なくとも 10 進 6 けた以上の精度を保つことを推奨する。

(3)  arithmetic

選択子で NATIVE を指定した場合,処理系定義の正数の下限は,2×10

38

以下である。こ

の値は,IEEE 標準の浮動小数点 2 進数を採用する処理系を規格合致とするために定めた。


28

X 3003-1993

6.

文字列

6.0

概要  文字列は,BASIC の基本的な二つのデータ型 (data type) の一つとする(他の一つは,数値と

する)

。文字列 (string) は,文字の任意の連なりとする。その長さは,固定長でなく可変長であるが,ある

文字列に対して最大の長さを指定することもできる。文字列は,定数,変数及び組込み関数に結び付けら

れ,それらによって文字列式が構成される。

6.1

文字列定数

6.1.1

概要  文字列定数 (string-constant) は,引用符でくくられた固定長の文字の列とする。引用符それ

自身を文字列定数の中に含めるには,連続した二つの引用符で一つの引用符を表現する。

6.1.2

構文  構文は,次による。

(1)

定数⊃文字列定数

(2)

文字列定数=引用文字列

(3)

引用文字列=引用符  引用文字

*

  引用符

(4)

文字列定数の長さとは,引用符でくくられた引用文字の個数とする。これは二つの行末の間に書くこ

とのできる文字数の処理系定義の最大数(少なくとも 132)によってだけ制限される。

6.1.3

例  構文の例を次に示す。

”XYZ”

(2)

”1E10”

(2)

”He said

,””Don’t””.”

(2)

6.1.4

意味  文字列定数の値は,先頭と末尾の引用符でくくられたすべての引用文字の並びとする。引用

文字列の中の二連引用符 (double-quote) は,二つの記号からなるが,一つの引用符を表す。文字列定数中

の空白は,先頭及び末尾の空白列も含めて,意味をもつ。先頭の引用符と末尾の引用符とを続けて書いた

引用文字列 (” ”) は,空文字列を表す。文字列定数中の英大文字と英小文字とは,区別される。

6.1.5

例外状態  なし。

6.1.6

注意  文字列定数の最大長は,物理行の最大長によって制限される。したがって,文字列定数の最

大長は,行の長さ−3 である。3 というのは,行継続のアンド記号 (&),先頭の引用符及び末尾の引用符の

分である。例を示す。

  100  LET A$=&

  &”abc...unseen characters here...xyz”

物理行の最大長は 132 以上であるから,

処理系は文字列定数の最大長を 129 以上としなければならない。

6.2

文字列変数

6.2.1

概要  文字列変数名 (string-variable) は,文字列単純変数  (simple string variable)  又は 1∼3 次元の

文字列配列 (string array) の要素に対する参照とする。

文字列単純変数を明示的に宣言する必要はない。文字列変数名は,ドル記号によって数値変数名と区別

される。

6.2.2

構文  構文は,次による。

(1)

変数名⊃文字列変数名

(2)

文字列変数名={文字列単純変数名|文字列配列要素名}  部分文字列指定?

(3)

文字列単純変数名=文字列識別名

(4)

文字列配列要素名=文字列配列名  添字部

(5)

文字列配列名=文字列識別名


29

X 3003-1993

(6)

部分文字列指定=左括弧  指標  コロン  指標  右括弧

(7)

単純変数名⊃文字列単純変数名

(8)

配列名⊃文字列配列名

6.2.3

例  構文の例を次に示す。

K$

(2)

name$(X:Y)

(2)

ITEM$(1,n)(z:z

+5)

(2)

A$(4)

(4)

table$(I,J)

(4)

6.2.4

意味  意味は,次による。

(1)

プログラムの実行中はいつも,一つの文字列変数は一つの文字列値に結び付いている。文字列変数に

結び付いた値は,プログラム中で文を実行して,変更することができる。

(2)

文字列変数に結び付いている文字列の長さは,プログラムの実行中に,0 文字(空文字列を意味する。

から,文字列変数に許される最大長(6.6.4 参照)まで変わりうる。

(3)

文字列単純変数名 (simple-string-variable) は,明示的に宣言する(6.6 参照)ことも,また,プログラ

ム単位中に書くだけで暗黙的に宣言することもできる。文字列変数名の有効範囲は,それの書いてあ

るプログラム単位とする。ただし,内部手続き定義の仮引き数の場合には,有効範囲はその定義の中

とする。

(4)

文字列配列要素名 (string-array-element) は,添字付き文字列変数名ともいい,1∼3 次元の配列中の要

素を添字の値によって選択して参照する。添字の値は,正しい範囲の中になければならない(7.1 参照)

(5)

部分文字列指定 (substring-qualifier) は,文字列変数に結び付いた値の一部を指定する手段を与える。

a$ (n)

は,a$に結び付いた文字列値の 文字目から 文字目(及び は,指標とする。

)までの

部分文字列を指定する。文字列中の文字は,左から右に,1 から順に番号付けられる。部分文字列指

定に関する例外状態はない。

m

又は が 1 から LEN (a$)  までの範囲の中になければ,

m

は MAX (m, 1),

n

は MIN (n, LEN (a$))とみなす。この調整後も mであれば,次のとおりとする。

(a)  n

m≦LEN (a$)  の場合,a$ (n)  は,番目の文字の前にある空文字列とする。

(b) LEN

(a$)

の場合,a$ (n)  は,略の直後の空文字列とする。

例 A$=“1234”とすると,次のとおりになる。

A$ (1 : 1)

=“1”

A$ (1 : 3)

=“123”

A$ (0 : 3)

=“123”

A$ (2 : 5)

=“234”

A$ (3 : 2)

=A$の 3 番目の文字の前の空文字列

A$ (5 : 7)

=A$の直後の空文字列

(6)

実行を開始する時に文字列変数に結び付ける初期値は,処理系定義とする。

6.2.5

例外状態  例外状態は,次による。

(1)

添字の値が,宣言された上下限指定の範囲の中にない。

(2001,続行不能。

6.2.6

注意  注意は,次による。

(1)

変数の初期値については規定しないので,処理系によって異なりうる。したがって,プログラムを移

植可能にするには,変数を含む式の評価に先立って,プログラム中でそれらの変数に値を明示的に代


30

X 3003-1993

入しておくことが望ましい。

(2)

初期値を変数に結び付けるには,処理系定義の多くの方式がある。処理系がすべての変数の初期値を

未定義であることがわかるようにしておき,プログラム中で値を明示的に代入することなしにその変

数の値を利用しようとすると,例外状態(3102,続行可能。処理系定義の値を用いて処理を続ける。

になる方式を推奨する。

6.3

文字列式

6.3.1

概要  文字列式 (string-expression) は,文字列変数名,文字列定数,文字列関数引用又はこれらの

連結 (concatenation) で構成する。

6.3.2

構文  構文は、次による。

(1)

式⊃文字列式

(2)

文字列式=文字列一次子  {連結演算子  文字列一次子}

*

(3)

文字列一次子=文字列定数|文字列変数名|文字列関数引用|左括弧  文字列式  右括弧

(4)

文字列関数引用=文字列関数名  値実引き数部?

(5)

文字列関数名=文字列定義関数名|文字列組込み関数名

(6)

連結演算子=アンド記号

(7)

文字列関数引用中の値実引き数の個数及び型は,その文字列関数の定義における値仮引き数の個数及

び型と一致していなければならない。実配列は,対応する値仮引き数と同じ次元数をもたなければな

らない。

(8)

プログラム単位中の式の中で引用されるすべての文字列関数名は,組込み関数名であるか,又はその

プログラム単位中のより早い位置に,内部関数定義による定義若しくは declare 文による宣言がなけ

ればならない。

6.3.3

例  構文の例を次に示す。

A2$ & B$(4:22)&”223”

(2)

X$(1,3)(I:J)

(3)

6.3.4

意味  意味は,次による。

(1)

文字列式の値は,その文字列式中の文字列一次子 (string-primary) の値を連結したものとする。

例 A$=“COME”及び B$=“IN”とすると,次のとおりになる。

A$ & B$

=“COME IN”

B$ & A$

=“INCOME”

(2)

文字列一次子は,文字列式の中で左から右に順に評価される。各文字列一次子ごとに,添字があれば

最初に添字が評価され,次に部分文字列指定が,最後にその文字列一次子自身の値が評価される。

(3)

文字列関数引用 (string-function-ref) は,あらかじめ定められた算法 (algorithm) を呼び出す記法とす

る。関数定義に仮引き数(parameter,6.4 及び 9.1 参照)があれば,それは実引き数 (argument) の値

で置き換えられる。文字列関数を評価すると,定義されている算法を実行し,一つのスカラ文字列値

が結果として与えられ,これが文字列式の中の文字列関数引用の値になる。

6.3.5

例外状態  例外状態は,次による。

(1)

文字列式の評価が文字列あふれを起こす。

(1051,続行不能。

6.3.6

注意  アンド記号は,連結と行継続の両方に使う。だから,次の文は,文字の列 ABCXYZ を印字

する。

100 PRINT ”ABC” &&


31

X 3003-1993

& ”XYZ”

6.4

文字列組込み関数

6.4.1

概要  一般的に使用される文字列関数 (string function) 及び実引き数が文字列であるような数値関

数 (numeric function) の評価に対し,あらかじめ定められた算法 (algorithm) が処理系から提供される。

6.4.2

構文  構文は,次による。

(1)

文字列組込み関数名⊃ {CHR|DATE|LCASE|LTRIM|REPEAT|RTRIM|STR|TIME|UCASE|

USING}

  ドル記号

(2)

数値組込み関数名⊃LEN|ORD|POS|VAL

(3)

数値関数引用⊃MAXLEN  左括弧  {文字列単純変数名|文字列配列名}  右括弧

6.4.3

例  なし。

6.4.4

意味  組込み関数 (implementation-supplied function) の値,値実引き数の個数及び値実引き数の型

は,

表 6.1 による。

表 6.1  文字列関数

m

:指標,すなわち数値式を丸めた整数値;  x:数値式;

v$

:文字列単純変数名又は文字列配列名;  a$b$:文字列式

関数

関数値

CHR$ (m)

宣言された文字集合の文字の大小順序における順序位置 m+1 の文字からなる長さ 1 文字
の文字列。文字集合の最初の文字は,引き数ゼロによって得られる。は,ゼロ以上かつ

宣言された文字集合中の文字数未満でなければならない[

表 4.1(163 ページ)参照]。

例  標準文字集合においては,次のとおりになる。

CHR$ (53)

= “5”,   CHR$ (65)  =“A”

  固有文字集合における CHR$の値は,処理系定義とする。

DATE$

JIS X 0301

に従った日付 yyyymmdd の文字列表現。

  1977 年 5 月 9 日の DATE$は,“19770509”である。

日付機能がない場合の DATE$の値は,

“00000000”とする。

LCASE$ (a$)

a$

に結び付いた値の中の英大文字を,すべて対応する英小文字で置き換えて得られる文字

列。

LEN (a$)

a$

に結び付いた値の中の文字の個数。

例  次の文字列定数の値は 1 個の引用符であるから,関数値は 1 である。

LEN ( ” ” ” ” )

=1

LTRIM$ (a$)

a$

に結び付いた値の中の先行するすべての空白を削除して得られる文字列。

MAXLEN (v$)

その文字列単純変数又は文字列配列の文字列の最大長(6.6 参照)

。有効な文字列長の制限

がないときは,値 MAXNUM を返す。

ORD (a$)

a$

に結び付いた文字列によって指名された文字の,宣言された文字集合における順序位置。

文字集合の最初の文字の順序位置は,ゼロとする。a$として許される値は,その文字集合

中の 1 文字及び長さ 2∼3 文字の呼び名 (mnemonic) とする。呼び名において,英大文字と
英小文字は同じに扱う。標準文字集合で許される値は,

表 4.1(163 ページ)による。固有

文字集合で許される値は,処理系定義とする。

例  標準文字集合においては,次のようになる。

ORD (”BS”)

=8

ORD (”A”)

=65

ORD (”a”)

=97

ORD (”5”)

=53

ORD (”SOH”)

=1

ORD (”Soh”)

=1

ORD (”ABC”)

……例外状態

POS (a$b$)

a$

に結び付いた文字列中で,b$に結び付いた値と一致する最初のものの先頭の,a$におけ


32

X 3003-1993

関数

関数値

る文字位置。一致する部分がないときは,POS (a$b$)  はゼロとする。POS (a$, ” ”)  は,a$
すべての値に対して 1 とする。

POS (a$b$m)

a$

に結び付いた値の第 文字目以降の文字列中で,b$に結び付いた値と一致する最初のも

のの先頭の,a$における文字位置。b$に結び付いた値が a$に結び付いた値の で指定され
た部分中にないとき,又は m>LEN (a$)  であるとき,ゼロを返す。それ以外は,次の算法

によって定められる POS の値を返す。

LET temp1

=MAX (1, MIN (m, LEN (a$)  +1))

LET temp2$

a$ (temp1 : LEN (a$))

LET temp3

=POS (temp2$b$)

IF temp3

=0 THEN

LET POS

=0

ELSE

LET POS

temp3temp1−1

END IF

例  a$=“GRANDSTANDING”とすると,次のとおりになる。

POS (a$, ”AN”, 1)

=3

POS (a$, ”AN”, 4)

=8

POS (a$, ”AN”, 9)

=0

POS (a$, ” ”, m)

は,m≦LEN (a$)  のとき,MAX (m, 1)  になる。

REPEAT$ (a$m)

a$

に結び付いた値を 回繰り返して連結した文字列値。は,ゼロ以上とする。

RTRIM$ (a$)

a$

に結び付いた値の中の後続するすべての空白を削除して得られる文字列。

STR$ (x)

x

に結び付いた値が print 文によって出力されるときの数値定数の形をした文字列。この数

値定数の前後の空白は,除かれる。

例 STR$

(123.5)

=“123.5”

STR$ (

−3.14)  =“−3.14”

TIME$

JIS X 0302

に従った 24 時間表示の時刻 hh mm ss の文字列表現。

例  午前 11 時 15 分の TIME$の値は,“11 : 15 : 00”である。

  時計機能がない場合の TIME$の値は,

“99 : 99 : 99”

とする。

午前 0 時の TIME$の値は

“00 :

00 : 00

”とする。

UCASE$ (a$)

a$

に結び付いた値の中の英小文字を,すべて対応する英大文字で置き換えて得られる文字

列。

USING$ (a$x)

a$

に結び付いた値を書式項目として用いて,数値式 の値を書式化した文字列表現(10.4

参照)

。書式付き出力の例外状態についての規定(10.4.5 参照)も適用する。

VAL (a$)

a$

に結び付いた文字列が数値定数の形であるとき,その数値定数の値。文字列の前後の空

白は,無視される。数値定数を評価した結果が下位けたあふれになったときは,ゼロを返

す。

例 VAL

(”123.5”)

=123.5

VAL (”2E

−99”)  ……ゼロになりうる

VAL (”MCMXVII”)

……例外状態

6.4.5

例外状態  例外状態は,次による。

(1) VAL

の実引き数の値が正しい数値定数の形でない。

(4001,続行不能。

(2) VAL

の実引き数の値が正しい数値定数の形であるが,その評価があふれを起こす。

(1004,続行不能。

(3) CHR$

の実引き数の値が適切な範囲の中にない。

(4002,続行不能。

(4) ORD

の実引き数の値が正しい 1 文字でも正しい呼び名でもない。

(4003,続行不能。

(5) REPEAT$

の第 2 実引き数の指標の値吻が負である。

(4010,続行不能。

参考  ANSI X3.113 では,“第 2 実引き数の値が負である”となっているが,誤りと考えられるので訂

正した。

6.4.6

注意  注意は,次による。


33

X 3003-1993

(1)

関数 VAL の絶対値がゼロでなく,かつ絶対値が機械最小値よりも小さい場合,処理系が下位けたあふ

れの例外状態(1504,続行可能。ゼロで置き換えて処理を続ける。

)として報告し,例外処理区による

処理を許すことを推奨する。

(2) DATE$

及び TIME$で用いる基準時間帯 (time zone) は,処理系定義とする。

(3)

関数 UCASE$及び LCASE$の効果は,英字についてだけ,完全に定義する。アクセント記号付きの文

字のような非プログラム文字に対する効果は,処理系定義とする。

参考 Full

BASIC

の規格の各国版は,地域的なアルファベットの利用に適合するために,この効果を

規定してもよい。

6.5

文字列 let 

6.5.1

概要  let 文 (let-statement) は,文字列式 (string-expression) の値を計算し,文字列変数の並びに対

して同時的に代入する。

6.5.2

構文  構文は,次による。

(1)  let

文⊃文字列 let 

(2)

文字列 let 文=LET  文字列変数名並び  等号  文字列式

(3)

文字列変数名並び=文字列変数名  {コンマ  文字列変数名}

*

6.5.3

例  構文の例を次に示す。

LET A$

=”ABC”

(2)

LET A$(I)

=B$(3:4)

(2)

LHT A$

,B$=”NEGATIVE DISCRIMINANT”

(2)

LET C$(7:10)

=”wxyz”

(2)

LET A$

=”ABCD” &&

(2)

& ”XYZ”

6.5.4

意味  意味は,次による。

(1)

文字列変数名並びの文字列変数名に添字や部分文字列指定がある場合,それらは左から右に順に評価

される。次いで,右辺の文字列式(6.3 参照)が評価される。最後に,文字列式の値が,文字列変数名

並びの各文字列変数に左から右に順に代入される。

(2)

左辺の文字列変数名に部分文字列指定があるときは,その文字列変数の値のうち,部分文字列指定で

指定された部分文字列が,右辺の値で置換される。この置換の結果,文字列変数の値の長さが,変わ

ることもありうる。

例 A$=“1234”であるとき,A$ (mn)  への代入は,次のようになる。

  代入する let 

結果の値

LET A$(2:3)

=”32”

“1324”

LET A$(2:3)

=” ”

“14”

LET A$(2:3)

=A$(1:2)

“1124”

LET A$(2:1)

=”5”

“15234”

6.5.5

例外状態  例外状態は,次による。

(1)

文字列変数に対する値の代入が文字列あふれを起こす。

(1106,続行不能。

6.5.6

注意  文字列変数名並びにおける文字列変数への代入の順序は,重要である。例えば,次の文で代

入の順序が規格と異なるときには,結果が異なりうる。

  LET A$(1:2), A$(2:5)=”X”


34

X 3003-1993

6.6

文字列宣言

6.6.1

概要  option 文 (option-statement) は,文字集合における文字の大小順序を指定する。

declare

文 (declare-statement) は,プログラム単位における個々の文字列変数の値の最大長を設定する。

6.6.2

構文  構文は,次による。

(1)

選択子⊃COLLATE   {NATIVE|STANDARD}  

(2)

宣言指定⊃string 宣言

(3)  string

宣言=STRING  最大長指定?  文字列宣言  {コンマ  文字列宣言}

*

(4)

最大長指定=星印  符号なし整数

(5)

文字列宣言⊃文字列単純宣言

(6)

文字列単純宣言=文字列単純変数名  最大長指定?

(7)  collate

選択子のある option 文を書く場合には,

同じプログラム単位中のどの文字列式よりも早い位置,

どの data 文よりも早い位置,かつ文字列配列名又は文字列変数名を指定した,どの dim 文及び declare

文よりも早い位置に書かなければならない。

参考  ANSI X3.113 には,data 文に関する規定がないが,誤りであるので,TIB によって訂正した。

(8)  collate

選択子は,一つのプログラム単位中では,たかだか 1 回だけ書くことができる。

(9)

一つの文字列単純変数名は,一つのプログラム単位中では,たかだか 1 回だけ declare 文で宣言でき

る。仮引き数である文字列単純変数名を,declare 文で宣言してはならない。

6.6.3

例  構文の例を次に示す。

COLLATE NATIVE

(1)

STRING

*

8 last name$

*

20

,first name$,middle name$  (3)

6.6.4

意味  意味は,次による。

(1)  collate

選択子は,文字列を比較したり(8.1 参照)

,関数 CHR$や関数 ORD の値を計算したり(6.4 

照)するのにプログラム単位中で用いる文字の大小順序を指定する。OPTION COLLATE NATIVE は,

親システム固有の大小順序を用いることを指定する。OPTION COLLATE STANDARD は,

表 4.1(163

ページ)にある文字の順序を用いることを指定する。プログラム単位中に collate 選択子がないときに

は,STANDARD が想定される。

(2)  string

宣言で宣言された文字列単純変数は,処理系定義の値以下の最大長をもつことができる。最大

長は,次の優先順位で決められる。

(a)

その変数名の文字列宣言における最大長指定

(b)

その変数名を含む declare 文の機能語 STRING の直後に書く最大長指定

(c)

処理系定義の最大長

(3)

文字列の最大長は,文字列変数に代入できる文字列の値の最大文字数を保証し,それより長い値を代

入しようとすると,文字列あふれの例外状態になることを指定する。処理系は,省略時想定の最大長

を,132 文字以上としなければならない。

(4)

最大長を 0 と宣言すると,その文字列変数の保持できる値の最大長が,ゼロになる。すなわち,空文

字列だけを保持する。

6.6.5

例外状態  なし。

6.6.6

注意  固有の大小順序は,標準の大小順序と同じであってもよい。

参考 Full

BASIC

の規格の各国版は,地域的なアルファベットの特定の利用に適合するために,collate

選択子を拡張して規定してもよい。


35

X 3003-1993

7.

配列

7.0

概要  配列 (array) は,数値又は文字列の指標付けられた集まりとする。配列要素 (array-element) は,

数値用又は文字列用のスカラ演算で操作できる(5.及び 6.参照)

。更に,配列全体は,配列用の文で操作で

きる。

7.1

配列宣言

7.1.1

概要  dim 文 (dimension-statement) 又は declare 文 (declare-statement) によって,配列を宣言する。

(1)  option

文 (option-statement) の base 選択子は,一つのプログラム単位の中の,下限値 (lower bound) が

明示的に宣言されていないすべての配列の添字 (subscript) に対して,

暗黙の下限値を定義する。

option

文で宣言して,すべてのそのような配列の添字の下限値を,ゼロ又は 1 にできる。option 文による宣

言がない場合には,暗黙の下限値は 1 とする。

(2)

配列の次元 (dimension) は,1∼3 次元とする。次元数及び各次元の添字の上下限は,declare 文又は

dim

文で宣言する。仮配列以外のすべての配列名は,これらの文でただ 1 回だけ宣言しなければなら

ない。添字の下限値は,明示的に宣言しないと,base 選択子によって 1 又はゼロとなる。添字の上限

値 (upper bound) は,必ず明示的に宣言しなければならない。

例えば,1∼10,1980∼1989 又は−9∼0 の添字をもつ 1 次元の配列は,いずれも 10 個の要素からな

る。各次元に対して 1∼10 の添字をもつ 3 次元の配列は,1 000 個の要素からなる。

(3)  dedare

文は,文字列変数・文字列配列 (string array) の文字列の最大長の宣言及び文字列配列・数値配

列 (numeric array) の配列宣言に用いることができる。dim 文は,配列宣言に用いることはできるが,

文字列配列の文字列の最大長を宣言することはできない。

7.1.2

構文  構文は,次による。

(1)  dim

文=DIM  配列宣言並び

(2)

配列宣言並び=配列宣言  {コンマ  配列宣言}

*

(3)

配列宣言=数値配列宣言|文字列配列宣言

(4)

数値配列宣言=数値配列名  上下限指定部

(5)

上下限指定部=左括弧  上下限指定  {コンマ  上下限指定}

*

  右括弧

(6)

上下限指定=整数  TO  整数|整数

(7)

整数=符号?  符号なし整数

(8)

文字列配列宣言=文字列配列名  上下限指定部

(9)

選択子⊃BASE   {0|1}  

(10)

文字列宣言⊃文字列配列宣言  最大長指定?

(11)

数値宣言⊃数値配列宣言

(12)

数値関数引用⊃ MAXSIZE  最大寸法実引き数部|SIZE  上下限実引き数部|

LBOUND

  上下限実引き数部|UBOUND  上下限実引き数部

(13)

最大寸法実引き数部=左括弧  実配列名  右括弧

(14)

上下限実引き数部=左括弧  実配列名  {コンマ  指標}?  右括弧

(15)

上下限指定部の中の上下限の個数は,1∼3 とする。

(16)

定義関数副プログラム,プログラム又は絵定義の仮配列となっている配列を,declare 文又は dim 文で

宣言してはならない。仮配列は,仮引き数部に書くことによって宣言される。仮配列以外のすべての

配列は,その配列又はその配列の要素を参照するどの文よりも早い位置の declare 文又は dim 文で宣

言しなければならない。配列及びその要素への参照は,declare 文,dim 文又は仮引き数におけるその


36

X 3003-1993

配列の宣言と,次元数が一致しなければならない。

(17)

一つの配列に対する配列宣言は,一つのプログラム単位の中に,

ただ 1 回だけ書かなければならない。

(18)

上下限指定において下限値を書く場合には,下限値(第 1 番目の整数)は,上限値(第 2 番目の整数)

以下の値でなければならない。

下限値を書かない場合には,上限値は,base 選択子によるゼロ又は 1 の暗黙の下限値未満であって

はならない。

(19) base

選択子のある option 文を書く場合には,同じプログラム単位の中の,どの declare 文,どの dim

文及び数値配列値又は文字列配列値を用いるどの mat 文よりも早い位置に書かなければならない。

(20) base

選択子は,一つのプログラム単位の中では,たかだか 1 回だけ書くことができる。

(21)

実配列が 1 次元として宣言されている場合にだけ,上下限実引き数部の指標を省略することができる。

7.1.3

例  構文の例を次に示す。

DIM A(6)

,B(10, 10),B$(100),D(1 TO 5,1980 TO 1989)

(1)

DIM A$(4, 4)

,C(−5 TO 10)

(1)

A$(3 TO 21) * 8

(10)

SIZE(A

,1)

(12)

SIZE(B$

,2)

(12)

SIZE(X)

(12)

LBOUND(A)

(12)

UBOUND(C$

,2)

(12)

7.1.4

意味  意味は,次による。

(1)

配列宣言 (array-declaration) は,上下限指定部 (bounds) に書いた上下限指定 (bounds-range) の個数 1

∼3 に従って,その配列が 1∼3 次元であることを宣言する。更に,上下限指定部は,その配列の添字

がとりうる最大値(及び指定されれば最小値)を指定する。添字の最小値が明示的に宣言されておら

ず,プログラム単位中に base 選択子もない場合には,添字の最小値は暗黙的に 1 と宣言される。

(2)  option

文の base 選択子は,プログラム単位に対して局所的とする。base 選択子は,それを含むプログ

ラム単位中のすべての配列の添字に対して共通の最小値を宣言する。ただし,添字の最小値が明示的

に宣言されているものは除く。

(3)

プログラムの実行が dim 文の行に到達すると,何もしないで次の行に進む。

(4)

文字列宣言の文字列配列宣言に,最大長指定を書くことができる。このとき,最大長指定は,文字列

配列の各要素の最大長を定める。文字列宣言に最大長指定を書かなければ,文字列単純変数の場合

(6.6.4)

と同様に,string 宣言の最大長指定が有効になる。これらの明示的な最大長指定がない場合に

は,処理系定義の最大長が有効になる。

(5)  a

を配列名とし を指標とするとき,SIZE (a,  n)  の値は,の 番目の添字に対する参照可能な値の

現在の個数とする。このとき,は,最も近い整数値に丸められる。の添字は,左から右に,1 から

順に番号付けられる。SIZE (a)  の値は,配列 の全要素の現在の個数とする。

(6) MAXSIZE

(a)

の値は,配列 の配列宣言によって許される全要素の個数とする。

(7)  a

を配列名とし を指標とするとき,LBOUND (a,  n)  の値は,の 番目の添字に許される現在の最

小値とする。同じく UBOUND (an)  の値は,の 番目の添字に許される現在の最大値とする。関数

SIZE

の場合と同様に,は,最も近い整数値に丸められ,の添字は,左から右に,1 から順に番号

付けられる。関数 LBOUND 及び関数 UBOUND は,実引き数がベクトル(1 次元配列)である場合に


37

X 3003-1993

は,配列名を実引き数に書くだけで呼び出すことができる。その場合,LBOUND 及び UBOUND の値

は,それぞれ,ベクトルの添字に許される現在の最小値及び最大値とする。以下で,

“ベクトル”とは

1

次元の配列,

“行列”とは 2 次元の配列をいう。

7.1.5

例外状態  例外状態は,次による。

(1)

関数 SIZE を引用したときの指標の値が,1 より小さい又は配列の次元数より大きい。

(4004,続行不

能。

(2)

関数 LBOUND を引用したときの指標の値が,1 より小さい又は配列の次元数より大きい。

(4008,続

行不能。

(3)

関数 UBOUND を引用したときの指標の値が,1 より小さい又は配列の次元数より大きい。

(4009,続

行不能。

7.1.6

注意  注意は,次による。

(1)  dim

文は,基本 BASIC (JIS X 3003-1982)  との互換性のために採用された。その機能は,すべて declare

文に含まれている。

(2)

処理系が 4 次元以上の配列を許す場合,関数 SIZE,LBOUND 及び UBOUND がそれらの次元に対し

ても機能し,例外状態は,宣言された次元数を超える次元に対してだけ起こさせることを推奨する。

7.2

数値配列

7.2.1

概要  BASIC では,数値配列 (numeric array) は要素ごとに扱うこともできる。しかし,数値配列

を指標付きの要素の集まりとみるだけでなく,一つのものとみなして,全体を一度に操作するほうが便利

な場合がある。BASIC は,このような操作を行うための幾つかの標準操作を備える。

7.2.2

構文  構文は,次による。

(1)  mat

文⊃数値 mat 

(2)

数値 mat 文=MAT  数値配列名  等号  数値配列式

(3)

数値配列式= {数値配列名  数値配列演算子}?  数値配列名|スカラ乗数  数値配列名|数値配列

値|数値配列関数引用

(4)

数値配列演算子=符号|星印

(5)

スカラ乗数=数値一次子  星印

(6)

数値配列値⊃スカラ乗数?   {CON|IDN|ZER}    再定義上下限指定部?

(7)

再定義上下限指定部=左括弧  再定義上下限指定  {コンマ  再定義上下限指定}

*

  右括弧

(8)

再定義上下限指定={指標  TO}?  指標

(9)

数値配列関数引用= {TRN|INV}    左括弧  数値配列名  右括弧

(10)

数値関数引用⊃ DET  左括弧  数値配列名  右括弧|DOT  左括弧  数値配列名  コンマ  数値配

列名  右括弧

(11)

再定義上下限指定部の中の再定義上下限指定の個数は,1∼3 とする。

(12)

数値 mat 文によって値が代入される左辺の数値配列の次元数は,その数値配列式の値の次元数と同じ

でなければならない。

(13)

関数 DOT の実引き数として書く数値配列は,1 次元でなければならない。

(14)

関数 IDN に書く再定義上下限指定部の中の再定義上下限指定の個数は,1 又は 2 とする。

(15)

加算又は減算で用いる二つの数値配列は,同じ次元数をもたなければならない。関数 DET,INC 又は

TRN

の実引き数として書く数値配列は,2 次元でなければならない。

(16)

数値配列演算子の星印(行列の乗算)を書くとき,その作用対象の数値配列は,1 次元又は 2 次元と


38

X 3003-1993

する。その少なくとも方は,2 次元でなければならない。

7.2.3

例  構文の例を次に示す。ここで,A,B 及び C は 2 次元数値配列,X,Y 及び Z は 1 次元数値配

列,W は数値一次子とする。

参考  ANSI X3.113 では,“数値一次子”のところが数値式となっているが,誤りであるので,TIB 

よって訂正した。

1.  構文規則(2)の例

MAT A

=B MAT

X

=Y

MAT A

=B+C MAT

X

=Y−Z

MAT A

=B *

C MAT

X

=A * Y

 MAT

X

=Y *

A

MAT A

=W *

B MAT

X

=W *

CON

MAT A

=ZER(4,3)

MAT  X

=ZER

MAT A

=INV(B)

MAT  A

=TRN(B)

2.  構文規則(10)の例

DET(B)

DOT(X,Y)

7.2.4

意味  意味は,次による。

(1)  mat

文と上下限の再定義

(1.1)

数値 mat 文 (numeric-array-assignment) を実行すると,数値配列式 (numeric-array-expression) が評価

され,その値が等号の左辺の配列に代入される。必要ならば,この配列の寸法 (size) が動的に変更

される。次元数は,変更されない。各次元の寸法が,右辺の数値配列式の値の寸法と同じになる。

(1.2)

数値配列の寸法が動的に変更されるとき,その添字の現在の上限値だけが,新しい寸法に合わせて

次のとおり変更される。

新しい下限値=もとの下限値

新しい上限値=もとの下限値+新しい寸法−1

各次元の新しい寸法は,その数値配列を宣言する配列宣言で指定した寸法を超えてもよい。しか

し,その数値配列の要素の新しい総数は,配列宣言で指定した要素の総数を超えてはならない。

(2)

配列式

(2.1)

数値配列式の評価は,通常の行列代数の規則に従う。星印“*”,正号“+”,負号“−”は,それぞ

れ乗算,加算,減算を表す。

(2.2)

数値配列式の中の数値配列の寸法は,行列代数の規則に適合していなければならない。加算又は減

算される二つの数値配列は,各次元の寸法が同じでなければならない。乗算される二つの数値配列

は,ある lmに対して,次のいずれかでなければならない。

(a)  l

×行列及び m×行列である。この結果は,l×行列となる。

(b)  m

要素ベクトル及び m×行列である。この結果は,要素ベクトルとなる。

(c)  l

×行列及び m 要素ベクトルである。この結果は,要素ベクトルとなる。

(2.3)

数値配列を評価すると,数値配列の全要素が使用される。すなわち,一つの数値配列は,一つのも

のとして扱われる。

(2.4)

数値配列式の中にスカラ乗数 (scalar-multiplier) があるときには,まずスカラ乗数の数値一次子が評

価され,次にその値が数値配列の各要素に掛けられる。

(2.5)

数値配列式を評価する途中で下位けたあふれになると,その演算の結果の値は,ゼロで置き換えら


39

X 3003-1993

れる。

(3)

配列値

(3.1)

数値配列値 (numeric-array-value) が,等号の左辺の数値配列に代入される。再定義上下限指定部が

ない場合には,等号の左辺の数値配列と同じ寸法の数値配列が生成される。再定義上下限指定部が

ある場合には,指定された寸法をもつ数値配列が生成され,等号の左辺の数値配列も(1)の規定に従

って再定義 (redimensioning) される。再定義上下限指定の二つの指標は,その配列値の対応する次

元の上限及び下限を表す。

再定義上下限指定に指標を一つだけ書いたときには,それは上限を表す。下限は,そこで有効な

暗黙の値になる。配列値 IDN に再定義上下限指定部を書くときには,それは正方行列(以下,行数

と列数が同じ行列をいう。

)を生成するものでなければならない。配列値 IDN に再定義上下限指定

部を書かないときには,等号の左辺の数値配列は正方行列でなければならない。

(3.2)

配列値 ZER は,すべての要素がゼロである数値配列を生成する。配列値 CON は,すべての要素が

1

である数値配列を生成する。配列値 IDN は,単位行列すなわち主対角要素は 1,それ以外の要素

はゼロの正方行列を生成する。配列値 IDN に再定義上下限指定を一つだけ書くと,同じ再定義上下

限指定を二つ書いたようにみなされる。

(3.3)

配列値 IDN,ZER 又は CON スカラ乗数を作用させると,その数値一次子(5.3 参照)が評価され,

結果の行列は,配列値 IDN,ZER 又は CON の各非ゼロ要素をその数値一次子の値で置き換えた値

をもつ。

(4)

配列関数

(4.1)

関数 TRN は,実引き数の転置行列を生成する。m×行列の実引き数に対して,n×行列を返す。

(4.2)

関数 INV は,実引き数の逆行列を生成する。実引き数は,正方行列でなければならない。

(4.3)

関数 DET は,実引き数の行列式の値を返す。実引き数は,正方行列でなければならない。

(4.4) DOT

(xy)

の値は,1 次元の数値ベクトル xの内積であるスカラ値とする。

7.2.5.

例外状態  例外状態は,次による。

(1)

数値配列式中の数値配列の寸法が,行列代数の規則に合わない。

(6001,続行不能。

(2)

再定義後の配列で必要な要素の総数が,もとの配列宣言で確保された要素数を超える。

(5001,続行不

能。

(3)

再定義上下限指定の 1 番目の指標の値が,2 番目の指標の値より大きい。

(6005,続行不能。

(4)

再定義上下限指定に指標が一つだけ書いてあって,その値が有効な暗黙の下限の値未満である。

(6005,

続行不能。

(5)

配列値 IDN に続く再定義上下限指定部が,正方行列を指定していない。又は,再定義上下限指定部が

書いてなくて,受取り側の行列が正方行列でない。

(6004,続行不能。

(6)

関数 DET の実引き数が,正方数値行列でない。

(6002,続行不能。

(7)

関数 INV の実引き数が,正方数値行列でない。

(6003,続行不能。

(8)

数値配列式の評価が,あふれを起こす。

(1005,続行不能。

(9)

関数 DET 又は DOT の評価が,あふれを起こす。

(1009,続行不能。

(10)

関数 INV の実引き数が,特異行列である。又は,有効数字が,すべて失われた。

(3009,続行不能。

7.2.6

注意  処理系が,下位けたあふれを例外状態(1505,続行可能。値をゼロで置き換えて,処理を続

ける。

)として報告し,例外処理区による処理を許すことを推奨する。

7.3

文字列配列


40

X 3003-1993

7.3.1

概要  文字列配列 (string array) は,数値配列と同様に,指標付きの要素の集まりとみるだけでな

く,全体として一つのものとみなすこともできる。BASIC は,文字列配列全体を連結 (concatenate) した

り,代入したりする機能を備える。

7.3.2

構文  構文は,次による。

(1)  mat

文⊃文字列 mat 

(2)

文字列 mat 文=MAT  文字列配列名  部分文字列指定?  等号  文字列配列式

(3)

文字列配列式= 文字列配列一次子  {連結演算子  文字列配列一次子}?|文字列一次子  連結演算

子  文字列配列一次子|文字列配列一次子  連結演算子  文字列一次子|文字列配

列値 

(4)

文字列配列一次子=文字列配列名  部分文字列指定?

(5)

文字列配列値={文字列一次子  連結演算子}?  NUL  ドル記号  再定義上下限指定部?

(6)

文字列 mat 文によって値が代入される左辺の文字列配列の次元数は,その文字列配列式の値の次元数

と同じでなければならない。

(7)

連結する二つの文字列配列は,次元数が同じでなければならない。

7.3.3

例  構文の例を次に示す。

MAT A$

=A$ & B$

(2)

MAT A$

=NUL$ (5,6)

(2)

MAT A$

=(”Number”)& B$

(2)

MAT A$(4:6)

=(””)& B$

(2)

7.3.4

意味  意味は,次による。

(1)

文字列 mat 文 (string-array-assignment) を実行すると,文字列配列式 (string-array-expression) が評価さ

れ,その値が等号の左辺の配列に代入される。必要ならば,この配列の寸法 (size) が動的に変更され

る。次元数は,変更されない。各次元の寸法が,右辺の文字列配列式の値の寸法と同じになる。

(2)

文字列配列の寸法が動的に変更されるとき,その添字の現在の上限値だけが,新しい寸法に合わせて

次のとおり変更される。

新しい下限値=もとの下限値

新しい上限値=もとの下限値+新しい寸法−1

各次元の新しい寸法は,その文字列配列を宣言する配列宣言で指定した寸法を超えてもよい。しか

し,その文字列配列の要素の新しい総数は,配列宣言で指定した要素の総数を超えてはならない。

(3)

文字列 mat 文の左辺の文字列配列に部分文字列指定があるときは,各要素の値のうち部分文字列指定

で指定された部分文字列を置き換える。左辺の部分文字列指定を先に評価し,それから右辺の文字列

配列式を評価する。

(4)

文字列配列式では,連結及び部分文字列の抽出操作も行う。連結する二つの文字列配列は,各次元の

寸法が同じでなければならない。連結は,要素ごとに行われる。文字列一次子を連結するときは,こ

の文字列一次子が文字列配列のすべての要素の,

(構文に従って)先頭又は末尾に連結される。文字列

配列に部分文字列指定があるときは,指定した部分文字列を配列の各要素から抽出する。

参考  ANSI X3.113 では,“文字列一次子”のところがスカラとなっているが,誤りであるので,TIB

によって訂正した。

(5)

評価及び代入の順序は,次による。

(a)

左辺の配列の部分文字列指定を評価する。


41

X 3003-1993

(b)

文字列配列式を左から右に順に評価する。個々の文字列一次子又は文字列配列一次子は,次のとお

り評価する。最初に添字を評価する。次に部分文字列指定を評価する。最後に文字列一次子そのも

のの値を評価する。

(c)

連結する。

(d)

代入する。

(6)

文字列配列値 NUL$は,すべての要素が空文字列である配列を生成する。再定義上下限指定部がない

場合には,等号の左辺の文字列配列と同じ寸法の文字列配列が生成される。再定義上下限指定部があ

る場合には,指定された寸法をもつ文字列配列が生成され,等号の左辺の文字列配列も(2)の規定に従

って再定義される。

数値配列値の再定義上下限指定部についての 7.2.4 の規定を,

NUL$

にも適用する。

(7)

部分文字列指定をもった文字列配列への代入が上下限を再定義するときの効果は,処理系定義とする。

これは,例えば,文字列 mat 文の左辺に部分文字列指定があり,右辺に再定義上下限指定部をもった

文字列配列値がある場合である。

参考  この(7)の項は,TIB による。

7.3.5

例外状態  例外状態は,次による。

(1)

文字列配列式中の配列の寸法が異なる。

(6101,続行不能。

(2)

再定義上下限指定の 1 番目の指標の値が,2 番目の指標の値より大きい。

(6005,続行不能。

(3)

再定義上下限指定に指標が一つだけ書いてあって,その値が有効な暗黙の下限の値未満である。

(6005,

続行不能。

(4)

再定義後の配列で必要な要素の総数が,もとの配列宣言で確保された要素数を超える。

(5001,続行不

能。

(5)

文字列配列式の評価が,文字列あふれを起こす。

(1052,続行不能。

(6)

左辺の文字列配列への代入が,文字列あふれを起こす。

(1106,続行不能。

7.3.6

注意  なし。

8.

制御構造

8.0

概要  制御構造 (control structure) は,プログラム中の行の実行の順序を制御する。それは,行番号

を明示的に参照する文,行番号を参照せずに明示的に構成された繰返し構造 (loop structure) 及び行番号を

参照せずに明示的に構成された判定構造 (decision structure) の両方によって行われる。

8.1

論理式

8.1.1

概要  論理式 (relational-expression) は,プログラム中の制御の流れを変更するために式の値を比較

する。

8.1.2

構文  構文は,次による。

(1)

論理式=論理和

(2)

論理和=論理積  {OR  論理積}

*

(3)

論理積=論理項  {AND  論理項}

*

(4)

論理項=NOT?  論理一次子

(5)

論理一次子=比較式|左括弧  論理式  右括弧

(6)

比較式=数値式  比較演算子  数値式|文字列式  比較演算子  文字列式

(7)

比較演算子=等値比較|大号|小号|非大|非小

(8)

等値比較=等号|非等


42

X 3003-1993

(9)

非等=小号  大号|大号  小号

(10)

非小=大号  等号|等号  大号

(11)

非大=小号  等号|等号  小号

8.1.3

例  構文の例を次に示す。

NOT X

<Y OR A$=B$ AND B$=C$

(2)

A

<=X AND X<=B

(3)

1

<=I AND I<=10 AND A(I)=X

(3)

I

<N AND (J>M OR A(I)<B(J))

(3)

8.1.4

意味  意味は,次による。

(1)

“小さいか等しい”は,非大で表す。

“大きいか等しい”は,非小で表す。

“等しくない”は,非等で

表す。

“大きい”

“小さい”及び“等しい”は,それぞれ大号,小号及び等号で表す。

(2)

二つの数値式は,同じ値のときだけ,等値とする。

(3)

二つの文字列式は,その両方の値の長さが同じで,かつ対応する位置の文字がすべて同じであるとき

だけ,等値とする。

(4)

文字列式を含む論理式の評価で,比較の“小さい”は,

“大小順序 (collating sequence) においてより

早く現れる”ことと定義し,他の比較もそれと同様に定義する。詳しくは,次による。

(a)

二つの文字列が同じ長さであって等値でない場合,両方の異なる文字のうちで最左端の文字位置を

比べ,一方の文字が指定された大小順序(6.6 参照)においてより早く現れれば,それを含む文字列

は他方の文字列より小さいとする。

(b)

二つの文字列の長さが異なる場合,一方の長さが 0 文字であるか,又は一方が他方の先頭からの部

分文字列であるとき,長さの短いほうがもう一方に比べて“小さい”とする。

(c)

それ以外で長さの異なる二つの文字列の大小関係は,短いほうの文字列の内容と,長いほうの文字

列の先頭から短いほうと同じ長さ分だけ取り出した文字列の内容との比較によって定義する。

(5)

演算子 AND,OR 及び NOT の優先順位は,構文の規定に従う。すなわち,NOT は直後の論理一次子

(relational-primary)

に作用し,AND は直前及び直後の論理項 (relational-term) に作用し,OR は直前及

び直後の論理積 (conjunction) に作用する。

(6)

論理式の評価の順序は,次のとおりとする。

(a)

論理式は,それを構成する論理和 (disjunction) の真理値をとる。

(b)

論理和に直接含まれる論理積は,真である論理積が見つかるか,又はすべての論理積の評価が終わ

るまで,左から右に順に評価される。そして,真である論理積が見つかったところで論理和全体が

真と評価され,残りの論理積は評価されない。真である論理積が見つからないと,その論理和は,

偽となる。

(c)

それぞれの論理積において,その中に直接に含まれる論理項は,偽である論理項が見つかるか,又

はすべての論理項の評価が終わるまで,左から右に順に評価される。そして,偽である論理項が見

つかったところで論理積全体が偽と評価され,残りの論理項は評価されない。すべての論理項が真

であれば,その論理積は,真となる。

(d)

それぞれの論理項において,その中に直接に含まれる論理一次子が評価され,NOT が直接に含まれ

るときは,論理一次子の真理値が逆転する。結果の値がその論理項の値となる。

(e)

比較式 (comparison) である論理一次子は,各種の比較について(4)の規定に従って評価される。比較

式でない論理一次子は,その中に直接に含まれる論理式の真理値をとる。この論理式は,(6)の規定


43

X 3003-1993

を再び適用して評価される。

8.1.5

例外状態  なし。

8.1.6

注意  論理式においては,式の評価に必要な部分だけを評価する。例えば,配列 A の上下限が 1

から 10 までとすると,

  1<=X AND X=10 AND A(X)=KEY

は,範囲外添字の例外状態には決してならない。

8.2

制御文

8.2.1

概要  制御文 (control statement) は,文の通常の実行順序を変更し,その文の次の行からではなく,

指定された行から実行を続ける。

(1)  goto

文 (goto-statement) は,無条件分岐 (unconditional transfer) を行う。

(2)  on-goto

文 (on-goto-statement) は,選ばれた行から実行を続ける。

(3)  gosub

文 (gosub-statement) と return 文 (return-statement) は,サブルーチン呼出しに用いる。

(4)  on-gosub

文 (on-gosub-statement) と return 文は,選択的なサブルーチン呼出しに用いる。

8.2.2

構文  構文は,次による。

(1)

行番号分岐=gosub 文|goto 文|if 文|データ存否|on-gosub 文|on-goto 

(2)  goto

文= {GOTO|GO  TO}    行番号

(3)  on-goto

文=ON  指標 {GOTO|GO  TO}    行番号  {コンマ  行番号}

*

{ELSE  単純実行文}?

(4)  gosub

文= {GOSUB|GO  SUB}    行番号

(5)  return

文=RETURN

(6)  on-gosub

文=ON  指標   {GOSUB|GO  SUB}    行番号  {コンマ  行番号}

*

{ELSE  単純実行

文}?

8.2.3

例  構文の例を次に示す。

GO TO 999

(2)

GOTO 999

(2)

ON L

+I GO TO 400,400,500

(3)

ON X GO TO 100

,200,150,9999 ELSE LET A=1

(3)

GO SUB 5000

(4)

GOSUB 5160

(4)

ON A

+7 GOSUB 1000,2000,7000,4000

(6)

ON F1

−2 GOSUB 4360,4460,4660 ELSE PRINT F$  (6)

8.2.4

意味  意味は,次による。

(1)  goto

文は,指定された行番号の行から実行を続ける。

(2)  on-goto

文を実行すると,指標が評価され,その値が最も近い整数に丸められる。この整数の値を使っ

て,GOTO に続く行番号の並びの中から,この整数番目の行番号を選ぶ(このとき,並び中の左端の

行番号を 1 番目とする)

。そして,その選ばれた行番号の行から実行を続ける。

on-goto

文が else 句をもち,かつその指標の丸められた値が 1 より小さいか又は並び中の行番号の個

数より大きいときには,ELSE に続く単純実行文を実行する。その単純実行文で別の行へ分岐するこ

とがなければ,通常の実行順序で on-goto 文の次の行から実行を続ける。

(3)  gosub

文,on-gosub 文及び return 文の実行は,行番号の棚 (stack) の概念を用いて説明する。

(行番号

の棚は概念上のものであって,この規格は,処理系がこの方法を用いることを要求しない。処理系は,


44

X 3003-1993

ほかの方法で実現してもよい。

(a)

行番号の棚は,プログラム単位又は内部手続き定義の各回の呼出しごとに一つずつ想定される。プ

ログラム単位又は内部手続き定義の各回の呼出しで,最初に gosub 文又は on-gosub 文を実行するま

では,その呼出しに対する棚は空とする。

(b)  gosub

文を実行するたびに,gosub 文自身の行番号が棚のいちばん上に積まれ,gosub 文で指定した

行番号の行から,そのプログラム単位又は内部手続き定義の実行を続ける。

(c)  on-gosub

文を実行すると,指標が評価され,その値が最も近い整数に丸められる。この整数の値を

使って,GOSUB に続く行番号の並びの中からこの整数番目の行番号を選ぶ(このとき,並び中の

左端の行番号を 1 番目とする。

。そして,on-gosub 文自身の行番号が棚のいちばん上に積まれ,指

標で選ばれた行番号の行から,そのプログラム単位又は内部手続き定義の実行を続ける。

(d)  on-gosub

文が else 句をもち,かつその指標の丸められた値が 1 より小さいか又は並び中の行番号の

個数より大きいときには,ELSE に続く単純実行文を実行する。このときには,行番号の棚は変わ

らない。その単純実行文で別の行へ分岐することがなければ,通常の実行順序で on-gosub 文の次の

行から実行を続ける。

(e)  return

文を実行するたびに,棚のいちばん上にある行番号を取り除き,その行番号の行の次の行か

ら,そのプログラム単位又は内部手続き定義の実行を続ける。

(f)

内部手続き定義中の gosub 文,on-gosub 文及び return 文は,その内部手続き定義の棚だけを使用す

る。それ以外の gosub 文,on-gosub 文及び return 文は,その文を含むプログラム単位の棚だけを使

用する。

(g)

プログラム単位又は内部手続き定義の実行を終了する時に,

gosub

文及び on-gosub 文の実行回数と,

return

文の実行回数とが等しくなっている必要はない。プログラム単位又は内部手続き定義のその

回の呼出しに想定された行番号の棚は,それぞれの実行の終了時に空にされる。

8.2.5

例外状態  例外状態は,次による。

(1)  else

句のない on-goto 文又は on-gosub 文の指標の丸められた値が,1 より小さい又は並び中の行番号

の個数より大きい。

(10001,続行不能。

(2)

同じプログラム単位又は内部手続き定義の中で,対応する gosub 文又は on-gosub 文を実行していない

のに,return 文を実行しようとする。

(10002,続行不能。

8.2.6

注意  注意は,次による。

(1)

行番号分岐という構文単位名は,行番号を参照する分岐を表すときにだけ用いる。それ以外の分岐を

表す生成規則に用いることはない。

(2)

行番号分岐中で,プログラム単位中にない行番号を参照すると,それは構文誤りとする(4.2 参照)

したがって,この規格は,そのような参照に対する例外状態を規定しない。しかし,処理系は,これ

を例外状態として扱ってもよい。その場合には,規格に合致しないそのようなプログラムの効果を,

文書化しておかなければならない。

8.3

繰返し構造

8.3.1

概要  繰返し区 (loop) は,一連の文を反復実行する。do 区 (do-loop) は,任意の出口条件

(exit-condition)

のある繰返し区を構成する。for 文 (for-statement) と next 文 (next-statement) は,回数制御

される繰返し区を構成する。

8.3.2

構文  構文は,次による。

(1)

繰返し区=do 区|for 


45

X 3003-1993

(2)  do

区=do 行  do 本体

(3)  do

行=行番号  do 文  行末部

(4)  do

文=DO  出口条件?

(5)

出口条件= {WHILE|UNTIL}    論理式

(6)  do

本体=区

*

  loop 

(7)  exit-do

文=EXIT DO

(8)  loop

行=行番号  loop 文  行末部

(9)  loop

文=LOOP  出口条件?

(10) for

区=for 行  for 本体

(11)  for

行=行番号  for 文  行末部

(12) for

文=FOR  制御変数名  等号  始値  TO  限界  {STEP  増分}?

(13)

制御変数名=数値単純変数名

(14)

始値=数値式

(15)

限界=数値式

(16)

増分=数値式

(17) for

本体=区

*

  next 

(18) exit-for

文=EXIT FOR

(19) next

行=行番号  next 文  行末部

(20) next

文=NEXT  制御変数名

(21) for

区 (for-loop) の末尾の next 文の制御変数名 (control-variable) は,その for 区の先頭の for 文の制御

変数名と同じものとする。

(22)

ある for 区の for 本体 (for-body) に含まれる内側の for 区には,外側の for 区と同じ制御変数名を用い

てはならない。

(23)

ある繰返し区の外部に書く行番号分岐中の行番号は,その繰返し区の for 本体又は do 本体 (do-body)

の内部にある行を参照してはならない。

(24) exit-do

文は,do 区の中にだけ書くことができる。exit-for 文は,for 区の中にだけ書くことができる。

8.3.3

例  構文の例を次に示す。

10 DO WHILE I

<=N AND A(I) <> 0

20

    LET I=I+1

(2)

30 LOOP


46

X 3003-1993

100 DO

110

    LET I=I+1

120

    PRINT ”MORE ENTRIES (ENTER ’NO’ IF NONE)”

(2)

130

    INPUT A$(I)

140 LOOP UNTIL A$(I)

=”NO”

10 DO

20

    INPUT X

30

    IF 0<X AND X  <7 AND X=INT(X) THEN EXIT DO

(2)

40

    PRINT ”INPUT AN INTEGER BETWEEN 1 AND 7”

50 LOOP

100 FOR I

=1 TO 10

150

   LET  A(I)=I

(10)

200 NEXT I

FOR I

=A TO B STEP −1

(12)

NEXT C7

(20)

8.3.4

意味  意味は,次による。

(1)

出口条件は,機能語 WHILE に続く論理式の値が偽であるか,又は機能語 UNTIL に続く論理式の値が

真であれば,繰返し区から出ることを指示する。

(2)

プログラムの実行が do 行に達した時,do 行の中に出口条件があれば,それが評価される。出口条件

がないとき,又は出口条件が繰返し区から出ることを指示しないときには,

次の行から実行を続ける。

出口条件が繰返し区から出ることを指示するときには,対応する loop 行の次の行から実行を続ける。

プログラムの実行が loop 行に達した時,loop 行の中に出口条件があれば,それが評価される。出口

条件がないとき,又は出口条件が繰返し区から出ることを指示しないときには,対応する do 行から

実行を続ける。出口条件が繰返し区から出ることを指示するときには,loop 行の次の行から実行を続

ける。

(3)  for

文と next 文の動作は,他の文に置き換えて次のとおり規定する。

110 FOR

  v=始値  TO  限界  STEP  増分

          (一連の行)

150 NEXT v

は,次と同等とする。

110 LET own1

=限界

120 LET own2

=増分

130 LET v

=始値

140 DO UNTIL (v

own1)* SGN (own2)>0

         (一連の行)

150

   LET  vvown2


47

X 3003-1993

160 LOOP

ここで,は,数値単純変数名とする。own1 と own2 は,その for 区に関係付けられている変数と

し,利用者からは参照できない。同様に,行番号 120,130,140 及び 160 は図示するためだけのもの

であって,for 区が実際にそのような行番号を生成するわけではない。変数 own1 と own2 は,他の for

区に関係付けられている同様の変数とは別のものとする。

この置換えにおいて,for 行への行番号分岐は最初の let 文(行番号 110 の行)への行番号分岐と解

釈され,next 行への行番号分岐は最後の let 文(行番号 150 の行)への行番号分岐と解釈される。

(4)  for

文において step 句を省略すると,増分 (increment) として+1 が想定される。

(5)  exit-do

文 (exit-do-statement) を実行すると,その exit-do 文を含む最も内側の do 区の loop 行の次の行

から実行を続ける。exit-for 文 (exit-for-statement) を実行すると,その exit-for 文を含む最も内側の for

区の next 行の次の行から実行を続ける。

8.3.5

例外状態  なし。

8.3.6

注意  next 文を経由して for 区を出たときには,制御変数の値は繰返し区の中で最後に使われた値

の“次の値”

(使われなかった最初の値)となる。それ以外で for 区を出たときには,制御変数の値はその

ときの値となる。

例  FOR I=1 TO J STEP 2

     (一連の文)

 NEXT  I

例に示す for 区において,J がゼロである場合には,一連の文を実行しないで for 区から出る。このとき,

制御変数 I の値は 1(使われなかった最初の値)となる。J が 10 である場合,next 文を経由して for 本体

を出たときには,制御変数 I の値は 11(最後に使われた値 9 の“次の値”

)となる。next 文を経由しない

で,例えば 3 回目の実行中に for 本体を出たときには,制御変数 I の値は 5(そのときの値)となる。

8.4

判定構造

8.4.1

概要  if 文 (if-statement) は,条件分岐,一つの単純実行文の条件付き実行,又は二つの単純実行

文の一方の実行を行う。

if

区 (if-block) は,行の連なりの条件付き実行,又は幾つかの行の連なりのうちの一つの条件付き実行

を行う。

select-case

区 (select-block) は,式の値に基づいて,幾つかの行の連なりのうちのどれか一つの実行を行

う。

8.4.2

構文  構文は,次による。

(1)  if

文=IF  論理式  THEN  単純実行動作  {ELSE  単純実行動作}?

(2)

単純実行動作=単純実行文|行番号

(3)  if

区=if-then 行  then 本体  elseif 

*

  else 区?  end-if 

(4)  if-then

行=行番号  IF  論理式  THEN  行末部

(5)  then

本体=区

*

(6)  elseif

区=elseif 行  区

*

(7)  elseif

行=行番号  ELSEIF  論理式  THEN  行末部

(8)  else

区=else 行  区

*

(9)  else

行=行番号  ELSE  行末部

(10) end-if

行=行番号  END  IF  行末部


48

X 3003-1993

(11)  select-case

区=select-case 行  注釈行

*

  case 区  case 

*

  case-else 区?  end-select 

(12) select-case

行=行番号  select-case 文  行末部

(13) select-case

文=SELECT  CASE  式

(14) case

区=case 行  区

*

(15) case

行=行番号  case 文  行末部

(16) case

文=CASE  照合項目並び

(17)

照合項目並び=照合項目  {コンマ  照合項目}

*

(18)

照合項目=定数|範囲指定

(19)

範囲指定={定数  TO|IS  比較演算子}  定数

(20) case-else

区=case-else 行  区

*

(21) case-else

行=行番号  CASE  ELSE  行末部

(22) end-select

行=行番号  END  SELECT  行末部

(23) select-case

区中の case 文の中に書く定数は,select-case 文中の式と同じ型(すなわち,数値又は文字

列のどちらか)でなければならない。

(24) select-case

区中の照合項目並びで指定する範囲及び定数は,重複してはならない。

(25) if

区,then 本体,elseif 区,else 区,select-case 区,case 区及び case-else 区において,それらの外部に

書く行番号分岐中の行番号は,内部にある行を参照してはならない。ただし,if 区の if-then 行及び

select-case

区の select-case 行は,参照してもよい。

(26) elseif

区,else 区,case 区及び case-else 区の内部に書く行番号分岐中の行番号は,それらに対応する

elseif

行,else 行,case 行及び case-else 行を参照してはならない。

8.4.3

例  構文の例を次に示す。

IF X

=>Y2 THEN GOSUB 900 ELSE GOSUB 2000

(1)

IF X$

=”NO” OR X$=”STOP” THEN LET A=1

(1)

IF A

=B THEN 100

(1)

IF A$

=B$ THEN 200 ELSE 300

(1)

10 IF X

=INT(X) THEN

20

    PRINT X;”IS AN INTEGER”

30 ELSE

(3)

40

    PRINT X;”IS NOT AN INTEGER”

50 END IF

100 IF A

=0 THEN

110

  PRINT ”ONE ROOT”

120 ELSEIF DISC

<0 THEN

130 PRINT ”COMPLEX ROOTS”

(3)

140 ELSE

150

  PRINT ”REAL ROOTS”

160 END IF


49

X 3003-1993

10 SELECT CASE A$ (1:1)

20 CASE ”A”TO”Z”, ”a”TO”z”

30

    PRINT A$;”starts with a letter”

40 CASE ”0”TO“9”

50

    PRINT A$;”starts with a digit”

(11)

60 CASE ELSE

70

    PRINT A$;”doesn't start with a letter or a digit”

80 END SELECT

10 SELECT CASE X

20 CASE IS

<0

30

    PRINT X;”is negative”

40 CASE IS

>0

50

    PRINT X;”is positive”

(11)

60 CASE ELSE

70

    PRINT X;”is zero”

80 END SELECT

8.4.4

意味  意味は,次による。

(1)  if

文は,論理式の値が真である場合,機能語 THEN の後ろに単純実行文があれば,その単純実行文を

実行し,THEN の後ろに行番号があれば,その行番号の行からプログラムの実行を続ける。論理式の

値が偽である場合,機能語 ELSE の後ろに単純実行文があれば,その単純実行文を実行し,ELSE の

後ろに行番号があれば,その行番号の行からプログラムの実行を続け,ELSE がなければ,順序どお

りに,すなわち if 文の次の行から実行を続ける。

(2)  if

区の実行は,次による。

(a)  then

本体,elseif 区又は else 区が,区を一つも含んでいなくても,結果は,注釈行 1 行からなる区

を一つ含んでいる場合と同じとする。

(b)  if-then

行の中の論理式の値が真である場合,then 本体の 1 行目から実行を続ける。

if-then

行の論理式の値が偽である場合,elseif 区があれば,それらの elseif 行の論理式を順に評価

する。真である論理式が最初に見つかったところで,その elseif 区中の区の 1 行目から実行を続け

る。

真である論理式を含む elseif 行がない場合,else 区があれば,その else 区中の区の 1 行目から実行

を続け,else 区がなければ,end-if 行の次の行から実行を続ける。

(c)  then

本体,elseif 区又は else 区の最後まで実行した後は,end-if 行の次の行から実行を続ける。

(3)  select-case

区では,

select-case

文 (select-statement) 中の式を評価し,

その値を case 文 (case-statement) 中

の照合項目と一致するまで順に比較する。式の値が次のいずれかであるときに,

“一致”したという。

(a)

定数の照合項目と等しい。

(b) TO

を含む範囲指定の,第の定数の値以上で第二の定数の値以下である。

(c)

範囲指定の中の,比較演算子と定数によって示される関係を満足する。

一致すると,その case 文を含む case 区中の区を実行する。一致しないとき,case-else 区があれば,

それを実行する。case 区又は case-else 区の最後まで実行した後は,end-select 行の次の行から実行


50

X 3003-1993

を続ける。

(4)

二つ以上の区を入れ子構造にすることができる。この場合,for 区と同じ制限が適用される[すなわ

ち,外側の区は,内側の区を完全に含んでいなければならない(8.3.2 参照)

8.4.5

例外状態  例外状態は,次による。

(1)  case-else

区のない select-case 区の実行で,どの照合項目でも一致しない。

(10004,続行不能。

8.4.6

注意  なし。

9.

プログラム分割

9.0

概要  BASIC プログラムは,複数の論理的な構造に分割 (segmentation) して書くことができる。

(1) BASIC

は,プログラムの分割のために,四つの機構を提供する。

(a)

利用者定義関数 (user-defined function)    関数の値は,数値式及び文字列式の中で使用することがで

きる。

(b)

副プログラム (subprogram) の定義  副プログラムは,call 文によって呼び出され,参照引き数を介

して情報伝達を行う。

(c)

プログラム連鎖 (chaining)    別々のプログラムを,利用者の介入なしに逐次的に実行させる。

(d)

図形絵 (graphical picture) の定義  13.5 参照。

(2)

関数及び副プログラム(両者を合わせてルーチンと呼ぶ。

)には,内部及び外部の 2 種類がある。この

区別は,13.5 で規定する絵定義にも適用する。外部ルーチンは,主プログラムの後ろに続けて書く独

立したプログラム単位である。内部ルーチンは,プログラム単位(主プログラム,外部ルーチン又は

並行単位)の中に含まれ,そのプログラム単位の一部とみなされる。内部ルーチンの中に更に内部ル

ーチンを書くことはできない。

(3)

一般に,外部ルーチンは,他のプログラム単位とは何も(例えば,変数,data 文,内部ルーチン,選

択子,デバッグ状態などを)共有しない。外部ルーチンと他のプログラム単位との情報交換は,引き

数又は(外部関数の場合には)関数値によって行う。

一方,内部ルーチンは,それを含むプログラム単位とすべてのものを共有する。ただし,その内部

ルーチンの仮引き数及びその gosub 用の行番号の棚は,共有しない。内部ルーチンに局所変数は,存

在しない。

参考  有効範囲については,附属書 B(参考)に一覧を示す。ANSI X3.113 では,行番号の棚に触れ

ていないが,誤りであるので,TIB によって訂正した。

(4)

一つのプログラム単位中で,ルーチンは,それを呼び出すどの文よりも早い位置に定義又は宣言がな

ければならない。ルーチンを定義又は宣言だけしておいて,それを一度も呼び出さなくても誤りでは

ない。

外部ルーチンは,プログラム全体のどこからでも呼び出すことができる。内部ルーチンは,それを

含むプログラム単位の中からだけ呼び出すことができる。

(5)

内部ルチン及び外部ルーチンの中にある行番号分岐で,ルーチンの外部の行番号を参照することはで

きない。ルーチンの外部にある行番号分岐で,ルーチンの内部の行番号を参照することもできない。

9.1

利用者定義関数

9.1.1

概要  BASIC は,プログラマの便宜のために組込み関数を提供する(5.46.4,その他参照)。組

込み関数に加えて,プログラマが,プログラム単位又はプログラムの内部で新しい関数を定義することも

できる。


51

X 3003-1993

9.1.2

構文  構文は,次による。

(1)

関数定義=内部関数定義|外部関数定義

(2)

内部関数定義=def 行|内部 function 行  区

*

  end-function 

(3)  def

行=行番号  def 文  行末部

(4)  def

文=数値 def 文|文字列 def 

(5)

数値 def 文⊃DEF  数値定義関数名  値仮引き数部?  等号  数値式

(6)

数値定義関数名=数値識別名

(7)

文字列 def 文=DEF  文字列定義関数名  最大長指定?  値仮引き数部?  等号  文字列式

(8)

文字列定義関数名=文字列識別名

(9)

値仮引き数部=左括弧  値仮引き数  {コンマ  値仮引き数}

*

  右括弧

(10)

値仮引き数⊃単純変数名|仮配列宣言

(11)

仮配列宣言=配列名  左括弧  コンマ

*

  右括弧

(12)

内部 function 行⊃ 行番号  FUNCTION  {数値定義関数名|文字列定義関数名  最大長指定?}

値仮引き数部?  行末部 

(13) end-function

行=行番号  END FUNCTION  行末部

(14)

外部関数定義=external-function 行  手続き区

*

 end-function

(15) external-function

行⊃ 行番号  EXTERNAL  FUNCTION  {数値定義関数名|文字列定義関数名

最大長指定?}  値仮引き数部?  行末部 

(16)

数値関数定義 let 文=LET  数値定義関数名  等号  数値式

(17)

文字列関数定義 let 文=LET  文字列定義関数名  等号  文字列式

(18) exit-function

文=EXIT  FUNCTION

(19)

宣言指定⊃def 宣言|内部 function 宣言|external-function 宣言

(20) def

宣言=DEF  定義関数名並び

(21)

内部 function 宣言=FUNCTION  定義関数名並び

(22) external-function

宣言=EXTERNAL  FUNCTION  定義関数名並び

(23)

定義関数名並び=定義関数名  {コンマ  定義関数名}

*

(24)

定義関数名⊃数値定義関数名|文字列定義関数名

(25)

内部関数定義の外部の行番号分岐中の行番号は,内部関数定義の内部にある行を参照してはならない。

ただし,内部 function 行は,参照してもよい。内部関数定義の内部の行番号分岐中の行番号は,その

内部関数定義の外部にある行及びその先頭の内部 function 行を参照してはならない。

(26)

外部関数定義の内部の行番号分岐中の行番号は,その外部関数定義の先頭の external-function 行を参

照してはならない。

(27)

一つのプログラム中で,同じ名前の外部関数定義を 2 回以上定義してはならない。一つのプログラム

単位中で,同じ名前の内部関数定義を 2 回以上定義してはならない。

(28)

一つのプログラム単位中で,同じ名前の(内部又は外部)関数を 2 回以上宣言したり定義したりして

はならない。

(29)

定義関数名が外部関数定義によって定義されている場合,プログラム単位中でその定義関数名を引用

するどの文よりも早い位置に,その定義関数名を含む extern-function 宣言の declare 文を書かなけれ

ばならない。

(30)

定義関数名が def 行以外の内部関数定義によって定義されている場合,そのプログラム単位中でその


52

X 3003-1993

定義関数名を引用するどの文よりも早い位置に,その内部関数定義,又はその定義関数名を含む内部

function

宣言の declare 文のどちらかを書かなければならない。

(31)

定義関数名が def 行によって定義されている場合,そのプログラム単位中でその定義関数名を引用す

るどの文よりも早い位置に,その def 行,又はその定義関数名を含む def 宣言の declare 文のどちらか

を書かなければならない。

(32)

再帰的な関数定義の中では,その関数自身を宣言する必要がない。すなわち,ある関数定義が,定義

しようとしている関数自身の引用を含む場合,その定義関数名を含む宣言指定を書く必要がない。

(33) exit-function

文は,関数定義の中にだけ書くことができる。

(34) def

行を除くすべての関数定義の中には,数値関数定義 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) def

宣言及び内部 function 宣言に書く定義関数名は,同じプログラム単位中のどこか別の場所で,内

部関数定義によって定義しておかなければならない。

(41) external-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)


53

X 3003-1993

100 EXTERNAL FUNCTION ANSWER(A$)

120

   SELECT CASE UCASE$(As)

130

   CASE  ”YES”

140

       LET  ANSWER=1

150

   CASE  ”NO”

160

       LET  ANSWER=2

(14)

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)  chain

文又は stop 文が実行される。

(d)  exit-function

文が実行される。

(e)  end-function

行に到達する。

(2.3)

定義関数の値は,数値関数定義 let 文 (numeric-function-let-statement) 又は文字列関数定義 let 

(string-function-let-statement)

の実行によって定められ,関数定義の実行が終了する時点でその定義

関数名に最後に代入された値となる。その時点で値が代入されていない場合は,処理系定義とする。

ただし,その処理系の定義は,初期設定されていない変数の引用と同様に,一貫していなければな

らない。

(2.4)

関数定義から返される文字列値の最大長は,文字列定義関数名に続けて書いた最大長指定によって


54

X 3003-1993

定められる。最大長指定を書かない場合,最大長は,最大長指定をもたない文字列変数に対する長

さと同じになる。

(2.5)  exit-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 文は,そのプログラム単位のデータ列全体を参

照する。


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)  sub

文=SUB  副プログラム名  参照仮引き数部?

(5)

副プログラム名=ルーチン識別名

(6)

参照仮引き数部=左括弧  参照仮引き数  {コンマ  参照仮引き数}

*

  右括弧

(7)

参照仮引き数⊃単純変数名|仮配列宣言|経路番号

(8)

経路番号=番号記号  符号なし整数

(9)  end-sub

行=行番号  end-sub 文  行末部

(10) end-sub

文=END  SUB

(11)  exit-sub

文=EXIT  SUB

(12)

外部副プログラム定義=external-sub 行  手続区

*

  end-sub 

(13) external-sub

行=行番号  EXTERNAL  sub 文  行末部

(14) call

文=CALL  副プログラム名  参照実引き数部?

(15)

参照実引き数部=左括弧  参照実引き数  {コンマ  参照実引き数}

*

  右括弧

(16)

参照実引き数=式|実配列名|経路式

(17)

宣言指定⊃内部 sub 宣言|external-sub 宣言


56

X 3003-1993

(18)

内部 sub 宣言=SUB  副プログラム名並び

(19) external-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) exit-sub

文は,副プログラム定義の中にだけ書くことができる。

(29) call

文中に書く参照実引き数の個数及び型は,対応する副プログラム定義における参照仮引き数の個

数及び型に一致していなければならない。すなわち,

(a)

参照実引き数の個数は,参照仮引き数の個数と同じでなければならない。

(b)

参照実引き数部の中の参照実引き数は,参照仮引き数部の中の対応する参照仮引き数に結び付けら

れる(対応付けは,最初の実引き数は最初の仮引き数に,2 番目の実引き数は 2 番目の仮引き数に,

というように行われる。

。型の対応は,表のとおりでなければならない。

仮引き数

実引き数

数値単純変数名

数値式

文字列単純変数名

文字列式

仮配列宣言(数値)

実配列名(数値)

仮配列宣言(文字列) 実配列名(文字列)

経路番号

経路式

(30)

実配列の次元数は,対応する仮配列の次元数と同じでなければならない。その仮配列の次元数は,仮

配列宣言中のコンマの個数より 1 だけ大きい数とする。

(31)

数値型の実引き数を,別のプログラム単位の対応する仮引き数に渡す場合,両方のプログラム単位に

おいて有効な arithmetic 選択子は,一致していなければならない。

(32)

一つの参照仮引き数に,同じ参照仮引き数の名前を,2 回以上書いてはならない。

参照仮引き数を,その内部副プログラム定義又は外部副プログラム定義の内部で,declare 文又は


57

X 3003-1993

dim

文に書いてはならない。

(33)

参照仮引き数としてゼロ番の経路を書いてはならない。

(34)

内部 sub 宣言に書く副プログラム名は,同じプログラム単位中のどこか別の場所で内部副プログラム

定義によって定義しておかなければならない。

(35) external-sub

宣言に書く副プログラム名は,プログラム中のどこか別の場所で,外部副プログラム定

義によって定義しておかなければならない。

9.2.3

例  構文の例を次に示す。

100 SUB exchange(a,b)

110

  LET t=a

120

  LET a=b

(2)

130

  LET b=t

140 END SUB

SUB CALC(X,Y,Z$)

(4)

SUB SORT(A(),B(,),A$,#3)

(4)

2000 EXTERNAL SUB OPEN (#1, fname$, result)

(13)

CALL CALC (3*A+2, 7715, ”NO”)

(14)

CALL SORT (Zvect, Ymat, (L$), #N)

(14)

9.2.4

意味  意味は,次による。

(1)

副プログラムの実行

(1.1)  call

文 (call-statement) を実行すると,call 文で指名された副プログラムに制御が移る。副プログラ

ムの実行は,sub 文の次の行から開始され,次のいずれかになるまで,順番に続けられる。

(a)

行の実行によって,他の動作が指示される。

(b)

続行不能な例外状態になる。

(c)  chain

文が実行される。

(d)  stop

文又は exit-sub 文が実行される。

(e)  end-sub

行に到達する。

(1.2)  end-sub

行は,副プログラムの物理的な終りを示すとともに,この行を実行すると,副プログラム

の実行を終了させる。exit-sub 文 (exit-sub-statement) を実行すると,その文を含む最も内側の副プ

ログラムの実行が終了する。副プログラムの実行が終了すると,その副プログラムの実行を開始さ

せた call 文の次の行から実行を続ける。

(1.3)

副プログラム中で stop 文を実行すると,そのプログラム全体の実行が終了する。

(1.4)

副プログラムは,直接に又は他の手続きを通して間接に,自分自身を呼び出してもよい。すなわち,

再帰的な副プログラム呼出しが許される。

(1.5)

副プログラム定義中の行は,その副プログラムが call 文によって引用されない限り実行されること

はない。プログラムの実行が sub 文の行に到達すると,何もしないで対応する end-sub 行の次の行

に進む。

(2)

副プログラムの引き数

(2.1)  call

文を実行すると,その参照実引き数 (procedure-argument) が左から右に順に,呼び出される副プ

ログラムの sub 文 (sub-statement) 中の対応する参照仮引き数 (procedure-parameter) と同一のもので


58

X 3003-1993

あるとされる。

(2.2)

参照実引き数のうち数値変数名及び部分文字列指定を伴わない文字列変数名は,参照によって (by

reference)

渡される。すなわち,副プログラム中の参照仮引き数のすべての引用は,対応する参照

実引き数の引用になり,その参照仮引き数への代入は,対応する参照実引き数への代入になる。

(2.3)

参照実引き数が配列要素名である場合には,その添字は,副プログラムが呼び出されるたびに入口

で 1 回だけ評価される。

(2.4)

参照実引き数が式であり,数値変数名ではなく,部分文字列指定を伴わない文字列変数名でもない

場合,その参照実引き数は,副プログラムが呼び出されるたびに入口で 1 回だけ評価される。得ら

れた値が,その副プログラムに対して局所的な場所に割り当てられる。この局所的な値は,対応す

る参照仮引き数の値として使用される。その参照仮引き数への代入は,この局所的な場所への代入

となる。

参照実引き数のこの評価は,左から右に順に評価される。

(2.5)

仮配列 (formal array) である参照仮引き数を参照すると,参照実引き数部の対応する配列を参照す

ることになる。同様に,そのような配列に対して代入や上下限の再定義 (redimensioning) を行うと,

参照実引き数部の対応する配列に対して代入や上下限の再定義を行うことになる。副プログラムの

入口では,参照仮引き数の仮配列は,対応する参照実引き数と同じ上下限をもつ。

(2.6)

文字列単純変数名又は文字列配列名である参照仮引き数の文字列の最大長は,それらの引き数が値

によって (by value) 渡される場合は処理系定義の省略時想定値とし,参照によって渡される場合は

対応する参照実引き数の文字列の最大長とする。

(2.7)

ある配列とその要素の両方が一つの call 文の参照実引き数として使用され,その配列が副プログラ

ムの実行中に上下限を再定義されたとき,配列要素に対応する参照仮引き数に対するそれ以降の参

照の結果は,処理系定義とする。

(2.8)

参照実引き数が経路式 (channel-expression) である場合,その経路式は,副プログラムが呼び出され

るたびに入口で 1 回だけ評価される。副プログラム中で対応する参照仮引き数の値を参照すると,

評価された結果の経路が使用される。この経路に割り当てられたファイルの性質(11.1.4 参照)は,

そのまま副プログラムに渡される。副プログラム中でファイルの性質及び内容を変更した場合,そ

の変更は,どの経路番号で参照したとしても直ちに有効とし,副プログラムから出た後もそのまま

有効とする。

(2.9)  call

文が実行されるときに,参照実引き数で示される経路にファイルが割り当てられていなくても

よい。副プログラム中の open 文でその経路にファイルを割り当てたとき,その割当ては,副プロ

グラムから出た後もそのまま有効とする。

(3)

変数,配列,経路番号及び内部データの有効範囲

(3.1)

副プログラム定義の参照仮引き数部に書く参照仮引き数のうち,値によって渡される参照仮引き数

は,その副プログラム定義の毎回の呼出しに対して局所的とする。すなわち,副プログラム定義の

外部で使われている同じ名前の変数や配列とは,別のものとする。

参照によって (by reference) 渡される参照仮引き数に関しては,その名前は副プログラム定義の

毎回の呼出しに対して局所的とするが,その名前が参照する対象は対応する参照実引き数と同じも

のとする[9.2.4(2)参照]

(3.2)

副プログラム定義において仮引き数に指定されていない変数と配列の扱いは,その副プログラム定

義が内部副プログラム定義か外部副プログラム定義かによって異なる。


59

X 3003-1993

副プログラム定義が外部副プログラム定義である場合,これらの変数と配列は,そのプログラム

単位の毎回の呼出しに対して局所的とする。すなわち,その副プログラム定義の外部で使われてい

る名前,又は,それ以前のその副プログラム定義の呼出しのときにその中で使われた名前とは,た

とえ同じつづりであっても別のものとする。更に,これらの変数や配列が副プログラム定義の呼出

しのたびに初期化されるか否かは,処理系定義とする。ただし,その処理系定義は,主プログラム

及び並行単位における変数や配列の初期化と同様に,一貫していなければならない。

副プログラム定義が内部副プログラム定義である場合,これらの変数と配列とはそのプログラム

単位に広域的とし,代入された値は副プログラム定義の呼出しのたびに保存される。すなわち,こ

れらの値が内部副プログラム定義の実行中に変えられたならば,呼び出したプログラム単位に戻っ

た後でもこの変更は有効とする。

(3.3)

参照仮引き数でない経路番号の有効範囲は,

(ゼロ番の経路を除き)常にプログラム単位とする。副

プログラム定義中のゼロ番でない経路番号は,外部副プログラム定義においては毎回の呼出しに対

して局所的とし,内部副プログラム定義においてはその副プログラム定義を含むプログラム単位に

広域的とする。

ゼロ番の経路は,プログラム全体に広域的とする。

ファイルは,使用する前にあらかじめ open 文によって,プログラム単位中のゼロ番でない経路

に割り当てられていなければならない。副プログラム定義に対して局所的な経路に割り当てられた

ファイルは,その副プログラム定義の実行が終了する時点で自動的に閉じられる。

(3.4)

内部データの有効範囲は,常にプログラム単位とする。

外部副プログラム定義中の data 文のデータ要素は,そのプログラム単位の毎回の呼出しに対して

局所的とする。したがって,このような副プログラム定義中の read 文及び restore 文は,その副プ

ログラム定義中の data 文のデータ要素だけを参照し,他のプログラム単位中のデータ要素を参照す

ることはない。このような副プログラム定義中のデータ列に対する指示子は,副プログラム定義が

呼び出されるたびにデータ列の先頭に戻される(10.1 参照)

内部副プログラム定義中の data 文のデータ要素は,そのプログラム単位におけるデータ列の一部

分とする。そして,このような副プログラム定義中の read 文や restore 文は,そのプログラム単位

のデータ列全体を参照する。

9.2.5

例外状態  なし。

9.2.6

注意  注意は,次による。

(1)  call

文があって,それが引用する内部副プログラム定義がそれより後に書いてある場合に,処理系は,

内部 sub 宣言を省略できるように拡張してもよい。

(2)

別名

(2.1)

ある対象に対して,同じ有効範囲をもつ二つ以上の異なる名前が存在するとき,別名 (alias) がある

という。仮引き数が参照によって渡されるときに,ある状況下で別名が作られる。仮引き数が値に

よって渡される場合は,それぞれの仮引き数に対して別の対象が生成されるので,別名が作られる

ことはない。

(2.2)

次の状況下で call 文によって別名が作られる。

(a)

値を丸めた結果が同じ整数値になる経路式を,経路番号である複数の仮引き数に渡す。

(b)

同じ実配列名を複数の仮配列宣言に渡す。

(c)

同じ単純変数名又は配列要素名を,単純変数名である複数の仮引き数に渡す。


60

X 3003-1993

(d)

ある配列を仮配列宣言に渡し,かつ,その配列の要素を単純変数名である仮引き数に渡す。

(e)

経路式を内部副プログラムに渡す。

(f)

経路式でない実引き数を,参照によって内部副プログラムに渡す。

(2.3)  (2.1)

(a)(d)では,二つ以上の仮引き数が同じ対象又は同じ対象の一部を指名するので別名が生じ

る。(e)及び(f)では,一つの対象が,仮引き数として,及びプログラム単位全体に対して広域的な対

象としての両方の形で,内部副プログラムから“見える”ので別名が生じる。

(2.4)

別名のある参照仮引き数を使って対象の状態を変更すると,その変更は,それ以後のすべての参照

において,どの名前を使って参照するかに関係なく直ちに有効となる。参照仮引き数によって参照

される対象の状態を変える事象は,代入,入出力操作及び配列上下限の再定義である。

(2.5)

規格合致処理系では,次のプログラムの print 文は実行されない。

100 DECLARE INTERNAL SUB S

110 LET A

=0

120 CALL S(A,A)

130 SUB S(B,C)

140

   LET  A=1

150

   LET  B=2

160

   LET  C=3

170

   IF  A<>B OR B<>C OR A<>C THEN

180

     PRINT ”This shouldn’t happen.”

190

   END  IF

200 END SUB

210 END

(3)

次の事項に関する 9.1.6 の注意は,副プログラムに対しても同様に適用する。

(a)

異なる collate 選択子をもつプログラム単位は,誤りとはしない[9.1.6(1)参照]

(b)

定義又は宣言されていながら引用されない関数名は,誤りとはしない[9.1.6(2)参照]

(c)

定義が宣言に先行する関数名は,内部関数定義では誤りとはしない[9.1.6(3)参照]

(d)

プログラム単位中で引用する外部関数名は,そのプログラム単位中で必ず宣言しなければならない。

内部関数名は,必ずしも宣言しなくてもよい[9.1.6(4)参照]

(e)

外部関数と同じ名前の内部関数を使ってもよい[9.1.6(5)参照]

参考  ANSI X3.113 では,ここが“異なったプログラム単位においては”となっているが,誤りであ

るので,TIB によって訂正した。

9.3

プログラム連鎖

9.3.1

概要  chain 文 (chain-statement) は,別々のプログラムを利用者の介入なしに連続して実行させる。

このような機能は,大きなプログラムを分割するのに有効である。

9.3.2

構文  構文は,次による。

(1)  chain

文=CHAIN  プログラム指示名  {WITH  値実引き数部}?

(2)

プログラム指示名=文字列式

(3)  chain

文中の値実引き数部に書く値実引き数と program 行中の値仮引き数部に書く値仮引き数との結

合は,定義関数に対する規定と同じ規則を適用する(9.1 参照)

9.3.3

例  構文の例を次に示す。


61

X 3003-1993

CHAIN ”PROG2”

(1)

CHAIN A$ WITH(X,FILENAME$)

(1)

9.3.4

意味  意味は,次による。

(1)  chain

文は,現在のプログラムの実行を終了し,すべてのファイルを閉じ,プログラム指示名

(program-designator)

によって指示されたプログラムの実行を開始する。プログラムを関連付ける方法

は,処理系定義とする。

(2)  chain

文によって実行されるプログラムが program 行 (program-name-line) を含む場合には,chain 

の値実引き数が評価され,その値が program 行の対応する値仮引き数に代入される。すなわち,値実

引き数は,値仮引き数に値によって (by value) 渡される。

仮配列の上下限は,関数に対して配列引き数を渡す場合の規則(9.1 参照)に従って,対応する実配

列の上下限に等しくなるように調整される。

(3)

プログラム指示名において,対応する英大文字と英小文字を等価なものとするか否かは,処理系定義

とする。

(4)  chain

文によって実行されるプログラム中の変数の初期値は,処理系定義とする。

9.3.5

例外状態  例外状態は,次による。

(1)

プログラム指示名によって識別されたプログラムが利用可能でない。

(10005,続行不能。

(2)  chain

文の値実引き数の個数及び型が,chain 文によって実行されるプログラムの program 行の対応す

る値仮引き数の個数及び型と一致しないか,

又は値仮引き数部をもつ program 行が存在しない。

(4301,

続行不能。

(3)

実配列の次元数が,対応する仮配列の次元数と同じでない。

(4302,続行不能。

(4)

有効な arithmetic 選択子の一致しないプログラム間で,chain 文によって数値型の引き数を渡す。

(4303,続行不能。

9.3.6

注意  注意は,次による。

(1)

通常の処理系においては,プログラム指示名は,そのプログラムが収められているファイルの名称で

ある。chain 文によって実行されるプログラムは,BASIC プログラムである必要はない。

(2) 4301

,4302 及び 4303 の例外状態の報告は,chain 文のあるプログラム,chain 文によって実行される

プログラム又はその他の中間のシステムプログラムのいずれが行ってもよい。

10.

入出力

10.0

概要  入出力機能によって,BASIC プログラムがデータの集まりを入出力する。プログラムは,入

力データをそのプログラムの data 文 (data-statement) から得ることもできるし,プログラムの外部の標準

入力源 (standard source) 又は指名した入力源(11.4 参照)から得ることもできる。出力データを,プログ

ラムの外部の標準出力先 (standard destination) 又は指名した出力先(11.3 及び 11.5 参照)に送り出すこと

ができる。

10.1

内部データ

10.1.1

概要  read 文 (read-statement) は,data 文 (data-statement) によって作られたデータ列 (data

sequence)

にある値を変数に代入する。restore 文 (restore-statement) は,プログラム中の同じデータを,再

び読めるようにする。

10.1.2

構文  構文は,次による。

(1)  read

文⊃READ  {if-missing 句  コロン}?  変数名並び


62

X 3003-1993

(2)

変数名並び=変数名  {コンマ  変数名}

*

(3)  if-missing

句=IF  MISSING  THEN  データ存否動作

(4) 

データ存否動作=exit-do 文|exit-for 文|行番号

(5)  restore

文=RESTORE  行番号?

(6)  data

文=DATA  データ要素並び

(7)

データ要素並び=データ要素  {コンマ  データ要素}

*

(8)

データ要素=定数|単純文字列

(9)

単純文字列=単語文字|単語文字  単純文字

*

  単語文字

(10)

データ存否動作の exit-for 文は,for 本体の中にだけ書くことができる。データ存否動作の exit-do 

は,do 本体の中にだけ書くことができる。

(11)  restore

文の行番号は,data 文を含む行を参照するものでなければならない。

10.1.3

例  構文の例を次に示す。

READ X,Y,Z

(1)

READ IF MISSING THEN 1350:X(1), A$

(1)

RESTORE

(5)

RESTORE 1000

(5)

DATA 3.14159,PI, 5E-30,”,”

(6)

COMMAS CANNOT OCCUR IN UNQUOTED STRINGS

(9)

10.1.4

意味  意味は,次による。

(1)

一つのプログラム単位中の data 文のデータ要素は,全体で一つのデータ列を構成する。一つのプログ

ラム単位の中にあるすべての data 文に書いたすべてのデータ要素が,その書いた順番に,一つの列に

なる。

(2)

プログラムの実行が data 文の行に到達すると,何もしないで次の行に進む。

(3)  read

文を実行すると,その read 文を含むプログラム単位のデータ列にある値が,順番に変数並び中

の変数に代入される。データ列に対して,一つの指示子 (pointer) を想定し関係付ける。プログラム単

位の実行を開始すると,指示子は,データ列にある先頭のデータ要素を指す。read 文を実行するたび

に,指示子の指すデータ要素の値が変数並び中の変数に代入され,指示子はそのデータ要素の次を指

す。

(4)

データ列の終りを越えてデータ要素を読もうとしたとき,

その read 文の中に if-missing 句がなければ,

例外状態になる。if-missing 句があれば,そのデータ存否動作 (io-recovery-action) を実行する。データ

存否動作が exit-do 文又は exit-for 文であれば,その文は通常と同じ効果をもつ(8.3 参照)

。データ存

否動作が行番号であれば,その行番号の行から実行を続ける。

(5)

データ列にあるそれぞれのデータ要素の型は,代入される変数の型に一致していなければならない。

すなわち,数値変数に対するデータ要素は,数値定数でなければならず,文字列変数に対するデータ

要素は,文字列定数又は単純文字列でなければならない。数値定数の形になっている単純文字列は,

read

文によって文字列変数にも数値変数にも代入できる。

(6)

数値データを評価した結果が下位けたあふれになると,その値は,ゼロで置き換えられる。

(7)

変数名並び中の添字及び部分文字列指定は,その変数名並び中の先行する(すなわち左側の)変数が

すべて値を代入されてから,評価される。

(8)

行番号を指定しないで restore 文を実行すると,その restore 文を含むプログラム単位中のデータ列へ


63

X 3003-1993

の指示子を,データ列の先頭に戻す。次に実行される read 文は,データ列の先頭からデータ要素を読

むことになる。restore 文に行番号があれば,その restore 文を含むプログラム単位中のデータ列への

指示子は,その行番号の data 文中の先頭のデータ要素を指す。そして,次に実行される read 文は,

指示された data 文の先頭からデータ要素を読むことになる。

(9)

一般に,入出力の途中で入出力以外の例外状態が起こったとき,その部分的な入出力動作の効果及び

その入出力装置の状態は,処理系定義とする。この規定は,10.及び 11.の入出力全般に適用する。

参考  ANSI X3.113 にはこの(9)項がないが,TIB によって補った。

10.1.5

例外状態  例外状態は,次による。

(1)  read

文の変数名並び中の変数がデータ要素を要求したが,データ列が尽きてしまって,かつ if-missing

句が指定されていない。

(8001,続行不能。

参考  ANSI X3.113 の文章は不十分であるので,TIB によって訂正した。

(2)

数値定数でないデータ要素を数値変数に代入しようとした。

(8101,続行不能。

(3)

数値データの評価があふれを起こす。

(1006,続行不能。

(4)

文字列変数に対するデータ要素の代入が文字列あふれを起こす。

(1053,続行不能。

10.1.6

注意  処理系は,下位けたあふれを例外状態(1506,続行可能。ゼロで置き換え,処理を続ける。)

としてもよい。この場合,下位けたあふれを例外処理区で処理することができる(12.1 参照)

10.2

入力

10.2.1

概要  input 文 (input-statement) 又は line-input 文 (line-input-statement) によって,データを入力す

る。

(1)  input

文は,プログラムの外部の入力源 (source) から値を変数に代入することによって,実行中のプ

ログラムと利用者との対話を可能にする。一つの入力応答 (input-reply) の中に文字列データと数値デ

ータが混在していてもよい。それぞれのデータの項目は,コンマで区切る。

(2)

処理系定義の通常の入力要求 (input-prompt) を,指定によって別の入力要求に置き換えることができ

る。

(3)  line-input

文は,空白やコンマを含む一つの入力応答の行全体を,文字列変数の値として代入する。

10.2.2

構文  構文は,次による。

(1)  input

文⊃INPUT  入力修飾?  変数名並び

(2)

入力修飾=入力修飾項目  {コンマ  入力修飾項目}

*

  コロン

(3)

入力修飾項目=prompt 句|timeout 句|elapsed 

(4)  prompt

句=PROMPT  文字列式

(5)  timeout

句=TIMEOUT  数値時間式

(6)

数値時間式=数値式

(7)  elapsed

句=ELAPSED  数値変数名

(8)  line-input

文⊃LINE  INPUT  入力修飾?  文字列変数名並び

(9)

入力要求=[処理系定義]

(10) 

入力応答=データ要素並び  コンマ?  行末

(11)

行入力応答=プログラム文字

*

  行末

(12) prompt

句,timeout 句及び elapsed 句は,一つの入力修飾の中に,それぞれたかだか 1 回だけ書くこ

とができる。これらは,どのような順序で書いてもよい。

10.2.3

例  構文の例を次に示す。


64

X 3003-1993

INPUT X

(1)

INPUT X, A$, Y(2)

(1)

INPUT PROMPT ”What is your name?”:N$

(1)

INPUT TIMEOUT 3*N, ELAPSED T, PROMPT Pstring$:N$

(1)

LINE INPUT A$

(8)

LINE INPUT PROMPT ””:A$, B$

(8)

2, SMITH,

−3

(10)

25, 0,

−10.2

(10)

He said ”Don't”

(11)

10.2.4

意味  意味は,次による。

(1)  input

文  input 文を実行すると,プログラムの実行は,(4)に定める正しい入力応答がなされるまで待

たされる。input 文は,入力応答にある値を順番に,変数名並び中の変数に代入する。

(2)

入力応答の取得  対話方式 (interactive mode) の場合,プログラムの利用者は,データを入力する必要

のあることを,入力要求 (input-prompt) によって知らされる。

一括方式 (batch mode) の場合,入力応答は,処理系定義の手段によって外部の入力源から与えられ

る。

(3)

入力修飾

(3.1)

入力修飾に prompt 句を書くと,処理系定義の入力要求は出力されず,代わりに prompt 句の文字列

式の値が出力される。ただし,入力応答がコンマで終わっている場合については,(4.6)による。

(3.2)

入力修飾に timeout 句を書くと,その数値時間式が評価され,秒数 s(整数とは限らない。

)が定め

られる。s 秒以内に正しい入力応答又は行入力応答 (line-input-reply) が与えられなければ,例外状

態になる。

(3.3)

入力修飾に elapsed 句を書くと,処理系が入力要求を出してから,その input 文に対する最後の入力

応答の行末又はその line-input 文に対する最後の行入力応答の行末を受け取るまでに経過した秒数

(整数とは限らない。

)の値が,elapsed 句の数値変数に代入される。

(3.4)

処理系に時計機能 (clock) がないとき,timeout 句は何も効果をもたない。elapsed 句の結果は−1

とする。時計機能があるとき,elapsed 句の結果は常に正とする。timeout 句及び elapsed 句の値の

範囲(最小値及び最大値)及び分解能は,処理系定義とする。

(4)

値の代入

(4.1)

入力応答中の一つの項目に対して,データ要素の型及び許容される値の範囲について正しいことが

確認されたところで,その都度対応する変数に値が代入される。

(4.2)

変数名並び又は文字列変数名並び中の添字及び部分文字列指定は,その変数名並び又は文字列変数

名並び中の先行する(すなわち左側の)変数がすべて値を代入されてから,評価される。

(4.3)

入力応答にあるそれぞれのデータ要素の型は,代入される変数の型に一致していなければならない。

すなわち,数値変数に対する入力は数値定数でなければならず,文字列変数に対する入力は文字列

定数又は単純文字列でなければならない。数値定数の形になっている単純文字列は,input 文によっ

て文字列変数にも数値変数にも代入できる。

(4.4)

数値データを評価した結果が下位けたあふれになると,その値は,ゼロで置き換えられる。

(4.5)

入力要求に対する入力応答がコンマで終わっていないときには,それまでに与えられたすべての入

力応答中のデータ要素の個数が,値を要求している変数名の個数と等しくなければならない。


65

X 3003-1993

(4.6)

入力応答の,行末の前の空白でない最後の文字がコンマであるときには,更にデータが与えられる

ことを意味する。この場合,入力応答中に含まれている個数だけの値が,変数名並び中の変数に代

入される。その後,入力要求(ただし,prompt 句が指定されていてもその文字列式の値ではない。

が再度出力され,続きの正しい入力応答が与えられるまで,プログラムの実行が待たされる。正し

い入力応答が与えられると,そこからデータの続きが得られる。

(5)  line-input

(5.1)  line-input

文を実行すると,文字列変数名並び中の各文字列変数名ごとに一つの行入力応答が,input

文の入力要求と同じやり方で要求される。

すなわち,1 番目の行入力応答の値が文字列変数名並びの 1 番目の変数に代入される。文字列変

数名並びに更に変数名がある場合には,入力要求(ただし,prompt 句が指定されていてもその文字

列式の値ではない。

)が再度出力され,2 番目の正しい行入力応答が与えられるまで,プログラムの

実行が待たされる。正しい行入力応答が与えられると,その値が文字列変数名並びの 2 番目の変数

に代入される。この過程が,文字列変数名並びのすべての変数に正しい行入力応答が与えられるま

で続く。

(5.2)

行入力応答中の文字は,前後の空白も含めて一続きの文字列とされ,対応する文字列変数の値にな

る。行入力応答の末尾の行末は,この文字列には含まれない。行入力応答中の引用符は,そのまま

の文字として扱われる。すなわち,連続する二つの引用符は,1 文字ではなく,2 文字として数える。

(6)

入出力の途中で入出力以外の例外状態が起こったとき,その部分的な入出力動作の効果及びその入出

力装置の状態は,処理系定義とする。

参考  ANSI X3.113 にはこの(6)項がないが,TIB によって補った。

10.2.5

例外状態  例外状態は,次による。

(1)

入力要求に対する応答として与えられた行が,構文的に正しい入力応答でない。

(8102,続行可能。新

たな入力応答を要求する。

(2)

数値変数名に対する入力として与えられたデータ要素が,数値定数でない。

(8103,続行可能。現在の

入力応答の再送を要求する。

(3)

入力応答中のデータ要素の個数が不足しており,かつ最後がコンマで終わっていない。

(8002,続行可

能。現在の入力応答の再送を要求する。

(4)

入力応答中のデータ要素の個数が多すぎる。又は,要求されている個数のデータ要素があるにもかか

わらず,入力応答がコンマで終わっている。

(8003,続行可能。現在の入力応答の再送を要求する。

(5)

数値データの評価があふれを起こす。

(1007,続行可能。現在の入力応答の再送を要求する。

(6)

文字列変数に対する,データ要素又は行入力応答の代入が文字列あふれを起こす。

(1054,続行可能。

現在の入力応答又は行入力応答の再送を要求する。

(7)

数値時間式として使用された数値式の値がゼロより小さい。

(8402,続行不能。

(8)

入力修飾中の timeout 句で指定された秒数以内に,正しい入力応答又は行入力応答がなかった。

(8401,

続行不能。

10.2.6

注意  注意は,次による。

(1)

この規格は,対話方式の利用者が入力応答を誤ったときに,それを再送できる機能を処理系に対して

要求する。一括方式では,これを続行不能の例外状態としてもよい。この規格は,誤った入力応答を

修正する機能を処理系に対して要求しないが,処理系は,そのような機能を用意してもよい。

(2)  prompt

句が指定されない場合の入力要求は,疑問符に 1 文字の空白を付けた 2 文字とすることを推奨


66

X 3003-1993

する。

(3)

処理系は,入力応答又は行入力応答を出力(すなわちエコー表示)しなくてもよい。

(4)

処理系は,下位けたあふれを例外状態(1507,続行可能。ゼロで置き換えて処理を続行する。

)として

もよい。この場合,下位けたあふれを例外処理区で処理することができる(12.1 参照)

(5)

入力データが単純文字列である場合には,その前後の空白列は無視される(4.1 参照)

。引用文字列で

ある場合には,引用符でくくられた内部の空白は,すべて意味をもつ(6.1 参照)

(6)

入力応答の単純文字列は,構文規則 10.1.2(9)に規定してある。処理系は,入力応答の単純文字列用の

文字の組を拡張して,10.2.5(1)に規定する例外状態 8102 を起こさずに利用できることにしてもよい。

参考  ANSI X3.113 にはこの(6)項がないが,TIB によって補った。

10.3

出力

10.3.1

概要  print 文 (print-statement) は,一定の書式で作表出力を行う。margin 句のある set 

(set-statement)

は,出力行 (output line) の幅を指定する。zonewidth 句のある set 文は,印字行 (print line) 中

の印字欄 (print zone) の幅を指定する。ask 文 (ask-statement) によって,出力行の幅又は印字欄の幅の現

在の値を問い合わせる。

機能を拡充した print 文は,10.410.5 及び 11.3 で規定する。

10.3.2

構文  構文は,次による。

(1)  print

文⊃PRINT  印字項目並び

(2)

印字項目並び={印字項目?  印字区切り}

*

  印字項目?

(3)

印字項目=式|位置指定

(4) 

位置指定=TAB  左括弧  指標  右括弧

(5)

印字区切り=コンマ|セミコロン

(6)  set

文=SET  設定対象

(7)

設定対象⊃ {MARGIN|ZONEWIDTH}    指標

(8)  ask

文⊃ASK  出力質問項目並び

(9)

出力質問項目並び=出力質問項目  {コンマ  出力質問項目}

*

(10)

出力質問項目= {MARGIN|ZONEWIDTH}    数値変数名

(11)

一つの出力質問項目は,一つの ask 文の中では,たかだか 1 回だけ書くことができる。

10.3.3

例  構文の例を次に示す。

PRINT X

(1)

PRINT X, Y

(1)

PRINT X, Y, Z,

(1)

PRINT ,,,X

(1)

PRINT

(1)

PRINT ”X EQUALS”, 10

(1)

PRINT X;(Y

+Z)/2

(1)

PRINT TAB(10);A$;”IS DONE.”

(1)

SET MARGIN 120

(6)

SET ZONEWIDTH 20

(6)

10.3.4

意味  意味は,次による。

(1)  print

文  print 文は,文字の列と行末を生成して,外部の装置に送り出す。この文字の列は,印字項


67

X 3003-1993

目並び (print-list) 中の印字項目 (print-item) と印字区切り (print-separator) を順番に評価して生成さ

れる。

(2)  print

文の副作用  印字項目並び中の式である関数を呼び出し,その関数がもとの print 文と同じ装置

に対する print 文を実行するとき,その実行の効果は処理系定義とする。

(3)

数値の印字  印字項目並び中の数値式を評価すると,正又はゼロならば 1 文字の空白,負ならば 1 文

字の負号の直後に,

その数値の絶対値の 10 進表現,

その直後に 1 文字の空白をおいた文字の列になる。

数値の 10 進表現の形式は,数値定数の規定(5.1 参照)に従い,次のとおりとする。

(3.1)

処理系は,有効数字部の幅 (significance width) と指数部の整数の幅 (exrad width) を定める。幅 d

は,出力する数値の表現のうち,有効数字部 (significand) の 10 進けた数を制御する。幅 は,指

数部 (exrad) の整数のけた数を制御する。の値は 6 以上,の値は 2 以上とする  (d≧6, e≧2)。

(3.2)  d

けた以下の整数として正確に表現できる数値は,小数点なし指数部なし形式で出力される。

(3.3)

他のすべての数値は,小数点あり指数部なし形式か,小数点あり指数部あり形式で出力される。指

数部あり形式による場合と比べて,精度を落とさずに けた以下の指数部なし形式で表現できる数

値は,指数部なし形式で出力される。

例えば,d=6 のとき,10

6

は,.000001 と出力され,10

7

は,1.E−7 と出力される。

(3.4)

小数点あり指数部なし形式による数値は,けた以内の 10 進数字と,小数点 1 文字で出力される。

処理系は,小数部の後続するゼロ列を,省略して出力してもよい。

絶対値が 1 未満の数値の場合,小数点の左側に数字は生成されない。この形式は,符号,小数点

及び後続の 1 文字の空白を含めて,最大 d+3 文字の幅を必要とする。

(3.5)

小数点あり指数部あり形式による数値は,次の形で出力される。

有効数字部  E  符号  符号なし整数

ここで,有効数字部の値 x は,1≦x<10 の範囲とし,ちょうど けたの精度で表現される。指数

部の符号なし整数は,1∼けたとする。処理系は,有効数字部中の小数部の後続するゼロ列及び指

数部の先行するゼロ列を,省略して出力してもよい。小数点は,有効数字部の一部分として必ず生

成される。この形式は,二つの符号,小数点,英字 E 及び後続する 1 文字の空白を含めて,最大 d

e+5 文字の幅を必要とする。

(4)

文字列の印字  文字列式を評価すると,対応する文字の列になる。

(5)

印字区切りと位置指定

(5.1)

印字区切りセミコロンを評価すると,空文字列すなわち長さ 0 文字の文字の列になる。

(5.2)

位置指定 TAB 及び印字区切りコンマの評価の結果は,現在又は先行の print 文によって生成された

文字の列に依存する。現在行 (current line) とは,実行の開始以後又は最後に生成された行末以後に

生成された文字の列(空でありうる。

)とする。

(5.3)

現在行の印字位置 (columnar position) とは,その行へ次に生成される文字が位置付けられる文字位

置とする。印字位置は,左から右に,1 から順に番号付けられる。

表 4.1(標準文字集合,163 ペー

ジ)の位置 2/0 から 7/14 までにある文字が 1 文字生成されるたびに,印字位置の番号は 1 増える。

行末を生成すると,印字位置は 1 に戻る。印字位置に対するその他の文字の効果は,処理系定義と

する。

(5.4)

行幅 (margin) とは,印字可能な最大の印字位置とする。margin 句のある set 文を実行するまでの行

幅は,処理系定義とする。処理系定義のこの行幅は,省略時想定の印字欄幅 (zone width) 以上でな

ければならない。行幅として MAXNUM を指定すると,印字位置は,任意に大きくてもよい。


68

X 3003-1993

(5.5)

印字の行は,一定の個数の印字欄 (print zone) に分割される。zonewidth 句のある set 文を実行する

までの印字欄の幅と個数は,処理系定義とする。右端以外の印字欄の幅は,すべて同じとする。端

数があるとき,右端の印字欄が短くなる。省略時想定の印字欄幅は,de+6 以上とする。印字欄

幅は,zonewidth 句のある set 文を実行して変更できる。印字欄幅は,1 以上現在の行幅以下の任意

の値に設定してよい。

(5.6)

位置指定 (tab-call) TAB は,次の印字項目に対する印字位置を次のとおり設定する。

(a)

位置指定 TAB の式が評価され,その値が最も近い整数値 に丸められる。が 1 よりも小さい場合

には,例外状態になる。が行幅 よりも大きい場合には,の整数倍を から引いて,1≦nm

にする。すなわち は,MOD (n−1, m)+1 に等しくされる。

(b)

現在行の印字位置が 以下であるときには,必要ならば空白を生成して,印字位置を にする。現

在行の印字位置が を越えているときには,行末を生成して次の行に移り,n−1 個の空白を生成し

て,印字位置を にする。

(5.7)

印字区切りコンマの評価の結果は,印字位置に依存する。

(a)

次の(b)(c)の場合を除いて,通常,1 文字以上の空白を生成して,印字位置を現在行中の次の印字

欄の先頭にする。

(b)

印字位置が行の右端の印字欄中にあるときには,行末を生成する。

(c)

印字位置が行幅を越えているときにも,行末を生成する。

備考  書式なし出力の実行によって,印字位置が行幅を越えるのは,最後の印字項目を出力した結果

がちょうど行幅を満たしているときだけである。

(6)

行幅を超える出力行

(6.1)

現在行に既に文字が生成されていて(すなわち,印字位置≧2)

,かつ次の印字項目を評価すると行

幅を越えて(すなわち,印字位置≧行幅+2 になって)しまう場合には,まず行末を生成してから,

その印字項目に対する文字の列を生成する。

(6.2)

一つの印字項目を評価出力している途中で,次の文字を生成すると行幅を越えてしまうことになっ

たときには,そこで行末を生成し,印字位置を 1 に戻してから,その文字を生成する。

(7)

印字項目並びの終り

(7.1)

印字項目並びの評価が完了した時,印字項目並びが印字区切りで終わっていない場合には,最後に

行末が生成される。印字項目並びが印字区切りで終わっている場合には,そのような行末は生成さ

れない。

(7.2)

完全に空の印字項目並びをもった print 文は,行末を生成して,現在行の出力を完了する。現在行

が文字を含んでいないときには,空白行ができる。

(8)

行幅の設定  margin 句のある set 文を実行すると,その指標が評価され,この値が新たな行幅になる。

出力行が部分的に生成されていたとしても,行幅の変更は直ちに有効になる。margin 句のある set 

は,書式なし出力だけに影響を与える。

(9)

印字欄幅の設定  zonewidth 句のある set 文を実行すると,その指標が評価され,この値が新たな印字

欄幅になる。出力行が部分的に生成されていたとしても,印字欄幅の変更は直ちに有効になる。

zonewidth

句のある set 文は,書式なし出力だけに影響を与える。

(10) ask

文  ask 文を実行すると,出力質問項目並び中の変数に,margin 句の場合には現在の行幅の値,

zonewidth

句の場合には現在の印字欄幅の値が代入される。

印字位置が任意に大きくてよい場合には,

margin

句の数値変数に値 MAXNUM が代入される。


69

X 3003-1993

(11)

入出力の途中で入出力以外の例外状態が起こったとき,その部分的な入出力動作の効果及びその入出

力装置の状態は,処理系定義とする。

参考  ANSI X3.113 にはこの(11)項がないが,TIB によって補った。

10.3.5

例外状態  例外状態は,次による。

(1)

位置指定 TAB の指標の値が 1 より小さい。

(4005,続行可能。値を 1 として処理を続ける。

(2)  set

文の margin 句の指標の値が,現在の印字欄幅の値より小さい。

(4006,続行不能。

(3) set

文の zonewidth 句の指標の値が,1 より小さい又は現在の行幅の値より大きい。

(4007,続行不能。

10.3.6

注意  注意は,次による。

(1)

数値式を評価して生成される文字の列は,右端に 1 文字の空白を含む。この空白まで生成しようとす

ると,ちょうど行幅を越えることになる(すなわち,印字位置=行幅+2 になる。

)場合には,処理系

は,その空白の生成を省略し,その数値を現在行の右端の印字欄に出力してもよい。

(2)

小数点あり指数部あり形式  [10.3.4(3.5)]  で数値を印字するときに,処理系は英小文字 を使用するこ

とにしてもよい。

(3)

位置指定 TAB に続く印字区切りは,それが式に続く場合と同じ効果をもつ。

10.4

書式付き出力

10.4.1

概要  print 文 (print-statement) は,書式 (image) を指定して出力の形式を制御することができる。

書式は,その print 文中又は別の image 行中で指定する。

10.4.2

構文  構文は,次による。

(1)  print

文⊃PRINT  書式付き印字指定

(2)

書式付き印字指定=USING  書式引用  {コロン  書式印字式並び}?

(3)

書式引用=行番号|文字列式

(4)

書式印字式並び=式  {コンマ  式}

*

  セミコロン?

(5)  image

行=行番号  IMAGE  コロン  書式文字列  行末

(6)

書式文字列=即値文字列{書式項目  即値文字列}

*

(7)

即値文字列=即値文字

*

(8)

即値文字= 英字|数字|空白|感嘆符|アポストロフィ|左括弧|右括弧|斜線|コロン|

セミコロン|等号|疑問符|下線 

(9)

書式項目=けた寄せ?  浮動文字列  {整数書式項目|小数書式項目|指数書式項目}1 けた寄せ

(10)

けた寄せ=大号|小号

(11)

浮動文字列={正号

*

|負号

*

}  ドル記号?|ドル記号

*

  {正号|負号}?

(12)

整数書式項目=数字位置  数字位置

*

  {コンマ  数字位置  数字位置

*

*

(13)

数字位置=星印|番号記号|パーセント記号

(14)

小数書式項目=小数点  番号記号  番号記号

*

|整数書式項目  小数点  番号記号

*

(15)

指数書式項目={整数書式項目|小数書式項目}  山記号  山記号  山記号  山記号

*

(16)

書式引用の行番号は,そのプログラム単位中の image 行を参照しなければならない。

(17) image

行中のコロンに続く空白列は,書式文字列の一部とする。

(18)

一つの整数書式項目中のすべての数字位置は,同一の文字でなければならない。すなわち,すべて番

号記号とするか,すべてパーセント記号とするか,又はすべて星印とする。

10.4.3

例  構文の例を次に示す。


70

X 3003-1993

(1)  10 LET sum

=20

20 PRINT USING”The answer is ###.#”:sum

は,

                  The answer is  20.0

を生成する。

(2) 

30 PRINT USING 40:342,42.021

40 IMAGE:RATE OF LOSS #### EQUALS ####.## POUNDS

は,

           RATE  OF  LOSS  342  EQUALS    42.02  POUNDS を生成する。

(3) 

10 LET A$

=”<##### ####.#### ####.####^^^^”

20 PRINT USING A$:1,1, 1

は, 

                     1   1.0000 1000.0000E−03 

を生成する。 

(4)  60 PRINT USING 70:”ONE”,”TWO”,”THREE”

70 IMAGE:Z

<####>#### ########Z 

は, 

           ZONE      TWO THREE    Z 

を生成する。 

(5)  80 LET A$

=  ”Pay  $**.## on ### %% 19%%”

90 PRINT USING

    A$:1, “May”, 2,83 

は,

                Pay $*1.00 on May 02 1983 

を生成する。 

(6)  10 PRINT USING”

<%%.##>---$##.## $$$+***”:3.1,−1234.567,2 は,

                  003.10 -$1234.57      $+**2                 を生成する。 

(7)  10 PRINT USING”

<$$$$.## $$$$.###^^^^^”:−.02, −.02  は,

                      $-.02    $-.200E-001 

を生成する。 

(8)  10 PRINT USING”$***,***.##”:1234.7777  は,

                  $**1,234.78 

を生成する。 

10.4.4

意味  意味は,次による。

(1)

書式文字列の選択  書式付き印字指定 (formatted-print-list) のある print 文は,書式印字式並びを評価

して出力を生成する際に,書式文字列 (format-string) を識別し,書式文字列を用いて出力の制御を行

う。書式引用 (image) が行番号であるときには,書式文字列は,指定された行番号の image 行中に含

まれている。書式引用が文字列式であるときには,書式文字列はその文字列式の値とする。

(2)

書式文字列の解析

(2.1)

選択された書式文字列は,0 文字以上の即値文字列 (literal-string) によって分離された幾つかの書式

項目 (format-item) に分解される。

書式項目は,書式文字列中の文字を左から右に走査して定められる。構文的に正しい書式項目の

最初の文字が探され,その文字から始まる最も長い書式項目が識別される。新しい書式項目の探索

は,前の書式項目が識別されるたびに,そのすぐ次の文字から始まる。書式項目に対する走査は,

このような方法で書式文字列の最後まで続けられる。


71

X 3003-1993

(2.2)

一つの書式項目にはそれぞれ一つの出力欄 (output field) が対応する。出力欄の長さは,書式項目中

の文字[けた寄せ (justifier),浮動文字列 (floating-characters),数字位置 (digit-place),コンマ,小数

点,番号記号及び山記号を含む。

]の個数に等しい。書式項目の一部でない文字は,即値文字でなけ

ればならない。

(2.3)  image

行中に定義された書式文字列は,その行における空白でも行末でもない最後の文字で終わる。

(3)

即値文字列と出力欄  出力すべき値の列は,書式印字式並び (output-list) の中の各式を順番に評価し

て生成される。各値が生成される際に,まず,書式文字列の中の次の書式項目の前にある即値文字列

が,生成中の文字の列の中にそのまま複写される。次に,数値式の場合は(4)に,文字列式の場合は(5)

に従って,出力欄の長さに等しい個数の文字が書式項目によって定められ生成される。

(4)

書式付き数値出力  数値は丸められ,用いられている書式項目に対応したやり方で表現される。

(4.1)

書式項目の中にけた寄せがある場合,けた寄せば,その右隣の文字で置き換えられる。右隣の文字

が小数点である場合及びその書式項目がけた寄せだけからなる場合,けた寄せば,番号記号で置き

換えられる。

(4.2)

最初に,値の絶対値の表現が生成される。

(a)

整数書式項目 (i-format-item) の場合,値は最も近い整数に丸められ,小数点なし指数部なし形式で

表現される。

(b)

小数書式項目 (f-format-item) の場合,値は小数点あり指数部なし形式で表現され,書式項目の中の

小数点に続く番号記号の個数に応じて丸められるか右にゼロが補われる。

(c)

整数書式項目の場合も小数書式項目の場合も,意味上の小数点の左側では先行のゼロ列は生成され

ない。ただし,生成しないと出力欄に数字が一つもなくなってしまうときは,意味上の小数点の左

隣に 1 文字のゼロが生成される。その後,その整数中又は小数点の左側にまだ満たされていない数

字位置があれば,数字位置として,パーセント記号が用いられているときには先行のゼロ列が,星

印が用いられているときには先行の星印列が,番号記号が用いられているときには先行の空白列が

生成される。その結果,意味上の小数点の左側に生成される文字の個数は,書式項目中の数字位置

の個数と等しくなる。

(d)

指数書式項目 (e-format-item) の場合,値は,その指数書式項目中に小数書式項目を用いたか整数書

式項目を用いたかに応じて,小数点あり指数部あり形式又は小数点なし指数部あり形式で表現され

る。

ゼロでない値の有効数字部は,最も左の数字位置又は番号記号の位置にゼロ以外の数字が来るよ

うに,10 のべき乗を乗じて調整される。それ以外の点では,有効数字部は,整数書式項目及び小数

書式項目の場合と同じ規則に従って生成される。

指数書式項目の中の山記号の個数は,指数部の文字数を定める。指数部の最初の文字は英字 E,

次の文字は正号又は負号,残りは指数部の整数の絶対値の表現となる。指数部の整数の絶対値の表

現では,指数部の文字数が書式項目中の山記号の個数と等しくなるように,必要ならば先行のゼロ

列が生成される。指数がゼロであるとき,指数部の符号は正号とする。値がゼロであるとき,その

指数はゼロとする。

(4.3)  2

番目に,書式項目の中にコンマがあれば,この数値表現のその位置にコンマが挿入される。挿入

点の左側に少なくとも 1 けたの数字が生成されていれば,このコンマがそのまま生成される。挿入

点の左側に数字が 1 けたも生成されていないときには,左隣の数字位置が星印であればコンマは星

印に置き換えられ,数字位置が番号記号であればコンマは空白に置き換えられる。


72

X 3003-1993

(4.4)  3

番目に,符号,ドル記号及び空白からなる先行文字列が

表 10.1 のとおり生成される。

表 10.1  浮動文字列の効果

書式項目中の浮動文字列(先頭の文字は,複数個あってもよい。

に対応して生成される長さ 0∼2 の先行文字列を示す。

指定した浮動文字列

生成される先行文字列

先頭

末尾

非負値

負値

− $ “$”

−$”

$

− “$”

“$

−”

なし “

” “

−”

+ $

+$” “−$”

$

+ “$+” “$−”

なし

+” “−”

$

なし “$” “$−”

なし

なし

“”

例外状態

参考  ANSI X3.113 では,例外状態のところが“−”となっている

が,誤りであるので,TIB によって訂正した。

(4.5)

最後に,数値の表現の長さが書式項目の長さと等しくなるように,左側に空白が補われる。これは,

出力欄の中で数値表現を右寄せする効果をもつ。

(5)

書式付き文字列出力  文字列値は,どの種類の書式項目を用いて出力することもできる。文字列は,

その長さが書式項目の長さと等しくなるように,空白を補われる。これらの空白は,書式項目が大号

で始まる場合は(右寄せのために)左側に付加され,小号で始まる場合は(左寄せのために)右側に

付加され,それ以外の場合は(中央に置くために)左右に同じだけ付加される。最後の場合に,必要

な空白の個数が奇数ならば,余分の空白は右側に付加される。

(6)

書式付き出力の終了

(6.1)

出力する値の個数が書式文字列の中の書式項目の個数より多ければ,書式文字列の末端に到達する

たびに,行末が生成され,残りの式に対してその書式文字列が再び用いられる。

(6.2)

すべての値が出力された後,次の即値文字列があればそれが出力される。その即値文字列の文字の

出力は,書式文字列中に書式項目が残っていれば,用いられなかった最初の書式項目の直前で終了

する。

(6.3)

書式印字式並びがセミコロンで終わっていない場合には,すべての文字の生成が終わった後で最後

に行末が生成される。書式印字式並びがセミコロンで終わっている場合には,そのような行末は生

成されない。

(7)

行幅の効果  現在の行幅は,出力に影響を及ぼさない。特に,書式付き出力においては,行幅を越え

たからといって行末が生成されることはない。

(8)  image

行  プログラムの実行が image 行に到達すると,何もしないで次の行に進む。

(9)

入出力の途中で入出力以外の例外状態が起こったとき,その部分的な入出力動作の効果及びその入出

力装置の状態は,処理系定義とする。

参考  ANSI X3.113 にはこの(9)項がないが,TIB によって補った。

10.4.5

例外状態  例外状態は,次による。

(1)

書式付き印字指定の中で正しくない書式文字列が指定されている。

(8201,続行不能。

(2)

書式付き印字指定が書式印字式並びを含んでいるのに,書式文字列の中に書式項目がない。

(8202,続

行不能。


73

X 3003-1993

(3)

文字列式又は数値式によって生成された出力文字列が,それに対応する書式項目より長い。

(8203,続

行可能。その出力欄を星印で埋め,次の行に書式なし出力の表現で値を報告し,その次の行の,例外

状態にならなかったときに続行するのと同じ文字位置から印字を続行する。

(4)

数値出力の指数部が,書式文字列中の山記号で確保した幅を越える。

(8204,続行可能。その出力欄を

星印で埋め,次の行に書式なし出力の表現で値を報告し,その次の行の,例外状態にならなかったと

きに続行するのと同じ文字位置から印字を続行する。

参考  ANSI X3.113 の文章は不十分であるので,TIB によって訂正した。

10.4.6

注意  注意は,次による。

(1)

処理系は書式文字列を実行時に評価してもよいので,その中の誤りは,

(たとえそれが image 行の中

にあり,実行前に判明していても,

)例外状態として扱ってもよい。

(2)

小数点なし指数部あり形式又は小数点あり指数部あり形式で数値を印字するときに,処理系は英小文

字 を使用することにしてもよい。

参考  ANSI X3.113 では,“小数点あり”のほうだけを記述してあるが,誤りであるので,TIB によっ

て訂正した。

(3)

浮動文字列を指定した書式項目においては,整数書式項目又は小数書式項目を用いて生成される数値

の整数部は,書式項目中の数字位置の個数より多くの数字を含むことができる。

(4)

負の数値には,常に負号が付く。すべての数字位置は,数字又は先行の空白列,ゼロ列若しくは星印

列で埋められるので,負の数値に対応する書式項目は,負号の分の場所を浮動文字列で確保しておか

なければならない。特に,浮動文字列を含まない書式項目又は浮動文字列が 1 文字のドル記号だけか

らなる書式項目の出力欄に負の数値を出力しようとすると,例外状態 8203 になる。

(5)

即値文字列及び即値文字は,構文規則 10.4.2(7)及び(8)に規定してある。処理系は,即値文字列用の文

字の組を拡張して,10.4.5(1)に規定する例外状態 8102 を起こさずに利用できることにしてもよい。

参考  ANSI X3.113 にはこの(5)項がないが,TIB によって補った。

10.5

配列入出力

10.5.1

概要  配列全体に入力又は配列全体を出力する文を定める。これらの文は,単一の値を扱う入出力

文の機能を拡充したものである(10.110.4 参照)

10.5.2

構文  構文は,次による。

(1)  mat-read

文⊃MAT  READ  {if-missing 句  コロン}?  再定義配列並び

(2)

再定義配列並び=再定義配列  {コンマ  再定義配列}

*

(3)

再定義配列=配列名  再定義上下限指定部?

(4)  mat-input

文⊃MAT  INPUT  入力修飾?  {再定義配列並び|不定長ベクトル}

(5)

不定長ベクトル=配列名  左括弧  疑問符  右括弧

(6)  mat-line-input

文⊃MAT  LINE  INPUT  入力修飾?  再定義文字列配列並び

(7)

再定義文字列配列並び=再定義文字列配列  {コンマ  再定義文字列配列}

*

(8) 

再定義文字列配列=文字列配列名  再定義上下限指定部?

(9)  mat-print

文⊃MAT  PRINT  {印字配列名並び|USING  書式引用  コロン  書式印字配列名並び}

(10)

印字配列名並び=配列名  {印字区切り  配列名}

*

  印字区切り?

(11) 

書式印字配列名並び=配列名  {コンマ  配列名}

*

  セミコロン?

(12)

再定義配列におけるその配列と再定義上下限指定部とは,同じ次元数でなければならない。

(13)

不定長ベクトルの配列は,1 次元でなければならない。


74

X 3003-1993

10.5.3

例  構文の例を次に示す。

MAT READ A

(1)

MAT READ A(M,N), B

(1)

MAT INPUT A$(3,4)

(4)

MAT INPUT X(?)

(4)

MAT INPUT PROMPT ”Enter data:”:X(?)

(4)

MAT LINE INPUT A$

(8)

MAT PRINT A;B, C;

(9)

10.5.4

意味  意味は,次による。

(1)  mat-read

(1.1)  mat-read

文 (array-read-statement) を実行すると,その文を含むプログラム単位の data 文によって生

成されたデータ列 (data sequence) にある値が,順番に再定義配列並び中の配列に代入される。

(1.2)

各配列のすべての要素が,行方向の順番(最後の添字が最も早く変わる順番)で,データ列の中の

データ要素にある値を代入される。代入される値は,データ列の指示子 (pointer) によって指示され

るデータ要素から順番に得られる。指示子は,それらのデータ要素の次を指す。

(1.3)

データ列にある各データ要素の型は,それが代入される配列要素の型に一致していなければならな

い(10.1 参照)

(1.4)

再定義上下限指定部 (redim) を書くと,値がその再定義配列に代入される前に動的に上下限の再定

義 (redimensioning) が行われる。上下限の再定義は,配列宣言での上下限の規則に従って行われる。

再定義上下限指定の指標の値が,配列の新しい上下限になる。配列の上下限の再定義を行っている

時に例外状態になると,もとの上下限が残る。

(1.5)

再定義配列 (redim-array) 中の再定義上下限指定部は,再定義配列並び中の先行する(すなわち左側

の)配列が値を代入されてから,評価される。

(1.6)

データ要素の個数が不足している場合の扱いは,if-missing 句のあるときもないときも,10.1 による。

(1.7)

数値データを評価した結果が下位けたあふれになると,その値は,ゼロで置き換えられる。

(2)  mat-input

(2.1)  mat-input

文 (array-imput-statement) を実行すると,プログラムの実行は,(2)及び(3)に定める正しい

入力応答 (input-reply) がなされるまで待たされる。mat-input 文は,入力応答にある値を順番に,

再定義配列並びにある配列に代入する。値は,各配列のすべての要素に対して行方向に代入される。

(2.2)

対 話 方 式 の 場 合 , プ ロ グラ ム の 利 用 者 は , デ ー タ を 入 力 す る 必 要 の あ る こ と を , 入 力 要 求

(input-prompt)

によって知らされる。この入力要求は,input 文の入力要求と同じものとする。

(2.3)

入力修飾の効果は,10.2 による。

(2.4)

入力応答にあるそれぞれのデータ要素の型は,代入される配列要素の型に一致していなければなら

ない。

(2.5)

再定義上下限指定部を書くと,mat-read 文に対して(1.4)で規定したとおり,値がその再定義配列に

代入される前に動的に上下限の再定義が行われる。

(2.6)

再定義配列中の再定義上下限指定部は,再定義配列並び中の先行する(すなわち左側の)配列が値

を代入されてから,評価される。

(2.7)

入力データが代入されてから配列の上下限が再定義され,続いて入力に関する例外状態の回復手続

きによってその配列に入力データを再入力することになったときの効果は,処理系定義とする。


75

X 3003-1993

(2.8)

配列入力の要求に対する応答において,データを単一の入力応答で供給する必要はない。配列並び

に対するデータ要素の個数が不足し,かつ入力応答の末尾がコンマであれば,入力要求が再び表示

され,更にデータ要素を供給するように入力応答が要求される。

(2.9)

数値データを評価した結果が下位けたあふれになると,その値は,ゼロで置き換えられる。

(3)

不定長ベクトルの入力

(3.1)  mat-input

文に不定長ベクトル (variable-length-vector) があれば,全入力応答(すなわち,コンマで

終わらない入力応答までの入力応答の列)中にあるだけの個数のデータ要素が入力として,そのベ

クトルに供給される。データの代入は,そのベクトルの現在の下限値のところがら始まる。代入後

にベクトルは,最後のデータ要素を受け取った要素のもつ添字に等しい添字を上限値として設定し

て,動的に再定義される。不定長ベクトルに代入されるデータ値の個数は,配列宣言の中で指定さ

れたときのそのベクトルに対するもとの寸法を超えてはならない。

(3.2)

入力応答にある各データ要素の型は,配列の型に一致していなければならない。

(4)  mat-line-input

(4.1)  mat-line-input

文 (array-line-input-statement) を実行すると,

文字列配列並び中の文字列配列の一つの

要素ごとに一つの行入力応答が,入力応答の要求と同じ方法で要求される。幾つかの行入力応答の

全体の内容(それらの行末は除く。

)が,文字列配列並び中の文字列配列の要素に対して,行方向に

代入される。要求される行入力応答の個数は,値を要求する要素の個数に等しい。

(4.2)

対話方式の場合,プログラムの利用者は,データを入力する必要のあることを,入力要求によって

知らされる。

(4.3)

入力修飾の効果は,10.2 による。

(4.4)

再定義上下限指定部を書くと,mat-read 文に対して(1.4)で規定したとおり,値がその再定義配列に

代入される前に動的に上下限の再定義が行われる。

(4.5)

再定義配列中の再定義上下限指定部は,再定義配列並び中の先行する(すなわち左側の)配列が値

を代入されてから,評価される。

(5)  mat-print

(5.1)  mat-print

文 (array-primt-statement) を実行すると,配列印字並び中にあるすべての配列の全要素の

値が印字される。

(5.2)

現在の出力行が空でないときに mat-print 文を実行すると,まず始めに行末が生成される。

(5.3)

印字配列名並びのある mat-print 文において,一つの 2 次元配列の印字によって生成され外部の装

置に転送される文字の列は,次による。すなわち,その配列の要素が行方向の順番に,一つの print

文の印字項目並びになっているとする(行別の昇順)

。そして,各要素は,もとの mat-print 文のそ

の配列名に続く印字区切りによって(又は印字区切りがないときにはコンマによって)区切られて

並んでいるとする。そのように想定して文字の列が生成される。ただし,配列の一つの行が印字さ

れる都度,行末(そのような行末がまだ生成されていないならば)が生成される。

3

次元配列は,一連の 2 次元配列が,1 番目の添字の値ごとに一つずつ並んだものであるかのよう

に印字され,添字の各値の間で追加の行末が生成される。

1

次元配列は,行ベクトルとして扱われ,1×配列であるかのように印字される。

更に,一つの印字配列名並び中の後続する配列との間にも,行末が生成される。

(5.4)

書式印字配列名並びのある mat-print 文において,生成され外部の装置に転送される文字の列は,

次による。すなわち,全配列の全要素が配列ごとに行方向の順番に並んで,一つの print 文の書式


76

X 3003-1993

印字式並びになっているとする。更に,mat-print 文に指定したのと同じ書式指定が指定されている

とする。そのように想定して文字の列が生成される。追加の行末は,生成されない。

書式指定を用いる print 文の場合と同様に,書式印字配列名並びがセミコロンで終わっていない

場合には,その mat-print 文の他のすべての出力が終わった後で最後に行末が生成される。書式印

字配列名並びがセミコロンで終わっている場合には,そのような行末は生成されない。

(6)

入出力の途中で入出力以外の例外状態が起こったとき,その部分的な入出力動作の効果及びその入出

力装置の状態は,処理系定義とする。

参考  ANSI X3.113 にはこの(6)項がないが,TIB によって補った。

10.5.5

例外状態  例外状態は,次による。

(1)  mat-read

文の再定義配列並びの要求するデータ要素の個数が,データ列の残りにあるデータ要素の個

数より多く,かつ if-missing 句が指定されていない。

(8001,続行不能。

(2)

データ列中の数値定数でないデータ要素を数値配列の要素に代入しようとする。

(8101,続行不能。

(3)  mat-read

文の実行中に,データの代入が文字列あふれを起こす。

(1053,続行不能。

(4)

データ要素並び中の数値データの評価があふれを起こす。

(1006,続行不能。

(5)

配列入力の要求に対する応答として与えられた行が,構文的に正しい入力応答でない。

(8102,続行可

能。新しい入力応答を要求する。

(6)

数値配列に対する入力として与えられたデータ要素が,数値定数でない。

(8103,続行可能。現在の入

力応答の再送を要求する。

(7)

入力応答中のデータ要素の個数が不足しており,かつ最後がコンマで終わっていない。

(8002,続行可

能。現在の入力応答の再送を要求する。

(8)

入力応答中のデータ要素の個数が多すぎる。又は,要求されている個数のデータ要素があるにもかか

わらず,入力応答がコンマで終わっている。

(8003,続行可能。現在の入力応答の再送を要求する。

(9)

入力応答中の数値データの評価があふれを起こす。

(1007,続行可能。現在の入力応答の再送を要求す

る。

(10) mat-input

文又は mat-line-input 文の実行中,文字列データの代入が文字列あふれを起こす。

(1054,

続行可能。現在の入力応答又は行入力応答の再送を要求する。

(11)

上下限の再定義後の配列で必要な要素の総数が,もとの配列宣言で確保された要素数を超える。

(5001,

続行不能。

(12)

再定義上下限指定の 1 番目の指標の値が,2 番目の指標の値より大きい。

(6005,続行不能。

(13)

再定義上下限指定に指標が一つだけ書いてあって,その値が有効な暗黙の下限の値未満である。

(6005,

続行不能。

(14) 

入力修飾にある timeout 句によって指定された秒数以内に,正しい入力応答又は行入力応答が与えら

れない。

(8401,続行不能。

(15)

数値時間式として使用された数値式の値がゼロより小さい。

(8402,続行不能。

(16) mat-print

文の中で正しくない書式文字列が指定されている。

(8401,続行不能。

(17) mat-print

文が書式印字配列名並びを含んでいるのに,書式文字列の中に書式項目がない。

(8402,続

行不能。

10.5.6

注意  注意は,次による。

(1)

処理系は,入力応答又は行入力応答を出力(すなわちエコー表示)しなくてもよい。

(2)

この規格は,誤った入力応答を修正する機能を処理系に対して要求しないが,処理系は,そのような


77

X 3003-1993

機能を用意してもよい。

(3)

処理系は,下位けたあふれを例外状態(1507,続行可能。ゼロで置き換えて処理を続ける。

)としても

よい。この場合,下位けたあふれを例外処理区で処理することができる(12.1 参照)

11.

ファイル

11.0

ファイル編成及び記録形式  ファイル編成及び記録形式は,次による。

(1)

ファイル (file) は,BASIC プログラムの外部にあるデータの構造化された集まりである。ファイルは,

BASIC

プログラムの実行中に生成されたデータを保存し,後の実行時にそのデータを取り出したり,

修正したりする手段を利用者に提供する。外部データをプログラムに転送する処理を入力 (input),プ

ログラムから転送する処理を出力 (output) という。

処理系は,ファイルの生成,保存及び取出しの機能を提供しなければならない。その手段は,処理

系定義とする。ファイルに対する入出力操作は,ここで規定されているとおりに実行されなければな

らない。

(2)

この箇条 11.では,ファイル及び装置の BASIC プログラムに対する論理的な見え方を規定する。ある

場合には物理的な特性を反映することもあるが,一般的にこの規格は,ファイル及び装置の物理的な

表現及び構造については何も前提としていない。

(3)

ファイル編成 (file-organization) は,次の四つとする。

順編成ファイル及び索引編成ファイルは,記録 (record) の列とする。相対編成ファイルは,記録領

域 (record-area) の列とする。この記録領域には,記録があることもあるし,ないこともある。流れ編

成ファイルは,値 (value) の列とする。

(a)

順編成 (sequential)  

(b)

流れ編成 (stream)

(c)

相対編成 (relative)  

(d)

索引編成 (keyed)  

(4)

記録形式 (record-type) は,次の三つとする。

表示形式記録は,文字の列とする。内部形式記録は,型をもった値の列とする。固有形式記録は,

プログラムで指定した枠 (template) によって記述される欄 (field) の列とする。

表示形式記録は,数値及び文字列値に対して異なる内部表現を用いるシステム相互の間でデータを

交換する手段を与え,人間の目に見える形でデータを扱う。内部形式記録は,一つのシステムの内部

でデータを効率よく操作する手段を与える。固有形式記録は,一つのシステムの内部の異なる言語処

理系間でデータを交換する手段を与える。

(a)

表示形式 (display)  

(b)

内部形式 (internal)  

(c)

固有形式 (native)

(5)

ファイルに関連して六つの機能単位 (module) をおく。これらは,ファイル編成と記録形式のある特

定の組合せを支援する(

表 11.4 参照)。

(a)

中核機能単位及び部分集合中核機能単位は,表示形式順編成ファイル,内部形式順編成ファイル及

び内部形式流れ編成ファイルを支援する。

(b)

内部形式拡充ファイル機能単位及び内部形式拡充ファイル部分集合機能単位は,内部形式相対編成

ファイル及び内部形式索引編成ファイルを支援する。


78

X 3003-1993

(c)

固有形式拡充ファイル機能単位及び固有形式拡充ファイル部分集合機能単位は,固有形式順編成フ

ァイル,固有形式相対編成ファイル及び固有形式索引編成ファイルを支援する。

(d)

その他のファイル編成と記録形式の組合せは,処理系定義とする。

備考  六つの機能単位は,上のとおり二つずつ 3 組に分かれる。各組の二つの機能単位に対する 11.

の規定は,それぞれ同じ(2.0 参照)である。以下ではこれらを,

“部分集合”の付かない名前

で併せて呼ぶ。

(6)

機能単位の区別は,構文の生成規則にも反映されている。それぞれの箇条では,最初に中核機能単位

の構文規則を示す。次に,拡充ファイル機能単位に関する追加の構文の生成規則を示す。固有形式拡

充ファイル機能単位に関してだけ適用される拡充の生成規則に対しては,番号の前に“固”と表示す

る。

(7)

箇条 11.で使う用語の定義は,次による。

(7.1)

ファイルは,

“ファイル要素 (file element)”の列とする。すなわち,索引編成ファイル及び順編成フ

ァイルのファイル要素は記録,相対編成ファイルのファイル要素は記録領域,流れ編成ファイルの

ファイル要素は値とする。

(7.2)

実行中に,一つのファイルには一つの“ファイル指示子 (file pointer)”が,関連付けられる。文の

実行が完了した時,ファイル指示子は一つのファイル要素又はファイルの終りを指す。ファイル指

示子がファイルの始めにあるときには,それは,もし存在するならば先頭のファイル要素を指す。

ファイルが空列である場合には,ファイルの始めと終りは同じとし,ファイル指示子はこの位置を

指す。

(7.3)

“次のファイル要素 (next file element)”というとき,そのようなファイル要素が存在しないならば,

それはファイルの終りを指す。

(7.4)

“ファイルの終り  (end of file)”は,順編成ファイル,流れ編成ファイル及び索引編成ファイルでは,

末尾のファイル要素の直後の位置とする。相対編成ファイルでは,存在する最後の記録の直後の空

の記録領域とする。

(7.5)

ファイルを全体的に操作する文を“ファイル操作 (file operation)”といい,次の五つとする。

(a)  open

(b)  close

(c)  erase

(d)  set

(e)  ask

(7.6)

個々のファイル要素に適用する文を“記録操作 (record operation)”といい,次の七つとする。

これらには,機能語 MAT 及び LINE を前置した文をも含む。input 操作,write 操作などという場合,

その機能語を用いた文すべてを指す。例えば,write 操作は,write 文と mat-write 文とを含む。

(a)  input

操作

(b)  print

操作

(c)  read

操作

(d)  write

操作

(e)  rewrite

操作

(f)  delete

(g)

指示子制御を指定した set 


79

X 3003-1993

(7.7)

七つの記録操作は,次の対象に作用する。

(a)

ファイル中のデータ

(b)

プログラム中の変数

(c)

ファイル指示子

(7.8)  print

操作,write 操作,rewrite 操作及び delete 文は,ファイル中のデータ及びファイル指示子に作

用する。read 操作及び input 操作は,プログラム中の変数及びファイル指示子に作用する。指示子

制御を指定した set 文は,ファイル指示子だけに作用する。

(7.9)

入力及び出力は,上に規定したようなファイルに対する転送だけではない。処理系は,ファイルを

処理する文を,端末装置,行印字装置,通信回線などの装置 (device) に対しても適用してよい。

この箇条 11.における“ファイル (file)”という用語は,外部データの入力源 (source) 又は出力先

(destination)

を全般的に意味する。すなわち,狭義のファイル又は装置を意味する。この規格中で二

つを区別する必要がある場合には,用語として“狭義ファイル (true file)”と“装置 (device)”とを使

い分ける。

(8)

装置は,次の点で狭義ファイルとは異なる。

(a)

個々の装置に書き出したデータが,そのまま保存されて後の入力操作で取り出せるか否かは,処理

系定義とする(11.1 参照)

(b)

個々の装置が消去の能力をもつか否かは,処理系定義とする(11.1 参照)

(c)

装置のファイル編成としては,相対編成及び索引編成は許されない(11.1 参照)

(d)

装置は,すべての入出力方向 (access-mode) 属性を支援しなくてもよい(11.1 参照)

(e)

装置は,132 以上の記録長を保証しなくてもよい(11.1 参照)

。ただし,処理系は,各装置で保証さ

れる最低限の記録長を文書で示さなければならない。

(f)

個々の装置が記録設定の能力をもつか否かは,処理系定義とする(11.2 参照)

(g)

個々の装置のデータ存在状態が真になったり偽になったりするための条件は,処理系定義とする

11.2 参照)

(h)

入力制御項目の,prompt 句,timeout 句及び elapsed 句の意味規則は,対話方式の端末装置の場合

にだけ適用される。処理系は,

(もしあれば)どの装置が対話方式の端末装置であるかを定義しなけ

ればならない。これらの入力制御項目の,他の装置及び狭義ファイルに対する効果は,処理系定義

とする(11.4 参照)

(i)

装置に対する input 操作中に,

表 11.1 に示す条件が発生したとき,それを,11.4 に規定されたとお

り続行不能な例外状態として扱うか,10.2 に規定されたとおり続行可能な例外状態として扱いその

回復手続きを適用するか否かは,処理系定義とする(11.4 参照)

(9)

表 11.2∼表 11.4 は,さまざまなファイル機能の概要を示す。詳細な仕様は,11.111.5 による。


80

X 3003-1993

表 11.1  端末とファイルとで異なる例外状態

11.4

での

例外状態種別 

10.2

での

例外状態種別

条件

8105 8102

入力応答の構文誤り

8101 8103

数値変数に対応するデータ要素が数値定数で

ない

8012 8002

入力応答のデータ要素が足りない

8013 8003

入力応答のデータ要素が多すぎる

1008 1007

入力中の数値あふれ

1105 1054

入力中の文字列あふれ

表 11.2  ファイル編成に対する操作及び記録設定

この表は,それぞれのファイル編成に対して有効な記録操作と記録設定の組合せを示す。編成は,許され

る記録操作の能力によって定義される。表にない記録操作と記録設定との組合せは,構文誤りとする。例え
ば,key 句を指定した input 文は,構文誤りとする。

○:規格によって規定される,×:例外状態,△:処理系定義

記録操作

記録設定

ファイル編成

順編成

流れ編成

順編成

索引編成

input

操作

なし

(

2

)

(

2

)

(

2

)

 NEXT

(

2

)

(

2

)

(

2

)

 BEGIN

(

2

)

(

2

)

(

2

)

 END

(

4

)

(

2

)

(

2

)

(

2

)

 SAME

(

2

)

(

2

)

(

2

)

print

操作

なし

(

2

)

(

2

)

(

2

)

 NEXT

(

2

)

(

2

)

(

2

)

 BEGIN

(

2

)

(

2

)

(

2

)

 END

(

2

)

(

2

)

(

2

)

 SAME

(

2

)

(

2

)

(

2

)

read

操作

なし

 NEXT

 BEGIN

 END

(

4

)

(

4

)

(

4

)

(

4

)

 SAME

 RECORD

×(

1

)

×(

1

)

×(

1

)

 KEY

×(

1

)

×(

1

)

×(

1

)

(

2

)

write

操作

なし

×(

3

)

 NEXT

×(

3

)

 BEGIN

×(

3

)

 END

×(

3

)

 SAME

×(

3

)

 RECORD

×(

1

)

×(

1

)

×(

1

)(

3

)

 KEY

(等値)

×(

1

)

×(

1

)

×(

1

)

なし

(

5

)

(

5

)

rewrite

操作及び

delete

文 NEXT

(

5

)

(

5

)

 BEGIN

(

5

)

(

5

)

 END

(

5

)

(

5

)

(

4

)

(

4

)

 SAME

(

5

)

(

5

)

 RECORD

(

5

)

(

5

)

×(

1

)

 KEY

(

5

)

(

5

)

×(

1

)


81

X 3003-1993

記録操作

記録設定

ファイル編成

順編成

流れ編成

順編成

索引編成

なし

NEXT

指示子制御を指
定した set 

BEGIN

 END

 SAME

 RECORD

×(

1

)

×(

1

)

×(

1

)

 KEY

×(

1

)

×(

1

)

×(

1

)

(

1

) RECORD

は,相対編成ファイルにだけ有効とする。KEY は,索引編成ファイルにだけ有効とする。

(

2

)  input

操作及び print 操作は,表示形式記録に対してだけ定義する。表示形式記録は,順編成ファイル

に対してだけ定義する。

(

3

)

索引編成ファイルに対する write 操作には,等値探索を指定しなければならない。

(

4

) END

によってデータ存在状態は,偽となる。

(

5

)

相対編成及び索引編成以外のファイル編成に対する rewrite 操作及び delete 文は,処理系定義とする。

表 11.3  記録操作及び制御

この表は,記録操作に対して構文上許される制御機能を示す。○印は,許される制御機能を示す。

記録操作

制御

記録設定

データ存否

書式と枠

中 核 記 録 設

(

1

)

す べ て の 記

録設定

if-missing

if-there

書式引用

枠引用

input

操作

print

操作

read

操作

write

操作

rewrite

操作

delete

set

(

2

)

(

1

)

中核記録設定=NEXT|BEGIN|END|SAME

(

2

)  set

文は,指示子制御を指定したものとする。

表 11.4  ファイル編成及び記録形式

この表は,規格の規定するファイル編成と記録形式との組合せ及びそれを支援する機能単位を示す。

ファイル編成

記録形式

表示形式

内部形式

固有形式

順編成

中核

中核

固有形式拡充ファイル

流れ編成

中核

相対編成

内部形式拡充ファイル

固有形式拡充ファイル

索引編成

内部形式拡充ファイル

固有形式拡充ファイル

11.1

ファイル操作

11.1.1

概要  ファイル全体に作用する文として,次の四つ及び set 文(11.3 参照)がある。

(1)  open

文 (open-statement) は,ファイルとプログラムとの接続を行い,ファイルをプログラムから参照

可能にする。ファイルの識別に用いられる形式は,オペレーティングシステムに依存する。したがっ

て,この規格では,ファイルにはそれぞれ名前と呼ばれる文字の列が関連付けられ,その名前によっ

てオペレーティングシステムがファイルを識別することだけを想定する。プログラム中では,ファイ

ルの識別には,そのファイルの参照に使用する経路 (channel) の番号を用いる。

(2)  close

文 (close-statement) は,open 文によって参照可能にされたファイルを,参照不能にする。

(3)  erase

文 (erase-statement) は,狭義ファイル中のデータの全部又は一部を削除する。装置には,何の効


82

X 3003-1993

果も及ぼさないことがある。

(4)  ask

文 (ask-statement) は,ファイルの現在の状態を問い合わせる。

11.1.2

構文  構文は,次による。ここで,(1)(22)は中核の生成規則,(23)(31)は拡充ファイルの生成

規則,(32)(34)は両方の機能単位に適用する構文,

“固”は固有形式拡充ファイルの生成規則とする。

中核の生成規則

(1)  open

文=OPEN  経路指定  NAME  ファイル名  ファイル属性並び

(2)

経路指定=経路式  コロン

(3) 

経路式=番号記号  指標

(4) 

ファイル名=文字列式

(5)

ファイル属性並び={コンマ  ファイル属性}

*

(6)

ファイル属性⊃中核ファイル属性

(7)

中核ファイル属性=access 句|organization 句|rectype 句|recsize 

(8) access

句=ACCESS  {INPUT|OUTPUT|OUTIN|文字列式}

(9)  organization

句=ORGANIZATION  {ファイル編成値|文字列式}

(10)

ファイル編成値⊃中核ファイル編成値

(11) 

中核ファイル編成値=SEQUENTIAL|STREAM

(12) rectype

句=RECTYPE  {記録形式値|文字列式}

(13)

記録形式値⊃中核記録形式値

(14)

中核記録形式値=DISPLAY|INTERNAL

(15) recsize

句=RECSIZE  {VARIABLE|文字列式}  {LENGTH  指標}?

(16) close

文=CLOSE  経路式

(17) erase

文=ERASE  REST?  経路式

(18) ask

文⊃ASK  経路指定  質問項目並び

(19)

質問項目並び=質問項目  {コンマ  質問項目}

*

(20)

質問項目=属性名  変数名  変数名

*

(21)

属性名⊃中核属性名

(22) 

中核属性名= ACCESS|DATUM|ERASABLE|FILETYPE|MARGIN|NAME|

ORGANIZATION

|POINTER|RECSIZE|RECTYPE|SETTER|

ZONEWIDTH 

拡充ファイルの生成規則

(23)

ファイル編成値⊃拡充ファイル編成値

(24) 

拡充ファイル編成値=RELATIVE|KEYED

(25) 記録形式値⊃拡充記録形式値

(26) 拡充記録形式値=NATIVE

(27)

ファイル属性⊃拡充ファイル属性

(28) 

拡充ファイル属性=collate 

(29) collate

句=COLLATE  {STANDARD|NATIVE|文字列式}

(30)

属性名⊃拡充属性名

(31) 

拡充属性名=RECORD|KEY|COLLATE

(32)

一つのファイル属性は,一つのファイル属性並び中では,たかだか 1 回だけ書くことができる。


83

X 3003-1993

(33)

一つの属性名は,一つの質問項目並び中では,たかだか 1 回だけ書くことができる。

(34)

質問項目中の変数の個数及び型は,

表 11.5 [11.1.4(10)]  に従っていなければならない。

11.1.3

例  構文の例を次に示す。

OPEN #3:NAME ”myfile”

(1)

OPEN #N:NAME A$, ACCESS OUTIN, ORGANIZATION KEYED,

          RECTYPE INTERNAL, RECSIZE VARIABLE LENGTH L

(1)

OPEN #N

+H1:NAME ”MY” & F$, ORGANIZATION ORG$

(1)

CLOSE #N

(16)

ERASE #3

(17)

ERASE REST #4

(17)

ASK #3:ACCESS AC$, DATUM DT$, NAME NM$, ORGANIZATION ORG$,

         POINTER P$, RECSIZE RS$ NUMCHARS, RECTYPE RT$

(18)

ASK #N:KEY K$

(18)

11.1.4

意味  意味は,次による。

(1)

ファイルと経路  ファイルは,プログラム単位の実行中に割り当てられる経路 (channel) を通じて参

照する。

(1.1)

経路は,BASIC プログラムとの間で外部データを転送するための論理的な路とする。プログラム単

位中では,経路は,そのプログラム単位に局所的な経路番号によって識別する。経路番号は,ゼロ

以上かつ処理系定義の最大値以下の整数とする。この最大値は,99 以上でなければならない。ファ

イルは,ファイル名 (file-name) によって識別する。

(1.2)

経路に割り当てられている状態のファイルは“開いている (open)”といい,割り当てられていない

状態のファイルは“閉じている (closed)”という。ファイルが割り当てられている状態の経路は“活

性状態にある (active)”といい,割り当てられていない状態の経路は“不活性状態にある (inactive)”

という。

プログラムの実行開始時点では,ゼロ番以外のすべての経路は,不活性状態とする。ゼロ番の経

路は,常に活性状態とする。ゼロ番の経路に対して open 文,close 文又は erase 文を実行すると,

続行可能な例外状態になる。

(1.3)

ゼロ番の経路による入力及び出力は,それぞれ経路式 (channel-expression) を含まない input 操作及

び print 操作と同じ入力源及び出力先をもつ。

ゼロ番の経路は,

ファイル属性として SEQUENTIAL,

DISPLAY

及び OUTIN をもち,記録設定及び消去の能力をもたない装置として動作する。

(2)  open

文  open 文 (open-statement) は,ファイルを参照可能にする。

(2.1)  open

文は,ファイル名によって識別されるファイルを,経路式によって指定した経路番号を通じて,

プログラムから参照できるようにする。英字の大文字と小文字の別だけが異なるファイル名を,同

じファイルを表すものとするか否かは,処理系定義とする。open 文の実行が成功すると,指定した

経路は活性状態になり,指定したファイルは開かれる。

既に活性状態にある経路によってファイルを開こうとすると,例外状態になる。既に開いている

ファイルを開こうとした場合の効果は,処理系定義とする。同時に活性状態になりうるゼロ番以外

の経路の個数は,中核機能単位に合致する処理系の場合には 1 以上,拡充ファイル機能単位に合致

する処理系の場合には 2 以上とする。

(2.2)  open

文の実行が成功すると,狭義ファイル (true file) は,それ以降,明示的な指定又は省略時想定


84

X 3003-1993

によって関連付けられたファイル属性に従って参照できるようになる。参照可能とは,ある種のフ

ァイル操作が可能なこと及びある種のファイル指示子 (file pointer) 操作が可能なことの二つを意

味する。ファイル属性 (file attribute) と,それに対して許される文の関係の概要は,11.0 による。フ

ァイルを開こうとして,open 文の要求する属性によってはそのファイルを参照可能にすることがで

きない場合,すなわち,関連する操作のうちで実行できないものがそのファイルにある場合には,

例外状態になる。

(2.3)

装置に対する open 文の実行が成功すると,二つの例外を除いて,すべてのファイル処理文は,狭

義ファイルに対するのと同じ効果をもつようになる。特に,出力の場合には同じデータが生成され,

入力の場合には値及び文字は同様に解釈され同様に変数に代入される。しかし,装置には,記録設

定(11.2 参照)又は erase 文[(9)参照]に関連付けられた意味を,必ずしも適用できない。個々の

装置がこれらの能力をもつか否かは,ask 文によって知ることができる。

(2.4)

あるファイル編成属性,記録形式属性及び記録長属性でファイルを開くことに成功した後に,その

ファイルを閉じ,その後,これらのファイル属性に関して以前と異なる値でそのファイルを開いた

場合,そのファイルがそのようなファイル属性によって参照可能になるか否かは,処理系定義とす

る。同様に,内部形式又は固有形式の記録形式属性をもつファイルに対する 2 回の open 文の実行

の間で,有効な arithmetic 選択子が異なっている場合,そのファイルがそのようにして参照可能に

なるか否かは,処理系定義とする。

逆に,狭義ファイルを後で再び開くときに次の三つの条件が満たされている場合には,利用者が

処理系定義の手段でその間にファイルを不変に保っていたならば,そのファイルは参照可能になり,

ファイルの内容は正しく保存される。

(a)

これらの三つのファイル属性の値が以前と同じである。

(b)

大小順序属性の値も以前と同じである。

(c)

内部形式又は固有形式のファイルについては,有効な arithmetic 選択子も以前と同じである。ただ

し,同じ arithmetic 選択子とは,ここでは DECIMAL, NATIVE 又は FIXED(15.1 参照)のこととす

る。FIXED の後ろの省略時想定の精度指定のことではない。

装置は,必ずしもデータを保存しない。索引編成ファイルを,異なる大小順序属性のもとで再び

開くと,例外状態になる。

(2.5)

内部形式又は固有形式のファイルを,arithmetic 選択子が異なる,別のプログラム単位で参照した

場合,その結果は処理系定義とする。

(2.6)

処理系は,すべての入出力方向属性の利用可能な狭義ファイルを提供しなければならない。更に,

利用できない入出力方向属性のある狭義ファイルを提供してもよい。装置は,すべての入出力方向

属性が利用可能であるとは限らない。

(2.7)

中核機能単位に合致する処理系は,ファイル編成値と記録形式値に関して,次の 3 種類の組合せを

受け入れ,処理しなければならない。これら以外の組合せの効果は,処理系定義とする。

(a)

順編成・表示形式

(b)

順編成・内部形式

(c)

流れ編成・内部形式

(2.8)

内部形式拡充ファイル機能単位に合致する処理系は,(2.7)の 3 種類に加えて,次の 2 種類の組合せ

をも受け入れ,処理しなければならない。

(a)

相対編成・内部形式


85

X 3003-1993

(b)

索引編成・内部形式

(2.9)

固有形式拡充ファイル機能単位に合致する処理系は,(2.7)の 3 種類に加えて,次の 3 種類の組合せ

をも受け入れ,処理しなければならない。

(a)

順編成・固有形式

(b)

相対編成・固有形式

(c)

索引編成・固有形式

(2.10)

属性の値として文字列式を用いた場合,その値は,その属性に関連付けられた機能語のうちのいず

れかでなければならない。この文字列値の中では,英大文字と英小文字は,等価とする。処理系は,

ファイル属性の値を追加定義してもよい。

(3)  access

句  access 句 (access-mode) は,データをファイルから入力転送するかファイルに出力転送する

かの方向を指示する入出力方向 (access mode) 属性を与える。この属性は,access 句のもつ機能語

INPUT

(入力専用)

,OUTPUT(出力専用)

,OUTIN(入出力両用)のいずれか又は値がこれらの機能

語のいずれかになる文字列式によって指定する。

(3.1)

入出力方向属性が INPUT であれば,ファイルからデータを読み込むことはできるが,そのファイル

を変更することはできない。具体的には,機能語 MAT 又は LINE のあるものも含め,read 操作,

指示子制御を指定した set 文及び input 操作は許されるが,print 操作,write 操作,rewrite 操作及

び delete 文は許されない。

(3.2)

入出力方向属性が OUTPUT であれば,ファイルに新たなデータを加えることはできるが,ファイル

中に既に存在するデータを変更したり,ファイルからデータを取り出したりすることはできない。

具体的には,

print

操作,

指示子制御を指定した set 文及び write 操作は許されるが,

read

操作,

rewrite

操作,delete 文及び input 操作は許されない。

(3.3)

入出力方向属性が OUTIN であれば,rewrite 操作及び delete 文も含めて,そのファイルに対するす

べての記録操作が許される。

(3.4)  erase

文は,入出力方向属性が OUTIN であるファイルに対してだけ許される。

(3.5)

ファイル属性並び中に access 句を書かなかったときの入出力方向属性は,そのファイルが入出力可

能であれば OUTIN が与えられ,入力だけ可能であれば INPUT が与えられ,出力だけ可能であれば

OUTPUT

が与えられる。ゼロ番の経路は,OUTIN を与えて開かれたかのように動作する。

(3.6)  open

文を実行すると,ファイル指示子は,出力専用として開いたファイルではファイルの終りに設

定され,その他のファイルではファイルの始めに設定される。

(4)  organization

句  organization 句 (file-organization) は,ファイル要素間の論理的関係と,要素を識別

するためのファイル指示子の操作手段とを指定するファイル編成 (file organization) 属性を与える。こ

の属性は,organization 句のもつ機能語 SEQUENTIAL(順編成)

,STREAM(流れ編成)

,RELATIVE

(相対編成),KEYED(索引編成)のいずれか又は値がこれらの機能語のいずれかになる文字列式に

よって指定する。

(4.1)

装置は,順編成又は流れ編成として参照される。相対編成及び索引編成は,狭義ファイルにだけ許

される。

(4.2)

順編成ファイルは,記録 (record) の列とする。記録の順序は,記録が出力された順序になる。記録

は,ファイルの終りにだけ追加することができる。ファイル指示子によって記録を識別する手段は,

ファイル指示子の現在の位置に対する相対的な位置,特別な位置 BEGIN 及び特別な位置 END だけ

を可能とする。ここで,BEGIN は記録の列(もしあれば)の先頭の記録を識別し,END は末尾の


86

X 3003-1993

記録の直後の位置(記録を追加できるただ一つの位置)を識別する。1 回の記録操作によって,表

示形式記録は複数個操作できるが,内部形式又は固有形式の記録はたかだか 1 個しか操作できない。

(4.3)

流れ編成ファイルは,記録ではなく個々の値 (value) の列であるという点を除けば,順編成ファイ

ルとほとんど同じとする。値の順序は,値が出力された順序になる。値は,ファイルの終りにだけ

追加することができる。値を識別する手段は,ファイル指示子の現在の位置に対する相対的な位置,

特別な位置 BEGIN 及び特別な位置 END だけを可能とする。ここで,BEGIN は値の列(もしあれば)

の先頭の値を識別し,END は末尾の値の直後の位置を識別する。1 回の記録操作では,通常,流れ

編成ファイル中の一連の値を入力又は出力する。

(4.4)

相対編成ファイルは,記録領域 (record-area) の列とする。この記録領域は,記録を含むことも含ま

ないこともある。記録領域には,1 から始まる一連の番号が与えられている。したがって,記録領

域及びその中に含まれる記録の順序は,記録領域に関連付けられた整数を識別することによって定

まる。順編成ファイルに与えられている手段のほかに,この記録番号 (record number) を使用するこ

とによってもファイル指示子を操作することができる。相対編成ファイルでは,ファイルの始めは,

記録領域中の記録の有無にかかわらず先頭の記録領域とする。ファイルの終りは,既に存在してい

る最後の記録の直後の位置とする。したがって,例えば既存の記録の最も大きい記録番号が 44 であ

れば,ファイルの終りは記録番号 45 の記録領域となる。ファイル中に記録が一つもなければ,ファ

イルの終りは記録番号 1 の記録領域となる。

相対編成ファイル中の記録は,読み書きできるばかりでなく,rewrite 操作によって変更でき,

delete

文によって削除できる。更に記録は,ファイルの終りばかりでなく,ファイルの終りを越え

た位置も含めて,任意の空の記録領域に追加することができる。1 回の記録操作では,たかだか 1

個の記録を操作する。

(4.5)

索引編成ファイルは,記録の列とする。個々の記録は,キー (key) と呼ばれる文字列で識別する。

記録の論理的な順序は,それらのキーの大小順序によって定まる[(7)参照]

。したがって,順編成

ファイルに与えられている手段のほかに,キーを使用することによってもファイル指示子を操作す

ることができる。順編成ファイルと同様に,ファイルの始めは記録の列(もしあれば)の先頭の記

録とし,ファイルの終りは最後の記録の直後の位置とする。

記録は,列の中の任意の位置に追加できる。ただし,記録を生成するときには,正確なキーを必

ず指定しなければならず,キーの値の重複は許されない。記録はまた入力,変更及び削除すること

ができる。1 回の記録操作では,たかだか 1 個の記録を操作する。

(4.6)  open

文に organization 句を書かなかったときのファイル編成属性は,そのファイルに関して利用可

能なシステム情報によって決められる。そのような情報が不十分であれば,処理系は,SEQUENTIAL

を与えてそのファイルを開こうとする。ゼロ番の経路は,SEQUENTIAL を与えて開かれたかのよう

に動作する。

(5)  rectype

句  rectype 句 (record-type) は,記録中のデータ又は個々のファイル要素としてのデータの論

理表現を指定する記録形式 (record type) 属性を与える。記録形式属性は,データがプログラムとファ

イルの間を転送されるときのデータの解釈及び変換の方法に影響を与える。この属性は,rectype 句の

もつ機能語 DISPLAY(表示形式)

,INTERNAL(内部形式)

,NATIVE(固有形式)のいずれか又は値

がこれらの機能語のいずれかになる文字列式によって指定する。

(5.1)

記録形式属性が DISPLAY であれば,記録が文字の列であることを示す。文字の列は,出力では print

操作,入力では input 操作の意味の規定に従って処理される(10.参照)

。表示形式記録は,read 


87

X 3003-1993

作及び write 操作で入出力することもできる。このときは,それぞれ input 操作及び print 操作に対

する規定に従う。

(5.2)

記録形式属性が INTERNAL であれば,記録が型をもつ値の列である(又は一つのファイル要素が一

つの値である)ことを示す。これは,プログラム中の変数が値を含むのと同じとする。内部形式の

機能の目的は,

(狭義ファイルに対して)値を保存したり取り出したりすることである。すなわち,

数値又は文字列値をプログラム中のある変数から出力し,後で他の変数に入力したとき,初めの変

数の値が変更されていなければ,二つの変数の値は正確に等しい。input 操作及び print 操作は,本

質的に文字の列に対するものであるので,内部形式として開いたファイルに対して使用すると例外

状態になる。

(5.3)

記録形式属性が NATIVE であれば,記録が,プログラムに指定した枠 (template) によって記述され

ている欄 (field) の列であることを示す。この枠は,関連する記録操作の作用対象の並びと関連付け

られて,その記録中の欄の大きさ,型,個数及び順序を指定する。これによって,ファイル中のデ

ータを,同じような記録記述能力をもつ他の言語処理系との交換に適するような形に整えることが

できる。値は,記録中の欄の大きさに関する制限に従って保存される。内部形式の場合と同様に,

input

操作及び print 操作は,固有形式として開いたファイルに対して使用すると例外状態になる。

(5.4)  open

文に rectype 句を書かなかったときの記録形式属性は,そのファイルに関して利用可能なシス

テム情報によって決められる。そのような情報が不十分であれば,処理系は,DISPLAY を与えてそ

のファイルを開こうとする。ゼロ番の経路は,DISPLAY を与えて開かれたかのように動作する。

(6)  recsize

句  recsize 句 (record-size) は,ファイル中の記録の最大長を指定する記録長 (record size) 属性

を与える。この属性は,length 句によって明示的に指定できる。

(6.1)  recsize

句のもつ機能語 VARIABLE(可変長)及び値がこの機能語になる文字列式は,可変長属性を

指定する。将来の拡充規格が固定長 (fixed-length) 記録を提供しない限り,すべてのファイルは,

可変長 (variable-length) 記録すなわち記録の長さが互いに独立な記録で構成される。表示形式記録

の長さは,その記録中の文字数とする。内部形式又は固有形式の記録の長さは,処理系定義とする。

明示的指定又は省略時想定によって open 文で決められた最大長より長い記録に対して,記録操作

を実行しようとすると,例外状態になる。length 句に書く記録長の指標の値は,1 以上でなければ

ならない。

(6.2)  open

文に recsize 句を書かなかったときの記録長属性は,そのファイルに関して利用可能なシステ

ム情報によって決められる。そのような情報が不十分であれば,処理系は,VARIABLE を与え,length

句を省略したとみなしてそのファイルを開こうとする。length 句を省略したときの記録の最大長は,

処理系定義とする。ゼロ番の経路は,VARIABLE を与え,length 句を省略して開かれたかのように

動作する。

(6.3)

処理系は,狭義ファイルに対して,最低限 132 の記録長を保証しなければならない。

(7)  collate

句  collate 句 (collate-sequence) は,索引編成ファイルに対して記録のキーの大小順序を指定す

る大小順序 (collate sequence) 属性を与える。この属性は,collate 句のもつ機能語 STANDARD(標準

の大小順序)

,NATIVE(固有の大小順序)のいずれか又は値がこれらの機能語のいずれかになる文字

列式によって指定する。

(7.1)

大小順序属性は,索引編成ファイルに対してだけ意味をもち,他のファイル編成属性をもつファイ

ルに対しては何の効果ももたない。

(7.2)  collate

句によって与えられるファイルの大小順序属性は,そのファイルに対するすべての記録操作


88

X 3003-1993

及びファイル操作である erase 文を制御する。すなわち,read 操作,write 操作,rewrite 操作,delete

文,指示子制御を指定した set 文,erase 文及び ask 文によってファイルを操作するとき,ファイル

の論理的な見え方は,collate 句によって指定される大小順序に適合したものとなる[(4)及び 11.2 

照]

。大小順序属性としてファイルに与えられる標準及び固有の大小順序は,option 文(6.6 参照)

の場合と正確に同じ順序付けを意味する。したがって,ファイルの collate 句に関連する大小順序と

プログラム単位の collate 選択子に関連する大小順序とが一致すれば,常にファイル中のより前のキ

ーがより後のキーより小さいとして比較される。両者が一致していなければ,この関係は成り立た

ない。それでも,ファイルの collate 句に関連する大小順序とは異なった collate 選択子に関連する

大小順序をもつプログラム単位が,索引編成ファイルに入出力することはできる。すなわち,collate

句に関連する大小順序は,記録の論理的順序にだけ影響を与え,その内容には影響を与えない。

(7.3)

索引編成ファイルの機能をもつ処理系は,標準及び固有の両方の大小順序属性を支援しなければな

らない。

(7.4)  open

文に collate 句を書かなかったときの大小順序属性は,そのファイルに関して利用可能なシス

テム情報によって決められる。そのような情報が不十分であれば,処理系は,その open 文を含む

プログラム単位で有効な collate 選択子に関連する大小順序と同じ順序付けを意味する大小順序属性

を与えてそのファイルを開こうとする。ゼロ番の経路は,ファイル編成属性が SEQUENTIAL であ

る(索引編成ではない。

)ので、大小順序属性は無関係である。

(8)  close

文  close 文 (close-statement) を実行すると,指定された経路に割り当てられているファイルが閉

じられ,その経路は不活性状態 (inactive) になる。その経路にファイルが割り当てられていなければ,

何も起こらない。外部副プログラム定義,外部関数定義又は外部絵定義から出る時及び並行単位の終

了時には,その手続きによって開かれたすべてのファイルが,その経路が参照仮引き数でない限り自

動的に閉じられる。プログラムの終了時には,開いているすべてのファイルが自動的に閉じられる。

(9)  erase

文  erase 文 (erase-statement) は,指定された経路に割り当てられている狭義ファイルの一部又

は全部のデータを削除する。そのファイルに関連したファイル属性は,変更されない。

(9.1)  rest

指定を書かないと,すべてのファイル要素を削除する。ただし,相対編成ファイルでは,すべ

ての記録領域から記録を削除する。そのファイルは空になり,ファイル指示子はファイルの終りを

指す。このときのファイルの終りは,ファイルの始めと同じとする。

(9.2)  rest

指定を書くと,ファイル指示子が現在指している位置以後(その位置を含む。

)のすべてのデー

タを削除する。それより前のすべてのデータは,変更されずに残る。ファイル指示子は,ファイル

の終りを指すように設定される。

(9.3)

装置に対する erase 文は,必ずしも有効でない。装置がこの機能を支援するか否かは,ask 文によっ

て知ることができる。

(9.4)

ゼロ番の経路に対して erase 文を実行すると,例外状態になる。そのほかに何の効果も及ぼさない。

(9.5)  erase

文は,入出力方向属性として OUTIN を与えて開かれたファイルに対してだけ許される。他の

入出力方向属性のときには,例外状態になる。そのとき,ファイルには何の効果も及ぼさない。

(10) ask

文  ask 文 (ask-statement) を実行すると,指定された経路に現在割り当てられているファイルの

属性に対応する値が,質問項目並び中の変数に代入される。

(10.1)

質問項目と値の対応を

表 11.5 に示す。経路が不活性状態にある場合には,文字列変数には空文字列,

数値変数にはゼロが代入される。

表 11.5  質問項目


89

X 3003-1993

この表は,ファイルに関連して ask 文に書く質問項目と,その中の変数に与えられる値を示す。

a$

:文字列変数,n:数値変数

質問項目

ACCESS a$

ファイルの入出力方向属性。すなわち,“INPUT”,“OUTPUT”又は“OUTIN”。

COLLATH a$

索引編 成フ ァイル に関 連付 けられ た大 小順序 属性 。す なわち , “STANDARD” 又は

“NATIVE”

。索引編成以外のファイルに対しては,空文字列。

DATUM a$

ファイル指示子の現在の位置の次にあるデータ要素の型。すなわち,“NUMERIC”,

“STRING”

,“NONE”(次のデータ要素がないとき)又は“UNKNOWN”(次のデータ要素

の型又は存在が決定できないとき)

。DATUM は,流れ編成の内部形式ファイルに対して

だけ規定する。その他のファイル編成に対しては,処理系定義とする。

ERASABLE a$

そのファイルが消去可能(erase 文によってファイル要素が削除できること)であれば

“YES”

,消去可能でなければ“NO”。

FILETYPE a$

そのファイルがデータを保存できる狭義ファイルならば“FILE”,装置ならば“DEVICE”。

KEY a$

索引編成ファイルのファイル指示子によって識別される記録に関連付けられたキーの
値。ファイル指示子がファイルの終りを指しているか又はファイルが索引編成でない場

合には,空文字列。

MARGIN n

表示形式ファイルにおける現在の行幅(記録が任意に長くてよいときには,MAXNUM)

表示形式以外のファイルに対しては,ゼロ。

NAME a$

その経路に割り当てられているファイルの名前。

ORGANIZATION a$

そのファイルのファイル編成属性。すなわち,“SEQUENTIAL”,“STREAM”,“RELATIVE”
又は“KEYED”。

POINTER a$

そのファイルのファイル指示子の現在の位置。すなわち,“BEGIN”,“MIDDLE”又は

“END”

。ここで,“MIDDLE”は,始めでも終りでもないことを示す。空ファイルにおける

ファイル指示子の位置及び相対編成ファイルにおけるファイルの終り以降の位置は,

“END”

になる。どの値が正しいかを処理系が決定できない装置の場合には,“UNKNOWN”

が返される。

RECORD n

ファイル指示子によって識別される記録領域の番号。相対編成以外のファイルに対して

は,ゼロ。

RECSIZE a$ n

そのファイルの記録長属性。すなわち,“VARIABLE”と記録の最大長(記録長の制限が
意味をもたないとき,例えば通信回線では,MAXNUM)

RECTYPE a$

そのファイルの記録形式属性。すなわち,“DISPLAY”,“INTERNAL”又は“NATIVE”。

SETTER a$

そのファイルが記録設定の能力をもっていれば“YES”,もっていなければ“NO”。

ZONEWIDTH n

表示形式ファイルにおける現在の印字欄幅。表示形式以外のファイルに対しては,ゼロ。

(10.2)

ゼロ番の経路に対する ask 文の実行の効果は,

表 11.6 による。


90

X 3003-1993

表 11.6  ゼロ番の経路の属性

質問属性

ACCESS “OUTIN”

COLLATE

空文字列

DATUM “UNKNOWN”

ERASABLE “NO”

FILETYPE “DEVICE”

KEY

空文字列

MARGIN

現在の行幅

NAME

処理系定義

ORGANIZATION “SEQUENTIAL”

POINTER “UNKNOWN”

RECORD

ゼロ

RECSIZE “VARIABLE”,

“MAXNUM”

RECTYPE “DISPLAY”

SETTER “NO”

ZONEWIDTH

現在の印字欄幅

11.1.5

例外状態  例外状態は,次による。

(1)

経路式の値が,ゼロ以上処理系定義の最大値以下の範囲にない。

(7001,続行不能。

(2)  open

文,close 文又は erase 文で,ゼロ番の経路を指定している。

(7002,続行可能。何もしないで処

理を続ける。

(3)  open

文で指定したゼロ番以外の経路が,既に活性状態にある。

(7003,続行不能。

(4)

ファイル属性を指定するための文字列式が許される値をもっていない。

(7100,続行不能。

(5)  open

文での明示的な指定又は省略時想定のファイル属性によるファイル参照が,可能でない。

(71xx,

続行不能。xx の値と意味は,処理系定義とする。

(6)

索引編成ファイルを,以前に開いたときの大小順序属性とは異なる大小順序属性で,再び開こうとす

る。

(7050,続行不能。

(7)  length

句の指標の値が,1 以上でない。

(7051,続行不能。

(8)

装置を,相対編成又は索引編成として開こうとする。

(7052,続行不能。

(9)  erase

文で指定したゼロ番以外の経路が,不活性状態にある。

(7004,続行不能。

(10) 

入出力両用として開いたのでないファイルに対して,erase 文を使用する。

(7301,続行不能。

(11)

入出力両用として開いた,消去の能力のない装置に対して,erase 文を使用する。

(7311,続行可能。

何もしないで処理を続ける。

11.1.6

注意  注意は,次による。

(1)

処理系が,ファイル名として,少なくとも英大文字の後に 0∼3 文字の英大文字又は数字が続いた文字

の列を許すことを推奨する。更に,ファイルの安全を保護する目的でオペレーティングシステムが必

要とする情報を,ファイル名の一部とみなして受け渡しをすることを推奨する。

(2)

狭義ファイルを開くのか,通信回線又は行印字装置のような,

狭義ファイルでない装置を開くのかを,

処理系が,ファイル名によって区別することを推奨する。

(3)

同時に活性状態になりうる経路の個数は,ゼロ番の経路以外に 4 個以上とすることを推奨する。

(4)

ファイル中の記録の省略時想定の最大長は特に制限をせず,どのような長さの記録も許すことを推奨

する。

(5)

処理系が,内部形式及び固有形式の記録長属性の意味を,表示形式の場合に準じて定めることを推奨


91

X 3003-1993

する。すなわち,記録長属性で記録中の文字(バイト)の最大数を指定するようにすることを推奨す

る。

(6)

この規格で定める以外に追加の入出力方向属性,ファイル編成属性,記録形式属性,記録長属性又は

大小順序属性を支援する処理系は,ask 文によって追加の値を返してもよい。

(7)

処理系が,種々のファイル操作に伴う状態符号 (status code) を返すのであれば,一つの文字列値を返

す属性名 IOSTAT を追加して行うことを推奨する。

例  ASK IOSTAT S$は,最後に行った操作に伴うファイルの状態を表す値を S$に返す。

(8)

キーの最大長は,処理系定義とする。

11.2

ファイル指示子の操作

11.2.1

概要  開いているファイルに対する指示子 (file pointer) は,データ転送を伴わずに,幾つかの方法

によって変更することができる。指示子制御 (pointer-items) を,set 文 (set-statement) に指定したときのフ

ァイル指示子操作の規則は,他の記録操作と組み合わせて使用するときにも適用する。

11.2.2

構文  構文は,次による。ここで,(1)(7)は中核の生成規則,(8)(12)は拡充ファイルの生成規

則とする。

中核の生成規則

(1)

設定対象⊃経路指定  指示子制御

(2)

指示子制御=指示子制御項目|データ存否|指示子制御項目  コンマ  データ存否

(3)

指示子制御項目⊃POINTER  中核記録設定

(4)

記録設定⊃中核記録設定

(5)

中核記録設定=BEGIN|END|NEXT|SAME

(6) 

データ存否=if-missing 句|if-there 

(7)  if-there

句=IF  THERE  THEN  データ存否動作

拡充ファイルの生成規則

(8) 

指示子制御項目⊃拡充記録設定

(9) 

記録設定⊃拡充記録設定

(10)

拡充記録設定=RECORD  指標|KEY  {等値探索|大号探索}  文字列式

(11)

等値探索=等号?

(12) 

大号探索=大号|非小

11.2.3

例  構文の例を次に示す。

#N

:POINTER BEGIN

(1)

#3

:RECORD N+1, IF MISSING THEN 1200

(1)

#4

:KEY ”Jones”, IF THERE THEN EXIT DO

(1)

11.2.4

意味  意味は,次による。

(1)

指示子制御を指定した set 

(1.1)

指示子制御を指定した set 文を実行すると,その経路に割り当てられたファイルに対する指示子の

設定が行われる。データ存否 (io-recovery) が指定されていれば,それは指示子の位置付けが行われ

た後に実行される。

備考  記録設定 (record-setter) に関する意味及びデータ存否の実行される時点は,すべての記録操作

を通じて同じとする(11.311.4 及び 11.5 参照)

(1.2)  11.2.5

に示す例外状態のいずれかが起こると,ファイル指示子は,その set 文が実行される前の状態


92

X 3003-1993

のままで変更されない。装置は,記録設定の能力をもつとは限らない。ある装置が記録設定の能力

をもつか否かは,ask 文によって知ることができる。

(2)

記録設定

(2.1)

記録設定を書かないと,ファイル指示子は,以前の状態のままで変更されない。その場合でも,デ

ータ存否[(3)参照]があれば,それはそのまま有効とする。

(2.2)

記録設定 NEXT は,指示子を,現在の位置又はそれ以後にある,次の存在する記録(流れ編成以外

のとき)又は値(流れ編成のとき)に位置付ける。したがって,相対編成ファイルでは,指示子は,

NEXT

によって次の存在する記録までにある空の記録領域をすべて飛び越す。指示子がファイルの

終り以後又は存在する記録に既に位置付けられていれば,指示子は,NEXT によって変更されない。

この機能によって,相対編成ファイルを順編成ファイルであるかのようにみなして処理することが

できる。

流れ編成ファイル及び索引編成ファイルでは,指示子は,存在するファイル要素又はファイルの

終りに常に位置付けられているので,変更されない。

順編成ファイルでは,NEXT が何らかの効果をもつのは,部分記録が保留されている場合だけと

する(11.3 参照)。この場合には,記録末 (end-of-record) が作られ,指示子はファイルの終りに位

置付けられたままとする。

(2.3)

記録設定 BEGIN は,指示子をファイルの始め,すなわち,先頭のファイル要素に位置付ける。フ

ァイルが空であるときには,この位置はファイルの終りでもある。

(2.4)

記録設定 END は,指示子をファイルの終りに位置付ける。ファイルの終りは,順編成ファイル,

流れ編成ファイル及び索引編成ファイルの場合には,

(もしあれば)末尾のファイル要素の直後の位

置とし,相対編成ファイルの場合には,存在する最後の記録の直後の位置(記録が全く存在しなけ

れば,記録番号 1 の記録領域)とする。

(2.5)

記録設定 SAME によって,その経路に割り当てられたファイルを開いて以来,いちばん最近に処理

したのと同じファイル要素(複数個のこともある。

)を参照することができる。その経路を通してい

ちばん最近に実行した記録操作が,次の二つの条件を満たす場合だけ,SAME の実行は正しい。

(a)

その記録操作が delete 文でない。

(b)

その記録操作の実行中,少なくともファイル指示子の位置付けが完了するまでは,どのような例外

状態にもならなかった。

これらの条件を満たしていない場合,指示子操作は行われず,例外状態になる。

これらの条件を満たしている場合,その最近の記録操作が read 操作,input 操作,指示子制御を

指定した set 文又は rewrite 操作であれば,SAME は,指示子をその操作の記録設定が位置付けたの

と同じファイル要素に再び位置付ける。その操作に記録設定の指定がなかったときは,SAME は,

指示子をその操作の開始時にあったのと同じ位置に再び位置付ける。最近の記録操作が write 操作

又は print 操作であれば,SAME は,指示子をその操作によって生成された最初のファイル要素に

位置付ける。

(2.6)

記録設定 RECORD は,相対編成ファイルに対して使用する場合にだけ正しい。相対編成ファイル

として開いたのでないファイルに対してこの記録設定を使用すると,指示子は変更されず,例外状

態になる。

指標は整数値に丸めて評価され,指示子は対応する記録領域に,記録のあるなしにかかわらず位

置付けられる。指標を評価した結果がゼロ以下である場合には,指示子は変更されず,例外状態に


93

X 3003-1993

なる。

(2.7)

記録設定 KEY は,索引編成ファイルに対して使用する場合にだけ正しい。索引編成ファイルとし

て開いたのでないファイルに対してこの記録設定を使用すると,指示子は変更されず,例外状態に

なる。

等値探索 (exact-search) では,指示子は文字列式の値に等しいキーをもつ記録に位置付けられる。

該当する記録がなければ,指示子は,文字列式の値より大きいキーをもつ最初の記録に位置付けら

れる。そのような記録もなければ,指示子はファイルの終りに位置付けられる。

非小を指定した大号探索 (inexact-search) では,データ存在状態[(3)参照]の設定を除けば,等

値探索と全く同じに指示子が位置付けられる。大号を指定した大号探索では,指示子は文字列式の

値より大きいキーをもつ最初の記録に位置付けられる。該当する記録がなければ,指示子はファイ

ルの終りに位置付けられる。

(3)

データ存否

(3.1)

指示子操作が完了すると,データ存在 (data-found) と呼ばれる状態が設定される。この状態は,真

又は偽の値をもつ。データ存在状態が真でかり if-there 句が指定されている場合,及びデータ存在

状態が偽でかつ if-missing 句が指定されている場合には,データ存否動作 (io-recovery-action) が実

行される。この二つの場合以外は,データ存否動作は無視される。

(3.2)

次のいずれかの場合に,データ存在状態は偽となる。これら以外の場合には,データ存在状態は真

となる。

(a)

等値探索が指定されたが,文字列式の値に等しいキーをもつ記録が存在しない。

(b)

位置付け後,その指示子がファイルの終りを指している。

(c)

位置付け後,その指示子が空の記録領域を指している。

(d)

装置の場合に,入力に使用できるデータが存在しないことを意味する処理系定義の条件が発生して

いる。

(3.3)

データ存否動作が exit-do 文又は exit-for 文であれば,その文は通常と同じ効果をもつ(8.3 参照)

データ存否動作が行番号であれば,指定した行から実行を続ける。

11.2.5

例外状態  例外状態は,次による。

(1)

不活性状態にある経路に対して指示子制御を指定した set 文を実行する。

(7004,続行不能。

(2)

ゼロ番の経路に対して記録設定を使用する。

(7002,続行可能。何もしないで処理を続ける。

(3)

記録設定の能力をもたない装置に対して,記録設定を使用する。

(7205,続行可能。何もしないで処理

を続ける。

(4)

指定した経路に対していちばん最近に実行した記録操作が delete 文であるにもかかわらず,記録設定

SAME

を使用する。

(7204,続行不能。

(5)

指定した経路に対していちばん最近に実行した記録操作が,指示子操作がなされる前に例外状態を引

き起こしたにもかかわらず,記録設定 SAME を使用する。

(7204,続行不能。

(6)

指定した経路に対して,開いて以来全く記録操作を実行していないにもかかわらず,記録設定 SAME

を使用する。

(7204,続行不能。

(7)

相対編成以外のファイル編成属性で開いたファイルに,記録設定 RECORD を使用する。

(7202,続行

不能。

(8)

索引編成以外のファイル編成属性で開いたファイルに,

記録設定 KEY を使用する。

(7203,

続行不能。

(9)

記録設定 RECORD の指標の値がゼロ以下である。

(7206,続行不能。


94

X 3003-1993

(10)

記録設定 KEY において,空文字列による等値探索を指定している。

(7207,続行不能。

11.2.6

注意  注意は,次による。

(1)

装置の場合,例えば次のような条件によって,データ存在状態が偽となることがある。

(a)

カード読取り装置に読み込むカードが尽きた。

(b)

端末から位置 1/10 の制御文字 (control-Z) が送られた。

(これは,ある種のシステムではファイルの

終りを意味する。

(c)

装置が,行印字装置のような出力専用装置である。

(2)

相対編成ファイルに対する記録設定の効果を,

図 11.1 に例示する。

図 11.1  相対編成ファイルに対する記録設定の効果の例示

相対編成ファイル中に,記録番号 2,5,6 の三つの記録だけが存在するとする。記録設定 RECORD 2 を

指定した read 文を実行した直後の各記録設定は,ファイル指示子を次のように位置付ける。

11.3

ファイルへのデータ生成

11.3.1

概要  利用者は,プログラムによって作成されたデータを外部に出力することができる。狭義ファ

イル (true file) の場合,後のプログラムによってそのデータを入力したり変更したりすることができる。

この機能は,10.の出力機能をファイル向きに拡充したものとする。更に,さまざまな記録形式 (record-type)

向きの出力を行う新しい機能も定める。set 文の margin 句及び zonewidth 句は,データ生成文 (data creation

statement)

には含まれないが,表示形式記録と関連するので,ここで規定する。

11.3.2

構文  構文は,次による。ここで,(1)(11)は中核の生成規則,(12)(27)は拡充ファイルの生成

規則,(28)(35)は両方の機能単位に適用する構文,

“固”は固有形式拡充ファイルの生成規則とする。

中核の生成規則

(1)  print

文⊃PRINT  経路式  印字制御  {コロン  {印字項目並び|書式印字式並び}

}?

(2)  mat-print

文⊃MAT  PRINT  経路式  印字制御  コロン  {印字配列名並び|書式印字配列名並び}

(3)

印字制御={コンマ  印字制御項目}

*

(4)

印字制御項目=中核記録設定|if-there 句|USING  書式引用

(5)

設定対象⊃経路指定   {MARGIN|ZONEWIDTH}    指標

(6)  write

文=WRITE  経路式  書出し制御  コロン  式並び

(7) mat-write

文=MAT  WRITE  経路式  書出し制御  コロン  配列名並び

(8)

書出し制御={コンマ  書出し制御項目}

*

(9)

書出し制御項目⊃記録設定|if-there 

(10) 

式並び=式  {コンマ  式}

*

(11)

配列名並び=配列名  {コンマ  配列名}

*

拡充ファイルの生成規則

(12) 書出し制御項目⊃枠引用


95

X 3003-1993

(13) 枠引用=WITH  {行番号|文字列式}

(14) 宣言文⊃template 

(15) template 文=TEMPLATE  コロン  枠要素並び

(16) 枠要素並び=枠要素  {コンマ  枠要素}

*

(17) 枠要素=欄数固定  {欄指定子|左括弧  枠要素並び  右括弧}|欄数不定  欄指定子

(18) 欄数固定=SKIP?  {符号なし整数  OF}?

(19) 欄数不定=疑問符  OF

(20) 欄指定子=数値欄指定子|文字列欄指定子

(21) 数値欄指定子=NUMERIC  星印  数値欄幅

(22) 数値欄幅=小数点指定|E

(23) 小数点指定=整数幅  小数点?|整数幅?  小数点  小数幅

(24) 整数幅=符号なし整数

(25) 小数幅=符号なし整数

(26) 文字列欄指定子=STRING  星印  文字列欄幅

(27) 文字列欄幅=符号なし整数

(28) print

文又は mat-print 文において,書式引用と印字項目並び又は印字配列名並びとを併用することは

できない。すなわち,印字制御として書式引用を書いたときにこれらの文に使用できるのは,書式印

字式並び又は書式印字配列名並びだけとする。

(29)

枠引用の行番号は,同じプログラム単位中の template 文を参照するものでなければならない。

(30)

欄数固定における符号なし整数の値は,1 以上とする。

(31)

小数点指定において,整数幅又は小数幅の少なくとも一方は,1 以上とする。

(32)

文字列欄幅は,1 以上とする。

(33)

書出し制御中の記録設定には,大号探索を指定してはならない。

(34)

一つの印字制御項目は,一つの印字制御中では,たかだか 1 回だけ書くことができる。

(35)

一つの書出し制御項目は,一つの書出し制御中では,たかだか 1 回だけ書くことができる。

11.3.3

例  構文の例を次に示す。

PRINT #3

:A, B, C

(1)

PRINT #3, END, USING 123:A$, B

+C;

(1)

MAT PRINT #N, SAME, IF THERE THEN EXIT FOR:A$;B$, C

(2)

#3:MARGIN N

+1

(5)

WRITE #3, RECORD 47, IF THERE THEN 666:A

+B, C$ & D$

(6)

WRITE #X

+Y, WITH TEMPLATE3$:X, Y, Z+W

(6)

MAT WRITE #3, KEY ”Whoever”, IF THERE THEN 666, WITH 111:A, B$

(7)

TEMPLATE:STRING*5, 2 OF NUMERIC*3.4

(15)

TEMPLATE:?OF NUMERIC*5.2,? OF STRING*5

(15)

5 OF STRING*22, 3 OF NUMERTC*E,? OF NUMERIC*.6

(16)

11.3.4

意味  意味は,次による。ここで,(1)は,すべてのデータ生成文に対する一般的な規則を定める。

すべての場合において,データ生成文は,ファイルに対して一つ以上の新しいファイル要素 (file element)

を追加するが,既存のファイル要素には影響を与えない。(2)(13)は,個々の文の構文形式に特有の規則

を文の形式ごとに定める。


96

X 3003-1993

(1)

データ生成処理

(1.1)

最初に,経路式によって,データを出力する経路 (channel) が定められ,意図した操作にファイル

属性が適合するか否かが調べられる。データ生成文においては,入出力方向属性が出力専用又は入

出力両用でなければならない。経路が活性状態にあり,ファイル属性がデータ生成文に適合するな

らば,次の段階に進む。そうでなければ,ファイル,ファイル指示子及びすべてのプログラム変数

は変更されず,例外状態になる。

(1.2)

段階 2 の処理では,記録設定 (record-setter) に基づいて(記録設定がない場合にも)

11.2.4(2)の規

定どおりにファイル指示子 (file pointer) の位置付けが行われ,11.2.4(3)の規定どおりにデータ存在

状態 (data-found) が設定される。データ存在状態が真である場合,if-there 句を指定してあるときは

データ存否動作が実行され,指定してないときは例外状態になる。いずれのときにも,指示子の位

置及びファイルは変更されたままとする。

(1.3)

データ存在状態が偽である場合には,段階 3 に進み,指示子によって指された位置にデータが出力

される。並びの作用対象が左から右に順番に評価され,データがちょうどファイル要素を満たすま

でになると,ファイル要素がファイルに追加され,指示子は生成されたファイル要素の直後の位置

を指す。特に,データ転送の途中で例外状態になったときに,ファイル要素の一部分だけがファイ

ルに追加されることはない。しかし,一つの文が複数個のファイル要素を生成しているときには,

例外状態になるまでに生成されたファイル要素は,ファイル中に残る。

データ転送が終わった時に,ファイル指示子は,最後に生成されたファイル要素の次のファイル

要素(次のファイル要素がないときはファイルの終り)を指している。例外状態になり,ファイル

要素が生成されなかった場合には,指示子は,段階 2 で設定された位置にとどまる。

(2)  print

(2.1)  print

文によるデータ転送は,10.3 及び 10.4 による。ただし,生成される一連の文字の列が現在行

ではなく表示形式ファイルの 1 記録を構成し,そこで行末ではなく記録末が生成される。文字の列

をもたない記録を生成することもできる。

記録末は,ファイル中の一つのファイル要素の生成が完了したことを示す手段とし,処理系定義

とする。すなわち,記録末が生成されると,データ生成文を用いて,この記録を変更したりこの記

録にデータを追加したりすることはできなくなる。(2.2)に定める特別な場合を除いて,有効な記録

末が生成されるまでファイルにデータが実際に追加されることはない。すなわち,その場合を除い

て,部分記録がファイルに追加されることはない。

記録末の生成位置を制御する実効行幅は,そのファイルを開く時に recsize 句の値として与えるか,

又は開いた後でこの経路に対して margin 句のある set 文を実行して与える[(4)参照]

(2.2)

ここに定める特別な場合に限って,部分記録 (partial record) がファイルに追加される。すなわち、

印字項目並び又は書式印字式並びの末尾に印字区切りがある場合,部分記録がファイルの終りに生

成され,指示子が部分記録の直後のファイルの終りを指して,文の実行が完了する。文の実行が完

了する前に例外状態になると,(1.3)と同様に,部分記録はファイルに追加されない。

この経路に対する次の操作が記録設定なしの print 文である場合にだけ,そこで生成される一連

の文字の列が,行幅に関する通常の規則に従ってこの部分記録の後ろに追加される。その経路に対

する次の操作がそのような print 文でない場合には,他のあらゆる処理に先立って,部分記録は後

ろに記録末を付けられて完成し,指示子はファイルの終りを指す。

(3)  mat-print


97

X 3003-1993

(3.1)  mat-print

文 (array-print-statement) によるデータ転送は,10.5 による。ただし,生成される一連の文

字の列が現在行ではなく表示形式ファイルの 1 記録を構成し,そこで行末ではなく記録末が生成さ

れる。

(3.2)  mat-print

文では,10.5 の規定どおり,部分記録が,印字配列名並びを指定したときは生成されず,

末尾にセミコロンのある書式印字配列名並びを指定したときは生成される。mat-print 文は常に新た

な行を開始するので,部分記録を完成するために用いることはできない。実効行幅の制御は,(2)

(4)による。

(4)

行幅の設定

(4.1)

行幅 (margin) は,開いている表示形式ファイルの一つごとに定められ,一つの記録が含むことので

きる文字の最大個数とする。行幅は,print 文及び mat-print 文において,記録末を生成する位置を

定める。

ファイルを開いた時点では,

実効行幅は,

recsize

句に書いた length 句の指標の値,

又は length

句を省略したときは処理系定義の値とする。この処理系定義の値は,印字欄幅の省略時想定値以上

とする。

(4.2)  margin

句のある set 文は,活性状態にある経路の行幅を,指定した指標の値に変更する。margin 

の影響を受けるファイル中に部分記録が存在する場合には,次にその部分記録にデータを追加する

時に新しい行幅が採用される。行幅として MAXNUM を設定すると,記録は任意の長さにできる。

ファイルを閉じると,margin 句の効果はなくなる。

(4.3)

可能な行幅の最大値は,処理系定義とする。

(5)

印字欄幅の設定

(5.1)

印字欄幅 (zone width) は,開いている表示形式ファイルの一つごとに定められ,print 操作の効果を

10.3

で規定したとおりに制御する。ファイルを開いた時点では,印字欄幅は処理系定義の省略時想

定値に設定される。その値は,de+6 以上とする[10.3.4(3)参照]

(5.2)  zonewidth

句のある set 文は,活性状態にある経路の印字欄幅を,指定した指標の値に変更する。右

端以外の印字欄の幅は,すべて同じとする。端数があるとき,右端の印字欄が短くなる。zonewidth

句の影響を受けるファイル中に部分記録が存在する場合には,次にその部分記録にデータを追加す

る時に新しい印字欄幅が採用される。set 文の zonewidth 句の指標の値は,1 以上でなければならな

い。ファイルを閉じると,zonewidth 句の効果はなくなる。

(5.3)

可能な印字欄幅の最大値は,処理系定義とする。

(6)

表示形式記録と print 操作  表示形式記録は,文字の列とし,10.に規定したとおり print 操作によっ

て生成される。数値の精度は,処理系定義の有効数字部の幅又は書式項目(10.4.2 参照)の長さ,及

び有効な arithmetic 選択子によってだけ制限を受ける。

(7)

ゼロ番の経路と print 操作  ゼロ番の経路に対する print 操作は,記録設定及び消去の能力をもたない

装置の定義に従って処理される。出力データの出力先は,経路指定を省略した場合と同じとする。例

外状態に対して,10.と 11.とで異なった回復手続きが規定されている場合には,10.の手続きを適用す

る。margin 句又は zonewidth 句のある set 文にゼロ番の経路を指定したときの効果は,経路指定を省

略したときと同じとする。

(8)  write

操作  write 文 (write-statement) 及び mat-write 文 (array-write-statement) は,どの記録形式の記

録をも生成する。式の値は,その順序に従って,値,欄又は文字の列に配置され,ファイルに書き出

される。部分記録が生成されることはない。

(9)

ファイル編成と write 操作


98

X 3003-1993

(9.1)

流れ編成 (stream) ファイルに対しては,一つの文で複数個のファイル要素を生成できる。具体的に

は,一つの式又は一つの配列要素を評価するたびに一つのファイル要素が生成される。内部的な評

価の間に例外状態になると,既に生成されている値はファイル中に残り,ファイル指示子はファイ

ルの終りを指し,残りの値は無視される。

(9.2)

流れ編成でなく,表示形式でないファイルに対しては,式又は配列によって生成された一つ以上の

値又は欄が一つの記録を形成する。したがって,文の実行の完了前に例外状態になると,記録はフ

ァイルに書き出されず,ファイル指示子は段階 2 で設定された位置にとどまる。

(9.3)

索引編成 (keyed) の記録は,キーによって識別されるので,新しい記録の生成時に,明示的にキー

を指定する必要がある。すなわち,索引編成ファイルに書出しを実行するときには,記録設定に等

値探索 (exact-search) を指定しなければならない。データ存在状態が偽ならば,等値探索の文字列

式に等しい値のキーの位置に新しい記録が挿入される。

(10)

表示形式記録と write 操作

(10.1)

表示形式 (display) 記録に対して write 操作を実行すると,同じ式並び又は配列名並びで print 操作

を実行したときと全く同じ記録の列及び文字の列を生成する。ただし,write 操作は記録向きである

ので,行向きである print 操作のすべての機能を含んでいるわけではない。

(10.2)

表示形式ファイルに対しては,行幅を越える出力の場合に,一つの文が複数個のファイル要素を生

成することがある。一つのファイル要素の生成途中で続行不能な例外状態になると,その文によっ

て既に生成されているファイル要素はファイル中に残り,ファイル指示子はファイルの終りを指し,

残りの式は無視される。

(11)

内部形式記録と write 操作

(11.1)

内部形式 (internal) 記録及び流れ編成ファイルは,値の列とする。この値には,数値型と文字列型

の 2 種類の型がある。

(11.2)

値の列とそれらの型は,値を生成するときの式又は配列要素によって定められる。ファイルに記録

された値を後で読み込むことは,その値を生成した式又は配列要素を let 文によってその入力変数

に代入するのと同じ効果をもつ。文字列値の長さと内容は,保持される。数値は,有効な arithmetic

選択子で指定された精度の通常の制限に従って保持される。

(12)

固有形式記録と write 操作

(12.1)

枠 (template) は,記録中の欄 (field) の位置,幅及び型を記述する。固有形式 (native) ファイルに

書き出すときには,必ず枠を使用しなければならない。枠は,他の記録形式に使用してはならない。

一つのデータ生成文は,文中の枠引用 (template-identifier) によって一つの枠を引用する。

(12.2)

枠引用は,template 文 (template-statement) 又は文字列式を指定する。文字列式の場合,その値は,

構文的に正しい枠要素並びでなければならない。write 文及び mat-write 文においては,枠引用の文

字列式を評価してから出力される式並び又は配列名並びを評価する。同じ template 文を二つ以上の

文で引用してもよい。

(12.3)

固有形式記録にデータを生成するときには,式並び中の一つの式ごとに,枠中の一つの欄指定子

(field-specifier)

が関連付けられる。次いでその欄指定子を用いて,その式の値が記録中の一つの欄

に変換される。この関連付けは,式並び中の一つの式に枠要素並び中の次に使用可能な一つの欄指

定子を用いて,左から右に順番に行われる。

(12.4)

式の型(数値又は文字列)が欄指定子の型と一致しない場合は,例外状態になる。式の個数は,欄

指定子の個数より多くてはならない。最後の式の後の余分な欄指定子は,無視される。欄の内容は,


99

X 3003-1993

式の値と欄指定子の幅の指定によって定められる。

(12.5)

文字列値の場合に,文字列欄幅 (string-field-size) とは,その欄の文字数とする。文字列値は,その

欄の中で左寄せされる。文字列長が欄幅より長い場合は,例外状態になる。短い場合は,欄の右側

に空白が埋められる。

(12.6)

数値欄は,数値として符号と絶対値の両方を保持する。符号は常に欄中に保持されるが,数値欄幅

(numeric-field-size)

は,数値の絶対値の幅だけを明示的に指定する。数値欄幅 E に対しては,有効

な arithmetic 選 択 子 に 関 す る 処 理 系 定 義 の け た 数 の 有 効 数 字 が 保 持 さ れ る 。 小 数 点 指 定

(fixed-point-size)

に 対 し て は , 整 数 幅  (integer-size) が 小 数 点 以 上 の け た 数 を 定 め , 小 数 幅

(fraction-size)

が小数点以下のけた数を定める。整数幅又は小数幅を省略すると,それぞれゼロとみ

なされる。数値は,これらの幅に従って記録される。欄で使用可能なけた位置の右端を越えて有効

数字がある場合には,その値は丸められて記録される。欄は,この結果,値ゼロをもつこともあり

うる。欄で使用可能なけた位置の左端を越えて有効数字がある場合には,例外状態になる。

(12.7)

枠中の欄数固定 (fixed-field-count) は,単独又は一連の欄指定子の飛越し又は反復を示す。欄数固定

の符号なし整数は反復の回数を示し,skip 指定は飛越しする欄を生成することを示す。欄数は,そ

の枠要素中の対象(欄指定子又は括弧でくくられた枠要素並び)に適用する。

欄数に符号なし整数を書くと,その欄数によって制御される対象をその回数だけ明示的に書いた

のと同じ効果をもつ。

欄数に skip 指定を書くと,それによって制御される欄指定子が,式並び又は配列名並びの値と関

連付けられないことを示す。記録を生成するとき,記録中のその欄は,その欄指定子の通常の幅と

型に従って,数値ならゼロの値,文字列なら空白の値になる。ある欄指定子が(入れ子になった)

複数個の skip 指定によって制御されているときは,その効果は一つのときと同じとする。

例  次の式並び及び枠要素並びを考える。

(a)  A

,B,C 及び NUMERIC*4,NUMERIC*5,NUMERIC*6

(b)  D

,E 及び NUMERIC*4,SKIP NUMEIRIC*5,NUMERIC*6

このとき,A と D,C と E は,それぞれ同じ欄位置を占める。2 番目の記録の 2 番目の欄は,1

番目の記録の B によって占められた欄と幅が同じで,値はゼロである。

(12.8)  (12.7)

の規定によって等価となる枠要素並びの対を例示する。

例 1. 

(a)  STRING*4, STRING*4, STRING*4

(b)  3 OF STRING*4

例 2. 

(a)  STRING*5, STRING*4, NUMERIC*2, NUMERIC*2, NUMERIC*2, STRING*4, 

NUMERIC*2, NUMERIC*2, NUMERIC*2

(b)  STRING*5, 2 OF (STRING*4, 3 OF NUMERIC*2)

例 3. 

(a)  SKIP NUMERIC*3, SKIP NUMERIC*3, NUMERIC*4, SKIP STRING*5,

      SKIP STRING*6

(b)  SKIP 2 OF NUMERIC*3, NUMERIC*4, SKIP (STRING*5,

      SKIP STRING*6)

ここで,

例 (b)の STRING * 6 の直前の skip 指定は,冗長である。


100

X 3003-1993

(12.9)

欄数不定 (variable-field-count) は,配列に関連してだけ用いることができる[(13)参照]

(12.10)

プログラムの実行が template 文の行に到達すると,何もしないで次の行に進む。

(13) mat-write

(13.1)

内部形式記録及び固有形式記録に対する mat-write 文 (array-write-statement) の効果は,その配列の

配列要素を行方向の順番(最後の添字が最も早く変わる順番)で明示的に指定した write 文と同じ

とする。

例 DIM

A(3)

,B(2, 2)と OPTION BASE 1 が有効である場合には,次の二つの文は等価である。

(a)  MAT WRITE #3:A, B

(b)  WRITE #3:A(1),A(2),A(3),B(1,1),B(1,2),B(2,1),B(2,2)

(13.2)

固有形式記録の書出しには,配列名並び中の配列は欄数不定を用いることができる。欄数固定の場

合には,write 文と同様に,欄指定子の個数及び型がその配列要素のものと一致しなければならない。

一方,ある配列の最初の要素に欄指定子を関連付ける時に,前の枠要素がちょうど完了したところ

であって(又は,この配列が並び中の最初のものであって)

,かつ次の枠要素が欄数不定であれば,

その欄指定子がその配列のすべての要素に使用される。その配列が評価された後,次の配列があれ

ば,それは次の枠要素を使用する。これは,欄数不定であってもなくてもよい。一つの配列の出力

に,欄数不定と欄数固定を併用してはならない。どちらか一方だけを指定する。

(14)

一般に,入出力の途中で入出力以外の例外状態が起こったとき,その部分的な入出力動作の効果及び

その入出力装置の状態は,処理系定義とする。この規定は,10.及び 11.の入出力全般に適用する。

参考  ANSI X3.113 にはこの(14)項がないが,TIB によって補った。

11.3.5

例外状態  set 文に関する例外状態は,(1)(5)による。データ生成文に関する(6)(20)の例外状態

は,それが検出される処理段階に従って分類する。段階 1 の例外状態では,ファイル及びファイル指示子

は変更されない。段階 2 の例外状態では,ファイルは変更されない。段階 3 の例外状態では,その時点で

幾つかのファイル要素が生成されていることがありうる。

(1)  set

文の margin 句の指標の値が,そのファイルの現在の印字欄幅の値より小さい。

(4006,続行不能。

(2) set

文の zonewidth 句の指標の値が,1 より小さい又はそのファイルの現在の行幅の値より大きい。

(4007,続行不能。

(3)  margin

句又は zonewidth 句のある set 文が,

不活性状態にある経路を指定している。

(7004,

続行不能。

(4)  margin

句又は zonewidth 句のある set 文が,

表示形式として開いたのでないファイルを指定している。

(7312,続行不能。

(5) margin

句又は zonewidth 句のある set 文が,入力専用として開いたファイルを指定している。

(7313,

続行不能。

段階 1 の例外状態

(6)

データ生成文が,不活性状態にある経路を参照している。

(7004,続行不能。

(7)  print

文又は mat-print 文が,内部形式又は固有形式として開いたファイルを参照している。

(7317,

続行不能。

(8) 

記録設定を正しく処理できない。

11.2.5 に規定する例外状態 7002 及び 7202∼7207 による。

(9)

データ生成文が,入力専用として開いたファイルを参照している。

(7302,続行不能。

(10) write

文又は mat-write 文が索引編成ファイルを参照しているが,記録設定の中に等値探索を指定して

いない。

(7314,続行不能。

(11) 

枠引用の文字列式が構文的に正しい枠要素並びでない。

(8251,続行不能。


101

X 3003-1993

(12)

枠引用を,表示形式又は内部形式として開いたファイルに対して使用する。

(7315,続行不能。

(13) 

枠引用を指定してない write 文又は mat-write 文が,固有形式として開いたファイルを参照している。

(7316,続行不能。

段階 2 の例外状態

(14)

データ生成文に対して,データ存在状態が真であって,かつ if-there 句の指定がない。

(7308,続行不

能。

段階 3 の例外状態

(15)

表示形式でなく,recsize 句で指定した値より長い記録を生成しようとする。

(8301,続行不能。

(16)

式又は配列要素の型が,関連する欄指定子の型(数値又は文字列)と一致しない。

(8252,続行不能。

(17)

欄数不定を指定した枠要素が配列の最初の要素に対応しない。

(8253,続行不能。

(18)

式及び配列要素に対して十分な個数の欄指定子が枠中にない。

(8254,続行不能。

(19)

数値が,枠中の欄で使用可能なけた位置の左端を越えて有効数字をもつ。

(8255,続行不能。

(20)

文字列値が,枠中の欄の幅より長い。

(8256,続行不能。

11.3.6

注意  注意は,次による。

(1)

処理系は,枠要素並びに対して,例えば,新しくデータの型を追加するような構文上の拡張をしても

よい。そのとき,構文的に正しくないことを示す例外状態は,拡張した枠要素並びの定義に従う。

(2)

欄数不定の指定は,プログラム中で大きさの変わりうる配列を書くときに特に有効である。欄数固定

を指定するには,事前に正確な大きさを知らなければならない。

11.4

ファイルからのデータ入力

11.4.1

概要  プログラムは,ファイル用のデータ入力文  (data retrieval statement)  を用いて装置又は以前に

データ生成したファイルからデータを入力する。この機能は,10.の入力機能をファイル向きに拡充したも

のとする。更に,さまざまな記録形式向きの入力を行う新しい機能も定める。

11.4.2

構文  構文は,次による。ここで,(1)(10)は中核の生成規則,(11)は拡充ファイルの生成規則,

(12)

(15)は両方の機能単位に適用する構文,

“固”は固有形式拡充ファイルの生成規則とする。

中核の生成規則

(1)  input

文⊃INPUT  経路式  入力制御  コロン  変数名並び  {コンマ  SKIP REST}?

(2)  mat-input

文⊃MAT  INPUT  経路式  入力制御  コロン  {再定義配列並び|不定長ベクトル}

(3)  line-input

文⊃LINE  INPUT  経路式  入力制御  コロン  文字列変数名並び

(4)  mat-line-input

文⊃MAT  LINE  INPUT  経路式  入力制御  コロン  再定義文字列配列並び

(5) 

入力制御={コンマ  入力制御項目}

*

(6)

入力制御項目=中核記録設定|if-missing 句|prompt 句|timeout 句|elapsed 

(7)  read

文⊃READ  経路式  読込み制御  コロン  変数名並び  {コンマ  SKIP REST}?

(8)  mat-read

文⊃MAT  READ  経路式  読込み制御  コロン  再定義配列並び

(9)

読込み制御={コンマ  読込み制御項目}

*

(10)

読込み制御項目⊃記録設定|if-missing 

拡充ファイルの生成規則

(11)  読込み制御項目⊃枠引用

(12)

枠引用の行番号は,同じプログラム単位中の template 文を参照するものでなければならない。

(13)

一つの入力制御項目は,一つの入力制御中では,たかだか 1 回だけ書くことができる。

(14)

一つの読込み制御項目は,一つの読込み制御中では,たかだか 1 回だけ書くことができる。


102

X 3003-1993

(15)

不定長ベクトルの配列は,1 次元でなければならない。

11.4.3

例  構文の例を次に示す。

INPUT #3:A,B,C,A$

(1)

MAT INPUT #W, BEGIN, IF MISSING THEN EXIT DO:A,B$

(2)

LINE INPUT #Q, NEXT:A$, B$, C$

(3)

MAT LINE INPUT #4, IF MISSING THEN 1234:A$, B$(N), C$(8)

(4)

READ #3, SAME, WITH 333:W$, SKIP REST

(7)

MAT READ #N, RECORD P

+2, IF MISSING THEN 111, WITH 222:V, W(Q)

(8)

11.4.4

意味  意味は,次による。ここで,(1)は,すべてのデータ入力文に対する一般的な規則を定める。

(2)

(13)は,個々の文の構文形式に特有の規則を文の形式ごとに定める。

(1)

データ入力処理

(1.1)

最初に,経路式によって,データを入力する経路 (channel) が定められ,意図した操作にファイル

属性が適合するか否かが調べられる。データ入力文においては,入出力方向属性が入力専用又は入

出力両用でなければならない。経路が活性状態にあり,ファイル属性がデータ入力文に適合するな

らば,次の段階に進む。そうでなければ,ファイル指示子及びすべてのプログラム変数は変更され

ず,例外状態になる。

(1.2)

段階 2 の処理では,記録設定 (record-setter) に基づいて(記録設定がない場合にも)

11.2.4(2)の規

定どおりにファイル指示子 (file pointer) の位置付けが行われ,11.2.4(3)の規定どおりにデータ存在

状態 (data-found) が設定される。データ存在状態が偽である場合,if-missing 句を指定してあるとき

はデータ存否動作が実行され,指定してないときは例外状態になる。いずれのときにも,指示子の

位置は変更されたままとする。

(1.3)

データ存在状態が真である場合には,段階 3 に進み,指示子によって指されたファイル要素から実

際のデータ入力が行われる。データは,一つ以上のファイル要素から各作用対象(変数又は配列)

に,左から右に順番に転送され,そのファイルの一連のデータ要素,値又は欄が,一連の変数又は

配列に代入される。

このとき,添字,部分文字列指定又は再定義上下限指定部があれば,それらは,先行する(すな

わち左側の)作用対象にデータが代入されてから評価され,続いてそれらを含む作用対象にデータ

が代入される。部分文字列指定のある文字列変数への文字列値の代入は,6.5 で規定した文字列代入

の通常の意味に従って行われる。

データ転送中に例外状態になると,正当な代入が行われた変数及び配列要素は新しい値をもつが,

後続のすべての変数及び配列要素はもとの値のままとする。データ入力操作が完了すると,指示子

は,次のファイル要素,すなわちファイルの次の記録,記録領域又は値を指すように進められる。

(1.4)  1

回のデータ入力操作は,通常,一つのファイル要素にだけ影響を及ぼす。ただし,次の三つの場

合には,複数個のファイル要素が処理されることがある。

(a)  line-input

文及び mat-line-input 

(b)

流れ編成ファイルに対する read 操作

(c)

末尾に(データの継続を示す)コンマのある記録をもつ表示形式ファイルに対する input 操作又は

read

操作

(1.5)  skip-rest

指定は,流れ編成以外のファイルに対してだけ指定できる。指定すると,最後のデータ要

素,値又は欄を得た記録の残りの部分は無視される。枠を指定した場合には,残りの欄指定子も無


103

X 3003-1993

視される。skip-rest 指定があっても,記録中には,並びの中の変数又は配列を満たすのに十分な個

数のデータがなければならない。

(1.6)

この段階 3 の処理の間に,さまざまな例外状態になることがある。各例外状態は,特定のファイル

要素に関連している。どの場合にも,指示子は例外状態に関連したファイル要素の直後の要素を指

すように進められる。これらの例外状態に関連するファイル要素を,

表 11.7 に要約する。

表 11.7  例外状態に関連するファイル要素

例外状態

関連するファイル要素

recsize

句の指定より長いファイル要素

そのファイル要素

不正な再定義上下限指定部,不正な添字,不正な

部分文字列指定,大きすぎる再定義上下限指定

データを得ようとしたファイル要素

不適切な枠。すなわち,型の不一致,配列の最初
の要素以外に対する欄数不定の指定“?”

,欄指定

子の個数の不足

データを得ようとしたファイル要素

不適切なデータ。すなわち,型の不一致,不正な
構文,あふれ

そのデータを含むファイル要素

ファイル要素中のデータの個数の不足

データの個数の不足したファイル要素

ファイル中のデータの個数の不足

ファイルの終り(すなわち,関連するファイル要
素はない。

ファイル要素中のデータの個数の余分

余分なデータをもつファイル要素

(2)  input

(2.1)  prompt

句,timeout 句及び elapsed 句の効果は,10.2 による。これらの入力制御項目は,対話方式

の端末装置にだけ有効とする。その他の装置及び狭義ファイル (true file) に対するこれらの句の効

果は,処理系定義とする。

(2.2)  input

文 (input-statement) によるデータ転送は,10.2 による。ただし,記録が入力応答のように,記

録末が行末のように取り扱われる。各データ要素(10.1 参照)は,変数名並び中の変数に順番に代

入される。input 操作は,

read 操作と違い,

)表示形式として開いたファイルにだけ有効とする。

その他の記録形式の場合には,例外状態になる。

(2.3)  input

文は,記録中の空白でない最後の文字がコンマである場合には,複数個の記録を処理すること

ができる。そのような末尾にコンマのある記録に続いて,すべての変数に値が代入される前にファ

イルの終りに達した場合には,残りの変数はもとの値のままで,ファイル指示子はファイルの終り

を指し,例外状態になる。

(2.4)

ある装置に対して input 操作を実行して段階 3 の例外状態になる場合に,処理系は,11.で狭義ファ

イルに対して規定する回復手続きを用いてもよいし,同じ例外状態が 10.で規定されていれば,代わ

りにその回復手続きを用いてもよい。これによって,処理系は,対話方式の二つ以上の装置からの

入力において,続行可能な回復手続きを採用することができる。

(3)  mat-input

(3.1)  mat-input

文 (array-input-statement) の効果は,その配列の配列要素を行方向の順番(最後の添字が

最も早く変わる順番)で明示的に指定した input 文と同じとする。ただし,追加の機能として,上

下限の再定義をも許す。再定義上下限指定部は,経路式のない mat-input 文に対して 10.5 で規定し

たとおりに,配列の寸法を変える。

1. DIM

A(3)

と OPTION BASE1が有効である場合には,次の二つの文は等価である。

(a)  MAT INPUT #N:A


104

X 3003-1993

(b)  INPUT #N:A(1), A(2), A(3)

2.  次の二つの文も等価である。

(a)  MAT INPUT #N:A$(2,2), C(2)

(b)  INPUT #N:A$(1,1), A$(1,2), A$(2,1), A$(2,2), C(1), C(2)

3.  次の文の場合には,最初のデータ要素が配列 B の実際の寸法を決定するので,そのデータ要素

によって効果が変わる。

MAT INPUT #N:A(1), B(A(1))

それでも,この mat-input 文は,配列 B の代わりに必要な個数の配列要素を指定した input

文と全く同じ効果をもつ。

(3.2)

上下限が再定義される時に,配列のいずれかの次元の寸法が 1 より小さくなる場合には,その配列

及び後続のすべての配列はもとの値のままで,例外状態になる。

(4)

不定長ベクトル  不定長ベクトル (variable-length-vector) のデータ転送及びそれに伴う配列の上下限

の再定義は,10.5 による。

(5)  line-input

文  line-input 文 (line-imput-statement) の効果は,10.2 による。ただし,記録が行入力応答

のように,記録末が行末のように取り扱われる。一連の記録の内容が先行及び後続の空白列をも含め

て,一連の文字列変数の値として代入される。記録は,空文字列であってもよい。その場合にもそれ

は,通常のやり方で代入される。すべての変数に値が代入される前にファイルの終りに達した場合に

は,残りの変数はもとの値のままで,ファイル指示子はファイルの終りを指し,例外状態になる。

(6) mat-line-input

文  mat-line-input 文 (array-line-input-statement) の効果は,mat-input 文の場合と同様に,

その配列の配列要素を明示的に指定した line-input 文と同じとする[(3)参照]

。ここでも,配列の寸法

は,それより前の配列に代入される値によって変わりうる。

例  MAT LINE INPUT #N:A$(1), B$(VAL(A$(1)))

最初の記録が文字列“12”である場合には,後続の 12 個の記録が配列 B$に読み込まれる。

上下限が再定義される時に,配列のいずれかの次元の寸法が 1 より小さくなる場合には,その配列

及び後続のすべての配列はもとの値のままで,例外状態になる。

(7)

ゼロ番の経路と input 操作  ゼロ番の経路からの入力は,狭義ファイルでない装置からの入力の規定

に従う。例外状態に対して,10.と 11.とで異なった回復手続きが規定されている場合には,10.の手続

きを適用する。

(8)  read

文  read 文 (read-statement) 及び mat-read 文 (array-read-statement) は,どの記録形式のファイル

からのデータ入力にも用いることができる。一連のデータ要素,値又は欄が並び中の一連の作用対象

(変数又は配列)に代入される。read 文は,順編成又は流れ編成のファイルでは複数個のファイル要

素を参照することができるが,相対編成又は索引編成のファイルではただ一つのファイル要素しか参

照できない。

(9)

ファイル編成と read 操作

(9.1)

流れ編成以外のファイルでは,変数は記録中の一連のデータ要素,値又は欄から値を受け取る。そ

の記録(末尾にコンマのある表示形式記録の場合は複数個の記録)の中には,

(1.5)の skip-rest 

定がある場合を除いて,

]変数名並びをちょうど満たすだけの個数のデータがなければならない。

(9.2)

流れ編成ファイルでは,各変数は指示子で指されたファイル要素から始めて,ファイルを構成する

列から直接に値を受け取るので,ファイル要素の境界は意味をもたない。すべての変数に値が代入

される前にファイルの終りに達した場合には,残りの変数はもとの値のままで,ファイル指示子は


105

X 3003-1993

ファイルの終りを指し,例外状態になる。

(10)

表示形式記録とデータ入力文

(10.1)

表示形式 (display) ファイル中の記録は,文字の列とする。ファイルからの文字列データの入力は,

10.2

による。print 操作によって生成された記録から入力したデータは,生成時と同じ値になるとは

限らない。例えば,単純文字列としての入力では,先行及び後続の空白列は保存されない。数値デ

ータの精度は,数値定数を数値変数に代入するときの通常の意味と一貫した扱いとする。すなわち,

有効数字は,arithmetic 選択子で NATIVE を指定した場合は少なくとも 6 けたとし,DECIMAL を

指定した場合は少なくとも 10 けたとする。DECIMAL を指定した場合,処理系定義のけた数以下の

有効数字の数値定数は,厳密に正確な値が代入される。

(10.2)

表示形式記録に対して read 操作を実行すると,同じ変数名並び又は再定義配列並びで input 操作を

実行したときと全く同じやり方で値を代入する。ただし,read 操作は記録向きであり,input 操作

のすべての機能を含んでいるわけではない。

(11)

内部形式記録と read 操作

(11.1)

内部形式 (internal) 記録及び流れ編成ファイルは,値の列とする。この値には,数値型と文字列型

の 2 種類の型がある。

内部形式のファイル要素においては,値は必ずそれと同じ型の変数に入力しなければならない。

そうしなければ,例外状態になる。すなわち,内部形式ファイル要素の内容は,それ自身で型をも

っている。

(11.2)

値の列とそれらの型は,ファイル要素を生成又は変更した記録操作によって定められる。値の入力

は,その値を生成した式又は配列要素を let 文によってその入力変数に代入するのと同じ効果をも

つ。文字列値の長さと内容は,保持される。数値は,有効な arithmetic 選択子で指定された精度の

通常の制限に従って保持される。

(12)

固有形式記録と read 操作

(12.1)

枠 (template) は,記録中の欄 (field) の位置,幅及び型を記述する。固有形式 (native) 記録から読

み込むときには,必ず枠を使用しなければならない。枠は,他の記録形式に使用してはならない。

一つのデータ入力文は,文中の枠引用 (template-identifier) によって一つの枠を引用する。

(12.2)

枠引用は,template 文 (template-statement) 又は文字列式を指定する。文字列式の場合,その値は,

構文的に正しい枠要素並びでなければならない。この文字列式を評価してから,入力を開始し,再

定義上下限指定,部分文字列指定及び添字を評価する。同じ template 文を二つ以上の文で引用して

もよい。

(12.3)

固有形式記録からデータを入力するときには,変数名並び中の一つの変数ごとに,枠中の一つの欄

指定子 (field-specifier) が関連付けられる。次いでその欄指定子を用いて,記録中の一つの欄からデ

ータが入力される。この関連付けは,変数名並び中の一つの変数名に枠要素並び中の次に使用可能

な一つの欄指定子を用いて,左から右に順番に行われる。

(12.4)

変数は,先行する(すなわち左側の)変数に値が代入された後,その変数に対する添字,部分文字

列指定及び再定義上下限指定部が評価されてから,欄指定子に関連付けられる。変数の型(数値又

は文字列)が欄指定子の型と一致しない場合は,例外状態になる。欄指定子の個数は,変数の個数

より少なくてはならない。変数に対して余分な欄指定子は,無視される。記録中の次の欄の内容が

欄指定子によって解釈され,その結果の値が変数に代入される。

(12.5)

データを入力するときに,記録中のすべての欄の欄指定子は,生成時の欄指定子と適合していなけ


106

X 3003-1993

ればならない。適合していないときの結果は,処理系定義とする。適合している (compatible) とは,

生成時と入力時の欄指定子が双方とも,同じ文字列欄幅をもつ文字列型であるか,同じ E の数値欄

幅をもつ数値型であるか又は同じ整数幅と小数幅をもつ数値型であることとする。整数幅又は小数

幅を省略すると,それぞれゼロとみなされる。

(12.6)

欄指定子がその記録に適合すると,欄幅に従って値が入力される。

文字列型の場合,その記録中に生成されたときの内容の値が,文字列欄幅に等しい長さで代入さ

れる。これは,欄の右側に埋められた空白を含む。

数値型の場合,数値欄幅と arithmetic 選択子によってだけ制限された精度で値が代入される。

arithmetic

選択子で DECIMAL を指定したときは,E の数値欄幅を用いて記録された数値,及び小

数点指定を用いて記録された,処理系定義のけた数以下の有効数字をもつ数値は,厳密に正確な値

が保持される。それ以外のときは,arithmetic 選択子の指定に従って数値が丸められ,変数に代入

される。

(12.7)

固有形式記録の欄に対する値の記録と欄数の効果は,11.3.4 による。ただし,skip 指定が,出力に

おいてはゼロ又は空白の欄を生成するのに対し,入力においては単に欄を読み飛ばすということだ

けが異なる。11.3.4 に規定したとおり,そのような欄指定子は,変数に関連付けられない。

(13) mat-read

(13.1)

一般に mat-read 文 (array-read-statement) の効果は,その配列の配列要素を明示的に指定した read

文と同じとする。

(13.2)  input

操作の場合と同様に,再定義上下限指定が後に評価されることがあるので,固有形式記録の読

込みには,欄数不定 (variable-field-count) を用いることができる。

欄数固定の場合には,read 文と同様に,欄指定子の個数及び型がその配列要素のものと一致しな

ければならない。

一方,ある配列の最初の要素に欄指定子を関連付ける時に,前の枠要素がちょうど完了したとこ

ろであって

(又は,この配列が並び中の最初のものであって)

かつ次の枠要素が欄数不定であれば,

その欄指定子がその配列のすべての要素に使用される。その配列が満たされた後,次の配列があれ

ば,それは次の枠要素を使用する。これは,欄数不定であってもなくてもよい。一つの配列の入力

に,欄数不定と欄数固定を併用してはならない。どちらか一方だけを指定する。

(14)

入出力の途中で入出力以外の例外状態が起こったとき,その部分的な入出力動作の効果及びその入出

力装置の状態は,処理系定義とする。

参考  ANSI X3.113 にはこの(14)項がないが,TIB によって補った。

11.4.5

例外状態  データ入力文に関する例外状態は,それが検出される処理段階に従って分類する。段階

1

の例外状態では,ファイル指示子及び変数は変更されない。段階 2 の例外状態では,変数は変更されな

い。

段階 3 の例外状態では,

その時点で幾つかの変数がファイルから値を受け取っていることがありうる。

段階 1 の例外状態

(1)

データ入力文が,不活性状態にある経路を参照している。

(7004,続行不能。

(2)  input

文,mat-input 文,line-input 文又は mat-line-input 文が,内部形式又は固有形式として開いたフ

ァイルを参照している。

(7318,続行不能。

(3)

記録設定を正しく処理できない。

11.2.5 に規定する例外状態 7002 及び 7202∼7207 による。

(4) 

データ入力文が,出力専用として開いたファイルを参照している。

(7303,続行不能。

(5)

枠引用の文字列式が,構文的に正しい枠要素並びでない。

(8251,続行不能。


107

X 3003-1993

(6)

枠引用を,表示形式又は内部形式として開いたファイルに対して使用する。

(7315,続行不能。

(7) 

枠引用を指定してない read 文又は mat-read 文が,固有形式として開いたファイルを参照している。

(7316,続行不能。

(8)  skip-rest

指定を,流れ編成として開いたファイルに対して使用する。

(7321,続行不能。

段階 2 の例外状態

(9)

データ入力文に対して,データ存在状態が偽であって,かつ if-missing 句の指定がない。

(7305,続行

不能。

段階 3 の例外状態

(10) recsize

句で指定した値より長い記録を参照しようとする。

(8302,続行不能。

(11)

再定義上下限指定の 1 番目の指標の値が,2 番目の指標の値より大きい。

(6005,続行不能。

(12) 

再定義上下限指定に指標が一つだけ書いてあって,その値が,そのプログラム単位で有効な暗黙の下

限の値未満である。

(6005,続行不能。

(13)

上下限の再定義後の配列で必要な要素の総数が,もとの配列宣言で確保された要素数を超える。

(5001,

続行不能。

(14) 

変数又は配列要素の型が,関連する欄指定子の型(数値又は文字列)と一致しない。

(8252,続行不能。

(15) 

欄数不定を指定した枠要素が配列の最初の要素に対応しない。

(8253,続行不能。

(16) 

変数及び配列要素に対して十分な個数の欄指定子が枠中にない。

(8254,続行不能。

(17) line-input

文及び mat-line-input 文を除くデータ入力文において,参照しようとする表示形式記録が,

構文的に正しい入力応答でない。

(8105,続行不能。

(18)

数値変数に代入しようとする表示形式記録中のデータ要素が,数値定数でない。

(8101,続行不能。

(19)

内部形式記録中の値の型が,代入しようとする変数の型(数値又は文字列)と一致しない。

(8120,続

行不能。

(20) 

ファイル中のデータ要素,値又は欄から変数への代入が,数値あふれを起こす。

(1008,続行不能。

(21) 

ファイル中のデータ要素,値又は欄から変数への代入が,文字列あふれを起こす。

(1105,続行不能。

(22)

流れ編成以外のファイルにおいて,記録中のデータ要素,値又は欄の個数がデータ入力文の作用対象

の個数よりも不足しており,かつその記録が末尾にコンマのある表示形式記録でない。

(8012,続行不

能。

(23)

データ入力文の作用対象に対するデータを得ようとして,ファイルの終りに達した。(8011,続行不

能。

(24) 

記録中のデータの個数がデータ入力文の作用対象の個数より多く,

かつ skip-rest 指定がない。

(8013,

続行不能。

(25) 

表示形式記録において,入力の要求をちょうど満たすだけの個数のデータ要素の後ろにコンマが続い

ており,かつ skip-rest 指定がない。

(8013,続行不能。

11.4.6

注意  処理系は,下位けたあふれを例外状態(1508,続行可能。ゼロで置き換えて処理を続行する。)

としてもよい。この場合,下位けたあふれを例外処理区で処理することができる(12.1 参照)

11.5

ファイルにおけるデータ変更

11.5.1

概要  利用者は,データ変更文 (data modification statement) によって,以前にファイルに保存した

データを書換え又は削除することができる。変更は,常に記録単位に行われる。

11.5.2

構文  構文は,次による。ここで,(1)(9)は拡充ファイルの生成規則,(10)(12)は拡充ファイル

機能単位に適用する構文,

“個”は固有形式拡充ファイルの生成規則とする。


108

X 3003-1993

中核の生成規則  なし

拡充ファイルの生成規則

(1)

単純実行文⊃rewrite 文|mat-rewrite 文|delete 

(2)  rewrite

文=REWRITE  経路式  書換え制御  コロン  式並び

(3)  mat-rewrite

文=MAT  REWRITE  経路式  書換え制御  コロン  配列名並び

(4)

書換え制御={コンマ  書換え制御項目}

*

(5)

書換え制御項目⊃if-missing 句|記録設定

(6)  delete

文=DELETE  経路式  削除制御

(7)

削除制御={コンマ  削除制御項目}

*

(8)

削除制御項目=if-missing 句|記録設定

(9)  書換え制御項目⊃枠引用

(10)

枠引用の行番号は,同じプログラム単位中の template 文を参照するものでなければならない。

(11)

一つの書換え制御項目は,一つの書換え制御中では,ただ 1 回だけ書くことができる。

(12)

一つの削除制御項目は,一つの削除制御中では,ただ 1 回だけ書くことができる。

11.5.3

例  構文の例を次に示す。

REWRITE #N, KEY

=B$, IF MISSING THEN 666:A,B,C$

(2)

MAT REWRITE #3, RECORD N-1, WITH 111:X,Y,Z

(3)

DELETE #3, KEY ”JONES”

(6)

11.5.4

意味  意味は,次による。ここで,(1)は,すべてのデータ変更文に対する一般的な規則を定める。

データ変更文は,多くの点でデータ入力文とデータ生成文の様式に密接に合わせてある。

データ変更文は,

データ入力文と同様に既存の記録を操作し,データ生成文と同様にファイルの状態を変えることができる。

(1)

データ変更処理

(1.1)

データ変更文は,相対編成 (relative) ファイル及び索引編成 (keyed) ファイルに対してだけ指定で

きる。それ以外のファイル編成のファイルに対する効果は,処理系定義とする。

(1.2)

データ変更文においては,入出力方向属性が入出力両用でなければならない。入出力方向属性以外

の点では,データ変更文の段階 1 及び段階 2 の処理(すなわち,ファイル属性の検査及びファイル

指示子の設定)は,既存の記録を操作するものであるから,データ入力文(11.4.4 参照)と全く同

じとする。段階 3 の処理は,操作がファイル属性に適合し,ファイル指示子が正しく位置付けられ,

データ存在状態 (data-found) が真になったときだけ実行される。(2)(4)は,段階 3 の処理を,個々

の文の形式ごとに定める。

(2)  rewrite

(2.1)  rewrite

文 (rewrite-statement) は,ちょうど一つの記録を生成する。この記録は,同じ式並び又は配

列名並び(及びもしあれば同じ枠引用)をもつ write 文によって生成される記録と同じとする(11.3.4

参照)

。ただし,固有形式記録においては,skip 指定によって制御される欄は,ゼロ又は空白が埋め

られるのではなく,もとの欄の内容が変更されずに残る。skip 指定がこの効果をもつのは,rewrite

文の使用する枠が,その記録を生成するのに最後に使用された枠に適合している (compatible) とき

だけとする[適合の定義は 11.4.4(12)参照]

skip 指定を含む適合しない枠を使用した結果は,処理

系定義とする。skip 指定を含まない適合しない枠を使用すると,11.3.4(12)に従って記録全体が置き

換えられる。

(2.2)

データ生成時に例外状態にならなければ,ファイル指示子の指している記録が,いま生成された記


109

X 3003-1993

録によって置き換えられる。ファイル指示子は,次のファイル要素を指すように進められる。この

結果,相対編成ファイルの記録番号又は索引編成ファイルのキーは,変更されない。例外状態にな

ると,ファイル指示子は段階 2 の処理(11.3.4 及び 11.4.4 参照)で設定された位置にとどまり,フ

ァイルのデータは変更されない。

(3)  mat-rewrite

文  mat-rewrite 文 (array-rewrite-statement) の効果は,その配列の配列要素を明示的に指

定した rewrite 文と同じとする。配列と枠中の欄指定子との対応の規則は,mat-write 文の場合と全く

同じとする[11.3.4(13)参照]

(4)  delete

文  delete 文 (delete-statement) は,ファイル指示子で指されている記録を削除する。ファイル

指示子は,次のファイル要素を指すように進められる。この結果,相対編成ファイルでは操作された

記録領域が記録を含まなくなり,索引編成ファイルでは操作された記録が,ファイルを構成する記録

の列から除去される。

(5)

入出力の途中で入出力以外の例外状態が起こったとき,その部分的な入出力動作の効果及びその入出

力装置の状態は,処理系定義とする。

参考  ANSI X3.113 にはこの(5)項がないが,TIB によって補った。

11.5.5

例外状態  データ変更文に関する例外状態は,それが検出される処理段階に従って分類する。段階

1

の例外状態では,ファイル及びファイル指示子は変更されない。段階 2 の例外状態では,ファイルは変

更されない。段階 3 の例外状態でも,ファイルは変更されない。

段階 1 の例外状態

(1)

データ変更文が不活性状態にある経路を参照している。

(7004,続行不能。

(2)

データ変更文がゼロ番の経路を参照している。

(7320,続行不能。

(3)

記録設定を正しく処理できない。

11.2.5 に規定する例外状態 7002 及び 7202∼7207 による。

(4)

データ変更文が,入力専用又は出力専用として開いたファイルを参照している。

(7322,続行不能。

(5)

枠引用の文字列式が,構文的に正しい枠要素並びでない。

(8251,続行不能。

(6)

枠引用を,表示形式又は内部形式として開いたファイルに対して使用する。

(7315,続行不能。

(7)

枠引用を指定してない rewrite 文又は mat-rewrite 文が,固有形式として開いたファイルを参照してい

る。

(7316,続行不能。

段階 2 の例外状態

(8)

データ変更文に対して,データ存在状態が偽であって,かつ if-missing 句の指定がない。

(7305,続行

不能。

段階 3 の例外状態

(9)  recsize

句で指定した値より長い記録を書き換えようとする。

(8301,続行不能。

(10)

式又は配列要素の型が,関連する欄指定子の型(数値又は文字列)と一致しない。

(8252,続行不能。

(11) 

欄数不定を指定した枠要素が配列の最初の要素に対応しない。

(8253,続行不能。

(12)

式及び配列要素に対して十分な個数の欄指定子が枠中にない。

(8254,続行不能。

(13)

数値が,枠中の欄で使用可能なけた位置の左端を越えて有効数字をもつ。

(8255,続行不能。

(14) 

文字列値が,枠中の欄の幅より長い。

(8256,続行不能。

11.5.6

注意  delete 文及び rewrite 操作は,ファイル指示子が NEXT によって位置付けられる場合及び記

録設定を省略したので前回の操作時のままの位置を指している場合にも,指示子の指している記録に作用

する。


110

X 3003-1993

12.

例外状態処理及びデバッグ

12.1

例外状態処理

12.1.1

概要  例外状態処理 (exception handling) 機能によって,例外状態 (exception) の起こった後にプロ

グラムの制御を取り戻すことができる。

12.1.2

構文  構文は,次による。

(1)

保護区=when-in 区|when-use 

(2)  when-in

区=when-in 行  when 本体  use 行  例外処理区  end-when 

(3)  when-in

行=行番号  WHEN  EXCEPTION  IN  行末部

(4)  when

本体=区

*

(5)  use

行=行番号  USE  行末部

(6)

例外処理区=区

*

(7)  end-when

行=行番号  END  WHEN  行末部

(8)  when-use

区=when-use 行  when 本体  end-when 

(9)  when-use

行=行番号  WHEN  EXCEPTION  USE  例外処理区名  行末部

(10) 

例外処理区名=ルーチン識別名

(11)

例外処理区戻り文=RETRY|CONTINUE

(12) exit-handler

文=EXIT  HANDLER

(13) cause-exception

文=CAUSE  EXCEPTION  例外状態種別

(14)

例外状態種別=指標

(15) handler

区=handler 行  例外処理区  end-handler 

(16) handler

行=行番号  HANDLER  例外処理区名  行末部

(17) end-handler

行=行番号  END  HANDLER  行末部

(18)

数値組込み関数名⊃EXLINE|EXTYPE

(19)

文字列組込み関数名⊃EXTEXT  ドル記号

(20)

例外処理区戻り文及び exit-handler 文は,例外処理区の中にだけ書くことができる。引き数のない数

値組込み関数 EXLINE 及び EXTYPE は,

例外処理区の中からだけ呼ぶことができる。

関数 EXTEXT$の

実引き数は,一つの数値式とする。これは,指標として評価される。

(21)

ある保護区の外部の行番号分岐中の行番号が,その保護区の内部にある行を参照してはならない。そ

の when-in 行及び when-use 行は,参照してもよい。例外処理区の内部の行番号分岐中の行番号が,そ

の例外処理区の外部にある行を参照してはならない。それ自身の end-handler 行及び end-when 行は,

参照してもよい。

ある例外処理区の外部の行番号分岐中の行番号が,

その例外処理区の内部にある行,

end-handler

行及び end-when 行を参照してはならない。

(22)

ある内部手続き定義の内部の when-use 行が参照する handler 区は,同じプログラム単位の内部で定義

しなければならない。

参考  ANSI X3.113 の文章はやや異なるが,TIB によって訂正した。

一つのプログラム単位の中の二つの handler 行に,同じ例外処理区名を書いてはならない。保護区

の内部に handler 区を書いてはならない[(4)(6)参照]

(23)

例外処理区の内部に保護区を書いてはならない。

12.1.3

例  構文の例を次に示す。

(1)

入力応答の誤りに対し,適切な通知を発行して,入力応答の再供給を可能にする[構文(2)


111

X 3003-1993

100 WHEIN EXCEPTION IN

110

   PRINT ”Enter your age and weight”

120

   INPUT a, w

130

   IF  a>10 THEN

140

      PRINT ”What is your height”

150

      INPUT  h

160

   END  IF

170 USE

180

   PRINT ”Please enter numbers only”

190

   RETRY

200 END WHEN

(2)

動的にファイルを開く[構文(15)(8)など]

100 HANDLER file_trouble

110

   LET  file_ok$z =”false”6

120

   IF  EXTYPE=7107 THEN

130

      LET  message$=”doesn't exist”

140

   ELSEIF  EXTYPE=7102 THEN

150

      LET  message$=”is thewrong type"

160

   ELSE

170

      LET  message$=”couldn't be used"

180

   END  IF

190

   PRINT”file”;filename$;message$;”try  again"

200 END HANDLER

500 DO

510

   INPUT  filename$

520

   LET file ok$=”true”

530

   WHEN EXCEPTION USE file_trouble

540

      OPEN #n:NAME filename$ ! other parameters omitted

550

   END  WHEN

560 LOOP UNTIL file_ok$

=”true”

(3)

例外処理区の入れ子[構文(2)

100 WHEN EXCEPTION IN

110

   DO

120

      READ#1, IF MISSING THEN EXIT DO:A

130

      LET  I = I+1               ! I initialized outside loop

140

      WHEN EXCEPTION IN

150

         LET  B(I)=1000*A*A

160

      USE

170

         ! Assume it is numeric overflow

180

         LET  B(I)=MAXNUM


112

X 3003-1993

190

         CONTINUE

200

   END  WHEN

210

   LOOP

220 USE

230

   IF  EXTYPE=8101 THEN       !non-numeric data

240

      RETRY                      !get next data item

250

   ELSE                          !give up

260

      PRINT ”Unable to process file”

270

      STOP

280

   END  IF

290 END WHEN

(4)

例外状態を引き起こす[構文(13)

  CAUSE EXCEPTION I

12.1.4

意味  意味は,次による。

(1)

プログラム単位の実行中に例外状態が起こったとき,とられる動作は,その例外状態が when 本体の

内部で起こったか否かに依存する。例外状態が when 本体の外部で起こった場合には,この規格で定

める省略時想定の例外状態処理手続き  (dfault exception handling procedure)  が適用される(2.4 参照)

この例外状態が続行可能なものであるならば,続行可能な例外状態に対する省略時想定の回復手続き

がとられる。

参考  ANSI X3.113 ではこの最後の 1 文がないが,誤りであるので,TIB によって訂正した。

例外状態が when 本体の内部で起こった場合には,例外状態を報告する省略時想定の例外状態処理

手続きは適用されず,代わりにその例外状態を起こした保護区 (protection-block) のうちで最も内側の

ものに対応する例外処理区 (exception-handler) に制御が移る。

(2)

保護区が when-in 区であるとき,対応する例外処理区は,その保護区の use 行に続く部分とする。保

護区が when-use 区であるとき,

対応する例外処理区は,

その保護区の when-use 行で指名された handler

区 (detached-handler) とする。handler 区の動作は,意味的には when-in 区における例外処理区の動作

と全く同じとする。

(3)

例外処理区の内部では,その例外処理区の実行を引き起こした例外状態の種別を,引き数なしの関数

EXTYPE

の値によって知ることができる。この規格で規定されるすべての例外状態に対し,EXTYPE

の値が決められている。この値を,例外状態の説明とともに

表 12.1(166 ページ)に示す。例外状態

を引き起こした行の行番号は,引き数なしの関数 EXLINE の値によって知ることができる。

(4)

例外処理区から出るには,次の 4 通りの方法がある。

(a)

例外処理区戻り文 (handler-return-statement) CONTINUE を実行すると,例外状態を引き起こした文

に構文上続く文に制御が移る。do 行,loop 行,for 行,if-then 行,elseif-then 行,select-case 行又は

case

行のように,構造を開始し,又は構造の一部となる行で例外状態が起こった場合は,その構造

全体に構文上続く文に制御が移る。

(b)

例外処理区戻り文 RETRY を実行すると,例外状態を引き起こした文又は行に制御が移り,その文

又は行が再実行される。その文がデータ入力を実行していた場合には,以前の入力応答又は行入力

応答は無視されて,再度応答が要求される。

(c)

制御が end-handler 行又は例外処理区を区切る end-when 行に到達すると,制御はその例外状態を引


113

X 3003-1993

き起こした保護区の end-when 行に続く行に移る[(5)参照]

(d)  exit-handler

文 (exit-handler-statement) を実行すると,その例外状態は,その例外状態の行を含む最

も内側の保護区を構文的に取り囲む環境に伝達される。

[これを“構文的”な伝達という。call 文や

関数引用などの“呼出し”の伝達については,(9)による。

]すなわち,その例外処理区は,

(そこで

既に実行されてしまっている文の効果はそのままとして,

)あたかも存在しなかったかのように無視

される。この例外状態の処理の規則は,外側を when 本体が囲んでいるか否かに依存する。

(5)

制御が when-in 区の use 行又は when-use 区の end-when 行に到達すると,制御はその保護区に続く行

に移る。制御が handler 区の end-handler 行に到達すると,制御はその例外状態を引き起こした

when-use

区の end-when 行に続く行に移る[(4)(c)参照]

。例外状態の発生によらないで制御が handler

区の handler 行に到達すると,制御はその end-handler 行に続く行に移る。

制御が when-in 行又は when-use 行に到達すると,何もしないで次の行に進む。

(6)  gosub

用の行番号の棚は,各例外処理区ごとに独立して一つずつある[8.2.4(3)参照]

。したがって,

retune

文の実行によって,制御が例外処理区の内外をまたいで移行することはない。

(7)  cause-exception

文 (cause-statement) を実行すると,続行不能 (fatal) な例外状態になる。その例外状態

種別の値が最も近い整数値に丸められて,関数 EXTYPE の値になる。

(8)

例外処理区の内部で重ねて起きた例外状態は,続行不能なものとして扱われる。このことは,

exit-handler

文の実行,任意の例外状態種別をもつ cause-exception 文の実行及びその他の続行可能又

は続行不能なあらゆる例外状態を含む。

参考  ANSI X3.113 の文章はやや異なるが,TIB によって訂正した。

(9)

手続きの外部への例外状態の伝達は,次による。

(9.1)

ある外部手続き単位の内部又は内部手続き定義の内部で続行不能な例外状態になり,しかも次のい

ずれかの場合には,その外部手続き単位又は内部手続き定義を呼び出した行に,その例外状態が戻

され,伝達される。

(“呼出し”の伝達。

(a)

その例外状態を引き起こした行は when 本体中にないので,例外処理区に移ることがない。

(b)

例外処理区に移り,そこで exit-handler 文を実行してその例外状態を構文的に外側に伝達するが,

それを受け止めるべき when 本体が構文的に外側を囲んでいない。

(9.2)

この伝達 (propagation) は,次のいずれかになるまで継続する。

(a)

利用者定義の例外処理区に入り,例外処理区戻り文を実行するか又はその例外処理区を区切る

end-handler

行若しくは end-when 行に制御を移すかして,その例外状態が解消される。

(b)

主プログラム又は並行単位に到達し,省略時想定の例外状態処理手続きが適用される。

(10)

この伝達の結果,例外処理区が呼ばれた場合,関数 EXTYPE の返す値は,

(当初の例外状態が起こっ

た外部手続単位の内部又は内部手続定義の内部で関数 EXTYPE が返すべき)通常の値に,100000 を

加えた値とする。関数 EXLINE の値は,例外状態が伝達された最後の行の行番号とする。

(すなわち,

その例外処理区を指定する when 本体中の行の行番号であり,例外状態の起こった当初の行の行番号

ではない。

(11)

省略時想定の例外状態処理手続きが報告する関数 EXTYPH 及び EXLINE の値は,常に例外状態の起

こった当初の行に対するものとする。

(12)

この規格に対して処理系が例外状態を追加した場合には,その EXTYPE の値は負の数にしなければな

らない。EXTYPE の値が負である例外状態が伝達された場合,EXTYPE の返す値は,当初の例外状態

に対する通常の負の値から 100000 を引いた値とする。


114

X 3003-1993

(13)

関数 EXTYPE の値 1∼999 は,この規格の将来の拡張でも使用しない。処理系による拡張の場合にも,

使用してはならない。

(14)

関数 EXTEXT$を引用すると,その実引き数の数値式の値が指標として評価され,最も近い整数値に

丸められる。その整数値を例外状態種別とする例外状態に対して,システムが用意する誤り通知 (error

message)

の文章部分を,この関数の値とする。その整数値がシステムの標準例外状態の例外状態種別

と一致しないときには,関数 EXTEXT$の値は,空文字列とする。

(15)

例外状態が伝達された結果,主プログラムに到達し,しかもそこで例外処理区が呼ばれない場合,そ

の例外状態は,この規格で定める省略時想定の例外状態処理手続きによって処理される。

12.1.5

例外状態  例外状態は,次による。

(1)  cause-exception

文が実行された。

(例外状態種別,続行不能。

12.1.6

注意  注意は,次による。

(1)

この規格が規定する例外状態の伝達 (propagation) には,2 種類ある。

(a)

一つは,

“構文的”な外側への伝達であって,外部手続単位の内部又は内部手続定義の内部において,

例外状態の起こった行を取り囲む何重かの保護区に向かって,外側に進む。

(b)

この伝達の結果,例外状態がそのような保護区の外部に出てしまうと,

“呼出し”の伝達に移り,呼

び出した文に例外状態が伝達される。

(2)

関数 EXLINE を利用するときは,注意が必要である。例えば,プログラムの行番号を付け直す再番号

付けの編集用機能(16.2 参照)を用いると,EXLINE を含む計算の部分が無効になることがありうる。

例  次のようなプログラム部分は,行番号 100 から 800 までのプログラム部分に対して行番号の再番

号付けを行うと,異なった動作をする。

1000 SELECT CASE INT (EXLINE/100)

1010 CASE 1, 2

  …

1100 CASE 3 TO 7

  …

(3)

続行不能な例外状態が呼出し側の文に伝達されて,その結果,省略時想定の例外状態処理手続きで処

理されるとき,処理系は,当初の例外状態の EXTYPE と EXLINE だけは必ず報告する。処理系は,更

に,例外状態が伝達されてきた経路の行の行番号又は有用であると考えるあらゆる情報を報告しても

よい。

(4)

続行可能 (nonfatal) な例外状態は,呼び出されたルーチンの例外処理区又はシステムの省略時想定の

例外状態処理手続きで処理されるので,呼出し側のルーチンにそのまま伝達することはできない。し

かし,例外処理区の中で cause-exception 文を実行して,続行不能な例外状態を引き起こすことはでき

る。

(5)  cause-exception

文は,実用上,規定されている例外状態を模擬することを意図したものではない。む

しろ,ある特定の EXTYPE の値をもった続行不能な例外状態を引き起こすために用いる。特に,

cause-exception

文で指定された EXTYPE の値が続行可能な例外状態を示すものである場合に,その続

行可能な例外状態があたかも実際に起こったかのように,処理系がその回復手続きを適用する必要は

ない。処理系は,通常,その例外状態を受け止めて処理する例外処理区が,利用者のプログラム中に

あると想定する。

(6)

正の EXTYPE の値は,すべてこの規格の将来の拡張に備えて予約されている。この規格に対して処理


115

X 3003-1993

系が拡張し定義する例外状態は,

表 12.1(166 ページ)で定めた分類に従った値を負にした EXTYPE

の値をもたなければならない。処理系の定めた例外状態が外部手続単位の内部又は内部手続定義の内

部で起きたとき,EXTYPE の値は,その例外状態を識別する負の値から 100000 を引いた値とする。

例えば,新しい組込み関数に誤った引き数を使った場合に対して,−4029 という EXTYPE の値を処

理系で定めたとする。副プログラムの内部でこの例外状態になったときに例外処理区がそこになけれ

ば,呼出し側のプログラムの例外処理区中で,EXTYPE の値が−104029 となる。

(7)

処理系作成上は,“これこれの分類におけるその他の例外状態”を表すのに,EXTYPE の値のその分

類中で第 0 番目の値を用いることを推奨する。例えば,EXTYPE の値 1000 は,規格の定めるあふれ

以外のあらゆるあふれを表すことに約束できる。

(8) EXTYPE

の値 1∼999 は,

応用プログラムの中で cause-exception 文を用いてだけ起こすことができる。

これらの値に対しては,この規格の将来の拡張においても標準的な意味を与えない予定であるので,

応用プログラムはこの値を用いるよう推奨する。

(9)

例外処理区戻り文 CONTINUE を用いるときには,注意がいる。例えば,def 文,on-gosub 文,on-goto

文,if 文などの中で例外状態が起こったときに文 CONTINUE を実行すると,制御はその行の構文的に

次の行に移る。この動作は,正常な制御の流れを回復することと等価であるとは限らない。

(10)

制御構造があるときの文 CONTINUE の効果を次に例示する。

100 WHEN EXCEPTION IN

120

    INPUT PROMPT ”Enter your age and weight”:a, w

130

    DO WHILE a>1

140

       IF  a<9999999999 THEN

150

       INPUT PROMPT ”What is your height”:h

160

       PRINT ”Check the following:”

170

       PRINT ”Age:”;a, ”Weight:”;w, ”Height:”;h

200

       INPUT PROMPT ”Enter your age”:a

210

    END IF

220

    PRINT ”Lexically following IF”

230 LOOP

240 PRINT ”Lexically following DO WHILE”

   ……

例外状態の起こった行

CONTINUE

によって制御の移る行

120 INPUT

130 DO

WHILE

(構文上の次の行)

130 DO

WHILE

240 PRINT

(対応する LOOP の次の行)

140 IF

… THEN

220 PRINT

(対応する END IF の次の行)

150 INPUT

160 PRINT

(構文上の次の行)

(11)

関数 EXTEXT$の値の正確な形は,処理系定義とする。例えば,例外状態の個々の発生に特有の誤り

通知中の欄に対して,特別のやり方で印を付けたり,欄を省いたりすることにしてもよい。欄の例と

しては,例外状態を起こした行の行番号や範囲外になった添字の値などがある。

12.2

デバッグ


116

X 3003-1993

12.2.1

概要  デバッグ (debugging) 機能は,BASIC 言語の文によってプログラム中に検査点を設定できる

ようにする。これらの文によって利用者は,中断点 (break point) を設定したり,プログラムの動作を追跡

(trace)

したり,デバッグシステム (debugging system) をそれぞれのプログラム単位ごとに活性化したり,

不活性化したりすることができる。

12.2.2

構文  構文は,次による。

(1)  debug

文=DEBUG   {ON|OFF}

(2)  break

文=BREAK

(3)  trace

文=TRACE  ON  {TO  経路式}?|TRACE  OFF

12.2.3

例  構文の例を次に示す。

TRACE ON

(3)

TRACE ON TO #3

(3)

12.2.4

意味  意味は,次による。

(1)

個々のプログラム単位は,一つごとにデバッグ状態 (debugging status) をもつ。これは,ある一時点で

は活性状態 (active) 又は不活性状態 (inactive) とする。主プログラム以外のプログラム単位における

デバッグ状態は,そのプログラム単位の次回の呼出しまで保持される。あるプログラム単位における

デバッグ状態の変更が,他のプログラム単位のデバッグ状態に影響を与えることはない。プログラム

の実行を開始する時点では,すべてのプログラム単位のデバッグ状態は,不活性状態とする。

(2)  debug

文 (debug-statement) DEBUG ON を実行すると,その debug 文を含むプログラム単位においてデ

バッグが活性状態となる。このプログラム単位中で debug 文 DHBUG OFF を実行するまでは,このプ

ログラム単位のこの回の実行の残り及びこのプログラム単位の以降の回の呼出しにおいて,デバッグ

は活性状態とする。プログラム単位中で debug 文 DHBUG OFF を実行すると,その debug 文を含むプ

ログラム単位においてデバッグが不活性状態となる。このプログラム単位中で debug 文 DEBUG ON

を実行するまでは,このプログラム単位のこの回の実行の残り及びこのプログラム単位の以降の回の

呼出しにおいて,デバッグは不活性状態とする。

(3)

デバッグが活性状態である時に,break 文 (break-statement) を実行すると,例外状態になる。この例

外状態からの標準の回復手続は,break 文の行番号を報告し,利用者にデバッグシステムとの対話が

可能であることを通知することとする。デバッグシステムが許す動作及びプログラムの実行を継続又

は終了させる方法は,処理系定義とする。デバッグが不活性状態である時に break 文を実行すると,

次の行に進むこと以外に何の効果ももたない。

(4)

デバッグが活性状態である時に trace 文 (trace-statement) を実行すると,ON であればその trace 文を

含むプログラム単位において追跡を有効にし,OFF であれば無効にする。プログラム単位の各 E の呼

出しごとに,trace 文を実行するまでは,追跡は無効とする。デバッグが不活性状態である時に trace

文を実行すると,次の行に進むこと以外に何の効果ももたない。

(5)  trace

文の実行は,デバッグ状態に影響を及ぼさない。debug 文の実行は,追跡状態の有効・無効に影

響を及ぼさない。

(6)

プログラム単位において,デバッグが活性状態であり追跡が有効である時には,次の種類の行が実行

されるたびに,それぞれの動作がなされる。

(a)

プログラム中の行の順次実行を中断する行の場合には,その行の行番号と次に実行されるべき行の

行番号の両方が報告される。

(b)

単純変数又は配列要素に値を代入する行の場合には,その行の行番号とその行の実行によって代入


117

X 3003-1993

される値の両方が報告される。

(7)

経路式を指定した trace 文によって追跡が有効になった場合,追跡報告は,その経路に割り当てられ

た表示形式のファイルに出力される。経路式を指定しなかった場合には,追跡報告は,ゼロ番の経路

の装置に出力される。

(8)

追跡報告の内容は,処理系定義とする。ただし,少なくとも追跡される変数の,追跡報告を引き起こ

した文に書かれた形での変数名,その値及び変数が配列要素である場合には添字の値を含む。

12.2.5

例外状態  例外状態は,次による。

(1)

デバッグが活性状態である時に,break 文を実行する。

(10007,続行可能。回復手続きは,その文の

行番号を報告しデバッグシステムとの対話を可能にすることとする。

(2)

不活性状態の経路に追跡報告を出力しようとする。

(7401,続行不能。

(3)

入出力指定属性 OUTPUT 又は OUTIN で開かれた表示形式のファイルでないファイルに,追跡報告を

出力しようとする。

(7402,続行不能。

12.2.6

注意  注意は,次による。

(1)  mat

文によって配列要素に値を代入すると,mat 文の追跡はすべての配列要素の新しい値を報告する。

(2)

追跡報告の形式は,処理系定義とする。

(3)

処理系は,これらの文のほかに指令によるデバッグ機能を提供してもよい。その指令には,これらの

文と同じ機能語を用いることを推奨する。

13.

図形

13.0

機能単位  ここでは,簡易図形出力機能単位 (mini graphics module) 【及び図形機能単位 (graphics

module)

】を規定する。

13.1

13.3 の括弧【  】で囲まれていない部分は,簡易図形出力機能単位を規定する。

13.113.5 は,

図形機能単位を規定する。括弧で囲まれた部分は,簡易図形出力機能単位には含まれない。

13.1

13.3【及び 13.4】は,ISO 7942 に規定された Graphical Kernel System (GKS)  の水準 0b の機能の部

分集合とする。GKS と共通の例外状態に対する関数 EXTYPE の値は,GKS の誤り番号の値に 11000 を加

えたものとする。

【図形機能単位を GKS の水準 0b の全体まで拡張したいときに,処理系が採用できる構文を,

附属書 F(参

考)に示す。13.5 は,GKS の規格の拡張である。】

GKS

の立場からみれば,この規格の 13.に規定する文を含む BASIC のプログラムは,図形を処理するす

べての文の実行に先立って,GKS の機能 OPEN GKS,OPEN WORKSTATION (#0, ”Maindev”, 1) 及び

ACTIVATE WORKSTATION #0

を暗黙的に呼び出す。そして,プログラムの終了に当たって,DEACTIVATE

WORKSTATION #0

,CLOSE WORKSTATION #0 及び CLOSE GKS を呼び出す。

参考  簡易図形出力機能単位は,図形機能単位の 13.113.3 の規定に対して,次の削除・制限を加え

たものであると考えることができる。

(1)  13.1

については,削除はない。

(2)  13.2

については,文章の形,大きさ,方向などは,ただ一つだけを許し,それ以外の規定及

び生成規則を削除する。COLOR MIX(色混合率)の規定を削除する。線の形の利用可能な

個数の最小値は,四つではなく三つとする。点の形の利用可能な個数の最小値は,五つでは

なく三つとする。これらに関連する例外状態 11073,4102 及び 11088 を削除する。

(3)  13.3

については,着色胞の配列を出力する機能を削除する。幾何図形 mat 文の規定を削除す


118

X 3003-1993

る。13.3.4(1.2),すなわち,通常の文による出力と図形出力との相互関係の規定を削除する。

文章の高さ,そろえ,方向などの規定を削除する。配列による出力に関連する例外状態 6401,

6402

及び 11085 を削除する。

13.1

座標系

13.1.1

概要  図形出力を生成するのに用いる座標系は,応用分野に合わせて選ぶことができる。“問題座

標 (problem coordinate)”

[論理座標 (world coordinate) ともいう。

]系の範囲は,機能語 WINDOW(窓)を

もつ set 文によって定める。この範囲を機能語 VIEWPORT(視野面)をもつ set 文で指定された抽象視野

面 (abstract viewing surface) 中の長方形の中に写像する。抽象視野面中のどの部分を利用者が表示画面

(display surface)

中に表示するかを,機能語 DEVICE WINDOW(装置窓)をもつ set 文によって指定する。

更に,この長方形を機能語 DEVICE VIEWPORT(装置視野面)をもつ set 文によって表示画面上に位置付

ける。

出力が装置視野面の外に出たときには,何も生成されない。切取り (clipping) を有効にすれば,視野面

の外に写像された図形の出力が無視される。

ask

文は,set 文のどれかの実行(又は省略時想定)によって設定された係数の現在値を問い合わせる。

13.1.2

構文  構文は,次による。

(1)

設定対象⊃ WINDOW  境界四辺|VIEWPORT  境界四辺|DEVICE  WINDOW  境界四辺|

DEVICE

  VIEWPORT  境界四辺|CLIP  文字列式

(2)

境界四辺=境界  コンマ  境界  コンマ  境界  コンマ  境界

(3)

境界=数値式

(4)  ask

文⊃ASK  質問対象  status 句?

(5)  status

句=STATUS  数値変数名

(6)

質問対象⊃ WINDOW  境界四辺変数|VIEWPORT  境界四辺変数|DEVICE WINDOW

境界四辺変数|DEVICE VIEWPORT  境界四辺変数|DEVICE SIZE  数値変数名

コンマ  数値変数名  コンマ  文字列変数名|CLIP  文字列変数名

(7)

境界四辺変数=数値変数名  コンマ  数値変数名  コンマ  数値変数名  コンマ  数値変数名

13.1.3

例  構文の例を次に示す。

WINDOW 0, PI*2, −1, 1

(1)

Viewport .5*width, width, .5*height, height

(1)

DEVICE WINDOW 0, .8, 0, 1

(1)

DEVICE VIEWPORT .3, .5, .1, 1

(1)

CLIP ”Off”

(1)

ASK WINDOW X1, X2, Y1, Y2

(4)

ASK VIEWPORT L, R, B, T

(4)

ASK DEVICE WINDOW XMIN, XMAX, YMIN, YMAX

(4)

ASK DEVICE VIEWPORT LEFT, RIGHT, BOTTOM, TOP

(4)

Ask device size Width, Height, Units$

(4)

ASK CLIP CLIP_STATE$

(4)

13.1.4

意味  意味は,次による。

(1)

図形出力は,問題座標上で指定する。基準化変形は,問題座標系から基準装置座標 (normalized device

coordinate, NDC)

空間への写像を定義する。この基準装置座標空間を抽象視野面とする。


119

X 3003-1993

(2)

基準化変形は,窓 (window) と呼ばれる長方形の限界を問題座標中に定義することで指定する。その

窓が,基準装置座標中の視野面 (viewport) と呼ばれる指定された長方形の領域に,線形写像される(

13.1

参照)

(3)

機能語 WINDOW をもつ set 文を実行すると,窓の境界四辺 (boundaries) が定められる。係数は,問

題座標中の窓の長方形のそれぞれ左辺,右辺,下辺及び上辺を表す。プログラムの実行を開始する時

の窓のこれらの値は,  (0, 1, 0, 1)  とする。

(4)

機能語 VIEWPORT をもつ set 文を実行すると,視野面の境界四辺が定められる。係数は,基準装置座

標中の視野面の長方形のそれぞれ左辺,右辺,下辺及び上辺を表す。これらの値は,ゼロ以上 1 以下

でなければならない。左辺の座標値は右辺より小さく,下辺の座標値は上辺より小さくなければなら

ない。プログラムの実行を開始する時の視野面のこれらの値は,  (0, 1, 0, 1)  とする。

(5)

この視野面は,切取りをする長方形をも定める。機能語 CLIP をもつ set 文を実行すると,視野面境界

における切取りが,文字列式の値の“ON”又は“OFF”に従って,有効又は無効になる。文字列式の

値の中の文字は,

英大文字と英小文字を混ぜて指定してもよい。

プログラムの実行を開始する時には,

切取りは有効になっている。

(6)

装置変形 (device transformation) は,装置窓 (device window) と呼ばれる基準装置座標空間中の長方形

を装置視野面 (device viewport) と呼ばれる物理画面上の長方形に一様に写像する。この変形は,両軸

に対して等しい正の比率をもった拡大縮小 (scaling) を行う。すなわち,装置窓と同じ縦横比 (aspect

ratio)

をもつ最大の長方形を装置視野面中に左下端を合わせて設定し,装置窓をこの長方形に写像す

る(

図 13.1 参照)。

(7)

機能語 DEVICE WINDOW をもつ set 文を実行すると,装置窓の境界四辺が定められる。係数は,基準

装置座標中の装置窓の長方形のそれぞれ左辺,右辺,下辺及び上辺を表す。これらの値は,ゼロ以上

1

以下でなければならない。左辺の座標値は右辺より小さく,下辺の座標値は上辺より小さくなけれ

ばならない。プログラムの実行を開始する時の装置窓のこれらの値は,  (0, 1, 0, 1)  とする。装置窓の

外への出力をしないように,切取りが装置窓の境界で行われる。この切取りを無効にすることはでき

ない。機能語 DEVICE WINDOW をもつ set 文を実行すると,表示画面が(まだ消去されていないなら)

消去される。

(8)

機能語 DEVICE VIEWPORT をもつ set 文を実行すると,装置視野面が定められる。係数は,装置視野

面の長方形のそれぞれ左辺,右辺,下辺及び上辺の座標を表す。装置視野面の単位は,正確に拡大縮

小された像を生成することのできる装置上ではメートルとし,さもなければ装置に依存した適当な座

標とする。表示画面の左辺及び下辺の座標値は,ゼロとする。プログラムの実行を開始する時の装置

視野面は,画面全体とする。機能語 DEVICE VIEWPORT をもつ set 文を実行すると,表示画面が(ま

だ消去されていないなら)消去される。

(9)

図 13.1 は,窓,視野面,装置窓,装置視野面の関係を示す。ここで,切取りは有効になっているもの

とする。


120

X 3003-1993

図 13.1  窓と視野面との関係 

(10) ask

文に書いた status 句は,その ask 文の実行に関する状態を数値変数に返す。ask 文が質問対象につ

いて意味のある値を返したときには,status 句は値ゼロを返す。ask 文が質問対象について意味のある

値を返せなかったときには,status 句はそれぞれの質問対象に関する意味の項で規定されているゼロ

でない値を返す。ある特定の質問対象に対する ask 文が,必ず意味のある値を返すとわかっていると

きには,その質問対象に関する意味の項は代わりの値を規定せず,必ず値ゼロが返される。

(11)

機能語 WINDOW,VIEWPORT,DEVICE WINDOW 又は DEVICE VIEWPORT をもつ ask 文を実行す

ると,指定された長方形の現在値が返される。実行された最後の set 文によって設定された左辺,右

辺,下辺及び上辺の値をそれぞれの境界四辺変数 (boundary variables) に代入する。関連する set 文が

まだ実行されていないときには,省略時想定の値を代入する。

(12)

機能語 DEVICE SIZE をもつ ask 文を実行すると,有効な表示画面の水平方向の寸法が 1 番目の数値変

数に代入され,垂直方向の寸法が 2 番目の変数に代入される。文字列変数は,寸法がメートル単位で

あれば値“METERS”が代入される。そうでなくて,寸法の単位が装置座標系によるその他の単位で

あれば,値“OTHER”が代入される。値“METERS”及び“OTHER”は,英大文字とする。

(13)

機能語 CLIP をもつ ask 文を実行すると,切取りが有効であれば文字列変数に値“ON”が代入され,

無効であれば値“OFF”が代入される。返される値は,英大文字とする。

13.1.5

例外状態  例外状態は,次による。

(1)  set

文の境界四辺が,ゼロの幅又はゼロの高さの長方形を指定する。

(11051,続行可能。今までの値を

維持して処理を続ける。

(2)

機能語 VIEWPORT,DEVICE WINDOW 又は DEVICE VIEWPORT をもつ set 文の境界四辺が,負の幅

又は負の高さを指定する。

(11051,続行可能。今までの値を維持して処理を続ける。

(3)

視野面の境界が閉区間 [0, 1] の範囲にない。(11052,続行可能。今までの値を維持して処理を続け

る。

(4)

装置窓の境界が閉区間 [0, 1] の範囲にない。(11053,続行可能。今までの値を維持して処理を続け

る。

(5)

装置視野面の境界が,表示画面の範囲にない。

(11054,続行可能。今までの値を維持して処理を続け

る。

(6)

機能語 CLIP をもつ set 文の文字列式の値が,英大文字に変換した後に“ON”でも“OFF”でもない。

(4101,続行可能。今までの値を維持して処理を続ける。

13.1.6

注意  注意は,次による。

(1)

特定の図形表示装置をプログラムによって選択する方法は,処理系定義とする。


121

X 3003-1993

(2)

左辺の値が右辺より大きい又は下辺の値が上辺より大きい窓の意味は,処理系定義とする。可能な場

合には,処理系は,適切に逆転した像とすることを推奨する。すべての図形出力【及び図形入力】の

効果は,抽象問題空間を用いて定義される。抽象問題空間は,左及び下が小さい値そして右及び上が

大きい値とする。この問題空間を基準装置座標に写像するとき,その窓の境界四辺の値の大小関係に

よっては,像が逆転することがありる。このことは,逆転している窓座標は誤りとなるという GKS

の規則を緩和する。

(3)

次の BASIC の文は,次の GKS の機能に対応する。

BASIC

: 機能語 WINDOW,VIEWPORT,DEVICE WINDOW 又は DEVICE VIEWPORT をもつ set

GKS

: 機 能 SET WINDOW , SET VIEWPORT , SET WORKSTATION WINDOW 又 は SET

WORKSTATION VIEWPORT

;これらの文に対して,GKS の変形番号は 1,GKS の図形処

理装置 (workstation) 番号は#0 とする。

(4)

次の BASIC の文は,次の GKS の機能に対応する。

BASIC

: 機能語 CLIP をもつ set 

GKS

: 機能 SET CLIPPING INDICATOR

(5)

次の BABASIC の文は,次の GKS の機能に対応する。

BASIC

: 機能語 WINDOW 又は VIEWPORT をもつ ask 

GKS

: 基準化変形 1 に対する機能 INQUIRE NORMALIZATION TRANSFORMATION

(6)

次の BABASIC の文は,次の GKS の機能に対応する。

BASIC

: 機能語 CLIP をもつ ask 

GKS

: 機能 INQUIRE CLIPPING INDICATOR

(7)

次の BABASIC の文は,次の GKS の機能に対応する。

BASIC

: 機能語 DEVICE WINDOW 又は DEVICE VIEWPORT をもつ ask 

GKS

: 図形処理装置識別子#0 に対する機能 INQUIRE WORKSTATION TRANSFORMATION の現

在の図形処理装置窓 (workstation window) 又は現在の図形処理装置視野面 (workstation

viewport)

の係数

参考  ANSI X3.113 では,ここの“#0”が“one”となっているが,誤りであるので,TIB によって訂

正した。

(8) DEVICE

VIEWPORT

をもつ set 文を実行する前に,DEVICE VIEWPORT をもつ ask 文を実行して,有

効な装置画面全体の装置座標を知ることができる。

(9)

次の BASIC の文は,次の GKS の機能に対応する。

BASIC

: 機能語 DEVICE SIZE をもつ ask 

GKS

: 機能 INQUIRE MAXIMUM DISPLAY SURFACE SIZE の装置座標単位及びそれによる

最大表示画面寸法の係数

(10)

附属書 F(参考)に示す質問対象の多くには,意味のある値を返せない場合がある。その場合,status

句の返す値は,GKS の誤り指示子係数値に 11000 を加えた値とする。

13.2

属性及び画面制御

13.2.1

概要  図形の表示は,次による。

(1)

図形表示装置は,さまざまの太さや形をもつ複数種類の線や点を描くことができる。図形の出力に当

たって,特定の形を選択できる。更に,図形表示装置は,さまざまの色を用いて線を描いたり,領域


122

X 3003-1993

を塗りつぶしたりできる。描線及び画面背景に,特定の色を選択できる。

(2)

幾何対象の現在の形及び色は,ask 文によって問い合わせることができる。利用可能な色の個数,線

の形の個数及び点の形の個数も,ask 文によって問い合わせることができる。

(3)

【図形表示装置は,さまざまの高さや方向をもつ多様な文章 (text) を表示することができる。文章の

出力に当たって,一つの組合せを選択できる。

(4)  clear

文は,全画面を消去して背景色 (background color) に戻す。消去不能な表示装置に対する clear

文は,用紙を進める,ペンをわきに寄せるなどの動作をする。

(5)

簡易図形出力では,ある 1 種類の形及び大きさをもち,開始点から水平右方向に進む文章を出力でき

る。

13.3.4(3)参照。

13.2.2

構文  構文は,次による。

(1)

単純実行文⊃clear 

(2)  clear

文=CLEAR

(3)

設定対象⊃ 線点指定  STYLE  指標|面指定  COLOR  指標

【|TEXT  文章特性  数値式|TEXT  JUSTIFY  文字列式  コンマ  文字列式|

COLOR

  MIX  左括弧  指標  右括弧  三原色指定】 

(4)

面指定=線点指定|TEXT|AREA

(5)

線点指定=POINT|LINE

(6)

【三原色指定=数値式  コンマ  数値式  コンマ  数値式】

(7)

質問対象⊃ 線点指定  STYLE  数値変数名|面指定  COLOR  数値変数名|

【TEXT  文章特性  数値変数名|TEXT  JUSTIFY  文字列変数名  コンマ  文字列変

数名|】

MAX

  線点指定  STYLE  数値変数名|MAX  COLOR  数値変数名

【|COLOR  MIX  左括弧  指標  右括弧  三原色取得】 

(8)

【三原色取得=数値変数名  コンマ  数値変数名  コンマ  数値変数名】

(9)

【文章特性=HEIGHT|ANGLE】

13.2.3

例  構文の例を次に示す。

LINE STYLE 2

(3)

TEXT COLOR 5

(3)

【AREA COLOR RED

(3)

【TEXT HEIGHT (N+3)/42

(3)

【Text justify ”Center”, ”Half”

(3)

【color mix (4) .5, R*.5, .3

(3)

【Point style P_style

(7)

Max color color_max

(7)

Max point style PtStyles

(7)

13.2.4

意味  意味は,次による。

(1)  clear

文を実行すると,図形表示が(まだ消去されていないなら)消去される。消去可能な表示装置に

対しては,画面を消去する。消去不能な表示装置に対しては,その媒体を進めたり,利用者に媒体を

交換させたりする。

(2)

機能語 LINE STYLE 又は POINT STYLE をもつ set 文を実行すると,指標が最も近い整数値 に丸め


123

X 3003-1993

られて評価され,それ以後の線の形又は点の形は,利用できる線の形又は点の形の集合の 番目のも

のに設定される。利用できる線の形の個数は,処理系定義とするが,簡易図形出力では少なくとも三

つ【,図形機能単位では少なくとも四つ】はなければならない。1,2,3【及び 4】の線の形は,それ

ぞれ実線,破線,点線【及び一点鎖線】とする。その他の線の形の値は,処理系定義とする。プログ

ラムの実行を開始する時の線の形は,1(実線)とする。

(3)

点の形は,中心付けられた記号を示す。点の形の個数は,処理系定義とするが,簡易図形出力では少

なくとも三つ【,図形機能単位では少なくとも五つ】はなければならない。1, 2, 3【,4 及び 5】の点

の形は,それぞれ黒点  (・),十字  (+),星印  (*)  【,白丸  (○)  及びばつ印  (×)】とする。その他の

点の形の値は,処理系定義とする。プログラムの実行を開始する時の点の形は,3(星印)とする。

(4)

機能語 LINE STYLE 又は POINT STYLE をもつ ask 文を実行すると,その時の実際の線の形又は点の

形の現在値が,その数値変数に代入される。

(5)

機能語 MAX LINE STYLE 又は MAX POINT STYLE をもつ ask 文を実行すると,LINE STYLE 又は

POINT STYLE

のそれぞれの利用可能な最大値がその数値変数に代入される。

値 1 からこの最大値までのすべての整数値が,点の形又は線の形として利用可能とする。

(6)

機能語 POINT COLOR,LINE COLOR,TEXT COLOR 又は AREA COLOR をもつ set 文を実行すると,

指標が最も近い整数値 に丸められて評価され,それ以後の点,線,文章又は塗りつぶし領域 (filled

area)

の色指標 (color index) が,その時の図形表示装置で利用できる色の集合の 番目のものに設定

される。この色を前景色 (foreground color) と呼ぶ。プログラムの実行を開始する時に,それぞれの指

標に対応する色は,処理系定義とし,前景色の指標は,すべて値 1 とする。利用できる色の個数は,

処理系定義とする。

(7)

機能語 POINT COLOR,LINE COLOR,TEXT COLOR 又は AREA COLOR をもつ ask 文を実行すると,

その時の点,線,文章又は塗りつぶし領域に対する色指標の現在値が,その数値変数に代入される。

(8)

【機能語 COLOR MIX をもつ set 文を実行すると,指標が最も近い整数値に丸められて評価され,そ

の色指標に対応する色を変更する。三つの数値式は,それぞれ赤,緑及び青の強度 (intensity) を定め,

これをその色指標に設定する。赤,緑及び青に対する値は,ゼロ以上 1 以下でなければならない。

背景色が意味をもつ装置では,色指標ゼロは背景色を表現する。機能語 COLOR MIX をもつ set 

の効果が,それ以後表示する色を変更するだけか,又は既に表示されている色も変更するかは,処理

系定義とする。

(9)

【機能語 COLOR MIX をもつ ask 文を実行すると,指標が最も近い整数値に丸められる。指定された

色指標に対応する赤,緑及び青の強度が,この順でそれぞれの数値変数に代入される。返される値は,

機能語 COLOR MIX 及びその指標の値をもって実行された最後の set 文によって設定された値とする。

色混合率を正確に設定できなかった場合には,実際に有効な値が返される。プログラムの実行を開始

する時の色混合率の値は,処理系定義とする。

機能語 COLOR MIX 及び status 句をもち,色指標がゼロより小さい又は利用可能な最大色指標より

大きい ask 文を実行すると,status 句は,値 11086 を返す。その色指標に対して色混合率が設定され

ていないと,値 11087 を返す。これらの場合,赤,緑及び青に対して,値ゼロが返される。

(10)

機能語 MAX COLOR をもつ ask 文を実行すると,

機能語

【COLOR MIX,】

POINT COLOR

LINE COLOR

TEXT COLOR

又は AREA COLOR をもつ set 文における色指標として利用可能な最大値が,その数値

変数に代入される。処理系が,値 1 からこの最大値までのすべての整数値を色指標として利用可能に

することが望ましい。


124

X 3003-1993

(11)

【文章属性は,(11)(16)による。

機能語 TEXT HEIGHT をもつ set 文を実行すると,それ以後の図形 text 文によって印字される文字

の問題座標における近似の高さが設定される。設定された文字寸法が現在の視野変形によって基準装

置座標に写像され,その要求された高さを超えない最大寸法の機械文字集合が選択される。すべての

利用可能な寸法が要求された高さを超える場合,最小寸法の機械文字集合が採用される。そもそも機

械文字集合が存在しない場合には,この規則に従ってソフトウェア的に生成された文字が使用される。

文字の高さの省略時想、定値は,0.01 とする。文字の高さとは,英大文字の高さとする(

図 13.2 参照)。】

(12)

【機能語 TEXT HEIGHT をもつ ask 文を実行すると,文字の高さの現在値がその数値変数に代入され

る。実際の文字の高さが,機能語 TEXT HEIGHT をもって実行された最後の set 文による設定と異な

る場合,実際の文字の高さが返される。

(13)

【機能語 TEXT ANGLE をもつ set 文は,それ以後に表示される文章の問題座標における角度を設定す

る。TEXT ANGLE がゼロであれば,先頭の文字を左端にして,通常の水平方向で画面上に名札を描く。

TEXT ANGLE

がゼロでなければ,JUSTIFY で設定された点を中心として,通常の水平方向から逆時計

回りの方向に,指定された角度だけ名札が回転される。

角度は,angle 選択子の指定による度又はラジアンで表す。180 度の整数倍の角度では水平に,90

度の奇数倍の角度では垂直に文字の列を表示する。45 度の奇数倍の角度では,その角度に対応して,

水平でも垂直でもない,中間の対応する斜め方向に文字の列を表示する。その他の方向の利用可能性

は,処理系定義とする。名札中での個々の文字の方向は,処理系定義とする。

プログラムの実行を開始する時の文章の角度は,ゼロ(水平右方向)とする。

(14)

【機能語 TEXT ANGLE をもつ ask 文を実行すると,文章の角度の現在値がその数値変数に代入され

る。実際の角度が,機能語 TEXT ANGLE をもって実行された最後の set 文による設定と異なる場合,

実際の角度が返される。

(15)

【機能語 TEXT JUSTIFY をもつ set 文を実行すると,文字列式を評価して,以後の図形 text 文によっ

て印字される文章出力の位置が定められる。図形 text 文に指定した開始点を,文章位置とする。文章

出力を囲む長方形が,この開始点に対して相対的に指定される。

1

番目の文字列式の有効な値は,

“LEFT”

“CENTER”又は“RIGHT”とし,文章そろえの水平相

対位置を指定する。2 番目の文字列式の有効な値は,“TOP”,“CAP”,“HALF”,“BASE”又は

“BOTTOM”とし,文章そろえの垂直相対位置を指定する。これらの値は,英大文字と英小文字を混

ぜて指定してもよい。

値“LEFT”を指定すると,文章長方形の左端を文章位置に位置付ける。値“CENTER”を指定する

と,文章長方形の左端と右端の中点を文章位置に位置付ける。値“RIGHT”を指定すると,文章長方

形の右端を文章位置に位置付ける。

垂直位置は,フォントに固有の,字形を定める基準線によって指定する(

図 13.2 参照)。値“TOP”

を指定すると,文章長方形の頂線を文章位置にそろえる。値“CAP”を指定すると,文字列の全高線

をそろえる。値“HALF”を指定すると,文字列の半高線をそろえる。値“BASE”を指定すると,文

字列の並び線をそろえる。値“BOTTOM”を指定すると,文章長方形の底線をそろえる。

プログラムの実行を開始する時の文章そろえの値は,

“LEFT”及び“BOTTOM”とする。

(16)

【機能語 TEXT JUSTIFY をもつ ask 文を実行すると,現在の文章そろえの水平位置及び垂直位置の値

がそれぞれ 1 番目及び 2 番目の文字列変数に代入される。返される値は,すべて英大文字とする。

(17)

字形の基準線を

図 13.2 に示す。


125

X 3003-1993

図 13.2  字形の基準線

13.2.5

例外状態  例外状態は,次による。

(1)

機能語【COLOR MIX,】POINT COLOR,LINE COLOR,TEXT COLOR 又は AREA COLOR をもつ set

文の色指標が,ゼロより小さい又は処理系定義の最大色指標より大きい。

(11085,続行可能。処理系

定義の省略時想、定値を用いる。

(2)

機能語 LINE STYLE をもつ set 文の指標の値が,ゼロ以下である又は利用可能な形の最大値より大き

い。

(11062,続行可能。値 1 を用いる。

参考  ANSI X3.113 では,(2)及び(3)の“指標”が数値式となっているが,誤りであるので,TIB によ

って訂正した。

(3)

機能語 POINT STYLE をもつ set 文の指標の値が,ゼロ以下である又は利用可能な形の最大値より大き

い。

(11056,続行可能。値 3 を用いる。

(4)

【機能語 TEXT HEIGHT をもつ set 文の数値式の値がゼロ以下である。

(11073,続行可能。今までの

値を維持して処理を続ける。

(5)

機能語 TEXT JUSTIFY をもつ set 文の文字列式の値が,13.2.4(15)に規定された値でない。

(4102,続行

可能。今までの値を維持して処理を続ける。

(6)

【機能語 COLOR MIX をもつ set 文の三原色指定の数値式の値が,

ゼロより小さい又は 1 より大きい。

(11088,続行可能。今までの値を維持して処理を続ける。

13.2.6

注意  注意は,次による。

(1)

機能語 MAX COLOR をもつ ask 文に対して処理系が返す色の個数は,同時に表示することのできる色

(背景色は除く。

)の個数とすることが望ましい。一つの装置において利用可能な色の総数ではない。

(2)

【処理系は,色指標の値の一部又は全部に対して,色混合率をあらかじめ定義しておいてもよい。

(3)

【処理系は,可能ならば,問題座標における文字の幅を,機能語 TEXT HEIGHT によって定められる

文字の高さに比例させることが望ましい。

(4)

【処理系は,単色の表示装置に対する強度を,0.30×赤+0.59×緑+0.11×青とすることが望ましい。

(5)

次の BASIC の文は,次の GKS の機能に対応する。

BASIC

clear 


126

X 3003-1993

GKS

:機能 CLEAR WORKSTATION (#0, CONDITIONALLY)

BASIC

:機能語 LINE STYLE 又は POINT STYLE をもつ set 

GKS

:機能 SET LINETYPE 又は SET MARKER TYPE

BASIC

:機能語 LINE COLOR,POINT COLOR,TEXT COLOR 又は AREA COLOR をもつ set 

GKS

:機能 SET POLYLINE COLOUR INDEX,SET POLYMARKER COLOUR INDEX,SET TEXT

COLOUR INDEX

又は SET FILL AREA COLOUR INDEX

【BASIC :機能語 TEXT HEIGHT をもつ set 

GKS

:機能 SET CHARACTER HEIGHT

BASIC

:SET TEXT ANGLE X という set 

GKS

:機能 SET CHARACTER UP VECTOR (Cos(X+PI/2), Sin (X+PI/2))

BASIC

:機能語 JUSTIFY をもつ set 

GKS

:機能 SET TEXT ALIGNMENT

BASIC

:機能語 COLOR MIX をもつ set 

GKS

:機能 SET COLOUR REPRESENTATION】

(6)

次の BASIC の質問対象は,GKS の機能 INQUIRE CURRENT INDIVIDUAL ATTRIBUTE VALUES の,

次の係数に対応する。

BASIC GKS

LINE STYLE

線の種類 (linetype)

POINT STYLE

マーカの種類 (marker type)

LINE COLOR

線の色指標 (polyline colour index)

POINT COLOR

マーカの色指標  (polymarker colour index)

TEXT COLOR

文章の色指標  (text colour index)

AREA COLOR

塗りつぶし領域の色指標  (fill area colour index)

(7)

【次の BASIC の質問対象は,GKS の機能 INQUIRE CURRENT PRIMITIVE ATTRIBUTE VALUES の係

数から,次のようにして導くことができる。ここで DX と DY は,文字の上げ下げ (character up) の値

から求める。

BASIC GKS

TEXT HEIGHT

文字の高さ (character height)

TEXT ANGLE

ANGLE

面(DX, DY)−PI/2

TEXT JUSTIFY

文字のそろえ (text alignment)】

(8)

【次の BASIC の文は,次の GKS の機能に対応する。

BASIC

: 機能語 COLOR MIX をもった ask 

GKS

: 機能 INQUIRE COLOUR REPRESENTATION において図形処理装置を#0 とし,返る値を

REALIZED

としたときの指標及び色係数


127

X 3003-1993

BASIC

: 機能語 MAX LINE STYLE をもつ ask 

GKS

: 機能 INQUIRE POLYLINE FACILITIES における利用可能な線の種類の係数の個数

BASIC

: 機能語 MAX POINT STYLE をもつ ask 

GKS

: 機能 INQUIRE POLYMARKER FACILITIES における利用可能なマーカの種類の係数の個

数】

(9)

【同時に表示することのできる色の個数を,

“色彩表の項目数”の係数によって示す GKS 処理系にお

いては,GKS の機能 INQUIRE LIST OF COLOUR INDICES によってこれを知ることができる。機能語

MAX COLOR

をもつ ask 文は,この値より 1 小さい値を返す。

13.3

図形出力

13.3.1

概要  ここでは,各種の図形出力の生成に使う文を規定する。利用者は,図形出力文によって,画

面上に点,線分又は塗りつぶし領域を描くことができる。図形出力文には,そのほかに文章を描画中に含

める機能【や着色胞 (colored cell) の配列を出力する機能】がある。図形出力文の効果は,13.1 及び 13.2

に規定したさまざまな設定対象の現在値によって制御される。

【図形出力の追加の機能が,

13.5

に規定して

ある。

13.3.2

構文  構文は,次による。

(1)

単純実行文⊃図形出力文

(2)

図形出力文=幾何図形文|【機何図形 mat 文|】図形 text 文【|mat-cells 文】

(3)

幾何図形文⊃図形動詞  幾何対象  コロン  点並び

(4)

図形動詞⊃GRAPH

(5)

幾何対象=POINTS|LINES|AREA

(6)

点並び=座標対  {セミコロン  座標対}

*

(7)

座標対=数値式  コンマ  数値式

(8)

【幾何図形 mat 文=MAT  図形動詞  幾何対象  {コンマ  limit 句}?  コロン  配列点並び】

(9)

limit 句=LIMIT  指標】

(10)

【配列点並び=数値配列名  {コンマ  数値配列名}?】

(11)

図形 text 文= 図形動詞  TEXT  開始点  {コンマ  USING  書式引用  コロン  式並び|コロン

文字列式} 

(12)

開始点=コンマ  AT  座標対

(13)

mat-cells 文=MAT  図形動詞  CELLS  コンマ  IN  点対  コロン  数値配列名】

(14)

【点対=座標対  セミコロン  座標対】

(15)

【配列点並び (array-point-list) に数値配列を二つ指定するときには,それらは両方とも 1 次元でなけ

ればならない。一つのときには,2 次元でなければならない。

(16)

幾何対象 LINES をもつ図形出力文では,その点並び (point-list) の中に少なくとも二つの座標対

(coordinate-pair)

をもたなければならず,幾何対象 AREA をもつ図形出力文では,少なくとも三つの座

標対をもたなければならない。

13.3.3

例  構文の例を次に示す。

 GRAPH  LINES:3,4;5,6;66.66,77.77

(3)

 MAT GRAPH POINTS:XY_PTS

(8)


128

X 3003-1993

 MAT GRAPH AREA, LIMIT 7:X,Y

(8)

【GRAPH TEXT, AT XP,YP:”here is the label:”& TEXT$

(11)

【GRAPH TEXT, AT 0,Y_VALUE, USING ”##. ##^^^^” : , Y_VALUE

(11)

【MAT GRAPH CELLS, IN p_i_x, p_l_y;p_2_x, p_2_y:color_array

(13)

13.3.4

意味  意味は,次による。

(1)

図形出力文

(1.1)

利用者による図形出力の生成は,すべて図形出力文によって行われる。幾何図形文【及び幾何図形

mat

文】は,形及び色を与えられた描点列,接続した線分の集まり又は多角形の塗りつぶし領域を

描く。図形 text 文は,英数字で構成される名札を作り出す。

mat-cells 文は,長方形で閉じられた

領域中に長方形の着色胞の集合を生成する。

(1.2)

print 文,input 文及び trace 文によって生成される出力は,図形出力文によって生成される出力

に影響を与えない。

(2) 

幾何図形文【及び幾何図形 mat 文】

(2.1)

幾何図形文【及び幾何図形 mat 文】は,問題座標中で指定された点の列を与える。幾何図形文では,

点並び中の最初の座標対が最初の点を示し,以下順次に点並びの終りまでの座標対が点の列を定め

る。

【幾何図形 mat 文では,limit 句と配列点並びとが点の列を次のとおりに定める。limit 句を書く

と,指標が最も近い整数値に丸められて評価され,その値が点の個数になる。limit 句を書かないと,

配列点並びに書いたベクトルの長さ又は配列の第 1 次元の要素数が,点の個数になる。配列点並び

が二つのベクトルで構成されている場合には,点の 座標は 1 番目のベクトルからとられ,座標

は 2 番目のベクトルからとられる。配列点並びが 2 次元の配列であり,その配列の第 2 次元の寸法

が 2 であれば,座標は第 1 列からとられ,座標は第 2 列からとられる。点の列は,いつも配列の

第 1 行又はベクトルの第 1 要素から始まり,順次にとられる。点の列は,limit 句のない場合には配

列又はベクトルの終りで終了し,limit 句のある場合にはそこで指定された点の個数に達したときに

終了する。

(2.2)

幾何対象が POINTS である場合,POINT STYLE 及び POINT COLOR の現在値に応じた形及び色の

点が描かれる。

幾何対象が LINES である場合,隣接した各 2 点を結んで,1 番目の点から 2 番目の点,2 番目の

点から 3 番目の点へというように線分が描かれる。したがって線分の本数は,点の個数より 1 だけ

少なくなる。線分の形及び色は,LINE STYLE 及び LINE COLOR の現在値によって定められる。

幾何対象が AREA である場合,この LINES の規定と同じ線分の連なりを辺とする多角形が,内

部を塗りつぶされて描かれる。点の連なりの最初と最後の点が同一点でないときには,その 2 点を

つなぐ線分が追加されて外周が完成される。AREA COLOR の現在値が,多角形の辺及び内部の色

を定める。ある点を起点とする半直線が多角形の辺と奇数回交差するとき,そのようなすべての点

(画素)の集合をその多角形の内部と定義する。それが可能な装置では,多角形の内部は,すきま

なく塗りつぶされる。

(2.3)

【第 2 次元の寸法が 3 以上である配列をもつ配列点並びの効果は,処理系定義とする。

(3)

図形 text 

(3.1)

図形 text 文は,その文字列式又は書式文字列と式並びとによって生成される文字の列からなる名札

を描く。

【書式文字列によって生成される文字の列は,10.4 による。

】名札として使われる文字は,


129

X 3003-1993

処理系定義の寸法,形【及び方向】をもつ。画面上の視野面の内と外にまたがって置かれる文字の

切取り方は,処理系定義とする。

(3.2)

簡易図形出力における名札の表示のされ方は,13.2.1(5)による。

【図形機能単位における名札の表示

のされ方は,TEXT HEIGHT,TEXT JUSTIFY 及び TEXT ANGLE の現在値によって制御される。

(4)

mat-cells 

(4.1)  mat-cells

文は,長方形の領域を塗りつぶす。長方形の対角位置にある二つの頂点の問題座標を,点

対によって与える。数値配列の現在の寸法が,胞数を定める。第 1 次元の寸法が水平方向の列数,

第 2 次元の寸法が垂直方向の行数になる。各胞は同一の大きさとし,

(ABS(1 番目の 座標−2 番目の 座標)/第 1 次元の寸法)の幅,

(ABS(1 番目の 座標−2 番目の 座標)/第 2 次元の寸法)の高さ

をもつ。各胞は,その数値配列中の対応する要素の値を丸めた指標で示される色で塗りつぶされ

る。点対の第 1 点のほうの位置にある胞が,配列の第 1 行,第 1 列の要素に対応する。点対の第 2

点のほうの位置にある胞が,配列の最後の行,最後の列の要素に対応する。

例  配列 A が次の値をもっているとする。

A (1, 1)

=7, A (1, 2)  =5,

A (2, 1)

=8, A (2, 2)  =6,

A (3, 1)

=9, A (3, 2)  =7

ここで次の文を実行する。

mat graph cells, in 1,3;7,1:A

点対は,1, 3; 7, 1 すなわち (1, 3) 及び (7, 1) の 2 点である。その結果,長方形は次のようになる。

指標はその胞の色を表す。

(4.2)

出力装置が画素出力の能力をもたないとき,処理系は,胞出力を模擬しなければならない。模擬の

最低条件は,変形された結果の胞長方形の外縁を描くこととする。

13.3.5

例外状態  例外状態は,次による。

(1)

limit 句の指定がなく,配列点並び中の二つのベクトル中の要素の個数が等しくない。

(6401,続行

不能)

(2)

【配列点並び中に,

ただ一つの数値配列だけが指定されており,

その第 2 次元の寸法が 1 である。

(6401,

続行不能。

(3) 

limit 句の指標の値がゼロ以下である,又は配列点並びで利用可能な点の個数より大きい。

(6402,

続行不能。

(4)

幾何対象 LINES をもつ図形出力文が,1 点以下の点を指定している。

(11100,続行不能。

(5)

幾何対象 AREA をもつ図形出力文が,2 点以下の点を指定している。

(11100,続行不能。


130

X 3003-1993

(6)

mat-cells 文中の数値配列によって指定されている色指標が,利用可能でない。

(11085,続行可能。

処理系定義の省略時想、定値を用いる。

13.3.6

注意  注意は,次による。

(1)

図形 text 文は,装置のハードウェアによって生成される文字集合を容易に参照できるように設計され

ている。

【だから例えば,個々の文字の向きや一般の向きの文章の方向などは,規定しない。

(2)

文章は,問題座標を用いて指定される。したがって,窓と視野面の縦横比が異なる場合には,文章が

歪むことがある。

(3)