Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

XECUTE

指定されたコマンドを実行します。

Synopsis

XECUTE:pc xecutearg,... 
X:pc xecutearg,...

xecutearg は、以下のいずれかにできます。

"cmdline":pc
("(fparams) cmdline",params):pc

引数

pc オプション — 後置条件式
cmdline 1 つ以上の有効な ObjectScript コマンドで構成されるコマンド行に解決される式。cmdline または (fparams) cmdline は引用符付きの文字列として指定する必要があります。
fparams オプション — 括弧で囲まれたコンマ区切りのリストとして指定される仮パラメータ・リスト。仮パラメータは cmdline により使用される変数で、その値は params を渡すことによって指定されます。fparams は、引用符付きのコード文字列内の最初の項目です。
params オプション — コンマ区切りのリストとして指定されるパラメータ・リスト。これらは fparams に渡されるパラメータです。params が指定されている場合、同数以上の fparams を指定する必要があります。

概要

XECUTE は、1 つ以上の ObjectScript コマンド行を実行します。各コマンド行は xecutearg で指定されます。複数の xecutearg をコンマで区切って指定できます。これらの xecutearg は、左から右の順で実行され、それぞれの実行はオプションの後置条件式で管理されます。xecutearg には以下の 2 つの構文形式があります。

  • パラメータ渡しなし。この形式は括弧を使用しません。

  • パラメータ渡しあり。この形式は括弧が必要です。

XECUTE には、xecutearg の 2 つの形式を任意に組み合わせて含めることができます。%Library.RoutineOpens in a new tab クラスの CheckSyntax()Opens in a new tab メソッドを使用すると、xecutearg コマンド行文字列の構文チェックを実行できます。

実際、各 xecutearg は、DO コマンドによって呼び出される一行サブルーチンに類似しており、引数の最後に達するか、QUIT コマンドに遭遇すると終了します。Caché が引数を実行した後、制御は xecutearg の直後に返されます。

XECUTE の各呼び出しは、新しいコンテキスト・フレームをプロセスのコール・スタックに配置します。$STACK 特殊変数は、コール・スタックのコンテキスト・フレームの現在の番号を含みます。

XECUTE コマンドは、実質的に $XECUTE 関数と同じ処理を行います。ただし、コマンドでは後置条件を使用できるが、関数では使用できないという点が異なります。コマンドは複数の xecutearg を指定できますが、関数が指定できる xecutearg は 1 つのみです。コマンドでは実行を完了するのに QUIT を必要としませんが、関数では実行パスごとに引数付きの QUIT が必要です。

引数

pc

オプションの後置条件式。後置条件式が XECUTE コマンド・キーワードに追加されている場合、Caché は後置条件式が True (0 以外の数値に評価される) の場合にのみコマンドを実行します。Caché は後置条件式が False (0 に評価される) の場合は、XECUTE コマンドを実行しません。

後置条件式が xecutearg に追加されると、Caché は後置条件式が True (ゼロ以外の数値に評価される) の場合にのみ、その引数を評価します。後置条件式が False の場合には、Caché はその xecutearg をスキップして、次の xecutearg を評価します (存在する場合)。詳細は、"Caché ObjectScript の使用法" の "コマンド後置条件式" を参照してください。

cmdline

cmdline は、1 つ以上の ObjectScript コマンドを含む文字列でなければなりません。場合によっては、コマンドとその次のコマンドの間にスペースを 2 つ挿入する必要があります。cmdline 文字列には、最初にタブ文字、または最後に [Enter] が含まれていてはなりません。cmdline 文字列内で引用符を指定するには、二重引用符を使用します。以下の例は、2 つのコマンドを含む、単一の cmdline を示しています。

   XECUTE "WRITE ""hello "",!  WRITE ""world"",!"

cmdline は文字列なので、複数のコード行に分割することはできません。単一の cmdline 引数は、以下のように、連結演算子で結合された個別の文字列に分割できます。

   XECUTE "WRITE ""hello "",!"_
          " WRITE ""world"",!"

単一の cmdline 引数は、以下のように、個別の複数のコンマ区切り cmdline 引数に分割できます。

   XECUTE "WRITE ""hello "",!",
          "WRITE ""world"",!"

cmdline の最大長は、以下の考慮事項に左右されます。 Caché は、ソース cmdline 文字列とその生成オブジェクト・コードの両方を単一の文字列として格納します。結果として生成されたこの文字列は、Caché の文字列の最大長を超えることはできません。最大文字列長の詳細は、"Caché ObjectScript の使用法" の "長い文字列" を参照してください。

/* text */ 形式のコメントを、cmdline 内、連結された cmdline 文字列の間、またはコンマ区切りの cmdline 引数の間に埋め込むことができます。

   XECUTE "SET x=""hello "" /* 1st val */ SET y=""world"" /* 2nd val */ "_
          " WRITE x,! /* part of 1st cmdline */ ",
          "WRITE y,! /* 2nd cmdline */ "

cmdline は、NULL 文字列 ("") に評価される場合があります。この場合、Caché は何も動作せず、次の xecutearg (存在する場合) で実行を継続します。

パラメータを渡す場合、fparams 仮パラメータ・リストは cmdline コマンドの前に置き、両方の要素を同じ引用符で囲む必要があります。cmdlinefparams を 1 つ以上のスペースで区切ることをお勧めしますが、スペースは必須ではありません。

  SET x=1
  XECUTE ("(in,out) SET out=in+3", x, .y)
  WRITE y
  QUIT

既定では、cmdline で使用するすべてのローカル変数は、パブリック変数です。変数を設定するコマンドを中括弧で囲むことにより、プライベート変数としてコマンド行内で変数を指定することができます。次に例を示します。

  SET x=1
  XECUTE ("(in,out) { SET out=in+3 }", x, .y)
  WRITE y
  QUIT

この特定の変数のプライベート変数の指定は、fparams 仮パラメータ・リストのすぐ後に角括弧で囲んでパブリック変数リストを指定することによって上書きできます。以下の例では、変数 x を含むパブリック変数リストを指定しています。

  SET x=1
  XECUTE ("(in,out) [x] { SET out=in+3 }", x, .y)
  WRITE y
  QUIT

fparams

コンマで区切り、括弧で囲んだ仮パラメータのリスト。仮パラメータ名は、有効な識別子である必要があります。これらの仮パラメータは、別のコンテキストで実行されるため、その xecutearg 内でのみ一意である必要があります。XECUTE を発行したプログラム内、または別の xecutearg 内の同じ名前のローカル変数には影響を与えません。cmdline 内の任意またはすべての fparams を使用する必要はありません。ただし、fparams の数は、指定した params の数と同じか、それ以上である必要があります。そうでない場合は、<PARAMETER> エラーが生成されます。

params

呼び出し元のプログラムから fparams に渡される、コンマ区切りリストで指定された実パラメータ。params は呼び出し元プログラム内で定義された変数であることが必要です。

前にドットを付けることで、参照によってパラメータを渡すことができます。これは、cmdline から値を渡すのに便利です。例は以下のようになります。詳細は、"Caché ObjectScript の使用法" の “ユーザ定義コード” の章にある "参照渡し" を参照してください。

以下の例では、グローバルを設定するコマンドにパラメータを渡します。2 つのコマンド行が用意されています。それぞれの実行は、後置条件設定に依存します。

  SET bad=0,good=1
  SET val="paid in full"
  XECUTE ("(pay) SET ^acct1=pay",val):bad,("(pay) SET ^acct2=pay",val):good

ここでは、bad 後置条件の値により、最初の xecutearg はスキップされます。2 番目の xecutearg は、パラメータとして渡される val で実行され、コマンド行で使用される pay 仮パラメータに値を提供します。

以下の例では、参照渡し (.y) を使用して、cmdline から呼び出し元のコンテキストにローカル変数値を渡します。

CubeIt
  SET x=5
  XECUTE ("(in,out) SET out=in*in*in",x,.y)
  WRITE !,x," cubed is ",y

以下の例では、XECUTE コマンドは、ローカル変数 xy を参照します。xy にはそれぞれ XECUTE が実行する 3 つの個別の ObjectScript コマンドから構成される文字列リテラルが含まれています。

   SET x="SET id=ans QUIT:ans="""" DO Idcheck"
   SET y="SET acct=num QUIT:acct="""" DO Actcheck"
   XECUTE x,y

以下の XECUTE コマンドの例では、$SELECT 文を使用しています。

   XECUTE "SET A=$SELECT(A>100:B,1:D)"

以下の例では、A の値であるサブルーチンを実行しています。

   SET A="WRITE ! FOR I=1:1:5 { WRITE ?I*5,I+1 }"
   XECUTE A

メモ

XECUTE とオブジェクト

以下のように、XECUTE を使用して、オブジェクト・メソッドとプロパティを呼び出し、返り値を実行できます。

   XECUTE patient.Name
   XECUTE "WRITE patient.Name"

XECUTE と FOR

XECUTE 引数に FOR コマンドが含まれている場合、FOR の範囲は、引数の剰余です。XECUTE 引数の最も外側の FOR が終了すると、XECUTE 引数も終了します。

XECUTE と DO

XECUTE コマンドに DO コマンドが含まれていると、Caché は DO 引数で指定されているルーチンを実行します。Caché は QUIT に出合うと、DO コマンドのすぐ後に制御を戻します。

例えば以下のコマンドでは、Caché はルーチン ROUT を実行し、DO 引数のすぐ後に戻って文字列 "DONE" を書き込みます。

   XECUTE "DO ^ROUT WRITE !,""DONE"""

XECUTE と GOTO

XECUTE コマンドに GOTO コマンドが含まれていると、Caché は GOTO 引数で指定されているルーチンを実行します。Caché は、QUIT に遭遇すると、転送を実行する GOTO 引数のすぐ後には戻りません。その代わり、Caché はその GOTO を含む XECUTE 引数のすぐ後に制御を戻します。

以下の例では、Caché は制御をルーチン ROUT に転送し、制御を XECUTE 引数のすぐ後に戻し、文字列 "FINISH" を書き込みます。文字列 "DONE" は書き込まれません。

   XECUTE "GOTO ^ROUT WRITE !,""DONE""" WRITE !,"FINISH"

XECUTE と QUIT

XECUTE 引数の終わりには、暗黙の QUIT があります。

$TEXT での XECUTE

cmdline 内に $TEXT 関数を含めることで、XECUTE を含むルーチン内にコード行を指定します。例えば、以下のプログラムでは、$TEXT 関数が行を検索して実行します。

A
   SET H="WRITE !!,$PIECE($TEXT(HELP+1),"","",3)"
   XECUTE H
   QUIT
HELP
   ;; ENTER A NUMBER FROM 1 TO 5

ルーチン A を実行すると、"ENTER A NUMBER FROM 1 TO 5" が抽出され、書き込まれます。

入れ子にされた XECUTE の呼び出し

ObjectScript は、XECUTE 引数内での XECUTE の使用をサポートします。しかし、入れ子にされた XECUTE は注意して使用しなければなりません。実行時の処理の正確な流れを判断するのが困難な場合があるからです。

XECUTE に呼び出されるコマンドの実行時間

XECUTE 内で呼び出されたコードの実行時間は、ルーチンの本体で遭遇する同じコードの実行時間より遅い場合があります。これは、Caché が XECUTE を処理するたびに、XECUTE コマンドで指定されたソース・コード、あるいは参照されたグローバル変数に含まれるソース・コードをコンパイルするためです。

一般化された演算の実装

XECUTE の代表的な使用法は、アプリケーション内で一般化された演算を実装することです。例えば、ユーザが任意の 2 つの数、または変数で数学演算を実行できるインライン数学カルキュレータを実装するとします。アプリケーションの任意の点から、このカルキュレータを利用可能にするには、特定のファンクション・キー (例えば F1) を使用して、カルキュレータ・サブルーチンをトリガします。

このようなカルキュレータを実装するコードの簡略化バージョンは、以下のようになります。

Start  SET ops=$CHAR(27,21)
  READ !,"Total amount (or F1 for Calculator): ",amt
  IF $ZB=ops { DO Calc 
    ; . . .
  }
Calc  READ !,"Calculator"
  READ !,"Math operation on two numbers and/or variables."
  READ !,"First number or variable name: ",inp1
  READ !,"Mathematical operator (+,-,*,/): ",op
  READ !,"Second number or variable name: ",inp2
  SET doit="SET ans="_inp1_op_inp2
  XECUTE doit
  WRITE !,"Answer (ans) is: ",ans
  READ !,"Repeat? (Y or N) ",inp
  IF (inp="Y")!(inp="y") { GOTO Calc+2 }
  QUIT

上記が実行されると、Calc ルーチンは、ユーザ入力の番号、変数、または希望の演算を受け入れ、これらを適切な SET コマンドを定義する文字列リテラルとして変数 doit に保存します。XECUTE コマンドは、doit を参照して、そこに含まれるコマンド文字列を実行します。このコード・シーケンスは、アプリケーション内の任意の数のポイントから呼び出すことができ、ユーザは毎回異なる入力を行うことができます。 XECUTE は、提供された入力を使用して、毎回 SET コマンドを実行します。

XECUTE と ZINSERT

XECUTE コマンドは、ルーチンから実行可能なコードの単独の行を定義し、挿入するために使用されます。プログラマ・プロンプトで ZINSERT コマンドを使用して、実行可能なコードの単独の行を行位置ごとに定義し、現在のルーチンに挿入することができます。プログラマ・プロンプトで ZREMOVE コマンドを使用して、現在のルーチンから実行可能なコードの 1 行、または複数の行を行位置ごとに削除することができます。

XECUTE コマンドは、新規のラベルの定義に使用することはできません。したがって、XECUTE はコード行の最初のコマンドの前に、最初の空白スペースを必要としません。ZINSERT コマンドは、新規のラベルの定義に使用できます。したがって、ZINSERT はコマンド行の最初のコマンドの前に、最初の空白スペース (または新規ラベルの名前) を必要とします。

関連項目

FeedbackOpens in a new tab