前へ | 次へ | 目次 | 索引 |
DCL のシンボルの評価結果は,文字列または整数値のいずれかになります。シンボルのデータ・タイプ (文字または整数) は,現在割り当てられている値のデータ・タイプによって決まります。データ・タイプは永久的なものではないので,値のタイプが変更されると,シンボルのタイプも変更されます。
式は,値のタイプと使用する演算子に応じて,整数値になったり文字列値になったりします。
次の例では,ローカル・シンボル NUM には,最初に文字値が割り当てられ,次に整数式が割り当てられるときに整数値に変換されます。
$ NUM = "ABC" $ NUM = 2 + 5 |
次の表は,DCL がどのように式を評価するかをまとめたものです。最初の欄には,式に指定できる値と演算子を示します。 2 番目の欄は,それぞれの場合に,式全体の評価結果のタイプを示しています。表の中で,任意の値 は文字列または整数を表しています。
式 | 結果の値タイプ |
---|---|
整数値 | 整数 |
文字列値 | 文字列 |
整数レキシカル関数 | 整数 |
文字列レキシカル関数 | 文字列 |
整数シンボル | 整数 |
文字列シンボル | 文字列 |
+,--,または .NOT. 任意の値 | 整数 |
任意の値 .AND. または .OR. 任意の値 | 整数 |
文字列 + または - 文字列 | 文字列 |
整数 + または - 任意の値 | 整数 |
任意の値 + または - 整数 | 整数 |
任意の値 * または / 任意の値 | 整数 |
任意の値 (文字列比較) 任意の値 | 整数 |
任意の値 (数値比較) 任意の値 | 整数 |
式の中のオペランドがすべて同じ値のデータ・タイプになっていないと, DCL は式を評価できません。値のタイプには,文字列データ・タイプと整数データ・タイプがあります。文字列データには,文字列,文字列値を持つシンボル,文字列値を戻すレキシカル関数があります。整数データには,整数,整数値を持つシンボル,整数値を戻すレキシカル関数があります。 1 つの式に数値オペランドと文字列オペランドの両方が入っている場合には, DCL はすべての文字列を整数に変換するか,すべての整数を文字列に変換します。
一般に,文字列値と整数値の両方を使用すると,文字列値が整数に変換されます。ただし,DCL が文字列比較を行うときは例外で,この場合には整数が文字列に変換されます。
また,次のレキシカル関数を使用すると,式の値を決定したり変更したりできます。
文字列は,次のようにして整数に変換されます。
次の表は,文字列を整数値を変換する場合を示しています。
文字列 | 結果として生じる整数 |
---|---|
"123" | 123 |
"12XY" | 0 (偽) |
"Test" | 1 (真) |
"hello" | 0 (偽) |
整数を文字列に変換すると,結果として生じる文字列には整数値に対応する数値が入ります。次の表は,整数を文字列値に変換する場合を示しています。
整数 | 結果として生じる文字列 |
---|---|
123 | "123" |
1 | "1" |
0 | "0" |
シンボルは,オペレーティング・システムによって管理されるローカル・シンボル・テーブルまたはグローバル・シンボル・テーブルに格納されます。
14.10.1 ローカル・シンボル・テーブル
DCL では,コマンド・プロシージャの実行時,CALL コマンドの使用時,およびバッチ・ジョブのキュー登録時にユーザが作成するすべてのコマンド・レベルとメイン・プロセスに対して 1 つずつのローカル・シンボル・テーブルが保持されます。ローカル・シンボルを作成すると,DCL は,そのシンボルを現在のコマンド・レベルのローカル・シンボル・テーブルに収めます。コマンド・レベルのローカル・シンボル・テーブルは,そのレベルが続くかぎり存在しますが,該当コマンド・レベルが終了すると,そのローカル・シンボル・テーブル (およびその中のすべてのシンボル) も削除されます。プロセス,コマンド・プロシージャ,バッチ・ジョブについての詳細は, 第 18 章 を参照してください。
ローカル・シンボル・テーブルには,ユーザが定義したローカル・シンボルに加えて, DCL の 8 つのシンボルが収められます。 P1 〜P8 までのこれらのシンボルは,パラメータをコマンド・プロシージャに渡すときに使用されます。コマンド・プロシージャに渡されるパラメータは文字列とみなされます。それ以外の場合,P1 〜 P8 は空の文字列 ("") として定義され,ローカル・シンボル・テーブルに格納されます。
14.10.2 グローバル・シンボル・テーブル
DCL では,1 つのプロセスが存在する間, 1 つのグローバル・シンボル・テーブルだけが保持され,すべてのグローバル・シンボルがそのテーブルに収められます。グローバル・シンボル・テーブルには,ユーザがアクセスするグローバル・シンボルに加えて,後述する予備グローバル・シンボルが収められています。このようなグローバル・シンボルは,使用しているプログラムやコマンド・プロシージャ,ならびにシステム・コマンドやユーティリティについての状態情報を提供します。
$STATUSは,最も最近実行されたコマンドが戻す条件コードです。シンボル$STATUS は OpenVMS オペレーティング・システムのメッセージ・コードの形式に準拠します。 EXIT コマンドにパラメータ値を指定すれば,アプリケーション・プログラムでグローバル・シンボル $STATUS の値を設定できます。システムは,$STATUS の値を使用して,どのようなメッセージを表示するか,次に高いコマンド・レベルで実行を継続するかどうかなどを決定します。 $STATUS の下位 3 ビットの値は,グローバル・シンボル $SEVERITY に収められます。
$SEVERITYは,最も最近実行されたコマンドが戻す条件コードの重大度レベルです。 $STATUS の下位 3 ビットに等しいシンボル $SEVERITY は,次のような値を持ちます。
0 | 警告 |
1 | 成功 |
2 | エラー |
3 | 情報 |
4 | 重大 (回復不能な) エラー |
$RESTARTは,システム・クラッシュによる割り込みが生じた後でバッチ・ジョブが再開された場合に TRUE の値になります。それ以外の場合は,FALSE の値になります。
14.10.3 シンボル・テーブル検索順序
コマンド・インタプリタはシンボルの値を判別するときに,シンボル・テーブルを次のような順序で検索します。
これ以降の節では,シンボルの値をマスクする方法について説明します。
14.11.1 SET SYMBOL コマンド
省略時の設定では,外側のコマンド・プロシージャ・レベルで定義されるすべてのシンボル(グローバルとローカル)は,内側のプロシージャ・レベルにアクセスできます。ただし,SET SYMBOL コマンドを使用すれば,コマンド・プロシージャの中のローカル・シンボルまたはグローバル・シンボルを他のコマンド・プロシージャで定義されたシンボルと区別できます。 SET SYMBOL コマンドは,ローカル・シンボルとグローバル・シンボルの値をマスクします。したがって,コマンド・プロシージャが別のコマンド・プロシージャを実行する場合, 2 番目のプロシージャで SET SYMBOL コマンドを指定すれば,両方のプロシージャで同じシンボル名を使用できます。
SET SYMBOL コマンドは,DCL がコマンド行を処理する前に,動詞文字列(コマンド行の最初のトークン) をシンボルとして変換しようとするかどうかも制御します。省略時の設定では,変換を行おうとします。この設定を変更して変換を行わないようにすると,コマンドを起動するときに,コマンド・プロシージャが外側のプロシージャ・レベル環境によって影響されなくなるので便利です。
14.11.2 シンボルの有効範囲
シンボルの有効範囲 は,ローカル・シンボルとグローバル・シンボルとでは異なります。プロシージャ・レベルを終了して,前のプロシージャに戻ると,ローカル・シンボルとグローバル・シンボルの両方で,前のレベルのシンボル有効範囲コンテキストが復元されます。
現在の汎用シンボルの有効範囲状態を表示するには,レキシカル関数 F$ENVIRONMENT("SYMBOL_SCOPE") を使用します。現在の動詞の有効範囲状態を表示するには,レキシカル関数 F$ENVIRONMENT("VERB_SCOPE") を使用します。
ローカル・シンボルはプロシージャ・レベルによって左右されます。ローカル・シンボルを外側のプロシージャ・レベルで定義すると,内側のどのプロシージャ・レベルでもシンボルを読み込むことができます (ただし,シンボルへの書き込みはできません)。外側のプロシージャ・レベルにローカルなシンボルに値を割り当てると,現在のプロシージャ・レベルで新しいシンボルが作成されます。ただし,外側のプロシージャ・レベルのシンボルは変更されます。
SET SYMBOL/SCOPE=NOLOCAL コマンドを使用すると,外側のプロシージャ・レベルで定義されたすべてのローカル・シンボルが現在のプロシージャ・レベルとその内側のプロシージャ・レベルではアクセスできなくなります。たとえば,プロシージャ・レベル 2 と 4 で SET SYMBOL/SCOPE=NOLOCAL を指定すると,次のようになります。
グローバル・シンボルはプロシージャ・レベルに左右されません。現在のグローバル・シンボルの有効範囲コンテキストがそれ以降のすべてのプロシージャ・レベルに適用されます。
/SCOPE=NOGLOBAL 修飾子を使用すると,/SCOPE=GLOBAL 修飾子を指定するか,プロシージャを終了して,グローバル・シンボルがアクセス可能であった前のレベルに戻るまで,すべてのグローバル・シンボルはそれ以降のすべてのコマンドにアクセスできません。また,/SCOPE=NOGLOBAL 修飾子を指定すると, /SCOPE=GLOBAL 修飾子指定するまで,新しいグローバル・シンボルを作成できなくなります。
14.12 シンボルの置換
コンテキストによっては,英字で始まる文字列がシンボル名またはレキシカル関数として使用されることがあります。このような場合,DCL はシンボルまたはレキシカル関数をその値と置き換えようとします。シンボルをその現在の値で置き換えることをシンボル置換といいます。これ以外のコンテキストでシンボルまたはレキシカル関数を使用する場合には,置換演算子を使用してシンボル置換を要求しなければなりません。
シンボルやレキシカル関数が次のように使用された場合, DCL はシンボルやレキシカル関数を自動的に評価します。
次の例では,コマンド・インタプリタは,英字で始まる文字列をシンボル名として,数値または基数演算子(%) で始まる文字列をリテラル数値として使用します。
$ TOTAL = COUNT + 1 |
$ QUERY = "Have we met before?" $ LEN = F$LENGTH(QUERY) + 5 $ SHOW SYMBOL LEN LEN = 27 Hex = 0000001B Octal = 000033 |
$ IF A .EQ. B THEN WRITE SYS$OUTPUT "DONE" |
$ PDEL = "DELETE SYS$PRINT/ENTRY=" $ PDEL 181 |
$ BELL = 7 $ BELL[5,1] = 1 $ SHOW SYMBOL BELL BELL = 39 Hex = 00000027 Octal = 00000000047 |
上記の場所にないシンボルの置換を強制するには,次にようにシンボルを一重引用符 (') で囲みます。
$ TYPE 'B' |
引用符で囲まれた文字列の中のシンボルの置換を強制するには,そのシンボルの前に 2 つの一重引用符 (') を付け,シンボルの後に 1 つの一重引用符 (') を付けます。
$ T = "TYPE ''B'" |
コマンド行を処理する場合,DCL は次の順序でシンボルをその値に置換します。
一重引用符 (二重引用符で囲まれた文字列の場合には,2 つの一重引用符) で区切られたすべての文字列を左から右に置換します。前に 1 つの一重引用符が付いたシンボルは反復変換されますが,前に 2 つの一重引用符が付いたシンボルは反復変換されません。
コマンド行の中のそれぞれの値を左から右に評価して,値がコマンドの場合は実行し,式の場合には評価します。。式の中のシンボルは割り当てられた値と置き換えられますが,この置換は反復されません。
次の例は,DCL がシンボルを置換する順序がどのように影響するかを示しています。シンボル PN,FILE1,および NUM は,次のように定義します。
$ PN = "PRINT/NOTIFY" $ FILE1 = "[BOLIVAR]TEST_CASE.TXT" $ NUM = 1 |
このシンボル定義の場合,次のコマンドは,[BOLIVAR]TEST_CASE.TXT というファイルを印刷します。
$ FILE = "'FILE''NUM''" $ PN 'FILE' |
最初のコマンドでは,強制置換によって NUM が 1 になり, FILE''NUM' は FILE1 になります。 SHOW SYMBOL FILE コマンドを入力すると, FILE="'FILE1'" になります。
2 番目のコマンドは 2 つの置換を行います。最初に,'FILE' は 'FILE1' に置換されます。一重引用符 (') で囲まれているため, 'FILE1' も置換が必要です。自動置換によって FILE1 は [BOLIVAR]TEST_CASE.TXT になります。このファイル名は次に,PN の値である PRINT/NOTIFY に渡されます。結果は,次のような文字列になります。
$ PRINT/NOTIFY [BOLIVAR]TEST_CASE.TXT |
前へ | 次へ | 目次 | 索引 |