参照渡しでは、プロシージャでまだ参照していない段階であれば、指定された変数名または配列名が実際に存在している必要はありません。通常、配列は参照渡しのみを使用します。添え字付き変数は参照渡しできません。
実リストで指定した変数あるいは配列名が存在しない場合、関数参照により未定義として処理されます。関数が対応する仮リストの値を変数に代入すると、実の変数あるいは配列もこの値で定義されます。
Main
SET a="6",b="7"
WRITE "Initial values:",!
WRITE "a=",a," b=",b,!
DO DoubleNums(a,.b)
WRITE "Returned to Main:",!
WRITE "a=",a," b=",b
DoubleNums(foo,&bar) {
WRITE "Doubled Numbers:",!
SET foo=foo*2
SET bar=bar*2
WRITE "foo=",foo," bar=",bar,!
}
可変個数のパラメータ
プロシージャでは、可変個数のパラメータが使用可能であることを指定できます。そのように指定するには、vals... のように最後のパラメータ名に 3 つのドットを付加します。このドットを付加するパラメータは、パラメータのリストの最後にあるものとする必要があります。パラメータのリストに記述した唯一のパラメータであってもかまいません。この ... 構文を記述することで、1 つ以上のパラメータを渡すことができるほか、パラメータをまったく渡さないこともできます。
リストのパラメータ間、ならびにリストの最初のパラメータの前と最後のパラメータの後には、スペースと新しい行が認められています。3 つのドットの間の空白は認められていません。
この構文を使用するには、最後のパラメータ名の後に ... が続くシグニチャを指定します。この手法でメソッドに渡す複数のパラメータには、データ型による値またはオブジェクトによる値を設定できるほか、これらの設定によるパラメータを混在して使用することもできます。可変個数のパラメータの使用を指定するパラメータには、任意の有効な識別子名を設定できます。
ObjectScript では、添え字付き変数を作成することで、可変個数のパラメータを渡す処理を扱います。この場合は、渡す変数ごとに 1 つの添え字が作成されます。最上位の変数には、渡すパラメータの個数を記述し、変数の添え字には、渡す値を記述します。
これを、以下の例に示します。ここでは、invals... を仮パラメータ・リストにある唯一のパラメータとしています。ListGroceries(invals...) は、可変個数の値を値渡しで受け取ります。
Main
SET a="apple",b="banana",c="carrot",d="dill",e="endive"
DO ListGroceries(a,b,c,d,e)
WRITE !,"all done"
ListGroceries(invals...) {
WRITE invals," parameters passed",!
FOR i=1:1:invals {
WRITE invals(i),! }
}
以下の例では、2 つの定義済みパラメータの後に最後のパラメータとして args... を使用しています。このプロシージャは、3 つ目のパラメータから、可変個数の追加パラメータを受け取ることができます。最初の 2 つのパラメータは必須で、定義済みパラメータ DO AddNumbers(a,b,c,d,e) またはプレースホルダのコンマ DO AddNumbers(,,c,d,e) のいずれかを指定します。
Main
SET a=7,b=8,c=9,d=100,e=2000
DO AddNumbers(a,b,c,d,e)
WRITE "all done"
AddNumbers(x,y,morenums...) {
SET sum = x+y
FOR i=1:1:$GET(morenums, 0) {
SET sum = sum + $GET(morenums(i)) }
WRITE "The sum is ",sum,!
}
以下の例では、2 つの定義済みパラメータの後に最後のパラメータとして args... を使用しています。このプロシージャが受け取るパラメータの個数は 2 つのみで、可変個数の追加パラメータ args... は 0 です。
Main
SET a=7,b=8,c=9,d=100,e=2000
DO AddNumbers(a,b)
WRITE "all done"
AddNumbers(x,y,morenums...) {
SET sum = x+y
FOR i=1:1:$GET(morenums, 0) {
SET sum = sum + $GET(morenums(i)) }
WRITE "The sum is ",sum,!
}
指定に応じて、AddNumbers(x,y,morenums...) は 2 個以上、255 個以下の範囲でパラメータを受け取ることができます。定義済みのパラメータに既定値を指定して AddNumbers(x=0,y=0,morenums...) とすると、このプロシージャは 0 個以上、255 個以下の範囲でパラメータを受け取ることができます。
以下の例では、唯一のパラメータとして args... を使用しています。これは参照渡しで可変個数の値を受け取ります。
Main
SET a=7,b=8,c=9,d=100,e=2000
DO AddNumbers(.a,.b,.c,.d,.e)
WRITE "all done"
AddNumbers(&nums...) {
SET sum = 0
FOR i=1:1:$GET(nums, 0) {
SET sum = sum + $GET(nums(i)) }
WRITE "The sum is ",sum,!
RETURN sum
}
変数パラメータ・リスト params... が参照によって渡されたパラメータを受け取り、params... をルーチンに渡すと、その中間ルーチンは、参照によっても渡される追加パラメータ (params 配列の追加ノード) を追加できます。以下に例を示します。
Main
SET a(1)=10,a(2)=20,a(3)=30
DO MoreNumbers(.a)
WRITE !,"all done"
MoreNumbers(¶ms...) {
SET params(1,6)=60
SET params(1,8)=80
DO ShowNumbers(.params) }
ShowNumbers(&tens...) {
SET key=$ORDER(tens(1,1,""),1,targ)
WHILE key'="" {
WRITE key," = ",targ,!
SET key=$ORDER(tens(1,1,key),1,targ)
}
}
以下の例では、この args... 構文を仮パラメータ・リストと実パラメータ・リストの両方で使用できることを示しています。この例の可変個数のパラメータ (invals...) は、ListNums に値で渡され、そこで 2 倍の値にされたうえで invals... として ListDoubleNums に渡されます。
Main
SET a="1",b="2",c="3",d="4"
DO ListNums(a,b,c,d)
WRITE !,"back to Main, all done"
ListNums(invals...) {
FOR i=1:1:invals {
WRITE invals(i),!
SET invals(i)=invals(i)*2 }
DO ListDoubleNums(invals...)
WRITE "back to ListNums",!
}
ListDoubleNums(twicevals...) {
WRITE "Doubled Numbers:",!
FOR i=1:1:twicevals {
WRITE twicevals(i),! }
}
QUIT
"可変個数の引数の指定" も参照してください。