1.5.4 glpget/glpsetの構造

電脳ライブラリの「パラメータ掲示版」である 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 を一度呼ぶだけで, 欠損値処理をする全てのメソッド(元サブルーチン)の動作を制御することが可能になる.