# BASIC言語について -------------------------------------------------------------------------------- ### 留意点 - キーワードは大文字小文字が区別されない - 変数名・引数名は大文字小文字が区別される - プログラムエントリ名には小文字は使えない - 例外やエラーの機構は組み入れてない(一般的に例外やエラーが発生するような箇所も実行が継続する) - 1ファイルにつき1つのプログラムを記述する - 要素アクセスや位置指定は0-based indexing -------------------------------------------------------------------------------- ### 基本構成 プログラムエントリ名の指定なし(プログラムエントリ名は*MAIN*になる) ``` [Option部] [Extern Sub部] [Argument部] [Dim部] [プログラム部] ``` プログラムエントリ名の指定あり ``` [Option部] [Extern Sub部] Sub プログラムエントリ名 [Argument部] [Dim部] [プログラム部] End Sub ``` | | | |:-------------|:--------------------------------------------------------------------------| | Option部 | CASL2ソースへの変換に関する指定をする場所 | | Extern Sub部 | 外部定義のCASL2コードを呼び出すための宣言をする場所 | | Argument部 | 外部定義のCASL2コードから呼び出される場合に受け取る引数仕様を宣言する場所 | | Dim部 | プログラムで使用する全ての変数を宣言する場所 | | プログラム部 | プログラムのメイン処理を書く場所 | -------------------------------------------------------------------------------- ### プログラムエントリ名 基本的にはCASL2のラベルの規則に従う (1~8文字、頭文字は英大文字、2文字目以降は英大文字か数字、GR0~GR7は不可) 使用できないプログラムエントリ名(b2c2により使用される) - ALLOC - EOF - EXIT - MEM - 接頭が次のいずれかの文字列で以降に数字が続くもの + ARG + B + BA + C + F + I + IA + J + LB + LL + SB + SL + T + TB + TL + V -------------------------------------------------------------------------------- ### 型 - 真理値 - 符号付整数 - 文字列 (符号付整数の可変長の配列としての使用も可能) - 真理値の固定長の配列 - 符号付整数の固定長の配列 #### 真理値 リテラル: - `True` - `False` 内部表現: - 1語 - `#FFFF`は`True`として解釈 - `#0000`は`False`として解釈 - それ以外の値の場合が真理値として渡されたときの動作は未定義 #### 符号付整数 リテラル: - 10進表記 `-32768`~`32767` - 16進表記 `&H0000`~`&HFFFF` (`&H8000`~`&HFFFF`は負数として扱われる) - 文字リテラル(文字コード) + 1文字の図形文字または半角スペースを`"`と`"c`で囲む( 例: `"A"c` ) + `"`の場合は`""""c`で記述 内部表現: - 1語 - 2の補数表現(16ビット) #### 文字列 符号付整数の可変長の配列としての使用も可能 リテラル: - 0文字以上の図形文字と半角スペースの組み合わせを`"`で囲む - `"`を含む文字列の場合は`"`を`""`で記述 - 文字列の最大長は256文字 - Unicodeスカラー値(32ビット)を1文字として扱う 内部表現: - 長さ情報の格納に1語の領域が確保される - 文字の格納に256語の連続領域が確保される - 長さの領域の直後に文字の領域が続くよう確保される - 長さ情報が壊れている場合、文字列を扱う処理全ての動作は未定義(データを破壊して暴走する可能性がある) #### 真理値の固定長の配列 リテラル: - なし 内部表現: - 宣言時に配列長に関する情報を指定する - 配列長の最小は1語、最大は256語 - 配列長分の連続領域が確保される - 各要素は真理値の定義に従う #### 符号付整数の固定長の配列 リテラル: - なし 内部表現: - 宣言時に配列長に関する情報を指定する - 配列長の最小は1語、最大は256語 - 配列長分の連続領域が確保される - 各要素は符号付整数の定義に従う -------------------------------------------------------------------------------- ### キーワード(予約語?)一覧 | キーワード | 概要 | 分類 | |:-----------|:----------------------------------------|:---------:| | Abs | 整数の絶対値を返す | 関数 | | And | 論理積を計算 | 演算子 | | Argument | プログラムの引数を指定 | 構文 | | Array | 一時的な固定長配列を生成 | 関数 | | As | 変数・引数の型指定に使用 | 構文 | | Asc | 文字列の先頭の値を返す | 関数 | | Boolean | 真理値の型名 | 型 | | ByRef | 参照渡しの引数宣言に使用 | 構文 | | ByVal | 値渡しの引数宣言に使用 | 構文 | | CArray | 固定長配列に変換 | 関数 | | CBool | 整数を真理値に変換 | 関数 | | CInt | 整数に変換 | 関数 | | CStr | 値を文字列表現に変換 | 関数 | | Call | 外部プログラムの呼び出し | 構文 | | Case | Selectの分岐の定義に使用 | 構文 | | Chr | 長さ1文字の文字列に変換 | 関数 | | Continue | For/Doの続く処理をスキップする | 構文 | | Dim | 変数の宣言 | 構文 | | Do | 条件ループ処理の開始点 | 構文 | | Else | 条件を満たさない分岐先として使用 | 構文 | | ElseIf | 条件分岐の1つとして使用 | 構文 | | End | コードブロックの終了 | 構文 | | Eof | 最後のInputがEOFだったかを返す | 関数 | | Exit | コードブロックから脱出する | 構文 | | Extern | 外部プログラムの宣言 | 構文 | | False | 真理値のリテラル | 値 | | Fill | 配列を指定の値で埋める | 構文 | | For | カウンタループの開始点 | 構文 | | From | 引数に対応するレジスタの指定に使用 | 構文 | | If | 条件分岐の最初の条件 | 構文 | | Input | ユーザ入力を受け取る | 構文 | | Integer | 整数の型名 | 型 | | Len | 文字列や配列の長さを返す | 関数 | | Loop | Doループのブロック終端に使用 | 構文 | | Max | 2つの整数のうちの最大値を返す | 関数 | | Mid | 部分文字列の取得や更新 | 構文/関数 | | Min | 2つの整数のうち最小値を返す | 関数 | | Mod | 余りを計算する | 演算子 | | Next | Forループのブロック終端に使用 | 構文 | | Not | 論理否定を計算 | 演算子 | | Option | CASL2ソース変換に関する指定 | 構文 | | Or | 論理和を計算 | 演算子 | | Print | 値や文字列を画面に出力 | 構文 | | Rem | コメント行 | 構文 | | Select | 値や文字列分岐処理の開始点 | 構文 | | Space | 半角スペースの文字列を返す | 関数 | | Step | Forループのカウンタの変化量指定に使用 | 構文 | | String | 文字列の型名、文字列の生成 | 型/関数 | | Sub | プログラムエントリ名の指定に使用 | 構文 | | SubArray | 部分配列を取得 | 関数 | | Then | If文における飾り | 構文 | | To | Forループの終了値などに使用 | 構文 | | True | 真理値のリテラル | 値 | | Until | Doループの条件指定に使用、Trueなら終了 | 構文 | | While | Doループの条件指定に使用、Trueなら継続 | 構文 | | With | 外部プログラム宣言の引数記述に使用 | 構文 | | Xor | 排他的論理和を計算 | 演算子 | -------------------------------------------------------------------------------- ### 演算子 | 順位 | 演算子 | 概要 | 種類 | 対象 | |-----:|:------:|:--------------------------------------------------------|:----------:|:-------------:| | 1 | `-` | 整数の符号反転(※5) | 単項演算子 | 整数 | | 1 | `Not` | 整数のビット反転 | 単項演算子 | 整数 | | 1 | `Not` | 真理値の論理否定 | 単項演算子 | 真理値 | | 2 | `>>` | 算術右シフト (SRAを実行) | 二項演算子 | 整数 | | 2 | `<<` | 算術左シフト (SLAを実行) | 二項演算子 | 整数 | | 2 | `>>>` | 論理右シフト (SRLを実行) | 二項演算子 | 整数 | | 2 | `<<<` | 論理左シフト (SLLを実行) | 二項演算子 | 整数 | | 3 | `*` | 2つの整数の積。掛け算 | 二項演算子 | 整数 | | 3 | `\` | 2つの整数の商。割り算 (※6) | 二項演算子 | 整数 | | 3 | `Mod` | 2つの整数の剰余。剰余演算 (※6) | 二項演算子 | 整数 | | 4 | `+` | 2つの整数の和。足し算 | 二項演算子 | 整数 | | 4 | `-` | 2つの整数の差。引き算 | 二項演算子 | 整数 | | 4 | `&` | 2つの文字列を結合 | 二項演算子 | 文字列 | | 5 | `<` | 2つの整数で左辺値が小さい場合に`True` | 二項演算子 | 整数 | | 5 | `>` | 2つの整数で右辺値が小さい場合に`True` | 二項演算子 | 整数 | | 5 | `>=` | 2つの整数で左辺値が小さい場合に`False` | 二項演算子 | 整数 | | 5 | `<=` | 2つの整数で右辺値が小さい場合に`False` | 二項演算子 | 整数 | | 5 | `<` | 2つの整数配列で左辺が辞書順で小さい場合に`True` (※7) | 二項演算子 | 整数配列(※3) | | 5 | `>` | 2つの整数配列で右辺が辞書順で小さい場合に`True` (※7) | 二項演算子 | 整数配列(※3) | | 5 | `>=` | 2つの整数配列で左辺が辞書順で小さい場合に`False` (※7) | 二項演算子 | 整数配列(※3) | | 5 | `<=` | 2つの整数配列で右辺が辞書順で小さい場合に`False` (※7) | 二項演算子 | 整数配列(※3) | | 6 | `=` | 2つのデータが一致する場合に`True` | 二項演算子 | 全ての型 | | 6 | `<>` | 2つのデータが一致しない場合に`True` | 二項演算子 | 全ての型 | | 7 | `And` | 2つの整数のビット論理積 | 二項演算子 | 整数 | | 7 | `Or` | 2つの整数のビット論理和 | 二項演算子 | 整数 | | 7 | `Xor` | 2つの整数のビット排他的論理和 | 二項演算子 | 整数 | | 7 | `And` | 2つの真理値の論理積 | 二項演算子 | 真理値 | | 7 | `Or` | 2つの真理値の論理和 | 二項演算子 | 真理値 | | 7 | `Xor` | 2つの真理値の排他的論理和 | 二項演算子 | 真理値 | | 8 | `,` | パラメータの区切りに使用される | 二項演算子 | 全ての型 | - ※1 ... 二項演算子は全て左結合 - ※2 ... `,`以外の二項演算子は同一の型同士にのみ使用できる - ※3 ... 整数配列とは文字列と符号付整数の固定長配列の2つを指す - ※4 ... オーバーフローは検知せず無視する - ※5 ... `-32768`は符号反転せず`-32768`のままになる - ※6 ... 0で除算してもエラーにはならず、計算結果は不定 - ※7 ... 辞書順は配列の先頭から順に1語ごとの整数比較を行い最初の違いを辞書順の比較結果とする -------------------------------------------------------------------------------- ### コメント行(Rem) `Rem`または`'`から始まる行はコメント行となる コメントにはUTF-8の有効な文字を使用する コメントは無視されるためプログラムの変換に影響を与えることはない 例: ```vb Rem これはコメント ' これもコメント Dim i As Integer For i = 0 To 5 Rem ここもコメント ' これもコメント Next i ``` 有効なステートメントの末尾で`'`から始まる行の残り部分がコメントになる 例: ```vb Dim i As Integer ' コメント For i = 0 To 5 ' コメント Print i ' コメント Next i ' コメント ``` -------------------------------------------------------------------------------- ### 変数宣言(Dim) 変数を使用する場合は宣言する必要がある Dim文1つにつき1つの変数を宣言できる 変数名は - 1文字以上、30文字以下 - 頭文字は大文字か小文字の英字 - 2文字目以降は大文字か小文字の英字か数字かアンダースコア - 文字は全て半角(ASCII範囲) - 英字の大文字小文字は区別される - プログラム内でユニークになるように命名する必要がある - キーワード(予約語)に一致する名前は使用できない - Argument部の引数名に一致する名前は使用できない | 型 | 書式 | |:-----------------------|:--------------------------------| | 真理値 | `Dim 変数名 As Boolean` | | 符号付整数 | `Dim 変数名 As Integer` | | 文字列 | `Dim 変数名 As String` | | 真理値の固定長配列 | `Dim 変数名(上界値) As Boolean` | | 符号付整数の固定長配列 | `Dim 変数名(上界値) As Integer` | ※上界値は配列長におけるインデックスの最大値を指す (つまり`配列長-1`) ※配列長は1~256 (つまり上界値は0~255) ※上界値は整数リテラルで指定する 例: ```vb Dim myFlag As Boolean Dim Value123 As Integer Dim foo_bar As String Dim flags(9) As Boolean Dim my_array(255) As Integer ``` 変数のメモリ領域について: - 真理値、整数、文字列、真理値固定長配列、整数固定長配列の順で連続した領域に確保される(型ごとの順序は宣言順になる) - デフォルト動作では変数名に1対1で対応するCASL2のラベル(DS領域)が用意される - デフォルト動作ではプログラム(サブルーチン)のスタート時に変数領域は0で初期化される -------------------------------------------------------------------------------- ### 式 リテラル、変数、関数、演算子、演算順序を決める括弧`( )`による組み合わせで構成される 例: (※`abc`,`efg`は整数変数とする) - 結果が整数の式: `123 + (345 * 10) - 5` - 結果が整数の式: `(abc + 4) * Max(1, efg)` - 結果が真理値の式: `(abc = 123) Or (efg <> 123)` - 結果が文字列の式: `"ABC" & CStr(abc + 5) & "EFG"` -------------------------------------------------------------------------------- ### 変数への代入 `変数名 = 式`で変数に値を代入できる 代入はコピーによって実現される(配列や文字列も値を全部コピーする) 例: ```vb Dim intValue As Integer Dim blnValue As Boolean Dim strValue As String Dim intArray(4) As Integer Dim blnArray(4) As Boolean intValue = 1234 intValue = 5 - 3 * 2 blnValue = True strValue = "ABC" & "EFG" intArray = Array(1, 2, 3, 4, 5) blnArray = Array(True, False, False, True, True) ``` 整数変数の場合は加算代入・減算代入を行うことができる - 加算代入 `変数名 += 式` (`変数名 = 変数名 + (式)`と計算結果は同じだが変換後のコード量が異なる場合がある) - 減算代入 `変数名 -= 式` (`変数名 = 変数名 - (式)`と計算結果は同じだが変換後のコード量が異なる場合がある) 例: ```vb Dim intValue As Integer intValue = 123 intValue += 10 intValue -= 99 ``` -------------------------------------------------------------------------------- ### 要素アクセス(文字列、配列) `変数名(インデックス)`で配列・文字列の要素にアクセスできる インデックスが範囲外を示すとき範囲内に収まるように丸められる(負数なら0、配列長以上なら上界値) 長さ0の文字列の要素にアクセスした場合はエラーにならず何らかの値が返る 長さデータの壊れた文字列に対する要素アクセスの結果は未定義 例: ```vb Dim i As Integer Dim iArr(5) As Integer Dim bArr(5) As Boolean Dim str1 As String str1 = "ABCDEF" For i = 0 To 5 ' 値取得 Print iArr(i) Print bArr(i) Print str1(i) ' 代入 iArr(i) = 123 bArr(i) = True str1(i) = "a"c Next i ``` 特別なケースとして文字列リテラルに対しても要素アクセスが可能(値取得のみ) 例: ```vb Dim i As Integer Dim ch As Integer For i = 0 To 5 ch = "ABCDEF"(i) Print Chr(ch) Next i ``` 整数の固定長配列の場合は要素に対して加算代入・減算代入を行うことができる 例: ```vb Dim iArr(4) As Integer iArr = Array(1, 2, 3, 4, 5) iArr(3) += 123 iArr(2) -= 999 ``` -------------------------------------------------------------------------------- ### カウンタ付きループ(For) カウンタの値を変化させながら目標値を超えるまでループ内の処理を繰り返す - 変化量が0以上の場合、カウンタが目標値以下の間ループ内が実行される - 変化量が負数の場合、カウンタが目標値以上の間ループ内が実行される 書式: - ループ始点: `For カウンタ = 初期値 To 目標値 Step 変化量` - ループ終点: `Next カウンタ` - `Step 変化量`は省略できる。省略した場合は変化量は`1` | | | |:---------|:-----------------------------------------------------------| | カウンタ | 整数変数名 | | 初期値 | 整数の式。ループの一番初めにこの値でカウンタが初期化される | | 目標値 | 整数の式。カウンタがこの値を超えるまでループ内が実行される | | 変化量 | 整数の式。ループ始点に戻るたびにカウンタに加算される | 例: ```vb Dim i As Integer For i = 0 To 6 Step 2 Print i Next i ``` カウンタ付きループに関するステートメント | | | |:---------------|:-------------------------------------------------------------------------| | `Exit For` | ループを抜けて`Next カウンタ`の次のステートメントに実行を移す | | `Continue For` | ループ内の後に続く処理を飛ばしカウンタを更新しループの継続条件判定をする | -------------------------------------------------------------------------------- ### 条件付きループ(Do) 条件を満たす間ループ内の処理が繰り返される - `While`指定の場合、条件が`True`の間ループ内が実行される - `Until`指定の場合、条件が`False`の間ループ内が実行される - `While`も`Until`も指定がない場合は無限ループとなる - 条件が前置(Doの位置)の場合、ループに入る一番最初も条件が評価される - 条件が後置(Loopの位置)の場合、ループ内を最低でも1回実行後に条件が評価される - 条件式は真理値を返す式 - 真理値が壊れている場合の動作は未定義 ```vb Do While 条件式 Loop ``` ```vb Do Until 条件式 Loop ``` ```vb Do Loop While 条件式 ``` ```vb Do Loop Until 条件式 ``` ```vb Do Loop ``` 例: ```vb Dim i As Integer i = 0 Do While i < 5 i += 1 Print i Loop ``` ```vb Dim i As Integer i = 0 Do Until i = 5 i += 1 Print i Loop ``` ```vb Dim i As Integer i = 0 Do i += 1 Print i Loop While i < 5 ``` ```vb Dim i As Integer i = 0 Do i += 1 Print i Loop Until i = 5 ``` 条件付きループに関するステートメント | | | |:--------------|:---------------------------------------------------------| | `Exit Do` | ループを抜けて`Loop`の次のステートメントに実行を移す | | `Continue Do` | ループ内の後に続く処理を飛ばしループの継続条件判定を行う | -------------------------------------------------------------------------------- ### 条件分岐(If) 最初にTrueになった条件式に紐ついたブロック内のコードを実行する ElseIfブロックは0個以上置ける Elseブロックは最後尾に最大1つだけ置ける ``` If 条件式 Then ElseIf 条件式 Then Else End If ``` 例: ```vb Dim i As Integer Input i If i = 1 Then Print "One" ElseIf i = 3 Then Print "Trhee" ElseIf i = 5 Then Print "Five" Else Print "Else" End If ``` ```vb Dim i As Integer Input i If i Mod 2 = 0 Then Print "i is Even" Else Print "i is Odd" End If ``` ```vb Dim i As Integer Input i If i = 0 Then Print "i is Zero" End If ``` ```vb Dim i As Integer Input i If i < 0 Then Print "minus!" ElseIf i > 100 Then Print "too big!" End If ``` -------------------------------------------------------------------------------- ### 値による分岐(Select) 対応する値のあるブロック内のコードを実行する - 値は整数か文字列 - `Case`への列挙はリテラルのみ - 値に長さデータの壊れた文字列渡した場合の動作は未定義 ``` Select Case 式 Case リテラル値,リテラル値,リテラル値 Case リテラル値,リテラル値,リテラル値 Case Else End Select ``` 例: ```vb Dim i As Integer Input i Select Case i Case 1,3,5,7,9 Print "Odd" Case 2,4,6,8 Print "Even" Case 0 Print "Zero" Case Else Print "Other" End Select ``` ```vb Dim s As String Input s Select Case s Case "apple","cherry" Print "RED" Case "banana" Print "YELLOW" End Select ``` 値による分岐に関するステートメント | | | |:--------------|:-------------------------------------------------------------------------------| | `Exit Select` | ブロック内の残りのコードを飛ばして`End Select`の次のステートメントに実行を移す | -------------------------------------------------------------------------------- ### 脱出(Exit) コードブロックを抜ける | | | |:--------------|:---------------------------------| | `Exit Sub` | プログラム(サブルーチン)を抜ける | | `Exit For` | Forループのブロックを抜ける | | `Exit Do` | Doループのブロックを抜ける | | `Exit Select` | Caseブロックを抜ける | -------------------------------------------------------------------------------- ### 出力(Print) 値を文字列として出力する CASL2のOUT命令に送る 値に長さデータの壊れた文字列渡した場合の動作は未定義 | | | |:-------------------|:-----------------------------| | `Print 文字列の式` | 文字列を出力 | | `Print 真理値の式` | 値によってTrueかFalseを出力 | | `Print 整数の式` | 整数(-32768~32767)を出力 | | `Print` | 空文字列を出力 | 例: ```vb Print "ABC" & "EFG" Print True Print 123 * 10 + 55 Print ``` -------------------------------------------------------------------------------- ### 入力(Input) 1行を読み込んだデータを文字列変数または整数変数に代入する CASL2のIN命令を使用する EOF情報を更新する - `Input 整数変数名` - `Input 文字列変数名` - 整数の読み取りは関数`CInt`と同じ 例: ```vb Dim i As Integer Dim s As String Input i Input s ``` -------------------------------------------------------------------------------- ### 配列を指定の値で埋める(Fill) 配列や文字列を指定の値で埋める 文字列は長さ分だけ埋める - `Fill 真理値固定長配列変数名, 真理値の式` - `Fill 整数固定長配列変数名, 整数の式` - `Fill 文字列変数名, 整数の式` 例: ```vb Dim bArr(2) As Boolean Dim iArr(3) As Integer Dim s As String Fill bArr, True ' True, True, True Fill iArr, 123 ' 123, 123, 123, 123 s = "" Fill s, "x"c ' "" s = "ABCD" Fill s, "x"c ' "xxxx" ``` -------------------------------------------------------------------------------- ### 文字列変数の部分文字列を更新(Mid) 文字列変数の部分文字列を更新する 文字列変数の長さは変更せず文字データのみ更新する 長さデータの壊れた文字列変数を渡した場合の動作は未定義 - `Mid(文字列変数名, 開始位置, 長さ) = 文字列の式` - `Mid(文字列変数名, 開始位置) = 文字列の式` (文字列変数の最後尾までが更新対象) - 開始位置は整数の式で指定 - 長さは整数の式で指定 例: ```vb Dim s As String s = "" Mid(s, 1, 3) = "ABCDEFG" ' "" s = "123" Mid(s, 1, 3) = "ABCDEFG" ' "1AB" s = "123456" Mid(s, 1, 3) = "ABCDEFG" ' "1ABC56" s = "123456" Mid(s, 1, 3) = "XY" ' "1XY456" ``` ```vb Dim s As String s = "" Mid(s, 1) = "ABCDEFG" ' "" s = "123" Mid(s, 1) = "ABCDEFG" ' "1AB" s = "123456" Mid(s, 1) = "ABCDEFG" ' "1ABCDE" s = "123456" Mid(s, 1) = "XY" ' "1XY456" ``` -------------------------------------------------------------------------------- ### 関数 | 関数名 | 概要 | |:---------|:----------------------------| | Abs | 整数を絶対値を取得 | | Array | 一時的な固定長配列を生成 | | Asc | 文字列の先頭の値を取得 | | CArray | 固定長配列に変換 | | CBool | 整数を真理値に変換 | | Chr | 1文字の文字列に変換 | | CInt | 整数に変換 | | CStr | 値を文字列表現に変換 | | Eof | EOF情報を取得 | | Len | 配列や文字列の長さを取得 | | Max | 2つの整数の内の最大値を取得 | | Mid | 部分文字列を取得 | | Min | 2つの整数の内の最小を取得 | | Space | 半角スペースの文字列を取得 | | String | 文字列の生成 | | SubArray | 固定長配列の部分配列を生成 | #### 整数を絶対値を取得(Abs) -32767~32767の整数の絶対値を取得する ただし、-32768は絶対値の取得はできない(-23768のまま) 書式: `Abs(整数の式)` 例: ```vb Dim i As Integer i = -123 Print i ' -123 Print Abs(i) ' 123 ``` #### 一時的な固定長配列を生成(Array) 値を列挙した個数のサイズの一時的な固定長配列を生成する 値の個数はは1個以上256個以下 - 真理値の配列の場合 `Array(真理値の式, 真理値の式, ..)` - 整数の配列の場合 `Array(整数の式, 整数の式, ..)` 例: ```vb Dim bArr(4) As Boolean Dim iArr(4) As Integer Dim i As Integer i = 100 bArr = Array(True, False, True, i <= 50, i = 100) iArr = Array(123, 10 * 4, i, i * 2, -999) ``` #### 文字列の先頭の値を取得(Asc) `Asc`は文字列の式の結果の文字列の先頭の値を取得 文字列の長さが0の場合の値は未定義 文字列変数や文字列リテラルの場合、要素アクセスの`文字列変数名(0)`や`文字列リテラル(0)`と同じ値を取得するので`Asc`を使う利点はない 例: ```vb Dim s As String s = "ABCD" Print ("A"c = Asc(s)) ' True Print ("A"c = Asc("ABC")) ' True Print ("A"c = Asc(s & "CD")) ' True Print ("1"c = Asc(CStr(123))) ' True s(0) = 12345 Print Asc(s) ' 12345 ``` #### 固定長配列に変換(CArray) 固定長配列に変換というよりはコピー配列を生成といったほうが実態を表す 文字列を一時的な整数の固定長配列にコピー、もしくは固定長配列を異なる長さの一時的な固定長配列にコピー - `CArray(真理値固定長配列, 配列長)` - `CArray(整数固定長配列, 配列長)` - `CArray(文字列, 配列長)` - 配列長は整数リテラルで指定 - 上界値ではなく配列長を指定する 例: ```vb Dim bArr1(2) As Boolean Dim bArr2(4) As Boolean Fill bArr1, True bArr2 = Array(True, False, True, True, False) bArr1 = CArray(bArr2, 3) ' True, False, True Fill bArr2, True bArr1 = Array(False, True, True) bArr2 = CArray(bArr1, 5) ' False, True, True, False, False ``` ```vb Dim iArr1(2) As Integer Dim iArr2(4) As Integer Dim s As String Fill iArr1, 99 iArr2 = Array(1, 2, 3, 4, 5) iArr1 = CArray(iArr2, 3) ' 1, 2, 3 Fill iArr2, 777 iArr1 = Array(10, 20, 30) iArr2 = CArray(iArr1, 5) ' 10, 20, 30, 0, 0 Fill iArr1, 1 Fill iArr2, 2 s = "ABCDEFGHIJ" iArr1 = CArray(s, 3) ' "A"c, "B"c, "C"c, iArr2 = CArray(s, 5) ' "A"c, "B"c, "C"c, "D"c, "E"c Fill iArr1, 1 Fill iArr2, 2 s = "XY" iArr1 = CArray(s, 3) ' "X"c, "Y"c, 0 iArr2 = CArray(s, 5) ' "X"c, "Y"c, 0, 0, 0 ``` #### 整数を真理値に変換(CBool) 整数の値を真理値に変換する - `CBool(整数の式)` - 0なら`False` - 0以外なら`True` 例: ```vb Dim i As Integer i = 123 Print CBool(0) ' False Print CBool(1) ' True Print CBool(2) ' True Print CBool(-1) ' True Print CBool(i * 2) ' True Print CBool(123 - i) ' False ``` #### 1文字の文字列に変換(Chr) 引数の整数を先頭の値とする長さ1の一時的な文字列を生成する - `Chr(整数の式)` 例: ```vb Dim s As String Dim i As Integer s = "A" Print (s = Chr("A"c)) ' True i = "A"c Print (s = Chr(i)) ' True s(0) = 12345 Print (s = Chr(12345)) ' True ``` #### 整数に変換(CInt) 真理値や文字列を整数に変換する - `CInt(真理値の式)` - `CInt(文字列の式)` - 真理値の`False`は0に変換する - 真理値の`True`は-1に変換する - 文字列は先頭から10進数の整数と解釈できる部分までを読み取りその数値の下位16ビットを変換値とする - 文字列の先頭に10進数の整数と解釈できる部分が無い場合は0を返す 例: ```vb Print (0 = CInt(False)) ' True Print (-1 = CInt(True)) ' True Print (-1 = CInt(CBool(6))) ' True Print (123 = CInt("123")) ' True Print (123 = CInt("123XYZ")) ' True Print (-123 = CInt("-123")) ' True Print (32767 = CInt("32767")) ' True Print (-32768 = CInt("32768")) ' True Print (-32768 = CInt("-32768")) ' True Print (65 = CInt("65_535")) ' True Print (65 = CInt("65,535")) ' True Print (-1 = CInt("65535")) ' True Print (-2 = CInt("4294967294")) ' True Print (2 = CInt("-4294967294")) ' True Print (0 = CInt("ABCDE")) ' True Print (0 = CInt("&H1234")) ' True Print (0 = CInt("0x1234")) ' True Print (0 = CInt("#1234")) ' True Print (0 = CInt("")) ' True ``` #### 値を文字列表現に変換(CStr) 真理値や整数を文字列表現した文字列を生成する - `CStr(真理値の式)` - `CStr(整数の式)` - 真理値は`"True"`,`"False"`に - 整数は`"-32768"`~`"32767"`に 例: ```vb Print ("False" = CStr(False)) ' True Print ("True" = CStr(True)) ' True Print ("True" = CStr(CBool(6))) ' True Print ("254" = CStr(200 + 50 + 4)) ' True Print ("-33" = CStr(-33)) ' True ``` #### EOF情報を取得(Eof) 入力がEOFに到達している場合は`True`をそうでない場合は`False`を返す EOF情報はデフォルトでは他のプログラム(サブルーチン)とは共有していない 基本的には`Eof`を呼び出すプログラム内で最低でも1回は`Input`を実行する必要がある EOF情報は初期化されないため`Input`を一度も使用せずに`Eof`を呼び出した場合の値は不定 - `Eof()` 例: ```vb Dim s As String Input s If Eof() Then Print "No Data!" End If ``` #### 配列や文字列の長さを取得(Len) 配列や文字列の長さを取得 - `Len(文字列の式)` - `Len(真理値の固定長配列)` - `Len(整数の固定長配列)` 例: ```vb Dim bArr(3) As Boolean Dim iArr(8) As Integer Dim s As String Print (4 = Len(bArr)) ' True Print (9 = Len(iArr)) ' True s = "" Print (0 = Len(s)) ' True s = "ABCDE" Print (5 = Len(s)) ' True Print (5 = Len(Array(1, 2, 3, 4, 5))) ' True Print (5 = Len("ABCDE")) ' True Print (6 = Len("ABC" & CStr(123))) ' True ``` #### 2つの整数の内の最大値を取得(Max) 2つの整数の内の最大値を取得 - `Max(整数の式, 整数の式)` 例: ```vb Print (30 = Max(1, 30)) ' True Print (-77 = Max(-77, -100)) ' True Print (0 = Max(-100, 0)) ' True Print (120 = Max(30 + 40, 100 + 20)) ' True ``` #### 部分文字列を取得(Mid) 部分文字列を生成 - `Mid(文字列の式, 開始位置, 長さ)` - `Mid(文字列の式, 開始位置)` (文字列の最後尾までを取得) - 開始位置は整数の式で指定 - 長さは整数の式で指定 例: ```vb Print ("ABC" = Mid("ABCDEFG", 0, 3)) ' True Print ("CDE" = Mid("ABCDEFG", 2, 3)) ' True Print ("FG" = Mid("ABCDEFG", 5, 3)) ' True Print ("BC12" = Mid("ABC" & CStr(1234), 1, 4)) ' True Print ("ABCDEFG" = Mid("ABCDEFG", 0)) ' True Print ("CDEFG" = Mid("ABCDEFG", 2)) ' True Print ("FG" = Mid("ABCDEFG", 5)) ' True Print ("BC1234" = Mid("ABC" & CStr(1234), 1)) ' True ``` #### 2つの整数の内の最小を取得(Min) 2つの整数の内の最小値を取得 - `Min(整数の式, 整数の式)` 例: ```vb Print (1 = Min(1, 30)) ' True Print (-100 = Min(-77, -100)) ' True Print (-100 = Min(-100, 0)) ' True Print (70 = Min(30 + 40, 100 + 20)) ' True ``` #### 半角スペースの文字列を取得(Space) 指定した数だけ半角スペースを並べた文字列を生成する 文字列の長さは256以下まで - `Space(整数の式)` 例: ```vb Dim s As String s = Space(5) Print (5 = Len(s)) ' True Print (" " = s) ' True ``` #### 文字列の生成(String) 文字列を生成 文字列の長さは256以下まで - `String(整数の固定長配列)` 配列の長さと各要素の値が同じ文字列を生成する - `String(長さ, 値)` 値を長さだけ並べた文字列を生成する - 長さと値はそれぞれ整数の式で指定 例: ```vb Print ("ABCDE" = String(Array("A"c, "B"c, "C"c, "D"c, "E"c))) ' True Print ("AAAAA" = String(5, "A"c)) ' True ``` #### 固定長配列の部分配列を生成(SubArray) 固定長配列の部分配列を生成 - `SubArray(真理値の固定長配列, 開始位置, 配列長)` - `SubArray(整数の固定長配列, 開始位置, 配列長)` - 開始位置は整数の式で指定 - 配列長は整数リテラルで指定 - 配列長は元になる配列長以下になるようにする - 上界値ではなく配列長を指定する 例: ```vb Print (Array(True, False) = SubArray(Array(True, False, True, True), 0, 2)) ' True Print (Array(True, True) = SubArray(Array(True, False, True, True), 2, 2)) ' True Print (Array(True, False) = SubArray(Array(True, False, True, True), 3, 2)) ' True Print (Array(1, 2, 3) = SubArray(Array(1, 2, 3, 4, 5, 6), 0, 3)) ' True Print (Array(3, 4, 5) = SubArray(Array(1, 2, 3, 4, 5, 6), 2, 3)) ' True Print (Array(5, 6, 0) = SubArray(Array(1, 2, 3, 4, 5, 6), 4, 3)) ' True ``` -------------------------------------------------------------------------------- ### 引数の受け取り(Argument) 他のプログラム(サブルーチン)から呼び出されるときに受け取る引数について記述する構文 (※他のプログラム(サブルーチン)とはb2c2で生成したCASL2プログラムだけに限定しないが引数はb2c2側に合わせる必要がある) `Argument`ブロックは[Argument部]に1つだけ記述できる `Argument`と`End Argument`の間に引数の情報を列挙する 引数はGR1~GR7のレジスタを通して受け取る。レジスタは1回ずつ使える 各引数は参照渡し(`ByRef`)と値渡し(`ByVal`)のいずれかを指定する 引数名は変数名との重複は出来ない 引数名に使える文字・文字列は変数名のルールに従う デフォルトでは引数名に1対1で対応するCASL2のラベル名(DS領域)が用意される プログラムの戻り値用途には参照渡し(`ByRef`)の引数を利用する 例: ```vb Argument ByVal xFlag As Boolean From GR6 ByVal someNumber As Integer From GR2 ByRef message As String From GR3,GR4 ByVal elements(10) As Integer From GR1 ByRef returnValue As Integer From GR7 End Argument ``` | 書式 | 受け取り | 型 | |:----------------------------------------------------|:--------:|:------------------:| | `ByRef 引数名 As Boolean From レジスタ名` | 参照渡し | 真理値 | | `ByRef 引数名 As Integer From レジスタ名` | 参照渡し | 整数 | | `ByRef 引数名 As String From レジスタ名,レジスタ名` | 参照渡し | 文字列 | | `ByRef 引数名(上界値) As Boolean From レジスタ名` | 参照渡し | 真理値の固定長配列 | | `ByRef 引数名(上界値) As Integer From レジスタ名` | 参照渡し | 整数の固定長配列 | | `ByVal 引数名 As Boolean From レジスタ名` | 値渡し | 真理値 | | `ByVal 引数名 As Integer From レジスタ名` | 値渡し | 整数 | | `ByVal 引数名 As String From レジスタ名,レジスタ名` | 値渡し | 文字列 | | `ByVal 引数名(上界値) As Boolean From レジスタ名` | 値渡し | 真理値の固定長配列 | | `ByVal 引数名(上界値) As Integer From レジスタ名` | 値渡し | 整数の固定長配列 | ※上界値は配列長におけるインデックスの最大値を指す (つまり`配列長-1`) ※配列長は1~256 (つまり上界値は0~255) ※上界値は整数リテラルで指定する #### 参照渡し・真理値 - `ByRef 引数名 As Boolean From レジスタ名` - レジスタには真理値が格納されているメモリのアドレスが格納されているとみなす - この引数を通じて当該メモリの書き換えが行える - アドレスを保持する1語の領域が確保される #### 参照渡し・整数 - `ByRef 引数名 As Integer From レジスタ名` - レジスタには整数が格納されているメモリのアドレスが格納されているとみなす - この引数を通じて当該メモリの書き換えが行える - アドレスを保持する1語の領域が確保される #### 参照渡し・文字列 - `ByRef 引数名 As String From レジスタ名,レジスタ名` - 1つめのレジスタには長さ情報が格納されているメモリのアドレスが格納されているとみなす - 2つめのレジスタには文字データが格納されているメモリの先頭アドレスが格納されているとみなす - この引数を通じて当該メモリの書き換えが行える - 2つのアドレスを保持する2語の領域が確保される #### 参照渡し・真理値の固定長配列 - `ByRef 引数名(上界値) As Boolean From レジスタ名` - レジスタには真理値の固定長配列のデータが格納されているメモリの先頭アドレスが格納されているとみなす - この引数を通じて当該メモリの書き換えが行える - アドレスを保持する1語の領域が確保される #### 参照渡し・整数の固定長配列 - `ByRef 引数名(上界値) As Integer From レジスタ名` - レジスタには整数の固定長配列のデータが格納されているメモリの先頭アドレスが格納されているとみなす - この引数を通じて当該メモリの書き換えが行える - アドレスを保持する1語の領域が確保される #### 値渡し・真理値 - `ByVal 引数名 As Boolean From レジスタ名` - レジスタには真理値の値が格納されているとみなす - 真理値を保持する1語の領域が確保される - レジスタの値を割り当てられた領域にコピーして取り扱う #### 値渡し・整数 - `ByVal 引数名 As Integer From レジスタ名` - レジスタには整数の値が格納されているとみなす - 整数を保持する1語の領域が確保される - レジスタの値を割り当てられた領域にコピーして取り扱う #### 値渡し・文字列 - `ByVal 引数名 As String From レジスタ名,レジスタ名` - 1つめのレジスタには長さ情報が格納されているとみなす - 2つめのレジスタには文字データが格納されているメモリの先頭アドレスが格納されているとみなす - 長さ情報を保持する1語、文字データを格納する256語、合計257語の領域が確保される - 1つめのレジスタの値を長さ情報用に割り当てられた領域にコピーして取り扱う - 2つめのレジスタの示すアドレスからを文字データ用に割り当てられた領域に値をコピーして取り扱う #### 値渡し・真理値の固定長配列 - `ByVal 引数名(上界値) As Boolean From レジスタ名` - レジスタには真理値の固定長配列のデータが格納されているメモリの先頭アドレスが格納されているとみなす - 真理値の固定長配列を保持する配列長分の領域が確保される - レジスタの示すアドレスからを割り当てられた領域に値をコピーして取り扱う #### 値渡し・整数の固定長配列 - `ByVal 引数名(上界値) As Integer From レジスタ名` - レジスタには整数の固定長配列のデータが格納されているメモリの先頭アドレスが格納されているとみなす - 整数の固定長配列を保持する配列長分の領域が確保される - レジスタの示すアドレスからを割り当てられた領域に値をコピーして取り扱う -------------------------------------------------------------------------------- ### 外部プログラム利用の宣言(Extern Sub) 他のプログラム(サブルーチン)を利用する場合にフォーマットを記述するための構文 (※他のプログラム(サブルーチン)とはb2c2で生成したCASL2プログラムだけに限定しないが引数はb2c2側に合わせる必要がある) プログラム名はb2c2のプログラム名のルールに従う必要がある [Extern Sub]部に記述する 引数が無いプログラムの場合 `Extern Sub プログラム名` だけを宣言すればよい 引数を必要とするプログラムの場合`Extern Sub プログラム名 With`と`End Sub`の間に引数について記述する必要がある 引数はGR1~GR7のレジスタを通して引き渡す。レジスタは1回ずつ使える 各引数は参照渡し(`ByRef`)と値渡し(`ByVal`)のいずれかを指定する 引数名に使える文字・文字列は変数名のルールに従う(重複に関しては`Extern Sub`ブロック内で重複しなければよい) 例: ```vb Extern Sub FOO With ByVal xFlag As Boolean To GR1 ByRef someNumber As Integer To GR2 ByRef message As String To GR3,GR4 ByVal elements(10) As Integer To GR5 End Sub Extern Sub BAR Extern Sub BAZ Extern Sub HOGE With ByVal message As String To GR5,GR1 ByRef flags(20) As Boolean To GR7 ByRef returnValue As Integer To GR2 End Sub Extern Sub FUGA ``` | 書式 | 引き渡し | 型 | |:--------------------------------------------------|:--------:|:------------------:| | `ByRef 引数名 As Boolean To レジスタ名` | 参照渡し | 真理値 | | `ByRef 引数名 As Integer To レジスタ名` | 参照渡し | 整数 | | `ByRef 引数名 As String To レジスタ名,レジスタ名` | 参照渡し | 文字列 | | `ByRef 引数名(上界値) As Boolean To レジスタ名` | 参照渡し | 真理値の固定長配列 | | `ByRef 引数名(上界値) As Integer To レジスタ名` | 参照渡し | 整数の固定長配列 | | `ByVal 引数名 As Boolean To レジスタ名` | 値渡し | 真理値 | | `ByVal 引数名 As Integer To レジスタ名` | 値渡し | 整数 | | `ByVal 引数名 As String To レジスタ名,レジスタ名` | 値渡し | 文字列 | | `ByVal 引数名(上界値) As Boolean To レジスタ名` | 値渡し | 真理値の固定長配列 | | `ByVal 引数名(上界値) As Integer To レジスタ名` | 値渡し | 整数の固定長配列 | ※上界値は配列長におけるインデックスの最大値を指す (つまり`配列長-1`) ※配列長は1~256 (つまり上界値は0~255) ※上界値は整数リテラルで指定する #### 参照渡し・真理値 - `ByRef 引数名 As Boolean To レジスタ名` - レジスタに真理値が格納されているメモリのアドレスを格納する - 呼び出された側はこの引数のアドレスを通じてメモリの書き換えが行える - 真理値変数や真理値の固定長配列変数の要素を引き渡す場合はそれら変数のアドレスが渡される - 上記以外の真理値の値を引き渡す場合は1語の一時領域が確保されそのアドレスが渡される #### 参照渡し・整数 - `ByRef 引数名 As Integer To レジスタ名` - レジスタに整数が格納されているメモリのアドレスを格納する - 呼び出された側はこの引数のアドレスを通じてメモリの書き換えが行える - 整数変数や整数の固定長配列変数の要素を引き渡す場合はそれら変数の該当アドレスが渡される - 上記以外の整数の値を引き渡す場合は1語の一時領域が確保されそのアドレスが渡される #### 参照渡し・文字列 -`ByRef 引数名 As String To レジスタ名,レジスタ名` - 1つめのレジスタに長さ情報が格納されているメモリのアドレスを格納する - 2つめのレジスタに文字データが格納されているメモリの先頭アドレスを格納する - 呼び出された側はこの引数のアドレスを通じてメモリの書き換えが行える - 文字列変数を引き渡す場合はその変数の該当アドレスが渡される - 上記以外の文字列を引き渡す場合は一時な文字列データ領域(257語)が確保されそのアドレスが渡される #### 参照渡し・真理値の固定長配列 - `ByRef 引数名(上界値) As Boolean To レジスタ名` - レジスタに真理値の固定長配列のデータが格納されているメモリの先頭アドレスを格納する - 呼び出された側はこの引数のアドレスを通じてメモリの書き換えが行える - 真理値の固定長配列変数を引き渡す場合はその変数の該当アドレスが渡される - 上記以外の真理値の固定長配列を引き渡す場合は一時なデータ領域(配列長分の語数)が確保されそのアドレスが渡される #### 参照渡し・整数の固定長配列 - `ByRef 引数名(上界値) As Integer To レジスタ名` - レジスタに整数の固定長配列のデータが格納されているメモリの先頭アドレスを格納する - 呼び出された側はこの引数のアドレスを通じてメモリの書き換えが行える - 整数の固定長配列変数を引き渡す場合はその変数の該当アドレスが渡される - 上記以外の整数の固定長配列を引き渡す場合は一時なデータ領域(配列長分の語数)が確保されそのアドレスが渡される #### 値渡し・真理値 - `ByVal 引数名 As Boolean To レジスタ名` - レジスタに真理値の値を格納する #### 値渡し・整数 - `ByVal 引数名 As Integer To レジスタ名` - レジスタに整数の値を格納する #### 値渡し・文字列 - `ByVal 引数名 As String To レジスタ名,レジスタ名` - 1つめのレジスタに長さ情報を格納する - 2つめのレジスタに文字データが格納されているメモリの先頭アドレスを格納する - 値渡しであるが文字データのコピーは呼び出された側で行われることを期待する #### 値渡し・真理値の固定長配列 - `ByVal 引数名(上界値) As Boolean To レジスタ名` - レジスタに真理値の固定長配列のデータが格納されているメモリの先頭アドレスを格納する - 値渡しであるが値のコピーは呼び出された側で行われることを期待する #### 値渡し・整数の固定長配列 - `ByVal 引数名(上界値) As Integer To レジスタ名` - レジスタに整数の固定長配列のデータが格納されているメモリの先頭アドレスを格納する - 値渡しであるが値のコピーは呼び出された側で行われることを期待する -------------------------------------------------------------------------------- ### 外部プログラムの呼び出し(Call) `Extern Sub`で宣言した他のプログラム(サブルーチン)を呼び出す 自身を呼び出す再帰呼び出しも可能ではある ※デフォルト動作では変数名や引数名に1対1で対応するCASL2のラベル付け(DS領域)が行われるため再帰呼び出しをすると値を上書きしていまいデータ破壊が起きる 書式: - 引数なしのプログラムの場合 `Call プログラム名` - 引数ありのプログラムの場合 `Call プログラム名(引数, 引数, ..)` `Extern Sub`で引数名を並べた順番で引数に渡す値をカンマ区切りで並べて括弧で囲む 例: ```vb Extern Sub FOO With ByVal xFlag As Boolean To GR1 ByRef someNumber As Integer To GR2 ByRef message As String To GR3,GR4 ByVal elements(10) As Integer To GR5 End Sub Extern Sub BAR Extern Sub BAZ Extern Sub HOGE With ByVal message As String To GR5,GR1 ByRef flags(20) As Boolean To GR7 ByRef returnValue As Integer To GR2 End Sub Extern Sub FUGA Dim flags(20) As Boolean Dim iArr(10) As Integer Dim s As String Dim value As Integer Fill flags, True iArr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) s = "ABCDEF" value = 123 Call BAR Call BAZ Call FUGA Call HOGE("XYZ", flags, value) Call FOO(value > 100, value, s, iArr) ```` 引数名付きで呼び出す場合 `Call プログラム名 With`と`End Call`の間に`引数名 = 式`で引数名を指定して呼び出すことも可能 引数名を指定するので並べる順番は問わない 例: ```vb Extern Sub FOO With ByVal xFlag As Boolean To GR1 ByRef someNumber As Integer To GR2 ByRef message As String To GR3,GR4 ByVal elements(10) As Integer To GR5 End Sub Dim iArr(10) As Integer Dim s As String Dim value As Integer iArr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) s = "ABCDEF" value = 123 Call FOO With someNumber = value elements = iArr message = s xFlag = value > 100 End Call ``` -------------------------------------------------------------------------------- ### CASL2ソースへの変換に関する指定(Option) [Option部]にそれぞれ1つまで置くことができる 設定値が`Default`の場合はその`Option`を置かない場合と同等を意味する | 書式 | 概要 | |:---------------------------|:-------------------------------------| | `Option Variable 設定値` | 変数領域の初期化の有無の設定 | | `Option Register 設定値` | レジスタ(GR1~GR7)の退避の有無の設定 | | `Option Eof 設定値` | EOF情報の共有の有無の設定 | | `Option Allocator 設定値` | 変数領域の確保の方法の設定 | | `Option Array 設定値` | 配列長の指定の方法の設定 | 例: ```vb Option Allocator Shared Option Array Length Option Eof Default Option Register Default Option Variable Uninitialize ``` #### 変数領域の初期化の有無の設定(Option Variable) - `Option Variable 設定値` - なんらかの事情でコード数を減らしたい場合などに初期化のコードを省ける(未初期化の変数の参照はプログラムが正しく動作しない可能性がある) | 設定値 | 説明 | |:---------------|:------------------------| | `Default` | 変数領域を0で初期化する | | `Initialize` | 変数領域を0で初期化する | | `Uninitialize` | 変数領域を初期化しない | #### レジスタの退避の有無の設定(Option Register) - `Option Register 設定値` - プログラム(サブルーチン)開始時にRPUSHでレジスタ(GR1~GR7)を退避し脱出時にRPOPで回復するかどうかの設定となる - b2c2のBASICプログラム間では退避する必要はないがデフォルトでは退避する設定になっている | 設定値 | 説明 | |:-----------|:--------------------------------| | `Default` | レジスタ(GR1~GR7)を退避する | | `Restore` | レジスタ(GR1~GR7)を退避する | | `Dirty` | レジスタ(GR1~GR7)を退避しない | #### EOF情報の共有の有無の設定(Option Eof) - `Option Eof 設定値` - 複数のプログラムにまたがって`Input`ステートメントや`Eof`関数を使用する場合にEOF情報を共有するための設定 - EOF情報を共有する設定の場合、`EOF.cas`という共有用のCASL2ソースコードが生成される - EOF情報を共有しない場合、`Input`ステートメントや`Eof`関数を使用する場合にEOFでラベル付けされた1語の領域が確保される | 設定値 | 説明 | |:-----------|:--------------------| | `Default` | EOF情報を共有しない | | `Internal` | EOF情報を共有しない | | `Shared` | EOF情報を共有する | #### 変数領域の確保の方法の設定(Option Allocator) - `Option Allocator 設定値` - 変数および引数のメモリ領域の確保の方法を設定する - 共有領域からの確保(`Shared`)を選択した場合、`ALLOC.cas`という共有用のCASL2ソースコードが生成される - 生成される`ALLOC.cas`の共有領域のサイズは30000語で固定である。それ以外のサイズにしたい場合は生成された`ALLOC.cas`を直接編集する必要がある - 共有領域または内部領域から変数領域を確保する場合、プログラム(サブルーチン)呼び出しのたびに変数領域を確保し脱出時に解放するというスタック構造の様になるので十分な領域がある場合に再帰呼び出しが可能となる | 設定値 | 説明 | |:------------------|:----------------------------------------------------| | `Default` | 変数名と1対1に対応するCASL2ラベル付き領域で確保する | | `Fixed` | 変数名と1対1に対応するCASL2ラベル付き領域で確保する | | `Shared` | 30000語の共有領域から変数領域を確保する | | `Internal` | 30000語の内部領域から変数領域を確保する | | `Internal サイズ` | 指定のサイズの内部領域から変数領域を確保する | ※サイズの単位は語 ※サイズは変数や引数で使用する領域の合計サイズ以上を指定する必要がある(`Call`ステートメントで`ByRef`引数に渡す一時領域がある場合それも合計サイズに含める必要がある) ※サイズに指定できる最大は30000 #### 配列長の指定の方法の設定(Option Array) - `Option Array 設定値` - ソースコードにおいて配列の配列長に指定する値の解釈の設定 - ソースコードにおいて上界値指定と配列長指定を混在させたくない場合などに設定する - 生成されるCASL2ソースコード内のコメント行に記載される参考用のBASICコードにはこの設定は適用されない | 設定値 | 説明 | |:----------|:-----------------------------------------------------------------------------| | `Default` | `Dim`,`ByVal`,`ByRef`では上界値で指定、`CArray`,`SubArray`は配列長で指定する | | `Length` | `Dim`,`ByVal`,`ByRef`,`CArray`,`SubArray`の全てで配列長で指定する | | `Bounds` | `Dim`,`ByVal`,`ByRef`,`CArray`,`SubArray`の全てで上界値で指定する | 例: ```vb Option Array Default Dim iArr(5) As Integer Print (6 = Len(iArr)) ' True Print (3 = Len(CArray(iArr, 3))) ' True ``` ```vb Option Array Length Dim iArr(5) As Integer Print (5 = Len(iArr)) ' True Print (3 = Len(CArray(iArr, 3))) ' True ``` ```vb Option Array Bounds Dim iArr(5) As Integer Print (6 = Len(iArr)) ' True Print (4 = Len(CArray(iArr, 3))) ' True ```