CommuniGate Pro
Version 5.1
アプリケーション
 
 
 
CG/PL

CommuniGate プログラミング言語(CG/PL)

CommuniGate プログラミング言語(CG/PL) は、強力で使いやすい手続き型言語です。 CommuniGate Pro サーバーソフトウェアの各種のコンポーネントに対応しています。例えば、次のよ うな処理やアプリケーションに利用できます。

CG/PL の言語構造と機能は、どのアプリケーションに対しても同じように働きます。ただし、アプ リケーションの内蔵機能とプロシージャはアプリケーションによってそれぞれ異なり、したがって CG/PL の言語構造と機能もアプリケーションによって異なることがあります。

下記は、簡単なCG/PL プログラムの例です。

//	
// A simple CG/PL application
//
entry Main is
  myName = "Jim" + " " + "Smith";
  if length(myName) > 10 then
    myName = Substring(myName,0,8) + "..";
  end if;
end;

データモデル

CG/PL では、データをオブジェクトとして扱います。オブジェクトの種類としては、文字列、 a 数値、 a データブロック、 a タイムスタンプ、 an IP アドレス、 an 配列、 or a 辞書が. 詳しくは「データ」のセクションを参照してください。

上記のオブジェクトのほか、メールボックスハンドルタスクハンドルなど、特定の環境内で定義された特殊オブジェクトも使用できます。

特殊なタイプのオブジェクトとしてNULL 値(オブジェクトがない値) があります。

論理(ブール) 値の処理では、NULL 値を偽(FALSE)、文字列を真(TRUE) として使用します。


語彙素

プログラムソースコードはプレーンテキストで、 UTF-8 キャラクタセットを使ってエンコードされ ます。

CG/PL の語彙は次の通りです。

コメントとは、ダブルスラッシュ(//)で始まり、それ以後のEOL (行の終り) まで(EOL を含 む) の文字列をいいます。

ホワイトスペースとは、スペース、タブ、EOL、コメント文字(いずれも1 個以上) をいいます。名 前とキーワードの間には、少なくても一つホワイトスペースを挿入しなければなりません。名前と キーワード以外の語彙素は、0 個以上のホワイトスペースで区切ることができます。


変数

プロシージャ名または関数 名として宣言されていない名前、また、内蔵のプロシージャ名または関数 名でない名前はいずれも変数名として使用できます。

各変数には値を割り当てることができます。変数の値は、最初はNULL 値です。変数にはオブジェ クトを割り当てることができ、割り当てた場合、そのオブジェクトが変数の値になります。

myCount = 3;           // 変数myCount を作成し
                       // 値として数値3 を割り当てる
myCount = myCount + 2; // 変数myCount の値を5 に変更
myCount = "Service";   // 変数myCount の値を文字列に変更

変数は、生成された関数/ プロシージャインスタンスに対してローカルです。また、関数/ プロシー ジャが終了する(返る) と、変数の値はすべて削除されます。


CG/PL では単項演算がサポートされています。単項演算の形式は次の通りです。
operation operand (演算子オペランド)

次の単項演算が可能です。

-
単項マイナス。オペランドの値が数値の場合、演算結果は、その数値の符号の反対の符号が 付いた数値になります。数値でない場合、演算結果は0 となります。     
下記の式の値は-5 です。
-5
-(3+2)
+
単項プラス。オペランドの値が数値の場合、演算結果は、その数値です。数値でない場合、 演算結果は0 となります。
下記の式の値は5 です。
+5
+(10/2)
not
否定。オペランドの値がNULL 値の場合、演算結果はTRUE、そうでない場合はNULL 値と なります。
キーワードnot の代わり符号! を使っても処理は同じです。
次のどちらの式も、値は"YES"(TRUE)です。
not null
!(2 == 3)

単項演算の優先度は、二項演算と三項演算より上です。したがって、下記の式の結果は-3 ではなく -1 です。

-2 + 1

CG/PL では、二項演算をサポートしています。二項演算は、次の形式で指定します。

left-operand operation right-operand (左オペランド演算子右オペランド)
特に指定しない限り、両側のオペランドが計算され(順番は不定)、その結果に対して演算が実行されます。

二項演算の演算子としては次の演算子がサポートされています。優先度は降順(高から低)です。

*, /, %
上の演算子はいずれも、数値のオペランドに対してのみ使用が可能です。
オペランドのいずれかが数値でなかったとき、または、演算子が/ または% で右オペランド が0 だった場合、演算結果はNULL 値となります。
下記の式の結果はいずれも10 です。
5 * 2
-20 / -2
30 % 20
+, -
この2 つの演算子はどちらも、数値のオペランドに対してのみ使用が可能です。
+ 演算子は、2 つの文字列オペランドに対して使用できます。結果は、2 つの文字列が連結さ れた文字列です。
また、+ 演算子は、2 つのデータブロックオペランドに対して使用できます。結果は、2 つの データブロックが連結されたデータブロックです。
さらに、+ 演算子は、タイムスタンプと数値をそれぞれオペランドとして使用できます。結 果は、タイムスタンプに数値(秒) を加えた値です。
- 演算子は、左オペランドにタイムスタンプを指定し、右オペランドに数値を指定して演算 が可能です。結果は、タイムスタンプから数値(秒) を差し引いた値です。
The - operation can be applied to a pair or operands with timestamp values, producing a numeric value - the number of seconds between the left and the right operand values.
上記以外の場合、結果はNULL 値です。
次の式の結果は5 です。
3 + 2
-2 - -7
次の式の結果は"John Doe" です。
"Joh" + "n Doe"
<, <=, ==, !=, >=, >
いずれも比較演算子で、数値オペレンドに対して実行が可能です。算術比較条件が満足され た場合、TRUE が返ります。
==!= は、2 つの数値のほか、2 つのオブジェクトについて使用し、その2 つのオブジェクトが「等しい」かどうかチェックできます。== と!= では、次のような比較が可能です。 
  • NULL 値とNULL 値との比較で、両方ともNULL 値かどうか。
  • 数値と数値の比較で、その値が同じかどうか。
  • 文字列と文字列の比較で、その長さと文字列上の各文字の位置が同じかどうか。
  • データブロックとデータブロックの比較で、その長さとブロック上の各データバイ トの位置が同じかどうか。
  • タイムスタンプとタイムスタンプの比較で、その秒データが等しいかどうか。
  • 配列と配列の比較で、その要素の数と要素の位置が同じかどうか。
  • 辞書と辞書の比較で、キーと値の数、キー(文字列)、キーの値がすべて同じかどう か。
  • 上記以外のオブジェクトの場合、2 つのオブジェクトが同じかどうか(オブジェクト の種類が異なるときには、同じとは判断されません)。

比較条件が満足されなかった場合、結果はNULL 値です。
次のいずれの式も、結果は"YES"(TRUE)です。
1+2 == 3
2+2 != 3
2+2 >= 3
"Joe" == "Joe"
null == (2 == 3)
and, or, xor, and then, or else
上の論理演算子ではいずれも、オペランドとNULL 値の比較が可能です。
and では、両方のオペランドの値がどちらもNULL 値でない場合、結果はTRUE です。そうで ない場合、NULL 値が返ります。
キーワードand の代わりに符号& を使用できます。
or では、少なくても一方のオペランドの値がNULL 値でない場合、結果はTRUE です。そうで ない場合、NULL 値が返ります。
キーワードor の代わりに符号| を使用できます。
xor では、両方のオペランドの値がNULL 値でない場合、または、両方のオペランドの値がNULL 値の場合、結果はNULL 値です。そうでない場合、NULL 値でないオペランドの値が返ります
キーワードxor の代わりに符号^ を使用できます。
and then 演算では、まず左オペランドの値が計算されます。その値がNULL 値だったときに は、右オペランドは計算されず、結果はNULL 値です。左オペランドの値がNULL 値でな かった場合、右オペランドが計算され、その結果が値となります。
キーワードand then の代わりに符号&& を使用できます。
or else 演算では、まず左オペランドの値が計算されます。その値がNULL 値でなかったとき には、右オペランドは計算されず、左オペランドの値が結果として返ります。左オペランド の値がNULL 値だった場合、右オペランドが計算され、その結果が値となります。
キーワードor else の代わりに符号|| を使用できます。
次の式の値はすべて"YES" (TRUE) です。
1+2 == 3 & 2+2 == 4
2+2 == 3 or else 7-5 == 2
false ^ true

二項演算では、演算の優先度が同じ場合、左から右に計算されます。例えば、 X op Y op Z( X op Y ) op Z と同じです。 

二項演算の優先度は、三項演算より上です。

CG/PL では、三項演算としては次の形式だけをサポートしています。
cond ? expr1 : expr2
  • まず、最初のcond (条件)が計算されます。
  • その値がNULL 値でなかった場合、次にexpr1 が計算され、その値が結果となります。
  • cond がNULL 値だったときには、expr2 が計算され、その値が結果になります。
次の式の結果は、どちらも"Good" です。
3 == 3 ? "Good" : "Bad"
null ? 77777 : "Good"

三項演算は、右から左へと計算されます。例えば、 A ? B : C ? D : E は、 A ? B : (C ? D : E) と同じです。

CG/PL では、インデキシング処理( インデックスの参照と値の処理) がサポートされています。

object[index]
上で、
式objectの値は、配列か辞書でなければなりません(そうでない場合、プログラム例外が発 生します)。
式indexの値は数値で、かつobjectの要素の数より小さい数値でなければなりません。

式objectの値が配列の場合、配列の要素のインデックス(開始値は0、つまり最初の要素のインデッ クスが0) が参照されます。
インデックスの参照を介して配列の要素の取り出しが行われ、その要素が存在しなかった場合、 NULL 値が返ります。
存在しない最初の要素(存在する最後の要素の次の要素) を指定し、その要素に新規の値を割り当て ることができます(下記の例を参照)。
上記以外の要素(存在する最後の要素の次の要素より後の要素)を指定し、新規の値を割り当てた場 合、プログラム例外が発生します。
例えば、下記の配列SquareArray の内容が(1,4,9,16,25) の場合、次の式の値は9 です。
SquareArray[2]
また、次の式では、
SquareArray[5] = "Blue";
配列SquareArray の内容は(1,4,9,16,25,"Blue") に変更されます(存在する最後の要素の次の 要素に新規の値が割り当てられます)。

式objectの値が辞書の場合、処理では、辞書のキーのインデックス(開始値は0、つまり最初のキー のインデックスが0) が参照されます。
インデックスの参照を介してキーの名前の取り出しが行われます。その要素が存在しなかった場合、 NULL 値が返ります。
参照先のキーに新規の値を割り当てることはできません。その処理を行うと、プログラム例外が発生 します。

例えば、下記の辞書SquareDictionary の内容が{"one" = 1; "two" = "four"; "three"=9;} の場合、次の式の値は"three" です。
SquareDictionary[2]

If the object expression value is a string, the operation returns a 1-byte string containing the string symbol number index (the first string symbol has the number 0).
Retrieving a symbol that does not exist results in a null-value.
An attempt to assign a new value to any string symbol results in a program exception.
If SquareString value is "grass", the following expression has the value of "r":
SquareString[1]

またCG/PL では、次の書式を使って辞書の要素の値(キーの値)を取り出すことができます。

dictionary.keyName
上で、
式dictionaryは、辞書でなければなりません(そうでない場合、プログラム例外が発生します)
keyName は、辞書のキーの名前です。

処理では、辞書dictionary の要素のうち、keyNameで示されるキーの値が取り出されます。
指定したキーが存在しなかった場合、NULL 値が返ります。
キーにNULL 値を割り当てると、そのキーと値の対が辞書から削除されます。
存在しないキーに非NULL 値を割り当てることができます。その場合、新規のキーと値(指定した 非NULL 値) の対が辞書に追加されます。
例えば、辞書SquareDictionary の値が{"one" = 1; "two" = "four"; "three"=9;} の場合、
次の式の値は9 です。
SquareDictionary.three

また、次の式ではnull 値が返ります。
SquareDictionary.four
CG/PL では、次の書式を使ってキーを計算し、その値を取り出すことができます。
dictionary.(keyExpr)
上で、
式dictionaryは、辞書でなければなりません。
また、式keyExpr は、辞書のキーを示す文字列でなければなりません(そうでない場合、プ ログラム例外が発生します)

処理では、辞書dictionaryのキーkeyExpr の値が取り出されます。
例えば、辞書SquareDictionary の内容が{"one" = 1; "two" = "four"; "three"=9;} の場合、 次の式の値は9 となります。
SquareDictionary.("th" + "ree")

さらにCG/PL では、関数呼び出しが可能です。関数呼び出しでは、関数名の後に複数の式をカッコ で囲んで指定(パラメータ式) することができます。
なお、関数名は、
内蔵関数または 定義済み関数の名前でなければなりません。処理の際、パラメータ 式(指定した場合) が計算され、そのパラメータの値を使って関数コードが実行されます。関数の実行後、オブジェクトが返ります。関数の結果に対して、インデキシング処理などの辞書の要 素に関する処理を実行することもできます。

例えば、パラメータが2 つの関数MyFunction の戻り値が配列(1,"four",9) の場合、次の式では、 値として"four" ( インデックスが1 の要素の値) が出力されます。
MyFunction(1,"zzz")[1]

式では、キーワードnull またはfalse を使ってfalse 値を指定できます。また、キーワード true を使ってtrue 値を指定できます。


演算子

0 個以上の演算子のつながりを演算子シーケンスと呼んでいます。シーケンスの末尾にはセミコロン (;) を置きます。

下は空のシーケンス(演算子なし)で、処理は何も実行されません。

;

また、null 演算子(キーワードnull) を使用したシーケンスも処理は何も実行されません。.

null;

データコンテナ参照(変数、配列の要素、辞書の要素)、 = 記号、式(この式が計算され、その結果 がデータコンテナに割り当てられます)の組み合わせを割り当て演算子と呼びます。

myVar = 123 + 111;
myVar = "string";

データコンテナ参照が配列の要素の場合、その要素は、実際に存在する要素、または存在しない最初 の要素(存在する最後の要素の次の要素) でなければなりません。つまり、要素が3 つの配列の場 合、インデックスが0、1、2 のいずれか、またはインデックスが3 の要素に限って値を割り当てるこ とができます。インデックスが3 の要素に値を割り当てた場合、配列に新規の要素が自動的に追加さ れます。

データコンテナ参照が辞書の要素の場合、要素にNULL 値を割り当てると、その要素が辞書から削 除されます。

プロシージャ呼び出し演算子を使ってプロシージャを呼び出すことができます。書式は、関数呼び出し式と同じです。プロシージャの名前は、内蔵プロシージャ または 定義済みプロシージャの名前でな ければなりません。

例えば、パラメータが2 つのプロシージャMyProc は、次のようにして呼び出すことができます。
MyProc(1,"zzz");

タスクは、ストップ演算子を使って終了できます。この場合、キーワードstop を使用します。

stop;

アクティブの接続に対してストップ演算子を使用すると、その接続が閉じます。リターン演算子を使って、関数またはプロシージャの実行を終了させることができます。
リターン演算子は関数の中で使用でき、書式はキーワードreturn と式の組み合わせです。この式 が計算され、その値が関数呼び出しの値となります。

return 12*year+month;

また、リターン演算子は、プロシージャの中でも使用できます。その場合、下記のようにキーワード return だけを使用します。
return;

条件演算子は、キーワードif とその右の式(if 式)、演算子シーケンス(if シーケンス)、キーワー ドend で構成されます。キーワードend にはオプションでキーワードif を付加することもできま す。まず、if 式が計算され、その値がNULL 値でなかった場合、if シーケンスが実行されます。その 後、条件演算が終了します。

次の例では、変数myCount の値が10 より小さい場合、変数myCount の値が2 だけ増加します。
if myCount < 10 then
  myCount = myCount + 2;
end if;

条件演算子では、オプションでif シーケンスの後に単一もしくは複数のelif 部を指定できます。elif 部は、キーワードelif、式(elif 式)、キーワードthen、演算子シーケンス(elif シーケンス) で構 成されます。
if 式の値がNULL 値の場合、最初のelif 式が計算され、最初のelif 式の値がNULL 値でなかったとき には、そのelif シーケンスが実行され、条件演算が終了します。一方、最初のelif 式の値がNULL 値 だった場合、次のelif 部が処理されます。
次の例では、変数myCount の値がチェックされます。その値が10 より小さかったときには、変数の 値が2 だけ増加されます。そうでなく(変数myCount の値が10 以上で)、かつ変数myCount の値が 20 より小さかった場合、その値が3 だけ減少されます。
if myCount < 10 then
  myCount = myCount + 2;
elif myCount < 20 then
  myCount = myCount - 3;
end if;

条件演算子にはまた、else 部を指定することもできます。このelse 部は、if シーケンスの後、また elif 部があるときには、その最後に指定します。else 部は、キーワードelse と演算子シーケンス (else シーケンス) で構成されます。
if 式の値がNULL 値で、オプションのelif 式の値がいずれもNULL 値の場合、else シーケンスが実行 され、条件演算が終了します。
次の例では、変数myCount の値が10 より小さかった場合、その値が2 だけ増えます。また、値が 10 以上でかつ20 未満だったときには、その値は3 だけ減ります。一方、これ以外の場合、値が4 倍されます。
if myCount < 10 then
  myCount = myCount + 2;
elif myCount < 20 then
  myCount = myCount - 3;
else
  myCount = myCount * 4;
end if;

ループ演算子とは、キーワードループ演算子とは、キーワードloop を使った演算子をいいます。キーワードloop の前にはオプ ションでキーワードwhile と式(while 式) を付加できます。また、演算子シーケンス(初期シーケ ンス) があり、最後にキーワードend (オプション、キーワードloop の前に置きます) が来ます。 を使った演算子をいいます。キーワードloop の前にはオプ ションでキーワードwhile と式(while 式) を付加できます。また、演算子シーケンス(初期シーケ ンス) があり、最後にキーワードend (オプション、キーワードloop の前に置きます) が来ます。
while 式を指定した場合、その式が計算され、その値がNULL 値だったときにはループ演算子の処理 が終了します。そうでない場合、演算子シーケンスが実行されます。この処理が繰り返されます。

次の例では、変数myCount の値がチェックされ、その値が10 より小さい間、値が2 だけ増加され ます。
while myCount < 10 loop
  myCount = myCount + 2;
end loop;

次の例では、ループ(条件なし) の中でプロシージャmyProc を呼び出しています。

loop
  myProc(2,"test.wav");
end loop;

ループ演算子では、演算子シーケンス(初期シーケンス) とキーワードend の間に単一もしくは複 数のexitif 部を挿入できます。exitif 部は、キーワードexitif、その後に式(exitif 式)、セミコロン (;)、演算子シーケンス(exitif シーケンス) という書式で指定します。処理の際には、まず初期シー ケンスが実行され、その後、最初のexitif 式が計算されます。そのexitif 式の値がNULL 値でなけれ ば、ループ演算子の処理は終了します。そうでない場合、exitif シーケンスが実行され、さらに次の exitif 式(ある場合) が計算されます。最後のexitif シーケンスの実行後、ループ演算子の処理が繰り 返されます。

次の例では、変数myWord に文字列"aaa" が追加され、その後、変数の長さがチェックされます。 ここで長さが20 より小さかった場合、変数myWord に文字列"bbb" が追加され、処理が反復されます。
loop
  myWord = myWord + "aaa";
exitif length(myWord) >= 20;
  myWord = myWord + "bbb";
end loop;

代替フォーム

シーケンスの中の演算子によっては、代替フォームを使用できるもの(例えば、then の代わりに{) もあります。代替フォームの後にはセミコロンを付加する必要はありません。

条件演算子の代替フォームは、キーワードif と、式(if 式)、演算子シーケンス(if シーケンス)で 構成されます。このうちif シーケンスは、左側と右側をそれぞれ左中カッコ({)と右中カッコ(}) で囲みます。
条件演算子の代替フォームでは、if シーケンスの後に単一もしくは複数のelif 部を指定できます。elif 部はいずれも、キーワードelif、式(elif 式)、演算子シーケンス(elif シーケンス) で構成されます。elif シーケンスもif シーケンスと同じく、左中カッコ({)と右中カッコ(})で囲みます。
また、条件演算子の代替フォームでは、else 部を指定することもできます。else 部は、中カッコで囲 まれたif シーケンスの後、かつ、オプションのelif 部の最後に置かなければなりません。else 部は、 キーワードelse、式(else 式)、演算子シーケンス(else シーケンス) で構成されます。else シーケ ンスもif シーケンスと同じく、左中カッコ({)と右中カッコ(})で囲みます。

次の例では、変数myCount の値が10 より小さかった場合、その値が2 だけ増えます。また、値が 10 以上でかつ20 未満だったときには、その値は3 だけ減ります。これ以外の場合、値が4 倍されます。
if (myCount < 10) {
  myCount = myCount + 2;
} elif (myCount < 20) {
  myCount = myCount - 3;
} else {
  myCount = myCount * 4;
}
注意: 上の例では、if 式とelif 式は丸カッコで囲まれていますが、必ずしも丸カッコで囲む必要はありません。

ループ演算子の代替フォームは、キーワードwhile、式(while 式)、左側中カッコ({)、演算子 シーケンス(初期シーケンス)、0 個以上のexitif 部、右側中カッコ(}) で構成されます。
exitif 部はそれぞれ、キーワードexitif、式(exitif 式)、セミコロン(;)、演算子シーケンスで構 成されます。

次の例では、変数myWord に文字列"aaa" が追加され、その後、変数の長さがチェックされます。 ここで長さが20 より小さかった場合、変数myWord に文字列"bbb" が追加され、処理が反復されま す。
while ( true ) {
  myWord = myWord + "aaa";
exitif (length(myWord) >= 20);
  myWord = myWord + "bbb";
}
注意: 上の例では、while 式とexitif 式は丸カッコで囲まれていますが、必ずしも丸カッコで囲む必要 はありません。


コードセクション

プログラムコードは、複数のコードセクションで構成されます。コードセクションとしては次の種類 があります。

プロシージャ/ 関数は、再帰的に呼び出すことができます。つまり、プロシージャまたは関数から直 接、または別のプロシージャ/ 関数の呼び出しを介して、そのプロシージャまたは関数自体を呼び出 すことができます。

コードセクションはいずれも「再入可能」です。つまり、同一のコードセクションを同時に複数のプ ログラムで使用(起動またはタスク経由) できます。

コードセクションを使用する場合、宣言が必要です。宣言としては、前方宣言、外部宣言、定義 (コードセクション自体の定義) を使用できます。

同一のコードセクションの外部宣言または定義(本体) は、同一のプログラムコードには一つ(どち らか一方のみ一つ) しか指定できません。また、同一のコードセクションの前方宣言は、同一のプロ グラムコードには一つしか指定できません。その前方宣言の後に定義を指定します。
2 つ(またはそれ以上) のコードセクションで呼び出しを相互に実行させたい場合、前方定義を使い ます。この方法により、コードセクションが他方のコードセクションで呼び出されるようになりま す。

外部宣言を使うことで、別のプログラムコードモジュールに定義されているコードセクションを呼び 出すことができます。
外部宣言は、外部宣言がサポートされている環境(例えば
リアルタイムアプリケーション環境など) でのみ使用が可能です。詳しくは、後述の環境の説明を参照してください。
外部宣言に指定されているコードセクションの名前とパラメータ名は、外部プログラムコードモ ジュールに定義されているコードセクションの名前とパラメータ名と同じでなければなりません。
コードセクション定義の中のパラメータは、外部宣言のパラメータより多くてもかまいません。外部 宣言にないパラメータには、外部宣言の処理時に自動的にNULL 値が割り当てられます。

エントリ

エントリの宣言(エントリコードセクションの宣言)は、キーワードentry とエントリ名のほか、 次の要素で構成されます(宣言/ 定義の種類によります)。
前方(先行)宣言の場合、
キーワードforward とセミコロン(;)
エントリ定義の場合、
キーワードis の後に演算子シーケンス、その後にキーワードend (その後にオプションで キーワードentry)、その後にセミコロン(;)。
代替エントリ定義の場合、
左中カッコ({)、演算子シーケンス、その後に右中カッコ(}

プログラムの動作中、処理がエントリの演算子シーケンスの最後まで達すると、演算子stop(暗黙 の演算子)が実行されます。

下は、
リアルタイムアプリケーションのエントリの例です。このエントリは、受信コールを受け付け るかどうかチェックし、受け付けに成功するとサウンドを再生します。エントリコードの処理が終わ るとプログラムが終了し、したがって呼び出しも終了します。
entry main is
  if acceptCall() == null then
    playFile("greeting.wav");
  end if;
end entry;

下記は、上記のエントリの代替フォーム(代替エントリ定義)です。条件演算子の部分が代替フォー ムです。

entry main {
  if (acceptCall() == null) {
    playFile("greeting.wav");
  }
}

プロシージャ

プロシージャの宣言は、キーワードprocedureとプロシージャの名前、左丸カッコ、パラメータ名 のリスト(オプション)、右丸カッコに加え、次の要素で構成されます(宣言/ 定義の種類によりま す)。
前方宣言の場合、
キーワードforward とセミコロン(;)
プロシージャ定義の場合、
キーワードis、演算子シーケンス、キーワードend (オプションで、その後にキーワードprocedure)、最後にセミコロン(;)
代替プロシージャ定義の場合、
左中カッコ({)、演算子シーケンス、その後に右中カッコ(}
外部宣言の場合、
キーワードexternal と、その後にセミコロン(;)

プログラムの動作中、処理がプロシージャの演算子シーケンスの最後まで達すると、演算子return (暗黙の演算子)が実行されます。

下記は
リアルタイムアプリケーション プロシージャの例で、このプロシージャでは、数値が読み上げ られます。
procedure sayNumber(x) is
  x = x % 100;
  if x >= 10 then
    PlayFile(String(x/10*10)+".wav");
  end if;
  if x != 0 then
    PlayFile(String(x%10)+".wav");
  end if;
end procedure;

前方宣言を使用する場合、その前方宣言で指定されているパラメータとまったく同じパラメータをプ ロシージャ定義で指定しなければなりません。下は例です。

例:
procedure SayMoney(x,units) forward;
procedure sayNumber(x) forward;
procedure sayMoney(x,units) is
  sayNumber(x);
  PlayFile(units+".wav");
end procedure;

関数

関数の宣言は、プロシージャの宣言と基本的には同じです。違いは、キーワードprocedure の代わ りにキーワードfunction を使用することだけです。

関数コードセクションのプログラム制御パスはすべて、return またはstop のいずれかの演算子で 終わらなければなりません。

次は、引数の階乗を返す関数の例です。
function Factorial(x) is
  if x <= 1 then return 1; end if;
  return Factorial(x-1)*x;
end function;

次は、上記と同じ関数を代替フォーム、また三項演算子を使って定義した例です。

function Factorial(x) {
  return x <= 1 ? 1 : Factorial(x-1)*x;
}

同一のプログラムコードでは、コードセクション(エントリ、プロシージャ、関数)の名前はいずれも一意でなければなりません。


内蔵関数/ プロシージャ

以下、CG/PL に内蔵されているプロシージャと関数について説明します。いずれも、すべてのアプ リケーションで使用できます。下記の内蔵プロシージャと内蔵関数の名前は、ユーザー定義のプロ シージャまたは関数の名前として使用することはできません。

Same(arg1,arg2)
この関数では、arg1 (引数1) とarg2 (引数2) の値がどちらも同じオブジェクト、両方の値 がNULL 値、両方の値がTRUE 値のいずれかの場合、TRUE 値が返ります。これ以外のとき には、NULL 値が返ります。
例えば、Same("J" + "ack","Jack") の値はNULL 値です。
次の例の場合、
x = "my string";
y = "my string";
z = x;
test1 = Same(x,y);
test2 = Same(x,x);
test3 = Same(x,z);
test1 の値はNULL 値です。一方、test2 とtest3 の値はどちらもTRUE 値です。
Length(arg)
argが文字列の場合、この関数からは、その文字列のサイズ(バイト数) が返ります。  
argがデータブロックの場合、この関数からは、そのデータブロックのサイズ(バイト数)が返ります。
argが配列の場合、この関数からは、その配列の要素の数が返ります。
argが辞書の場合、この関数からは、その辞書のキー(要素) の数が返ります。
argがメールボックスハンドルの場合、この関数からは、そのメールボックスのメッセージの数が返ります。
上記以外の場合、この関数からは数値0 が返ります。
Void(arg1)
このプロシージャはarg1の値を廃棄するだけで、他には何も処理は行われません。通常、関 数を呼び出し、その結果が不要なときに使用します。

文字列

IsString(arg)
この関数からは、argの値が文字列のときにTRUE 値が返ります。そうでない場合、NULL 値 が返ります。
String(arg)
この関数は、argの値が文字列の場合、その文字列を返します。
argの値が数値の場合、その数値を10 進数で表した文字列を返します。
argの値がIP アドレスの場合、そのIP (ネットワーク) アドレスを標準の形式で表した文字 列を返します。
argの値がNULL 値の場合、NULL 値を返します。
上記以外の場合、 その値をテキスト表現で表した文字列が返ります。
FindSubstring(str,substr)
strsubstr の値がどちらも文字列で、かつ、substr の値がstrのサブ文字列(文字列の一 部) だった場合、この関数からは、文字列strの中のサブ文字列substrの位置(先頭の位置 が0) が返ります。
例えば、FindSubstring("forest","for") の値は 0です。
上記以外の場合、数値 -1が返ります。
Substring(str,from,len)
str の値が文字列で、かつfrom の値が数値、かつlen の値が非負値の場合、この関数からは、 文字列strのうち長さがlenのサブ文字列が返ります。
fromが非負値(正の値) の場合、fromで示される位置(文字列の先頭の文字の位置が0) か ら始まるサブ文字列が返ります。
fromが負の値の場合、文字列strの最後から数えて1- fromの位置で終わるサブ文字列が返り ます( したがって、文字列の最後の文字も含めてサブ文字列を取り出したい場合、fromを-1 とします)。
from の値(または1- from の値) がstr の長さ以上の場合、空白の文字列が返ります。
from の値+ lenの値(または1- from の値+ enの値) がstr の長さより大きい場合、返る文字 列の長さはlenより短くなります。
上記以外の場合、この関数からはNULL 値が返ります。
EOL()
この関数からは、EOL (行の終わり) 記号を格納した文字列が返ります。EOL 記号は、使用 しているOS プラットフォームによって異なります。
CRLF()
この関数からは、インターネットEOL (<carriage-return><line-feed>) 記号が返ります。
ToUpperCase(str)
strの値が文字列の場合、その文字列の文字がすべて大文字に変換された文字列が返ります。
ToLowerCase(str)
strの値が文字列の場合、その文字列の文字がすべて小文字に変換された文字列が返ります。
FindRegEx(str,picture)
この関数では、文字列str と文字列picture (正規表現を指定) の比較が可能です。
strまたはpictureが文字列でなかった場合、または文字列pictureが正規表現と解釈されな かった場合、または文字列strがpictureの正規表現と一致しなかった場合、この関数からは NULL 値が返ります。
上記以外の場合、文字列の配列が返ります。配列の要素0 には文字列strのコピーが格納さ れています。それ以外の要素には(ある場合)、文字列strのサブ文字列のうち正規表現グ
ループに一致したサブ文字列が格納されています。文字列pictureに指定する正規表現は、拡 張POSIX シンタックスの正規表現でなければなりません。
EmailDomainPart(address)
addressの値が文字列(アドレス) で、かつ、その文字列に@ 記号がある場合、最初の@ 記 号の後のアドレスを格納した文字列(つまりドメイン部) が返ります。
上記以外の場合、戻り値はNULL 値です。
EmailUserPart(address)
addressの値が文字列でない場合、この関数はNULL 値を返します。
addressの値が文字列であるものの、@ 記号が存在しない場合、この関数は、その文字列をそ のまま返します。
上記以外の場合( addressの値が文字列であり、かつ@ 記号が存在する場合)、この関数から は、最初の@ 記号の前のアドレスを格納した文字列(つまりユーザー部) が返ります。

数値

IsNumber(arg)
argの値が数値の場合、この関数はTRUE 値を返します。それ以外の場合、NULL 値が返りま す。
Number(arg)
argの値が数値の場合、この関数は、その数値を返します。
argの値が文字列の場合、その文字列の数値が返ります(数値への変換)。数値への変換は、 最初の非数値文字の前まで行われます。
例えば、 Number("123#") の場合、 123が返ります。
上記以外の場合、この関数からは数値 0が返ります。
RandomNumber()
この関数は、整数の乱数を返します。範囲は、[0..9223372036854775807] ([0..2*63- 1]) です。

タイムスタンプ

IsDate(arg)
argの値がタイムスタンプの場合、TRUE 値が返ります。そうでない場合、NULL 値が返りま す。
GMTTime()
この関数は、カレントのGMT 時刻を格納したタイムスタンプオブジェクトを返します。
LocalTime()
この関数は、カレントのローカル時刻を格納したタイムスタンプオブジェクトを返します
GMTToLocal(arg)
argの値としてタイムスタンプオブジェクト(GMT) を指定した場合、その値がローカル時 刻に変換され、タイムスタンプオブジェクトとして返ります。
上記以外の場合、この関数はNULL 値を返します。
LocalToGMT(arg)
argの値としてタイムスタンプオブジェクト( ローカル時刻) を指定した場合、その値が GMT に変換され、タイムスタンプオブジェクトとして返ります。
上記以外の場合、この関数はNULL 値を返します。
Year(arg)
argの値がタイムスタンプオブジェクトの場合、argの値のうち年の数値が返ります。
上記以外の場合、この関数はNULL 値を返します。
Month(arg)
argの値がタイムスタンプオブジェクトの場合、argの値のうち月の名前(Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec) を格納した文字列が返ります。  
上記以外の場合、この関数はNULL 値を返します。
MonthNum(arg)
argの値がタイムスタンプオブジェクトの場合、argの値のうち月の数値(1 月は1) が返り ます。
上記以外の場合、NULL 値が返ります。
MonthDay(arg)
argの値がタイムスタンプオブジェクトの場合、argの値のうち月の日を示す数値(月の最初 の日が1) が返ります。
上記以外の場合、NULL 値が返ります。
WeekDay(arg)
argの値がタイムスタンプオブジェクトの場合、argの値のうち曜日の名前(Mon, Tue, Wed, Thu, Fri, Sat, Sun)を格納した文字列が返ります。
上記以外の場合、NULL 値が返ります。
YearDay(arg)
argの値がタイムスタンプオブジェクトの場合、argの値のうち年の日を示す数値(1 月1 日 が1) が返ります。
上記以外の場合、NULL 値が返ります。
TimeOfDay(arg)
argの値がタイムスタンプオブジェクトの場合、argの日の値と、その日の開始点との差を示す数値(日の開始から経過した時間の長さ、単位は秒数) が返ります。 
上記以外の場合、NULL 値が返ります。
DateNumber(arg)
argの値がタイムスタンプオブジェクトの場合、1970 年1 月1 日からargの値の中の日まで の日数(経過日数) が返ります。
上記以外の場合、NULL 値が返ります。
DateByMonthDay(year,monthNum,monthDay)
year、monthNum、monthDay (年の数値、月の数値、月の日の数値) はすべて正の数値でな ければなりません。いずれかが正の数値でなかったときには、この関数からはNULL 値が返 ります。すべて正の数値だった場合、year、monthNum、monthDay で指定した日の午前0 時 を格納したタイムスタンプオブジェクトが返ります。
例えば、次の場合、2006 年11 月5 日の午前0 時のタイムスタンプが返ります。
DateByMonthDay(2006,11,5)
DateByYearDay(year,yearDay)
year、yearDay (年の数値、年の日の数値) はどちらも正の数値でなければなりません。い ずれかが正の数値でなかったときには、この関数からはNULL 値が返ります。すべて正の数 値だった場合、year、yearDay で指定した日の午前0 時を格納したタイムスタンプオブジェ クトが返ります。
例えば、次の場合、2006 年2 月1 日の午前0 時のタイムスタンプが返ります。
DateByYearDay(2006,32)

IP アドレス

IsIPAddress(arg)
argの値がIP アドレスの場合、この関数からはTRUE 値が返ります。そうでない場合、 NULL 値が返ります。
IPAddress(arg)
argの値がIP アドレスの場合、そのIP アドレスが返ります。
argの値が文字列で、その文字列に格納されているIP アドレス表現が適切(オプションで ポート番号があっても可) だった場合、そのIP アドレスが返ります。
上記以外の場合、NULL 値が返ります。

データブロック

IsData(arg)
argの値がデータブロックの場合、TRUE 値が返ります。それ以外の場合、NULL 値が返りま す。

配列

IsArray(arg)
argの値が配列の場合、TRUE 値が返ります。それ以外の場合、NULL 値が返ります。
NewArray()
この関数では、新規の空の配列が作成され、その配列が返ります。
Invert(arg)
argの値は配列でなければなりません。そうでない場合、プログラム例外が発生します。
argの値(配列) の要素の順番が逆転された後、その配列が返ります。
Find(source,object)
sourceには配列、objectにはオブジェクトを指定します。関数の実行後、sourceの要素のう ちobjectの値に等しい最初の要素のインデックスが返ります。配列sourceに該当するオブ ジェクトがなかった場合、負の数値が返ります。
sourceの値が配列でないときには、負の数値が返ります。
RemoveElement(target,index)
このプロシージャでは、配列の要素を削除できます。
targetの値は配列でなければならず、そうでない場合、プログラム例外が発生します。
indexは配列の要素のインデックスで、値は数値または10 進数値を格納した文字列でなけれ ばなりません。ここで指定した配列の要素が削除されます。indexを指定しなかったときに は、配列の最初の要素(インデックス0) が削除されます。
例えば配列myArray の値が (1,4,9,16,25)の場合、 RemoveElement(myArray,2) により配列myArray の値は (1,4,16,25)に変更されます( インデックスが2 の要素が削除されます)。
InsertElement(target,index,element)
このプロシージャを使って、配列に要素を挿入できます。
targetの値は配列でなければならず、そうでない場合、プログラム例外が発生します。
indexは配列の要素のインデックスで、値は数値または10 進数値を格納した文字列でなけれ ばなりません。indexで指定した位置に要素が挿入されます。既存の要素のうち、indexで指 定した位置にある要素と、それ以降の要素のインデックスはそれぞれ1 だけ増えます。
例えば配列myArray の値が (1,4,9,16,25) の場合、 InsertElement(myArray,2,"Jack") により配列myArray の値は (1,4,"Jack",9,16,25) に変更されます( インデックスが2 の位置に要素が挿入されます)。

辞書

IsDictionary(arg)
argの値が辞書の場合、TRUE 値が返ります。それ以外の場合、NULL 値が返ります。
NewDictionary()
この関数を使って、新規の空の辞書を作成できます。

データ変換

ObjectToString(arg)
この関数では、argの値のテキスト表現を格納した文字列が返ります(オブジェクトからテ キストへの変換)。
argの値がNULL 値の場合、NULL 値が返ります。
TextToObject(arg)
argの値は文字列またはデータブロックでなければなりません。そうでない場合、プログラ ム例外が発生します。
この関数では、argの値に対応するオブジェクトが返ります(テキストからオブジェクトへ の変換)。変換が失敗した場合、NULL 値が戻ります。

環境

Vars()
この関数は、このタスク(プログラム呼び出し)の辞書が返ります。プログラムのプロシー ジャと関数で使用される変数をすべて、この辞書に保存できます。
When a Task is started with parameters (for example, when a
リアルタイムアプリケーション is started to process a Signal directed with the ルータ), the parameter array is placed into the startParameter element of the Vars() dictionary.
The following example retrieves the first two Task parameters:
  firstParam  = Vars().startParameter[0];
  secondParam = Vars().startParameter[1];

アドレスとURI

SIPURIToEmail(uri)
uriにSIP URI を指定し、そのURI を電子メール文字列に変換できます。
uriが文字列でなかったとき、またはSIP URI であると認識されなかったときには、この関数 からはNULL 値が返ります。
EmailToSIPURI(email)
emailに電子メールアドレスを指定し、そのアドレスをSIP URI 文字列に変換できます。
emailが文字列でなかったとき、または電子メールアドレスであると認識されなかったときに は、この関数からはNULL 値が返ります。
PhoneNumberToSIPURI(phoneNumber)
この関数は、phoneNumberの値(電話番号) をSIP URI 文字列に変換します。
phoneNumberが文字列でなかったとき、または電話番号であると認識されなかったときに は、NULL 値が返ります。
phoneNumberの値に書式付け記号があった場合、その記号はすべて削除され、数字と先頭の プラス(+) 記号(ある場合) だけが残ります。
また、処理後の電話番号に自動的にカレントのドメイン名が付加されます。
RouteAddress(email,type)
この関数では、email (電子メールアドレス) を指定し、そのルーティングが可能です。ルー ティングは、ルータ を使って行われます。
typeにはアドレスのタイプを指定します。指定できるタイプは、mail、signal、access (いずれも文字列)のいずれかです。
指定したアドレスのルーティングに失敗した場合、エラーコード文字列が返ります。成功し たときには辞書が返り、この辞書には次の各要素が格納されています。
module
CommuniGate Pro のモジュールの名前で、このモジュールにより、指定したアドレスが処理 されます。
host
ホストの名前を格納した文字列( ローカルの場合はローカルアカウント、リモートの場合は リモートドメインなど)。指定したアドレスは、このホストにルートされます。
object
ホストオブジェクトの名前を格納した文字列。指定したアドレスは、このオブジェクトに ルートされます。
canRelay
オプションの要素。指定したアドレスに対して情報のリレーが可能な場合、この要素に TRUE 値が格納されます。

アカウントデータ

以下の関数とプロシージャは、アカウントデータ操作用です。いずれもプログラム( タスク) に「カ レントのアカウント」が設定されているときに使用できます。
MyDomain()
カレントタスクに、カレントのドメイン名(カレントのアカウントのドメインの名前) が存 在する場合、その名前を格納した文字列が返ります。存在しない場合、NULL 値が返ります。
MyEmail()
カレントタスクに、カレントのアカウントの電子メールアドレスが存在する場合、その電子 メールアドレスを格納した文字列が返ります。存在しない場合、NULL 値が返ります。
GetAccountPreferences(keyName)
カレントのアカウントに設定されているプレファレンスデータが返ります。
のキーの値(アカウントのプレファレンスオブジェクト) が返ります。指定しなかった(空 白の文字列の) 場合、アカウントの有効なプレファレンスがすべて格納された辞書が返りま す。
keyNameには接頭辞~username/ を付加できます( この接頭辞は自動的に削除されます)。 これで、username で指定したアカウント(ユーザー名) について処理が行われます。この 場合、そのアカウントがカレントのアカウントと同じではなく、かつ、カレントのアカウン トに、そのアカウントのドメインについてドメイン管理者アクセス権が付与されているとき に限って、処理が実行されます。
SetAccountPreferences(keyValue,keyName)
この関数では、カレントのアカウントのプレファレンスデータを更新できます。
keyNameには辞書(アカウントのプレファレンスデータ) のキーの名前(文字列)、keyValue には、そのキーの新規のオブジェクトを指定します。既存のオブジェクトは、このオブジェ クトに更新されます。keyValueにNULL 値を指定した場合、そのオブジェクトがアカウント のプレファレンスデータから削除されます。以後、そのキーの値としてデフォルト値が使用 されます。
keyNameを指定しない(空白の文字列を指定) 場合、keyValueには辞書を指定します。この 方法で、アカウントのプレファレンスデータ全体を更新できます。
keyNameには接頭辞~username/ を付加できます( この接頭辞は自動的に削除されます)。これで、username で指定したアカウントのデータを更新できます。その場合、そのアカウ ントがカレントのアカウントと同じではなく、かつ、カレントのアカウントに、そのアカウ ントのドメインについてドメイン管理者アクセス権が付与されているときに限って、処理が 実行されます。
プレファレンスデータの更新に成功したときには、NULL 値が返ります。失敗したときには、 エラーコードを格納した文字列が返ります。
ReadSiteFile(fileName)
カレントのアカウントのファイルストレからファイルを読み込むことができます。
fileNameの値(ファイル名) は文字列でなければなりません。このファイルが読み込まれま す。
この関数からデータブロックが返ります。データブロックには、ファイルの内容が格納され ています。指定したファイルが見つからなかったときには、NULL 値が格納されます。
WriteSiteFile(fileName,data)
dataにはデータブロックまたは文字列を指定し、fileNameにはカレントのアカウントのファイルストレにあるファイルを指定します。そのデータブロックまたは文字列が、file-Nameで指定したファイルに書き込まれます。
fileNameが文字列でなかった場合、またはdataがデータブロックもしくは文字列でなかった 場合、プログラム例外が発生します。
ファイルの書き込みに成功したときにはNULL 値が、失敗したときにはエラーコードを格納 した文字列が返ります。
AppendSiteFile(fileName,data)
dataにはデータブロックまたは文字列を指定し、fileNameにはカレントのアカウントのファイルストレにあるファイルを指定します。そのデータブロックまたは文字列が、file-Nameで指定したファイルの末尾に追加されます。
fileNameが文字列でなかった場合、またはdataがデータブロックもしくは文字列でなかった 場合、プログラム例外が発生します。
データの追加に成功したときにはNULL 値が、失敗したときにはエラーコードを格納した文 字列が返ります。
DeleteSiteFile(fileName)
この関数を使って、fileNameにファイル名を指定し、そのファイルをカレントのアカウント のファイルストレから削除できます。
ファイルの削除に成功したときにはNULL 値が、失敗したときにはエラーコードを格納した 文字列が返ります。
RenameSiteFile(oldFileName,newFileName)
oldFileNameには、カレントのアカウントのファイルストレにある既存のファイルの名前 を指定します。newFileNameには、既存のファイルの名前の変更後の名前(別の名前) を指 定します。既存のファイル名がnewFileNameで指定したファイル名に置き換えられます。パ ラメータの値はどちらも文字列でなければなりません。
ファイル名の変更に成功したときにはNULL 値が、失敗したときにはエラーコードを格納し た文字列が返ります。
ListSiteFiles(folderName)
この関数では、カレントのアカウントのファイルストレの中のサブディレクトリ ( folderName) を指定し、そのサブディレクトリにあるすべてのファイルに関する情報(ファ イル/ フォルダのリスト) を取り出せます。
folderNameが文字列でなかった(指定しなかった) 場合、ファイルサイトの最上位レベルの ディレクトリに関する情報が取り出されます。
エラーが発生したときにはNULL 値が返ります。エラーが発生しなかったときには辞書が返 ります。辞書のキーはファイル名または(サブ) フォルダ名です。フォルダの場合、値は空 白の配列です。ファイルの場合、値は次の要素を格納した辞書です。
STCreated
ファイル作成日を示すタイムスタンプ。
STModified
ファイル変更(更新)日を示すタイムスタンプ。
STFileSize
ファイルのサイズ(単位はバイト数)を示す数値。
注意: カレントのアカウント以外のアカウントのファイルストレージにもアクセスできます。その場 合、次の書式でファイル名またはフォルダ名を指定します。
Impersonate(email)
この関数では、emailに電子メールアドレスを指定し、そのアドレスをルートできます。結果 は、カレントのアカウントで使用されます。
ルート先のアドレスがローカルアドレスでなかった場合、カレントのアカウントは消去され ます。
ルート先のアドレスがローカルアドレスで、かつ、そのアドレスがカレントのアカウントの アドレスと異なっている場合(例えば別のドメイン)、カレントのアカウントに、ルート先 のアドレスのドメインについて[CanImpersonate] アクセス権が付与されているときに限っ て処理が実行されます。
ルーティングによりカレントのアカウントが変更された場合、プレファレンスや言語、時刻 ゾーンも変更されます。
処理に成功するとNULL 値が、失敗するとエラーコードを格納した文字列が返ります。
ReadGroupMembers(groupName)
この関数では、カレントのドメインに関する情報(グループのメンバー) を取り出せます。
groupNameにはグループの名前(文字列) を指定します。このグループに関する情報が読み 出されます。
処理に成功すると文字列の配列が返り、各文字列にはグループのメンバーの電子メールアド レスが格納されています。指定した名前のグループが存在しなかったときには、NULL 値が 返ります。
ReadTelnums(accountName)
This function reads Phone Numbers assigned to the accountName Account or to the current Account, if the accountName value is a null-value.
This function returns an array of strings. This function returns a null-value if there is no Account with the specified name.
To retrieve the Phone Numbers assigned to a different Account, the current Account should have the Domain Administrator right for the accountName Account Domain.
UpdateAccountMailRule(ruleData,accountName)
UpdateAccountSignalRule(ruleData,accountName)
These functions modify Account Queue or Signal Rules.
The ruleData parameter is a string or an array. It has the same meaning as the newRule parameter of the UpdateAccountMailRule and UpdateAccountSignalRule CLI commands.
These functions update the Rules of the the accountName Account, or the current Account if the accountName value is a null-value.
To update Queue Rules of a different Account, the current Account should have the RulesAllowed Domain Administrator right for the accountName Account Domain.
To update Signal Rules of a different Account, the current Account should have the SignalRulesAllowed Domain Administrator right for the accountName Account Domain.
This function returns a null-value if the operation has succeeded, otherwise it returns a string with an error code.

メールボックスハンドル

メールボックスハンドルは、 メールボックスを表す内部オブジェクトです。

OpenMailbox(mailboxName)
この関数を使ってメールボックスをオープンできます。mailboxNameは文字列でなければな りません。このパラメータにはメールボックス名を指定します。
メールボックス名の先頭に~ 記号を付けなかった場合、カレントのアカウント(存在する場 合) を使ってメールボックスがオープンされます(~ 記号を付加し、別のアカウントを指定 することができます)。
カレントのアカウント(存在する場合) には、mailboxNameで指定したメールボックスにつ いて読み取り/ 選択が付与されていなければなりません。
メールボックスのオープンに成功した場合、メールボックスハンドルが返ります。失敗した ときには、NULL 値が返ります。
MailboxUIDs(boxRef,flags)
この関数からは、メールボックスメッセージUID ( メールボックスにあるメッセージのUID) の配列が返ります。
boxRefには、メールボックスハンドルを指定します。
flagsにはメッセージフラグを指定します。複数指定することができ、その場合、コンマで区 切ります。通常のメッセージフラグの名前 のほか、 逆名を(例えばUnseen) 指定することも できます。メッセージのうち、通常の名前(Seen など) を使って指定したフラグが設定され ており、かつ、逆名(Unseen など) を使って指定したフラグが設定されていないメッセージ のUID だけが配列で返ります。
次の例では、 フラグSeen が設定されており、かつ、フラグDeleted が設定されていない メッセージのUID が取り出されます。
myMailbox = OpenMailbox("INBOX");
seen = MailboxUIDs(myMailbox,"Seen,Undeleted");
MailboxInternalTimeByUID(boxRef,uid)
この関数からは、メッセージの内部日付を格納したタイムスタンプオブジェクトが返りま す。
boxRefの値としてはメールボックスハンドルを指定します。uidには、数値( メッセージ UID) を指定します。
指定したUID のメッセージがメールボックスに存在しなかったときには、この関数から NULL 値が返ります。
MailboxFlagsByUID(boxRef,uid)
メールボックスのメッセージのフラグの名前を格納した文字列( コンマ区切りのリスト) が 返ります。
boxRefの値としてはメールボックスハンドルを指定します。uidには、数値( メッセージ UID) を指定します。
指定したUID のメッセージがメールボックスに存在しなかったときには、この関数から NULL 値が返ります。
MailboxSetFlagsByUID(boxRef,uid,flags)
この関数を使ってメールボックスのメッセージのフラグを変更できます。
boxRefの値としてはメールボックスハンドルを指定します。uidには、数値( メッセージ UID) を指定します。flagsには、メッセージフラグの名前 または 逆名を指定します。複数指定する場合、コンマで区切ります。
名前を使って指定したフラグが、指定したメッセージのフラグとして設定されます。また、 逆名の場合、そのフラグがリセット(例えばUnseen とした場合、Seen がリセット) されま す。
カレントのアカウント(存在する場合) にフラグの変更に関する所定のメールボックスアクセス権 が付与されており、かつフラグの変更に成功した場合、NULL 値が返ります。そうで ない場合、エラーコード文字列が返ります。
MailboxExpunge(boxRef)
メールボックスのメッセージのうち、 "purgable (パージ可能) " または"deleted (削除済 み) " とマークされているメッセージをすべて削除できます。
boxRefにはメールボックスハンドルを指定します。uidには、数値( メッセージUID) を指 定します。
MailboxAudioByUID(boxRef,uid)
この関数からは、メッセージのオーディオ部分を格納したデータブロックが返ります。   boxRefにはメールボックスハンドルを指定します。uidには、数値( メッセージUID) を指 定します。
指定したUID のメッセージがメールボックスに存在しなかったときには、NULL 値が返りま す。
MailboxRedirectByUID(boxRef,uid,addresses)
MailboxForwardByUID(boxRef,uid,addresses)
These function redirect or forward the specified message to the specified E-mail addresses.
The boxRef value should be a mailbox handle, the uid value should be a number - the message UID, the addresses should be a string containing one E-mail address or several E-mail addresses separated with the comma (,) symbols.
These functions return a null-value if the operation has succeeded, otherwise they return a string with an error code.

ディレクトリ

以下の内蔵関数は、 ディレクトリ マネージャへのインターフェイスとして使用できます。

DirectorySearch(baseDN,filter,parameters)
ディレクトリ検索が可能です。見つかったレコードを格納した辞書が返ります。
baseDNには検索ベースDN を指定します。"$" を指定することもでき、その場合、ディレクトリ統合 設定を使ってカレントのドメインの検索ベースDN が生成されます。
filterには、NULL 値または検索フィルタ(文字列、RFC2254 フォーマット) を指定します。
parametersにはNULL 値、または検索オプション(下記) を格納した辞書を指定します。
limit
このオプションに正の値を指定しておくと、最大で、この数までのレコードが返ります。指 定しなかった場合、レコードの最大数として100 がデフォルトで使用されます。
keys
このオプションの値としてDN を指定しておくと、辞書のキーとして正規のレコードDN (識別名) が使用されます。指定しなかった場合、RDN (相対識別名) が辞書のキーとして 使用されます。
scope
このオプションの値としてsub を指定しておくと、サブツリー検索が実行されます。指定し なかった場合、ベースDN レコードの子ディレクトリが検索されます。
attributes
このオプションの値として属性(文字列) の配列を指定しておくと、その配列に指定した属 性だけがレコードに取り込まれます。指定しなかった場合、すべての属性がレコードに取り込まれ返ります。

ディレクトリ検索に失敗すると(ベースDN レコードが存在しない、アクセス権が不十分な ど)、エラーコード文字列が返ります。

サービス

GetLanguage()
この関数からは、現在選択されている言語を格納した文字列が返ります。
SetLanguage(lang)
このプロシージャを使って、「現在選択されている言語」を設定できます。langには言語名 (文字列) を指定します。NULL 値を指定した場合、デフォルトの言語が選択されます。
GetTimeZoneName()
この関数からは、現在選択されているタイムゾーンの名前が返ります。タイムゾーンが選択 されていない(サーバータイムオフセットが使用されている) 場合、この関数はNULL 値を 返します。
SetTimeZone(zoneName)
このプロシージャでは、カレントのタイムゾーンの設定が可能です。zoneNameには有効な タイムゾーンの名前(文字列) を指定します。タイムゾーンの名前が無効だった(存在しな かった) とき、または文字列でなかったときには仮想の値( no zone) が設定され、また、 サーバーのカレントのタイムオフセットが使用されます。
SysLog(arg)
このプロシージャでは、argにテキスト表現を指定し、そのテキストをサーバーログに格納 できます。
StoreCDR(arg)
このプロシージャを使って、argに指定した値(文字列) を外部CDR プロセッサに送信でき ます。
argの値の前には自動的に接頭辞APP が付加されます(下記)。また、argの値の最初の部分 には、アプリケーション側で、そのアプリケーションの名前とバージョン番号を指定しなけ ればなりません。この名前とバージョン番号により、外部CDR プロセッサ上で、そのアプ リケーションが別のアプリケーションと区別されます。
APP arg

通信

HTTPCall(URL,parameters)
この関数を使ってHTTP トランザクション(HTTP コール) を実行できます。
URLは文字列でなければなりません。URLには要求URL を指定します。URL スキーマは、 http またはhttps のいずれかです。
parametersには辞書を指定します。辞書の内容は各要求パラメータです。要求の本体を指定 することもできます。辞書の要素としては、下記の要素を指定できます(すべてオプション です)。
body
要求の本体(ボディ) を格納したデータブロック。
Content-Type
要求の本体のコンテントタイプを格納した文字列。この要素は、要素body を指定し たときにだけ使用されます。
Content-Subtype
要求の本体のコンテントサブタイプを格納した文字列。この要素は、要素body と要 素Content-Type を指定したときにだけ使用されます。
method
要求のメソッドを格納した文字列。この要素を指定しなかった場合、GET メソッド (要求の本体を指定しなかったとき)またはPOST メソッド(要求の本体を指定したと き)が使用されます。
Cookie
Cookie フィールドデータを格納した文字列。
authName, authPassword
認証名と認証パスワード(どちらも文字列)です。指定した場合、この2 つの文字列 を使って要求の認証が行われます。
HTTP トランザクションが失敗したときにはエラーコード文字列が返ります。成功したとき には、次の各要素を格納した辞書が返ります。
responseCode
HTTP 応答コードが格納された数値。
body
応答の本体を格納したデータブロック(空のこともあります)
Content-Type
応答の本体のコンテントタイプを格納した文字列。
Content-Subtype
応答の本体のコンテントサブタイプを格納した文字列。
charset
応答の本体のキャラクタセットを格納した文字列。
Date, Last-Modified, Expires
タイムスタンプで、それぞれ応答のヘッダフィールド(日付、最後の更新時刻、有効 期限)の値が格納されています。
Server, Location, Set-Cookie
文字列で、それぞれ応答のヘッダフィールド(サーバー、場所、セットクッキー)の 値が格納されています。
SendEMail(fromAddress,subject,to,headers,content)
この関数では、電子メールメッセージの作成と送信が可能です。
fromAddressの値は文字列でなければなりません。このパラメータには、メッセージのFrom: アドレスを指定します。
subjectの値は文字列でなければなりません。このパラメータには、メッセージのSubject: フィールドを指定します。
toの値は、単一の電子メールアドレス(文字列) または電子メールアドレス(文字列) の配 列でなければなりません。メッセージのTo: アドレス(単一または複数)です。
headersにはNULL 値または辞書を指定します。この辞書で指定したヘッダフィールドの値 が、作成された電子メールメッセージで使われます。辞書には、次の要素を指定できます (すべてオプションです)。
Cc
この要素には、電子メールアドレス(文字列)または電子メールアドレス(文字列) の配列を指定します。指定した値は、メッセージのCc: アドレス(単一または複数) として使用されます。
Bcc
この要素には、電子メールアドレス(文字列)または電子メールアドレス(文字列) の配列を指定します。指定した値は、メッセージのBcc: アドレス(単一または複数) として使用されます。
sourceType
この要素には、メッセージソース(文字列)を指定します。この要素を指定しなかっ た場合、値として文字列""CGPL" が使われます。
sourceAddress
この要素の値は文字列でなければなりません。この要素には、メッセージソースのア ドレス(ネットワークアドレス、リモートシステムの名前など) を指定します。
protocol
この要素の値は文字列でなければなりません。この要素にはプロトコルを指定します。 このプロトコルを使って、メッセージが送信されます。
Content-Class
この要素の値は文字列でなければなりません。この要素には、電子メールのCon-tent-Class: ヘッダフィールドの値を指定します。
X-Priority
この要素の値は文字列でなければなりません。この要素には、電子メールのX-Priority:ヘッダフィールドの値を指定します。
contentには、電子メールメッセージのボディ(本体) を指定します。contentの値が辞書の 場合、辞書の要素のうちボディ(body) を示す要素の値が実際のコンテントとなります。こ れ以外の要素はすべて、ボディパラメータ( コンテントヘッダフィールド) です。contentの 値が辞書でない場合、その値自体が実際のコンテントとして処理され、またボディパラメー タは空です。
ボディパラメータ(辞書の要素) としては、次の要素が処理されます(すべてオプションです)。
Content-Type
この要素の値は文字列でなければなりません。この要素にはボディのコンテントタイ プを指定します。この要素が指定されていない場合、コンテントタイプは"text" (コンテントが文字列の場合)または "application" (コンテントが文字列でない場 合)のいずれかに設定されます。
Content-Subtype
この要素の値は文字列でなければなりません。この要素にはボディのコンテントサブ タイプを指定します。この要素が指定されていなく、かつコンテントタイプ (Content-Type)が "text"に設定されている場合、この要素の値(コンテントサ ブタイプ)としては "plain" が使われます。
filename
この要素の値は文字列でなければなりません。この要素には、ファイル名(ボディを 格納したファイルの名前)を指定します。
Content-Disposition
この要素の値は文字列でなければなりません。この要素には、コンテントディスポジ ションを指定します。この要素が指定されておらず、要素fileName が指定されてい る場合、コンテントディスポジションの値としては "attachment" が使われます。

実際のコンテントが文字列の場合、8bit コンテントトランスファーエンコーディングを 使って「そのまま」保存されます。
実際のコンテントがデータブロックの場合、base64 コンテントトランスファーエンコー ディングを使って保存されます。
実際のコンテントが配列の場合、コンテントはマルチパートコンテントとして処理されま す。また、要素としてはコンテントサブタイプ(Content-Subtype)だけが使用されま す。コンテントサブタイプが指定されていないときには、その値として "mixed" が使用さ れます。
配列の各要素はいずれも、contentの値自体の形式で保存されます。
実際のコンテントが配列、文字列、データブロックのいずれでもない場合、空のコンテント が保存されます。
電子メールメッセージの生成と送信(キューへの送信) に成功した場合、この関数からは NULL 値が返ります。失敗したときには、エラーコード文字列が返ります。

次は、簡単なテキストメッセージを送信する例です。

  result = SendEmail("from@sender.dom","Test Message","To@recipient.dom",
                      null,"Test Message\eEnd Of Message\e");

次の例では、multipart/mixed メッセージが送信されます。このメッセージには、HTML テキ ストとバイナリアタッチメントが格納されています。

  content = NewArray();

  textPart = NewDictionary();
  textPart.("Content-Type") = "text";
  textPart.("Content-Subtype") = "html";
  textPart.body = "<HTML><BODY>This is an <B>HTML</B> text</BODY></HTML>";
  content[0] = textPart;

  dataPart = NewDictionary();
  dataPart.("Content-Type") = "image";
  dataPart.("Content-Subtype") = "gif";
  dataPart.fileName = "file.gif";
  dataPart.body = ReadSiteFile(dataPart.fileName);
  content[1] = dataPart;

  headers = NewDictionary();
  headers.("Content-Class") = "message";

  result = SendEmail("from@sender.dom","Test Attachment",
                     "To@recipient.dom",headers,content);

SendInstantMessage(fromAddress,toAddress,content)
この関数では、インスタントメッセージの作成と送信が可能です。
fromAddressの値は文字列でなければなりません。メッセージのFrom: アドレスです。
toAddressの値は文字列でなければなりません。メッセージのTo:(受取人)アドレスです。
contentの値は文字列でなければなりません。メッセージのコンテントです。
この関数による処理は、インスタントメッセージのシグナリング処理(生成と送信) の開始 だけで、処理が完了(応答の受信) まで待機することはありません。
インスタントメッセージの生成と送信(Signal コンポーネントへの送信) に成功すると NULL 値が返ります。失敗したときには、エラーコード文字列が返ります。
RADIUSCall(address,parameters)
この関数では、RADIUS 要求の生成と送信が可能です。
addressの値はIP アドレスでなければなりません。RADIUS サーバーのアドレスとポートを 指定します。このRADIUS サーバーに要求が送信されます。
parametersの値は辞書でなければならず、辞書の要素は次の通りです。
Type
この要素は文字列でなければなりません。この要素は、送信されるRADIUS 要求のタ イプです。指定できるタイプは次の通りです。
authenticate, accountingStart, accountingUpdate, accountingStop.
Secret
この要素は文字列でなければなりません。この要素には、RADIUS サーバーの「共有秘密 (shared secret)」を指定します。
Username
この要素は文字列(ユーザー名) でなければなりません。このユーザー名を使って、 要求のuserName (1) 属性が作成されます。
Password
RADIUS 要求のタイプがauthenticate の場合(上記)、この要素は必ず指定されて いなければなりません。文字列でなければなりません。クリアテキストパスワードを 指定し、このパスワードを使って認証が行われます。
nn (nn は10 進数)
この要素を使って、要求の追加の属性(複数可)を指定できます(属性を示す値を指 定します)
要素の値は、文字列、数値(整数型パラメータの場合)、IP アドレス( インターネット型パラメータの場合) のいずれかでなければなりません。
要素の値としてデータブロックを指定することもでき、その場合、そのデータブロッ クのないようなエンコーディングなしで送信されます。
また、配列を指定することもでき、その場合、配列の要素の値がそれぞれ複数回にわ たって要求に追加されます。
-nnnnn (where nnnnn is a decimal number)
these elements specify additional vendor-specific attributes (where nnnnn is the VendorID). See the RADIUS section to see more on the vendor-specific attribute presentation.

RADIUS 処理が成功したときには、この関数からは辞書が返ります。この辞書には、RADIUS サーバーからの応答に含まれている属性が格納されています。処理が失敗した場合、エラー コードを格納した文字列が返ります。
注意: 要求は RADIUS モジュールのUDP ソケットを使って送信されます。したがって、 RADIUS モジュールが有効になっていなければなりません(また、0 以外のポート番号が使 用されるように設定しておかなければなりません)。

次は、RADIUS 認証要求を送信する場合の例です。この要求は、nasIdentifier (32) 属性(テキ スト) が格納されて送信されます。

callParam = newDictionary();
callParam.Type     = "authenticate";
callParam.Secret   = "sys2";
callParam.Username = "user4567";
callParam.Password = "drum$1245";
callParam.("32")   = "my NAS";
result = RADIUSCall(IPAddress("[10.0.1.77]:1812"),callParam);

次は、RADIUS アカウンティング要求の送信例です。この要求は、nasIdentifier (32) 属性(テ キスト) とacctSessionTime (60) 属性(数値) が格納されて送られます。

callParam = newDictionary();
callParam.Type     = "accountingStart";
callParam.Secret   = "sys2";
callParam.Username = "user4567";
callParam.("32")   = "my NAS";
callParam.("46")   = SessionTimeInMinites*60;
result = RADIUSCall(IPAddress("[10.0.1.77]:1812"),callParam);

マルチタスキング

環境(リアルタイムアプリケーション環境など) によっては、マルチタスキング機能の利用が可能で す。こうした環境(マルチタスキング環境) では、複数のプログラム呼び出し( タスク) の同時実行 が可能であり、この同時実行により相互に通信したりデータを交換したりといった処理が可能です。 以下、マルチタスキング環境で使用できるCG/PL について説明します。

タスクを表現する内部オブジェクトをタスクハンドルと呼んでいます。 クラスタ環境では、タスクハ ンドルには、そのタスクが動作しているクラスタメンバーに対する参照も格納されています。

スポーニング

プログラム(実行中のタスク) には、スポーニング式を使って新規のタスクを作成する機能がありま す。スポーニング式とは、キーワードspawn の後にエントリコードポジションの名前を定義すると いう形式の式をいいます。
スポーニング式の値は、作成された新規のタスクのタスクハンドルです。または、新規のタスクに失 敗したときには、NULL が返ります。

次は、プログラム(エントリコードセクションMain)で新規のタスクを作成する場合の例です。こ の新規のタスクにより、エントリコードセクションDoBackup が実行され、その結果、"file1"、 "file2"...."file100" の各ファイルが"backup1"、"backup2"... の各ファイルにコピーされます。
entry DoBackup is
  nameIndex = 1;
  while nameIndex <= 100 loop
    fileData = ReadSiteFile("file" + String(nameIndex));
    if fileData != null then
      resultCode = WriteSiteFile("backup" + String(nameIndex));
      if resultCode != null then
        Log("failed to backup file" + String(nameIndex) +
            ". Error Code=" + resultCode);
      end if;
    end if;
  end loop;
end entry;
 
entry Main is
  backuper = spawn DoBackup;
  if backuper == null then
    Log("Failed to start a Backup Task");
  end if;
end entry;

なお、複数のタスク間で変数が共有されることはいっさいありません。これは、タスク内で直接、ス ポーニング式を使って新規のタスクを作成したときでも同様です。

イベント

タスクから他のタスクにイベントを送信するという方法で、そのタスクと他のタスクとの間でデータ の交換が可能です。
SendEvent(taskRef,eventName,eventParam)
この関数を使って、別のタスクにイベントを送信できます。イベントの送信が成功すると NULL 値が返ります。失敗した(例えば指定したタスクが存在しなかった) ときには、エ ラーコードを格納した文字列が返ります。
taskRefの値はタスクハンドルでなければなりません。eventNameにはイベント名(アルファ ベットで始まる文字列) を指定します。eventParamの値は、NULL または「変更不可能のオ ブジェクト」でなければなりません(つまり、eventParamには配列や辞書は指定できませ ん)。
eventParam ( イベントのパラメータ) として配列または辞書を指定する必要がある場合、配 列または辞書の
テキスト表現 を使用します。
この関数による処理は、指定した( ターゲット) タスクに対するイベントの送信だけです。ターゲットタスクによるイベントの受信まで、またはターゲットタスクからの応答の受信ま で待機することはありません。
ReadInput(secsToWait)
タスクに送信されたイベントはキューに格納されます。そのタスクでは、この関数を使っ て、キューの中の最初のイベントを読み取ることができます。関数からは、イベントデータ が格納された辞書が返ります。
secsToWaitには非負数値(待機時間) を指定します。タスクイベントキューが空で、その 後、secsToWaitで指定した時間(秒数) 内に新規のイベントが受信されなかった場合、この 関数からはNULL 値が返ります。
この関数から返った辞書には(待機時間内にイベントが受信された場合)、次の要素が格納 されています。
sender
送信側のタスク( このイベントを送信したタスク) のタスクハンドル。 クラスタ環境 の場合、送信側のタスクとカレントタスク( イベントを受信したタスク) は、別々ク ラスタメンバー上で動作していてもかまいません(別のクラスタメンバーのタスクに イベントを送信することもできます)。
what
この要素には、パラメータeventNameの文字列( イベント名)、つまり送信側のタスク のSendEvent で指定されているイベント名が格納されています。
parameter
この要素には、パラメータeventParamの文字列( イベントパラメータ)、つまり送信 側のタスクのSendEvent で指定されているイベントパラメータが格納されています。
注意: 意: 環境によっては、関数ReadInput から上記以外のオブジェクトが返ることもありま す。例えば、 リアルタイムアプリケーション 環境の場合、 キューの最初のDTMF を格納し た文字列が返ることがあります。
注意: 関数ReadInput では「誤覚醒」処理が発生することがあります。つまり、指定した 待機時間が経過する前にNULL オブジェクトが返ることがあります。

ミーティング

ミーティング(会議) メカニズムはタスクに対応しており、このメカニズムを介して、アカウント のタスクと、そのアカウントの別のタスクとの間で通信が可能です。

アカウントではそれぞれ、名前付きミーティングセット(複数) と名前なしデフォルトミーティング セット(単一) を使用できます。ミーティングセットにはいずれも、複数の名前付きミーティングを 作成できます。ミーティングは辞書オブジェクトで、それぞれタスクハンドルがあります(ない場合 もあります)。

CreateMeeting(setName,key,param)
この関数を使用して、カレントのアカウントのミーティングセットの中にミーティングオブ ジェクトを作成できます。
パラメータsetNameはミーティングセットの名前で、このミーティングセットを使ってミー ティングが作成されます。この値がNULL 値または空白の文字列の場合、デフォルトミー ティングセットが使用されます。
パラメータkeyは文字列でなければなりません。このパラメータには新規のミーティング (作成されるミーティング) の一意のID または名前を指定します。例えば、リアルタイムカンファレンシング(電子会議) アプリケーションの場合、乱数文字列を生成し、その乱数文 字列をカンファレンスのパスワードとして使用し、さらに、その文字列をパラメータkeyの 値として使用してミーティングを作成するという処理が可能です。その後、作成されたミー ティング(また、そのミーティングを処理するタスクのタスクハンドル) に対して、同じア カウントの他のタスクからアクセスが可能になります。なお、その場合、他のタスクで、 CreateMeeting ( ミーティング作成) 処理で使用されているパラメータkey とパラメータ setName の値が認識されていることが必要です(パラメータを渡すことが必要です)。
パラメータparameterの値は、作成されたミーティングに保存されます。この場合、値はテ キスト表現を使って保存されます。そのため、parameterの値また値のサブ要素として指定で きるのは、標準のオブジェクトに限られます。例えば、メールボックスやタスクハンドル は、parameterの値また値のサブ要素としては指定できません。
ミーティングが作成された場合、この関数からはNULL 値が返ります。失敗したときには、 エラーコード文字列が返ります。
ActivateMeeting(setName,key)
この関数を使って、カレントのアカウントのミーティングに対してタスクハンドル(プログ ラムのカレントタスクのタスクハンドル) を追加できます。
setName とkey にはそれぞれ、既存のミーティングのsetName とkey の値を指定します。こ のミーティングに対してタスクハンドルが追加されます。
ミーティングに既にタスクハンドルが存在する場合、タスクハンドルを新たに追加すること はできません。
この関数の処理が成功すると、カレントタスクがミーティングのアクティブタスクになりま す( ミーティングが有効になります)。
タスクハンドルの追加が成功すると、この関数からNULL 値が返ります。失敗すると、エ ラーコード文字列が返ります。
DeactivateMeeting(setName,key)
この関数を使って、カレントのアカウントのミーティングに設定されているタスクハンドル (プログラムのカレントタスクのタスクハンドル) を削除できます。
setName とkey にはそれぞれ、既存のミーティングのsetName とkey の値を指定します。こ のミーティングのタスクハンドルが削除されます。
この関数の処理が成功すると、ミーティングにはアクティブタスクはなくなります( ミー ティングが無効になります)。
タスクハンドルの削除に成功すると、NULL 値が返ります。失敗したときにはエラーコード 文字列が返ります。
RemoveMeeting(setName,key)
この関数では、カレントのアカウントのミーティングセットにあるミーティングを削除でき ます。
setName とkey にはそれぞれ、既存のミーティングのsetName とkey の値を指定します。こ のミーティングが削除されます。
ミーティングの削除に成功した場合、または指定したミーティングが見つからなかった場 合、NULL 値が返ります。失敗したときにはエラーコード文字列が返ります。
FindMeeting(setName,key)
カレントのアカウントのミーティングセットにあるミーティングの検索が可能です。
setName とkey にはそれぞれ、既存のミーティングのsetName とkey の値を指定します。こ のミーティングが検索されます。
指定したミーティングがアカウントに存在しなかった場合、NULL が返ります。
指定したミーティングが見つかったときには、そのミーティングに関する情報が辞書で返り ます。この辞書の要素は次の通りです。
parameter
CreateMeeting ( ミーティング作成) 処理で使用されたパラメータparameterの値です。
id
アクティブタスク(カレントタスク)のタスクハンドルです(存在する場合)
クラスタ 環境では、アクティブタスク( ミーティング) とカレントタスクは、別個の クラスタメンバー上に存在してもかまいません( タスク間で通信が可能です)。
ClearMeeting(setName,key)
This function removes a Task Handle from a Meeting (if any).
The setName and key parameter values specify the Meeting to clear.
This function can be used to clear a reference set by a Task that has died.
This function returns a null-value if the Meeting has been successfully cleared. Otherwise, this function returns an error code string.

キュー

キューメカニズムはタスクに対応しており、このメカニズムを介して、アカウントのタスクと、そ のアカウントの別のタスクとの間で通信が可能です。例えば、タスクを介して、キューに登録されて いるタスクを検索し、見つかったタスクをキューから削除するといった処理が可能です。

Enqueue(queueName,parameter,pty)
この関数では、カレントタスクをアカウントのキューに登録できます。
単一のアカウントでは複数のキューを使用できます。queueNameには、いずれかのキューの 名前を指定します。このキューにタスクが登録されます。このパラメータの値としてNULL 値または空白の文字列を指定した場合、アカウントのデフォルトのキューが使用されます。
パラメータparameterにはタスクのパラメータの値を指定します。この値は、タスク(の登 録情報) に保存されます。この場合、値はテキスト表現を使って保存されます。そのため、 parameterの値また値のサブ要素として指定できるのは、標準のオブジェクトに限られます。 例えば、メールボックスやタスクハンドルは、parameterの値また値のサブ要素としては指定 できません。
パラメータptyはタスクの優先度で、数値文字列でなければなりません。この文字列は、一 桁の10 進数、ドット(.)、任意の桁の数値の書式で指定します。タスク(カレントタスク) は、この優先度をもとにキューに格納されます。具体的には、タスクは、そのタスクより pty(優先度)の値が小さいすべてのタスクの前、かつ、そのタスクとpty(優先度)の値が同じか、または大きいすべてのタスクの後に置かれます。パラメータptyの値としてNULL 文字列を指定した場合、デフォルト値として"1.0" が使われます。
同一のタスクは、キューが異なればそれぞれ別個に登録することができます。一方、同一の タスクを同一のキューに複数登録することはできません。つまり、タスク(カレントタス ク) が既にキューに登録されており、そのタスクを使って、この関数で同じキューに登録を 行おうとしても、タスクがもう一つ登録されることはありません。その場合、この関数のパ ラメータparameterを使って登録済みのタスクのパラメータparameterが更新され、また、こ の関数のパラメータptyの値にしたがってキューの現在のタスクの位置が更新されます(優 先度が異なる場合)。
登録に失敗した場合、この関数からはNULL 値が返ります。登録に成功した場合、次の要素 を格納した辞書が返ります。
length
数値。キューに格納されているタスクの総数(長さ) です。
position
数値。この関数によってキューに登録されたタスクの現在の位置。
キューの最初のタスクの位置は0 です。
CheckQueue(queueName)
アカウントのキューのカレントタスクの位置を取り出せます。
パラメータqueueNameにはキューの名前を指定します。このキューの中のタスクが検索され ます。
指定したキューへのアクセスが失敗するとNULL 値が返ります。成功した場合、辞書が返り ます。この辞書の要素は、関数Enqueue で返る辞書と同じです。
注意: 返った辞書の要素position には、指定したキューにカレントタスクが存在したとき にのみ値が格納されています。カレントタスクがキューに存在していなかった場合、また は、別のタスクによってキューから削除されていた場合には、この要素は空です。
Dequeue(queueName)
この関数を使って、アカウントのキューからカレントタスクを削除できます。
queueNameは、キューの名前です。このキューからカレントタスクが削除されます。
ReadQueue(queueName)
アカウントのキューの最初のタスクを取り出せます。
パラメータqueueNameにはキューの名前を指定します。
指定したキューにタスクが一つも存在しなかったときには、NULL 値が返ります。
指定したキューにタスクが存在したときには、次の要素を格納した辞書が返ります。
id
取り出されたタスクのタスクハンドル。 クラスタ環境では、このタスクとカレントタ スクは別個のクラスタメンバー上に存在してもかまいません( タスク間で通信が可能 です)。
parameter
このタスクがキューに格納されたときに使われたパラメータparameterの値。
注意: この関数では、キューの最初のタスクは、取り出されると同時に削除されます。その ため、このタスクを再度同じキューに格納しない限り、別のタスクからこのタスクを検索す ることはできません。

正規構文

string::="string-data"
number::=digits
name ::=alpha-numeric-and-underscore-starting-with-alpha
variable::=name
basicData::=variable | funcCall
dataRef::=basicData | dataRef [ expr ] | dataRef . name | dataRef . ( expr )
spawnExpr::=spawn name
basicExpr::=string | number | dataRef | null | false | true | spawnExpr
unaryOp::=! | not | - | +
unary::=basicExpr | unaryOp unary | ( expr )
multOp::=* | / | %
multBinary::=unary | multBinary multOp unary
addOp::=+ | -
addBinary::=multBinary | addBinary addOp multBinary
cmpOp::=< | <= | == | != | >= | >
cmpBinary::=addBinary | cmpBinary cmpOp addBinary
logicOp::=& | and | | | or | && | and then | || | or else
logicBinary::=cmpBinary | logicBinary logOp cmpBinary
ternary::=logicBinary | logicBinary ? logicBinary : ternary
expr::=ternary
argList::=expr 0*(, expr)
funcCall::=name ( [argList] )
procCall::=name ( [argList] )
leftSide::=variable | dataRef [ expr ] | dataRef . name | dataRef . ( expr )
letOper::=letOper = expr
nullOper::=| null
stopOper::=stop
returnOper::=return [ expr ]
ifOper::=if expr then opSequence 0*( elif expr then opSequence ) [ else opSequence ] end [ if ]
altIfOper::=if expr { opSequence } 0*( elif expr { opSequence } ) [ else { opSequence } ]
loopOper::=[while expr ] loop opSequence 0*( exitif expr ; opSequence) end [ loop ]
altLoopOper::=while expr { opSequence 0*( exitif expr ; opSequence) }
oper::=nullOper | procCall | letOper | returnOper | stopOper | ifOper | loopOper
altOper::=altIfOper | altLoopOper
seqOper::=oper ; | altOper
opSequence::=0*( seqOper )
entryBody::=forward ; | is opSequence end [ entry ] ; | { opSequence }
procBody::=forward ; | external ; | is opSequence end [ procedure ] ; | { opSequence }
funcBody::=forward ; | external ; | is opSequence end [ function ] ; | { opSequence }
parmList::=name 0*(, name)
entry::=entry name entryBody
procedure::=procedure name ( [ paramlist] ) procBody
function::=function name ( [ paramlist] ) funcBody
program::=1*(entry | procedure | function)

CommuniGate® Pro Guide. Copyright © 1998-2007, Stalker Software, Inc.