DOコマンドは、GT.Mの呼び出しスタック内のエントリを作成し、入口参照(entryref)で指定された位置へ実行を渡します。
DOコマンドのフォーマットは:
D[O][:tvexpr] [entryref[(expr|.lvn[,...])][:tvexpr][,...]]
オプションでコマンド直後に続く真理値の式は、GT.Mがコマンドを実行するかどうかをコントロールする後置コマンドです。
オプションのentryref は、DOの直後に続き実行するその位置(ラベル、オフセット、ルーチン名の組み合わせ)を指定します。
オプションのラベルの後で、必要な開始行の前で、もしその行がピリオド (.) の適切な数が含まれている場合、引数なしDOコマンド(すなわち、DOに続き2個のスペースによって)は、ルーチン内の次の行へ実行を移行します。これらの期間は、引数なしDOによって引き起こされる"即時:immediate" ネストの現在のレベルを示しています。もしDOの次の行に多すぎるピリオドがある場合、GT.Mはエラーを報告します; もしDOの次の行に少なすぎるピリオドがある場合、GT.MはDOコマンドを無視します。
$TESTの現在値を保護しない引数ありのDOとは対照的に、引数なしDOコマンドは、 $TESTの現在の値をスタックします。
括弧() で囲まれたオプションのパラメータリストは、ルーチンのエントリポイントに渡すパラメータが含まれています。
DOを使用したラベル呼び出しには、アクチュアリスト(actuallist)がない呼び出しの場合はカッコを必要としません。アクチュアリスト(actuallist)を指定していないDOまたは$$が formallist でラベルを呼び出す場合、欠落しているパラメータは呼び出されたルーチンでは未定義です。
Warning : 警告 | |
---|---|
DOまたは$$がルーチンを指定していてアクチュラリストを使用するラベルが指定されていない場合、 そのルーチンのトップラベルがformallistを持っているかどうか、反対にアクチュアリストが実行可能コードで最初のラベルに「通り抜けて落ちる"fall through"」前に、アクチュアリストはそれに直接適用します。 |
もしDOがパラメータリストを指定している場合、入口参照(entryref)の位置は、ラベルと引数リスト(Mはパラメータパッシングの間にオフセットを持つ入口参照(entryrefs)を禁止する)で開始する必要があります。
もしパラメータリスト内の要素がピリオドで始まる場合、それは添字なしのローカル変数名を指定し、DOは参照によってその変数を渡します。そうでなければ、要素は、DOが値として評価し渡す式、を指定します。
パラメータリストに続くオプションの真理値式、または、もし引数にパラメータリストがない場合の入口参照(entryref) は、後置条件の引数を指定し、GT.Mがその引数を使用しているDOを実行するかどうかをコントロールします。
間接指定演算子と1つ以上のDOの引数リストに評価される原子式(expression atom)は、DOのための正当な引数を構成します。
DOの範囲内で明示的または暗黙的なQUITは、しかし、他のDO、FOR、XECUTE、または外部関数の範囲内では無く、呼び出し元のポイントの次の命令に実行を戻します。このポイントには、次のDOの引数または別のコマンドがあります。ルーチンの最後の時点、または、引数なしDOで作成されたネストレベルの最後の時点で、GT.Mは暗黙のQUITを実行します。もしその行がコメントだけが含まれている場合でさえも、先行するピリオド (.) の数を変更することにより、ネストの現在のレベルを減らす任意の行は、暗黙のQUITを引き起こします。 ZGOTOコマンドのイメージと実行を終了することは、呼び出しポイントへ実行を最終的に戻すことを回避する唯一の方法です。
DOコマンドは、必要に応じて呼び出されるサブルーチンにパラメータを渡すことができます。入口参照(entryref)とパラメータパッシングの詳細については、 第5章: “Mの一般的な言語特徴” を参照してください。
例:
GTM>DO ^%RD
この例では、ダイレクトモードからルーチンディレクトリのユーティリティプログラム(%RD)を呼び出します。キャレット記号(^)は、DOコマンドが外部ルーチンとして%RDを呼び出すことを指定します。
例:
GTM>DO A(3)
この例では、ラベルAでサブルーチンを呼び出し、パラメータとして値3を渡します。 DOの引数はキャレット記号(^)を持っていません、したがって、それは現在のルーチンのラベルとしてAを識別します。
例:
ReportA ; Label for ReportA SET di="" OPEN outfile USE outfile FOR SET di=$ORDER(^div(di)) QUIT:di="" DO PREP DO DO POST .SET de="",(nr,gr)=0 .WRITE "Division ",di,!F S de=$ORDER(^de(di,de)) QUIT:de="" DO ..WRITE "Department ",de," Gross Rev: ",^grev(di,de),! ..WRITE "Department ",de," Net Rev: ",^nrev(di,de),! ..SET gr=gr+^grev(di,de),nr=nr+^nrev(di,de) .W "Division Gross Rev: ",gr,!,"Division Net Rev: ",nr,! DO PRINT^OUTPUT(outfile) QUIT
このルーチンは、最初に、いくつかの前処理を行うために、ラベルの引数(PREP)でDOを使用しています。次に、それはレポートをフォーマットするために、 社内(company)の各部門(division)を引数なしDOをループしながら使用しています。1番目の引数なしDOの中で、2番目の引数なしDO(4行目)は、ループしながら、部門(division)内の各部署(department)をフォーマットします。すべての部門(department)の処理の後、部門(division)の要約を出力する1番目の引数なしDOに制御が戻ります。全部門(division)の処理に続いて、ラベルの引数(POST)のDOで、いくつかの後処理が行われます。最後に、最後の行の次の行で、ルーチンは、パラメータとして出力ファイルの名前(outfile)を渡して、外部ルーチン(^OUTPUT)のラベル(PRINT)で、サブルーチンを呼び出すDOを使用しています。
例:
GTM>zprint ^SQR SQR(z); set revert=0 if $view("undef") set revert=1 view "noundef" if z="" write "Missing parameter.",! view:revert "undef" quit else write z*z,! view:revert "undef" quit GTM>do ^SQR(10) 100 GTM>do ^SQR Missing parameter.
この例では、DOを括弧付きで使用するか、括弧なしで使用するラベル呼び出しを示しています。