パラメータ パッシング(引数の受け渡し)

パラメータ パッシングは、Mルーチン間で移される変数コンテキストの一部またはすべてを明示的に制御する方法を提供します。

Mは、以下に渡すパラメータを使用しています。

パラメータパッシングは、DOコマンドではオプションです。

パラメータパッシングには2つの引数リストを使います: 1つは、Mが呼び出されるルーチンへ渡すそのパラメータを指定する実要素リスト(actuallist) と、もう一つは、パラメータを受け取るかまたは関連付けるためのローカル変数を指定するフォーマルリスト(formalist)です。

実要素リスト(Actuallists)

実要素リスト(actuallist) は、Mが呼び出されたルーチンに渡すパラメータを指定します。実要素リスト(actuallist) は、DOまたは外部関数に直ちに続いて、括弧で囲まれたゼロ個以上のパラメータのリストが含まれています。

実要素リスト(actuallist) :

  • コンマで区切られた項目から構成されています

  • 式 かつ/または(and/or) 実要素名(actualname)が含まれています。項目が抜け落ちるかもしれません、つまり、2つのコンマの間に何もないお互い隣同士が接して出現します。

  • 外部の特殊変数の場合を除き、フォーマルリスト(formalist)でラベルの呼び出しの中で使用する必要があります。

  • 未定義の変数を含めることはできません。

  • それが使用されている形式的リストより多い項目を持つことはできません。

  • 1個より多い位置で、同じ項目を含んでいる可能性があります。

例:

GTM>DO MULT(3,X,.RESULT)

この例では、パラメータを持つDOを示しています。実要素リスト(actuallist) が含まれています:

  • 3 - 1つの数値リテラル

  • X - 1つのローカル変数

  • .RESULT - 1つの実要素名

実要素名(Actualnames)

実要素名(actualname) は、添字なしローカル変数名に続き先頭のピリオド ( . ) 区切りで始まります。実要素名(actualname)は、次のセクションで説明するように、参照によって渡される変数を識別します。制御がフォーマルラベル(formallabel) へ移される時に実要素名(actualname)で式が評価される一方で、実要素名(actualname)で識別される変数がないので、それらが制御が移される時に定義する必要はありません。

フォーマルリスト(Formallists)

フォーマルリスト(Formallists)は、Mが渡された値を保持するために使用する変数を指定します。フォーマルリスト(Formallists)は、ラベルのすぐ後に続く括弧で囲まれた0個以上のパラメータのリストが含まれています。

フォーマルリスト(Formallists):

  • コンマで区切られた項目から構成されています

  • 添字なしローカル変数名が含まれています

  • 実要素リストまたは外部で呼び出されたラベルを使用してのみ使用する必要があります。

  • 未定義の変数を含めることができます。

  • それが使用されている実要素リストの個数より多いアイテムを持っている可能性があります。

  • 1個より多い位置で、同じ項目を含んではなりません。

  • それが使用されていると実要素リストと少なくとも同じくらいに多くの項目が含まれている必要があります。

例:

MULT(MP,MC,RES)
SET RES=MP*MC
QUIT RES

この例では、単純にパラメータ化されたルーチンを示し、fフォーマルリスト(Formallists)は、以下の項目が含まれています。

  • MP

  • MC

  • RES

" 実要素リスト(Actuallists)" を記述するセクションの例は、このルーチンに一致する呼び出しを示しています。

フォーマルラベル(Formallabel)

フォーマルリスト(formallist)に続くラベルが、フォーマルラベル(formallabel)と呼ばれています。

パラメータパッシングの動作

Mは、フォーマルリストの名前で暗黙のNEWを実行し、実要素リスト(actuallist)のアイテムに対応するフォーマルリスト(formallist)アイテムを置き換えます。

Mは、実要素リスト(actuallist)内の対応する要素によって与えられたフォーマルリスト(formallist)の値または参照の内で各要素を与えることによって、呼び出された手続きに実要素リストの値を提供します。Mは、実要素リスト(actuallist)の1番目の項目とフォーマルリスト(formallist)の1番目の名前を関連付け、実要素リスト(actuallist)の2番目の項目とフォーマルリスト(formallist)の2番目の名前を関連付けます。もし実要素リスト(actuallist) が フォーマルリスト(formallist)より短い場合、Mは、対応する値が無いフォーマルリスト(formallist)の項目が有効にNEWされることを保証します。もしフォーマルリスト(formallist) の項目が、実要素リスト(actuallist)( 実要素リスト(actuallist)で隣接する2つのコンマによって示される)に対応する項目がない場合、フォーマルリスト(formallist)でその項目は未定義になります。

もし実要素リスト(actuallist)のt項目が式であり、対応するフォーマルリスト(formallist) の変数が配列の場合、パラメータパッシングは、配列の添字の要素には影響しません。もし実要素名(actualname)がフォーマルリスト(formallist)の変数に対応している場合、Mは実要素名(actualname)で指定された変数に、参照によって、フォーマルリスト(formallist)変数上の配列操作を反映しています。

パラメータパッシングが存在しないものとして(すなわち、Mが呼び出されたルーチンで使用できる状態になる)、Mはフォーマルリスト(formallist) の一部ではない変数を扱います。

Mはフォーマルラベル(formallabel)に続く1番目のコマンドで実行を開始します。

QUITコマンドは、呼び出されたルーチンの実行を終了します。QUITの時点で、Mは、それらがルーチンの呼び出し時に持つ値にフォーマルリスト(formallist)の項目を復元します。

[注意] 注意

変数名が、実要素リスト(actuallist)で実要素名(actualname)として、そして、フォーマルリスト(formallist)で変数として表示される場合には、復元された値は参照によって作られた任意の変更が反映されます。

外部からのQUITはが引数を持っている必要がありますが、DOからのQUITは引数を取りません。これは、パラメータを持つDOコマンドと外部との、2つの大きな違いの一つを表しています。Mは、外部関数または特殊変数の値として、QUITコマンドの引数の値を返します。他の違いは、Mが外部用の$TESTをスタックするということです。

詳細については、 "外部関数" "外部の特殊変数" を参照してください。

例:

SET X=30,Z="Hello"
DO WRTSQR(X)
ZWRITE
QUIT
WRTSQR(Z)
SET Z=Z*Z
WRITE Z,!
QUIT

結果:

900
X=30
Z="Hello"

パラメータパッシングのメカニズム

Mは、2つのパラメータを渡すメカニズムを使用して呼び出されるルーチンに実要素リスト(actuallist)の値を渡します。

  • 値呼び出し コール バイ バリュー(Call-by-Value) - 式が現れます

  • 参照呼び出し コール バイ リファレンス(Call-by-Reference) - 実要素名(actualnames)が現れます

call-by-value は、フォーマルリスト(formallist)の変数へコピーを割り当てることによって、呼び出されたルーチンに実要素リスト(actuallist)の式の値のコピーを渡します。もしパラメータが変数の場合、呼び出されたルーチンは、その変数を変更することができます。しかし、Mはコピーを保持するその変数を組み立てるので、QUITが以前のフォーマルリスト(formallist)の値を復元する時に、それはコピーを保持する変数を削除します。また、呼び出されたルーチンによって変数への変更が、呼び出し元のルーチンで変数の値に影響しないことを意味します。

例:

SET X=30
DO SQR(X)
ZWRITE
QUIT
SQR(Z)SET Z=Z*Z
QUIT

結果:

X=30

名前が引き続く期間は、実要素名(actualname)を識別し、call-by-reference を引き起こします。

フォーマルリスト(formallist)変数に割り当てられた操作も実要素名(actualname)の変数に作用するように、 call-by-reference は、呼び出されたルーチンの変数へのポインタを渡します。フォーマルリスト(formallist)変数のKILLを含む変更は、対応する実要素名(actualname)の変数ですぐに同じ効果を持ちます。Mは、実要素名(actualname)の変数の変更として、呼び出し元のルーチンに戻って、呼び出されたルーチンでフォーマルリスト(formallist)変数への変更を渡すことを意味します。

例:

SET X=30
DO SQR(.X)
ZWRITE
QUIT
SQR(Z)SET Z=Z*Z
QUIT

結果:

X=900

GT.M パラメータパッシングの拡張機能

シンタックスはあいまいさを持っているので、標準ではラベル参照(labelref)の間接指定は提供されません。

例:

DO @X(1)

この例では、以下のようになります:

  • 1の引数を持つ X で指定されたラベルの呼び出し

  • 引数リストにない X(1) で指定されたラベルの呼び出し

次の例に示すように、GT.Mは、後者の解釈を処理します。

例:

シンタックス:

SET A(1)="CUBE",X=5
DO @A(1)(.X)
WRITE X,!
QUIT
CUBE(C);cube a variable
SET C=C*C*C
QUIT

実行結果:

125

GT.Mは、ルーチンの間接指定のために類似のシンタックスに従います。

DO ^@X(A) は、X(A) によって指定されたルーチンを呼び出します。

DO ^@(X)(A) は、X によって指定されたルーチンを呼び出し、引数 A を渡します。

DO ^@X(A)(A) は、X(A) によって指定されたルーチンを呼び出し、引数Aを渡します。

inserted by FC2 system