Mは、ランタイム(run-time)まで、コードの要素の定義を引き延ばす手段として、間接指定を提供します。間接指定は、要素へ保有または"ポイント" する変数に名前を付けます。間接指定の演算子は "アット" 記号(@)です。
任意のアトム式(expratom) または任意のローカルまたはグローバル変数名は、間接指定に置き換えてられます。
例:
GTM>set x="HOOP",b="x" GTM>write a="HULA "__@b HULA HOOP GTM>
この例では、連結する操作の内で間接指定を使用しています。
入口参照(entryref)の任意の要素は、間接指定によって置き換えられます。
例:
GTM>set lab="START",routine="PROG" GTM>do @lab^@routine
この例では、 do START^PROG
に相当します。
パターンコードは、間接指定によって置き換えられます。
例:
GTM>FOR p="1U.20A1"",""1U.20A",5N IF x?@p QUIT GTM>ELSE WRITE !,"Incorrect format" QUIT
この例では、名前または番号のどちらかを test x するパターンコードの間接指定を使用します。
間接指定は、添字付きグローバルまたはローカル変数名の接頭辞を置き換えることができます。この"名前" の間接指定は、2つの間接指定演算子と、間接指定の他のフォームと同様な主要な演算子と、間接指定で明示されていないこれらの添字への変換をマーキングする末尾の演算子、が必要です。
例:
GTM>SET from="B",to="^A(15),x="" GTM>FOR SET x=$O(@from@(x)) Q:x="" S @to@(x)=@from@(x)
この例では、グローバル配列の一部にローカル配列のレベルの内容をコピーして間接指定の名前を使用しています。例では、変数Bのすべての既存の最初のレベルのノードがデータを持っていることを前提としています。
Mの間接指定は、プログラムの抽象化を可能にするための非常に強力なツールが用意されています。しかし、間接指定が頻繁には不必要であり、いくつか欠点があるので、慎重に使用してください。
いくつかの点で間接指定を使用するルーチンは読みやすくするための十分な情報が含まれていないため、そのようなルーチンは、デバッグと保守がより困難になる傾向があります。
実行時のパフォーマンスを向上させるには、GT.Mはコンパイル時に実行時からの作業を移行する傾向があります。間接指定は、コンパイルのメリットを最小限に抑え、ランタイムで発生するコンパイラ処理するよう強制します。
Mは、間接指定の多くの形態を再帰的にできます。しかし、実際のアプリケーションでは、再帰的な間接指定は、通常、コードがわかりにくく、遅くなります。
間接指定が価値ある目的を果たすような状況があります。例えば、一般的な性質を持つ特定のユーティリティの機能が、間接指定を使用して、明確に抽象化しコード化されている場合もあります。Mは "CASE"コマンドが無いので、引数の間接指定でを使っての DO(またはGOTO)が、複雑な分岐を提供するという問題に対して明確な解決策を提供します。
間接指定を使ったいくつかのMユーザのプロトタイプは、その後、実行時のオーバーヘッドを低減するその生成されたコードで間接指定に置き換えます。いずれの場合でも、常に、間接指定が明確でまたはより効率的なアプローチで置き換えることができるかどうかを検討します。
間接指定またはXECUTEのランタイムエラーは、$STATUS と $ZSTATUS 関連の情報を保持し、通常のエラー処理を行いますが、コードフラグメント内のエラーの場所に関するコンパイラ提供の情報は提供しません。