SET $LISTBUILD(var1,var2,...)=list
SET $LISTBUILD の var 引数は、コンマで区切られた変数のリストです。これらの変数はそれぞれ、対応する位置にある list 要素の値に設定されます。したがって、var1 は、最初の list 要素の値に設定され、var2 は 2 つ目の list 要素の値に設定されるというようになります。var 引数が既存の変数である必要はありません。変数は、SET $LISTBUILD によって値に割り当てられるときに、定義されます。
-
var 引数の数は、list 要素の数より少なくても、多くてもかまいません。未指定の var 値では、前の値が保持されます。前に値が定義されていない場合は、未定義のままです。この動作を SET $LISTGET と比較してください。余分な list 要素は無視されます。
-
var 引数と list 要素のいずれかまたは両方に、プレースホルダのコンマで表された、省略された値を含めることができます。省略された var 引数は未定義です。list 要素を省略すると、対応する var 値で前の値が維持されます。前に値が定義されていない場合は、未定義のままです。この動作を SET $LISTGET と比較してください。
SET $LISTBUILD はアトミック処理です。コンパイル済みのプログラムでの var 引数の最大数は 1024 個です。ターミナルから実行した場合の var 引数の最大数は 128 個です。これらの制限を超過しようとすると、<SYNTAX> エラーが発行されます。
var 引数がオブジェクト・プロパティ (object.property) である場合、プロパティは多次元でなければなりません。すべてのプロパティは、オブジェクト・メソッド内で i%property インスタンス変数として参照できます。
以下の例では、(等号の右側にある) $LISTBUILD によって、4 つの要素を使用してリストが作成されます。
以下の例では、SET $LISTBUILD によって、リストから最初の 2 つの要素が取り出され、2 つの変数に取り込まれます。
SET colorlist=$LISTBUILD("red","blue","green","white")
SET $LISTBUILD(a,b)=colorlist
WRITE "a=",a," b=",b /* a="red" b="blue" */
以下の例では、SET $LISTBUILD によって、リストから要素が取り出され、5 つの変数に取り込まれます。指定された list には 5 つ目の要素がないため、対応する var 変数 (e) には、その前の値が含まれます。
SET (a,b,c,d,e)=0
SET colorlist=$LISTBUILD("red","blue","green","white")
SET $LISTBUILD(a,b,c,d,e)=colorlist
WRITE "a=",a," b=",b," c=",c," d=",d," e=",e
/* a="red" b="blue" c="green" d="white" e=0 */
以下の例では、SET $LISTBUILD によって、リストから要素が取り出され、4 つの変数に取り込まれます。指定された list には 3 つ目の要素がないため、対応する var 変数 (c) には、その前の値が含まれます。
SET (a,b,c,d)=0
SET colorlist=$LISTBUILD("red","blue",,"white")
SET $LISTBUILD(a,b,c,d)=colorlist
WRITE "a=",a," b=",b," c=",c," d=",d
/* a="red" b="blue" c=0 d="white" */
以下の例では、SET $LISTBUILD によって、リストから要素が取り出され、4 つの変数に取り込まれます。list の 3 つ目の要素は入れ子になったリストであるため、対応する var 変数 (c) にはリスト値が含まれます。
SET (a,b,c,d)=0
SET colorlist=$LISTBUILD("red","blue",$LISTBUILD("green","yellow"),"white")
SET $LISTBUILD(a,b,c,d)=colorlist
WRITE "a=",a," b=",b," c=",c," d=",d
/* a="red" b="blue" c=$LB("green","yellow") d="white" */
例
ここに示す例の多くでは、$LISTTOSTRING 関数を使用して、表示のために $LISTBUILD 返り値に変換します。$LISTBUILD は直接表示できないエンコードされた文字列を返します。
以下の例は、3つの要素を持つリスト "Red,Blue,Green" を作成します。
SET colorlist=$LISTBUILD("Red","Blue","Green")
WRITE $LISTTOSTRING(colorlist,"^")
以下の例では、"3^0^44^5.6^33^400" と表示される 6 つの数値要素のリストを作成します。$LISTBUILD は、キャノニック形式と同じでない場合がある、最適化された 2 進数表記に基づいて、数値要素値をエンコードします。$LIST および $LISTTOSTRING などのリスト表示関数は、キャノニック形式で数値要素値を返します。
SET numlist=$LISTBUILD(003,0.00,44.0000000,5.6,+33,4E2)
WRITE $LISTTOSTRING(numlist,"^")
要素の省略
要素式を省略すると、エンコードされた要素が定義されますが、その要素のデータ値は定義されません。
以下の例では、$LISTBUILD 文はどちらも、2 つ目の要素に未定義の値がある、有効な 3 要素のリストを作成します。要素を省略することと、要素に未定義の変数を指定することで、生じる結果はまったく同じです。$LISTBUILD は、未定義の変数をリスト要素として取ることができ、これによってエラーが生成されることはありません。また、結果のリストは $LISTVALID のテストに合格します。しかし、この未定義のリスト要素を $LIST や $LISTTOSTRING などのリスト関数で参照すると、<NULL VALUE> エラーが生成されます。
KILL a
SET list1=$LISTBUILD("Red",,"Green")
SET list2=$LISTBUILD("Red",a,"Green")
WRITE "List lengths:",$LISTLENGTH(list1)," ",$LISTLENGTH(list2),!
IF $LISTVALID(list1)=1,$LISTVALID(list2)=1 {
WRITE "These are valid lists",! }
IF list1=list2 {WRITE "and they're identical"}
ELSE {WRITE "They're not identical"}
以下の例は、未定義の要素を、リスト内だけでなく、リストの末尾にも指定できることを示しています。末尾に未定義の要素があるリストは、有効なリストです。しかし、この未定義の要素をリスト関数で参照すると、<NULL VALUE> エラーが生成されます。
KILL z
SET list3=$LISTBUILD("Red",)
SET list4=$LISTBUILD("Red",z)
WRITE "List lengths:",$LISTLENGTH(list3)," ",$LISTLENGTH(list4),!
IF $LISTVALID(list3)=1,$LISTVALID(list4)=1 {
WRITE "These are valid lists",! }
IF list3=list4 {WRITE "and they're identical"}
ELSE {WRITE "They're not identical"}
しかし、以下の例では、2 つ目の要素にデータ値 (空の文字列) を持つ 3 つの要素のリストを生成します。2 つ目の要素を参照する際に、エラーは発生しません。
SET list5=$LISTBUILD("Red","","Green")
SET list5len=$LISTLENGTH(list5)
WRITE "List length: ",list5len,!
FOR i=1:1:list5len {
WRITE "Element ",i," value: ",$LIST(list5,i),! }
データを含まないリストまたは NULL 文字列データを含むリスト
$LISTBUILD を使用して作成されたリストには、少なくとも 1 つのエンコードされたリスト要素が含まれます。その要素には、データが含まれる場合と含まれない場合があります。$LISTLENGTH はデータではなく要素をカウントするため、$LISTBUILD を使用して作成されたリストのリスト長さは 1 以上になります。
データ値が未定義である $LISTBUILD 要素を参照すると、<NULL VALUE> エラーが生成されます。以下は、すべて “空” のリストを作成する有効な $LISTBUILD 文です。しかし、前述のリストのような要素を参照しようとすると、<NULL VALUE> エラーになります。
TRY {
SET x=$LISTBUILD(UndefinedVar)
SET y=$LISTBUILD(,)
SET z=$LISTBUILD()
IF $LISTVALID(x)=1,$LISTVALID(y)=1,$LISTVALID(z)=1 {
WRITE "These are valid lists",! }
WRITE "$LB(UndefinedVar) contains ",$LISTLENGTH(x)," elements",!
WRITE "$LB(,) contains ",$LISTLENGTH(y)," elements",!
WRITE "$LB() contains ",$LISTLENGTH(z)," elements",!
/* Attempt to use null lists */
WRITE "$LB(UndefinedVar) list value ",$LISTTOSTRING(x,"^"),!
WRITE "$LB(,) list value ",$LISTTOSTRING(y,"^"),!
WRITE "$LB() list value ",$LISTTOSTRING(z,"^"),!
}
CATCH exp { WRITE !!,"In the CATCH block",!
IF 1=exp.%IsA("%Exception.SystemException") {
WRITE "System exception",!
WRITE "Name: ",$ZCVT(exp.Name,"O","HTML"),!
WRITE "Location: ",exp.Location,!
WRITE "Code: "
}
ELSE { WRITE "Some other type of exception",! RETURN }
WRITE exp.Code,!
WRITE "Data: ",exp.Data,!
RETURN
}
データに NULL 文字列値が含まれていますが、以下は、データを含むリスト要素を作成する有効な $LISTBUILD 文です。
SET x=$LISTBUILD("")
WRITE "list contains ",$LISTLENGTH(x)," elements",!
WRITE "list value is ",$LISTTOSTRING(x,"^"),!
SET y=$LISTBUILD($CHAR(0))
WRITE "list contains ",$LISTLENGTH(y)," elements",!
WRITE "list value is ",$LISTTOSTRING(y,"^")
リストの入れ子
リストの要素自体がリストである場合もあります。例えば、以下の文は 3 つ目の要素が "Walnut,Pecan" という 2 つの要素を持つリストである、3 つの要素を持つリストを作成します。
SET nlist=$LISTBUILD("Apple","Pear",$LISTBUILD("Walnut","Pecan"))
WRITE "Nested list length is ",$LISTLENGTH($LIST(nlist,3)),!
WRITE "Full list length is ",$LISTLENGTH(nlist),!
WRITE "List is ",$LISTTOSTRING(nlist,"^"),!
リストの連結
連結演算子 (_) を使用して 2 つのリストを連結すると、その 2 つのリストを結合した別のリストが生成されます。
以下の例では、2 つのリストを連結することで、LISTBUILD を使用して作成したのと同じ要素を持つ同一のリストを作成します。
SET list1=$LISTBUILD("A","B")
SET list2=$LISTBUILD("C","D","E")
SET clist=list1_list2
SET list=$LISTBUILD("A","B","C","D","E")
IF clist=list {WRITE "they're identical",!}
ELSE {WRITE "they're not identical",!}
WRITE "concatenated ",$LISTTOSTRING(clist,"^"),!
WRITE "same list as ",$LISTTOSTRING(list,"^")
文字列をリストに連結することはできません。そのようにすると、結果に最初にアクセスしようとしたときに、<LIST> エラーが生成されます。
TRY {
SET list=$LISTBUILD("A","B")_"C"
WRITE "$LISTBUILD completed without error",!
SET listlen=$LISTLENGTH(list)
WRITE "$LISTLENGTH completed without error",!
SET listval=$LISTTOSTRING(list,"^")
WRITE "$LISTTOSTRING completed without error",!
}
CATCH exp { WRITE !!,"In the CATCH block",!
IF 1=exp.%IsA("%Exception.SystemException") {
WRITE "System exception",!
WRITE "Name: ",$ZCVT(exp.Name,"O","HTML"),!
WRITE "Location: ",exp.Location,!
WRITE "Code: "
}
ELSE { WRITE "Some other type of exception",! RETURN }
WRITE exp.Code,!
WRITE "Data: ",exp.Data,!
RETURN
}
連結の詳細は、"ObjectScript の使用法" の "演算子" を参照してください。
関連項目