電脳ライブラリの「パラメータ掲示版」である
SYSLIB の glpget/glpsetは,
毎回指定する必要のないパラメータをうまく隠蔽して見えないようにしておく
という前述のテクニックを極限にまで利用したライブラリなのである.
glpget/glpsetは他のプログラムにパラメータを渡すだけで,
あとは何もしない.
その構造は, 以下のようになっている(実際のソースより簡略化されている).
(注: Ver.5 の電脳ライブラリでは, 実行時パラメータによって 内部変数への介入が可能になったため glpget/glpsetは 内部でさらに下請けルーチンを呼ぶようになった. 以下では, Ver.4 の電脳ライブラリにおける glpget/glpsetを 用いて説明をおこなう. Ver.5 の下請けルーチンの構造は, 基本的に Ver.4 の glpget/glpsetと同じである. )
*−−−−−−−−−−−−−−−−−−−−−−−-
* glpget / glpset
*−−−−−−−−−−−−−−−−−−−−−−−-
SUBROUTINE lpara = NumRu::DCL.glpget(cp)
CHARACTER CP*(*)
PARAMETER (NPARA=17)
INTEGER IX(NPARA)
REAL RX(NPARA)
LOGICAL LX(NPARA)
CHARACTER CPARA(NPARA)*8
EQUIVALENCE (IX,RX,LX)
SAVE
DATA CPARA( 1)/'NBITSPW '/, IX( 1)/32/
........
DATA CPARA(12)/'LMISS '/, LX(12)/.FALSE./
DATA CPARA(13)/'IMISS '/, IX(13)/999/
DATA CPARA(14)/'RMISS '/, RX(14)/999.0/
........
DO 10 N=1,NPARA
IF (CP.EQ.CPARA(N)) THEN
IPARA=IX(N)
RETURN
END IF
10 CONTINUE
エラー処理
STOP
*−−−−−−−−−−−−−−−−−−−−−−−-
ENTRY NumRu::DCL.glpset(cp,rpara)
DO 15 N=1,NPARA
IF (CP.EQ.CPARA(N)) THEN
IX(N)=IPARA
RETURN
END IF
15 CONTINUE
エラー処理
STOP
END
ここで, cparaという文字変数にパラメータ名が登録されており,
その名前に対応した値が
ix, rx, lx という変数に入っている.
(これら3つの変数はEQUIVALENCE文により結合されているので,
実際には1つの記憶領域しか持たない)
さて, IFALIBのメソッド(元関数)imaxは, 欠損値以外の最大値を求めるものであるが, imaxは欠損値を示す整数値を引数から得る代りに,
lpara = NumRu::DCL.glpget(cp)
という文を実行する.
この時, glpget では, cparaの中から'IMISS'という名前を探して
(24-29行目) その名前に対応する値imissとして返す.
この時返される値は, DATA文によって指定されているが,
必要であれば, あらかじめこれらの値をglisetで変更しておくこともできる.
この方法が前の1.5.3節の方法
(各プログラムがimiss 設定用のENTRYを持つ方法)
より優れている点は,
glpgetが持つ情報を複数のメソッド(元サブルーチン)から参照できることである.
例えば, 欠損値を示す値は何も初期値としては999が与えられているが,
999がデータ範囲に入っているような場合には,
これを変更しておかなければならない.
そのような時にでも glpset を一度呼ぶだけで,
欠損値処理をする全てのメソッド(元サブルーチン)の動作を制御することが可能になる.