制御構造

拡張関数言語は、プログラムの実行を制御するための通常のステートメントを提供します。

  • If Then Else
  • While Do and Repeat Until
  • Numeric For
  • Break
  • Goto

If Then Else

If ステートメントは、1 つ以上の条件に基づいて実行するステートメントのブロックを選択します。次の 3 つの形式があります。

If then Form

if expression then
     statements to execute if expression is not false or nil
end
<!--NeedCopy-->

If then else Form

if expression then
     statements to execute if expression is not false or nil
else
     statements to execute if expression is false or nil
end
<!--NeedCopy-->

If then elseif else Form

if expression1 then
     statements to execute if expression1 is not false or nil
     elseif expression2 then
          statements to execute if expression2 is not false or nil
. . .
else
     statements to execute if all expressions are false or nil
end
<!--NeedCopy-->

例:

if headers[name] then

     local next_value_index = #(headers[name]) + 1
     headers[name][next_value_index] = value

else

     headers[name] = {name .. ":" .. value}

end
<!--NeedCopy-->

注:

  • 式は、C および Java の場合と同様に、括弧で囲まれていません。
  • C/Java スイッチ文に相当するものはありません。等価を行うには、一連の if elseif ステートメントを使用する必要があります。

While Do and Repeat Until

while 文と repeat 文は、式によって制御ループを提供します。

while expression do
     statements to execute while expression is not false or nil
end

repeat

     statements to execute until expression is not false or nil

until expression
<!--NeedCopy-->

whileの例:

local a = {1, 2, 3, 4}
local sum, i = 0, 1 -- multiple assignment initializing sum and i
while i <= #a do -- check if at the end of the array
     sum = sum + a[i] -- add array element with index i to sum
     i = i + 1 -- move to the next element
end
<!--NeedCopy-->

repeatの例:

sum, i = 0, 1 -- multiple assignment initializing sum and i
repeat
     sum = sum + a[i] -- add array element with index i to sum
     i = i + 1 -- move to the next element
until i > #a -- check if past the end of the array
<!--NeedCopy-->

もちろん、終了しないループを書くことは可能です。たとえば、これらの例のいずれかで i = i + 1 ステートメントを省略した場合などです。このような関数が実行されると、Citrix ADCは関数が妥当な時間内に完了しなかったことを検出し、実行時エラーで強制終了します。

Cpu limit reached. Terminating extension execution in [[string "function extension function..."]]: line line-number.

は、/var/log/ns.log に報告されます。

Numeric For

forループには2種類あります。最初は、のための数値です。これは、CおよびJavaでのforステートメントの通常の使用に似ています。数値のfor文は、変数が最終的な値を渡したかどうかをテストし、そうでない場合は、文のブロックを実行し、変数をインクリメントし、繰り返し、変数を初期化します。forループの数値の構文は次のとおりです。

for variable = initial, final, increment do

     statements in the loop body

end
<!--NeedCopy-->

ここで、initial、final、およびincrementは、数値を生成する(または変換できる)すべての式です。変数は、forループステートメントブロックに対してローカルであるとみなされ、ループの外側では使用できません。incrementは省略できます。デフォルトは1です。式は、ループの先頭で 1 回評価されます。終了条件は、増分が正の場合は変数 > finalで、増分が負の場合は変数 < finalです。増分が 0 の場合、ループは直ちに終了します。

例 (前のセクションの while ループと繰り返しのループと同等):

sum = 0
for i = 1, #a do -- increment defaults to 1
     sum = sum + a[i]
end
<!--NeedCopy-->

forループの2番目のタイプは、ループのより柔軟なタイプに使用することができ、のための汎用です。これは、関数の使用を伴うので、関数が導入された後に後で説明します。

Break

break文は、しばらくの間、繰り返し、またはforループ内で使用されています。これは、ループを終了し、ループの後の最初の文で実行を再開します。例(前述の while、repeat、および for ループと同等):

sum, i = 0, 1
while true do
     if i > #a then
          break
     end
     sum = sum + a[i]
     i = i + 1
end
<!--NeedCopy-->

Goto

goto文は、ラベルに前方または後方にジャンプするために使用することができます。ラベルは識別子であり、その構文は:: label:: です。goto文はgotoラベルです。例(前述のループと同等):

sum, i = 0, 1
::start_loop::
     if i > #a then
          goto end_loop -- forward jump
     end
     sum = sum + a[i]
     i = i + 1
     goto start_loop -- backwards jump
::end_loop::
. . .
<!--NeedCopy-->

プログラミングでgotosを使用することについては、長い間論争がありました。一般に、関数をより読みやすく信頼できるものにするために、他の制御構造を使用してください。しかし、時折gotosの賢明な使用は、より良いプログラムにつながる可能性があります。特に、gotosはエラーの処理に役立ちます。

制御構造