1.2 内部変数

地球流体電脳ライブラリでは, MATH1/SYSLIB の glpget/glpsetのような内部変数管理ルーチン が多く使われている. (ここで, pr/i/l/c のどれかで, それぞれ, 実数, 整数, 論理変数, 文字変数用である. ) 内部変数管理ルーチン とは, 設定された変数の値を保持し, 問い合わせに答えて値を返す機能を持ったルーチンで, 「掲示版」のような役目をするものである. この様なルーチンを使う理由は,

である. 複数のメソッド(元サブルーチン)で情報を共有するには, COMMON BLOCK を使うこともできるが, これを多用するとプログラムの可読性を落とすことにつながるので, 電脳ライブラリでは極力 COMMON BLOCK の使用を避けている. また, メソッド(元サブルーチン)の引数を少くすると融通の効かないメソッド(元サブルーチン)になって しまうが, かといって, むやみに引数の数を増やすとかえって使いにくくなっ てしまう. このような問題を解決するのが 内部変数管理ルーチン である. もともと「パッケージの内部で使われる変数」という意味で, 内部変数という言葉を使っているが, その変数はパッケージ外からも設定/参照できるので, その有効範囲からすると C 言語の「外部変数」に 似た性格を持つものである.

内部変数管理ルーチンは xxpget, xxpsetという名前 (xx は通常パッケージの先頭2文字) を持ち, あらかじめ, システムが用意した変数の値 (システムデフォルト) を 保持している. この値は xxpgetによって参照, xxpsetによって変更することがでる. 電脳ライブラリの多くのルーチンでは, 必要なパラメタの多くを xxpgetによって取得しており, ユーザーが何も指定しなければシステムデフォルトを使い, xxpsetで値を指定すれば, その値を使うようになっている.

この内部変数は実行時オプションによって変更することもできる. 実行時オプションとは, プログラム実行時に外部環境と交信することによって 内部変数への介入を可能にするような指定である. 具体的には, 外部ファイル, 環境変数, コマンドライン引数など による交信手段を念頭においた概念であるが, それがどのように実現されているかは, システムに依存する. なお, 実行時オプションの効力は, システムデフォルトよりも強く, xxpsetの指定よりも弱い.

実行時オプションに比べて xxpsetによる設定は強力なので, その設定を実行時に変更することができないが, 実行時オプションより効力の弱い xxpstxというルーチンも 用意されている. これを使えば, プログラム中でデフォルト値 (ユーザーデフォルト) を設定し, 実行時に変更することが可能になる.

内部変数の設定手段を, その効力の強さの順に並べると,

1: xx p set
2: 実行時オプション
3: xx p stx
4: システムデフォルト

となる.

実行時オプションは, 「オプション名」と「オプションの値」の組合せからなり, 複数個指定できる. オプション名は原則として, 介入しようとする内部変数を 管理しているxxpget/xxpset の最初の2文字 'xx' と 内部変数名 'PNAME' を組み合わせて xx:pname となる.

環境変数を通してオプションを指定する場合, 例えば UNIX の C シェル環境で glpget/glpsetが 管理する内部変数 'MSGLEV' を 1 に変更したいときには,

    > setenv GL:MSGLEV 1

とする. このとき環境変数名はすべて大文字でなければならない.

また, コマンドライン引数を通してオプションを指定する場合は, 原則としてオプション名に - 記号を付け, さらにオプション名とオプションの値の間に '=' を入れて, -xx:pname=value という形式で指定する (環境変数名と違って大文字・小文字の区別はない). 例えば, sample というプログラム実行時に

    > sample -gl:msglev=1

とすると, 上記の環境変数の場合と同じ結果が得られる. ここで, '=' 記号の前後に空白を入れてはいけない.

外部ファイルを通してオプションを指定する場合は,

gl:msglev  1
gl:lmiss .true.

のように(行のはじめの番号は便宜的につけてある), オプション名とオプションの値を並べて書いたファイルを, たとえば .dclrc として カレントディレクトリに用意してやればよい. ここで, オプション名は第1カラム目から書きはじめ, オプションの値との間は1個以上の空白によって 区切らなければならない(タブなどを入れてはいけない). 読み込むファイルを検索するルールについては, 第2節を参照のこと.

なお, 環境変数, コマンドライン引数, 外部ファイルを通して 同じオプションを指定した場合には, 原則としてその優先順位はコマンドライン引数, 環境変数, 外部ファイルを通して指定したもの順になる. (コマンドライン引数による指定が一番強い.)