- 追加された行はこの色です。
- 削除された行はこの色です。
#navi(マニュアル/文法)
#contents
*フロー制御 [#r383aae0]
**ifによる分岐 [#s7f37fda]
式の結果が真であれば以降に続く{ }内を処理します。
if文の条件式は()で括っても構いません。
#code(aya,nooutline,nolink,nonumber){{
request
{
if !i {
"iは0である。"
}
}
}}
すぐ後にelseif節を付加することができます。これはifの判定が偽であった場合のみ処理されます。~
いくつでも連結できます。~
また、if~elseifの最終端にはelse節を置くことができます。これは先行するifおよびelseifの判定がすべて偽であった場合に
処理されます。
#code(aya,nooutline,nolink,nonumber){{
request
{
if !i {
"iは0である。"
}
elseif i == 5 {
"iは5である。"
}
elseif "A" _in_ TOUPPER(i) {
"iは文字列で、aもしくはAを含んでいる。"
}
else {
"iは0でも5でもaを含む文字列でもない何物かである。"
}
}
}}
if、elseif、elseが処理する{ }内にスクリプトが1つしか存在しない場合は、{ }を略せます。したがって上の例は
下のように書きなおすことが出来ます。
#code(aya,nooutline,nolink,nonumber){{
request
{
if !i
"iは0である。"
elseif i == 5
"iは5である。"
elseif "A" _in_ TOUPPER(i)
"iは文字列で、aもしくはAを含んでいる。"
else
"iは0でも5でもaを含む文字列でもない何物かである。"
}
}}
ただしifが重なっている場合は{ }の省略は出来ません。以下はC言語では正しいですが、文では誤りです。
#code(aya,nooutline,nolink,nonumber){{
if i == 0
if j == 0
"iとjはともに0である。"
}}
以下のように{ }が必要です。
#code(aya,nooutline,nolink,nonumber){{
if i == 0 {
if j == 0
"iとjはともに0である。"
}
}}
**caseによる分岐 [#l73d8c0f]
caseはラベル分岐構造を実現します。
#code(aya,nooutline,nolink,nonumber){{
request
{
case i {
when 0 {
"iは0である。"
}
when "A"
"iは文字列Aである。"
others {
"iは0でもAでもない。"
}
}
}
}}
caseに与えられた判定式の結果に一致するラベル値を持ったwhen節が実行されます。~
others節は、すべてのラベルに合致しなかった場合に実行される部分です。othersは省略できます。省略した場合は何もしません。
ヒットさせるラベル値はカンマで列挙可能です。またマイナス符号でヒットさせる範囲を指定することもできます。
#code(aya,nooutline,nolink,nonumber){{
request
{
case name+(i+1) {
when "Pentium3","Pentium4"
"Pen!!!は1999年、Pen4は2000年発売発売。"
when "Pentium5"-"PentiumX" {
"まだ無い。"
}
others
"分からない。"
}
}
}}
whenに記述するラベル値は必ず即値でなければなりません。変数や関数、演算子を含む数式は記述できません。
when、othersが処理する{ }内にスクリプトが1つしか存在しない場合は、ifと同様に{ }を省略できます。
**switchによる分岐 [#eded24e4]
{ }内の出力候補から出力は無作為に選ばれますが、switchを使用すると選択する候補をを位置で指定できます。
#code(aya,nooutline,nolink,nonumber){{
request
{
switch id {
"idは0である。"
"idは1である。"
{
"idは2である。"
"idはtwoである。"
}
"idは"3である。"
}
}
}}
変数idの値によって出力される文字列が指定されます。指定は0オリジンです。~
idが2の時は、"idは2である。"もしくは"idはtwoである。"が出力されます。この内包された{ }部分では、選択は無作為です。
switchが評価する値に対応する候補が{ }内に存在しない場合は空の文字列が出力されます。たとえば、上の例においてidが100だった場合は空の文字列が出力されます。
switch内に出力確定子がある場合は、各ブロックの該位置にある候補が選択されます。
#code(aya,nooutline,nolink,nonumber){{
request
{
switch 1 {
"かわいい"
"天才"
"サル"
--
"とは言い難い"
--
"ですね。"
"かもしれません。"
}
}
}}
requestの出力は"天才かもしれません。"となります。~
中間のブロックには指定位置に候補が無いので、出力が空の文字列となっていることに注意してください。
**ループ [#hb9f85fc]
while、for、foreachの3種類のループ構造があります。~
while, for, foreachでは条件式を()でくくるとエラーになります。
***while [#j24fd024]
whileが評価する式が真である間は{ }内を繰り返し処理します。
#code(aya,nooutline,nolink,nonumber){{
request
{
_i = 1
_j = 0
while _i < 11 {
_j += _i
_i++
}
"1から10をすべて足すと%(_j)である。"
}
}}
上の例はwhileの機能を簡単に説明しています。
下の例では異なる10個の文字列を発生しています。requestの出力は、1~10のうちいずれかの平方根を報告する文字列です。
#code(aya,nooutline,nolink,nonumber){{
request
{
_i = 1
while _i < 11 {
"%(_i)の平方根は%(SQRT(_i))である。"
_i++
}
}
}}
***for [#hb029288]
forはwhileと同様の先判定ループ構造ですが、初期化式、脱出判定式、ループ毎に実行する式を一箇所にまとめて書ける点が優れています。
以下は、whileで挙げた平方根を報告する例をforで書き直したものです。
#code(aya,nooutline,nolink,nonumber){{
request
{
for _i = 1; _i < 11; _i++ {
"%(_i)の平方根は%(SQRT(_i))である。"
}
}
}}
_i = 1はループを始める直前に実行されます。_i < 11はループ判定式で、これが真である間はループが続きます。_i++はループの一単位が完了して先頭へ
戻る際に実行される式です。
C言語では for ( ; ; ) とすることで無限ループとできますが、文では各式を省略できません。~
無限ループを作る場合は
#code(aya,nooutline,nolink,nonumber){{
for 1;1;1
}}
などとしてください。ただ、whileなら
#code(aya,nooutline,nolink,nonumber){{
while 1
}}
で済むため、文で無限ループを作る際は、可読性の点からも、動作速度の点からも、whileを使用すべきであると言えます。~
***foreach [#a44ed835]
簡易配列、もしくは汎用配列の各要素値を順番に取り出します。
以下では簡易配列の要素値を取り出して数値へ変換し、すべての合計を計算しています。
#code(aya,nooutline,nolink,nonumber){{
request
{
_str = "1,3,5,7,9"
_t = 0
foreach _str; _i {
_t += TOINT(_i)
}
_t
}
}}
foreachに続いて処理対象を記述します。上の例では簡易配列_strを指定しています。次に書かれた_iは取り出された要素値を格納する変数で、これは
必ず変数でなければなりません。
処理対象の変数のデリミタがSETDELIMによって変更されていても、foreachはそのデリミタを認識して正常に動作します。
foreachは汎用配列も処理できます。
#code(aya,nooutline,nolink,nonumber){{
request
{
_sent = ("I", "am", 31, "years", "old.")
_t = ""
foreach _sent; _i {
_t += (_i + " ")
}
_t
}
}}
requestは"I am 31 years old. "を出力します。
foreachループ内において要素取り出し対象の簡易配列、汎用配列を書き換えてもかまいませんが、その場合でも列挙は書き換え前のデータを対象とします。
***break [#h5c17692]
ループ中にbreakが現れると、現在実行中の最も深いループから脱出します。
#code(aya,nooutline,nolink,nonumber){{
request
{
_j = 0
for _i = 0; _i < 100; _i++ {
_j = _i*_i
if _j >= 100
break
}
_i - 1
}
}}
上の例では、forは初期値0の_iが100に達するまでループを実行しようとします。しかし、ループ内には「_i を二乗した結果が 100 を越えたらループから抜ける」ようにbreakが仕込まれています。したがって、実際には _i = 10 の時点でループが終了します。
requestは_iから1を減じた価を返しています。つまりrequestは、二乗した結果が100を越えない最大の整数を求める関数です。 ~
***continue [#badbffd1]
ループ中にcontinueが現れると、その位置からすぐにループ先頭へ戻ります。
#code(aya,nooutline,nolink,nonumber){{
request
{
_j = ""
for _i = 0; _i < 3; _i++
{
_j += "go "
if _i > 0
continue
_j += "ahead "
}
_j
}
}}
_iは0、1、2と変化しますが、1、2ではcontinueが働くので、_jに"ahead"を追加する式が実行されません。~
したがってrequestの出力は"go ahead go go "となります。
**return [#ad085d7a]
returnが現れると、その関数の実行はそこで終わります。~
関数の出力はそれまでに蓄積された候補から選ばれます。
#code(aya,nooutline,nolink,nonumber){{
to_rad
{
if GETTYPE(_argv[0]) == 3 {
-1
return
}
_argv[0]*2.0*3.14/360.0
}
}}
関数to_radはdegreeをradianへ変換します。~
引数に文字列が与えられた場合は、if判定でそれを発見して-1を返すようにプログラムされています。returnの時点で出力の候補は-1しか
ありませんから、これが出力されることになります。
#navi(マニュアル/文法)