制御構造 †
SAD では条件判断やループといったプログラムの流れの制御も関数によって行います。
式の連結 †
CompoundExpression †
- expr1; expr2; ... ; exprn は式expr1からexprnをこの順に評価し、最後の式の結果を返します。
- expr1; expr2; ... ; exprn; は式expr1から式exprnをこの順に評価し、Null を返します。
TracePrint の中では各式が評価の前にそのまま印刷されます。
GotoとLabel †
SAD には実際にはあまり使われませんが Goto もあります。
- Goto[ラベル1] はその Goto と同一またはそれより下の階の CompoundExpression に含まれる Label[ラベル1の値]のところまで制御を移します。ここでラベル1は任意の式でよい。Label 自身はなにもせず、自分自身の式を返します。
条件式 †
SAD の条件演算子、論理演算子は実数値0を偽、0でない実数を真とします。0以外の実数はどれも真なのですが、実際の演算では真の場合には実数値1が返されます。論理式の結果はこのように実数ですから、他の算術式の中に混ぜても構いません。また、システムでは True, False の二つのシンボルを用意していますが、これらは単にそれぞれ実数1と0と同値です。また、条件判断を要求される場合に普通の算術式を書いてもかまいません。
条件演算子の中で、SameQ(===) と UnsameQ(<=>)以外のものは真または偽以外の値、すなわち条件式そのものをかえすことがあります。例えば、条件式 a == 1 で、もし a に何も値が割り当てられていないときは、この条件式の結果は真でも偽でもなく、じつはこの式 a == 1 そのものです。また、a に実数値以外の値が割り当てられているときも (aの値) == 1 のような式が返されます。(このようになるひとつの理由は、a == 1 の様な条件式は、いくつかの関数の中で方程式としての意味を持つからです)。これに対して、演算子 SameQ(===) と UnsameQ(<=>) は必ず真または偽の結果を返します。
AtomQ †
- AtomQ[expr]は式exprが部分式を持たない最小単位のものかどうかを調べ、最小単位の時 True(1)、それ以外はFalse(0)を返します。
BoundQ †
- BoundQ[expr]は式exprに特定値が定義されていれば、True(1)、それ以外はFalse(0)を
返します。
ComplexQ †
- ComplexQ[expr] は式exprの値が実数でない複素数、あるいは、少なくともひとつの要素がそのような数であるリストの時 True(1) になり、それ以外は False(0) になります。
DirectoryQ †
- DirectoryQ[expr]は式exprのDirectoryが存在する場合、True(1)を、存在しない場合 False(0)を返す。
EvenQ †
- 偶数のとき True(1)、それ以外はFalse(0)を返します。
FileQ †
- FileQ[expr]は式exprのファイルが存在する場合、True(1)を、存在しない場合False(0)を返す。
FreeQ †
- FreeQ[expr, form] は式exprの全ての部分式の中にパターンformに照合するものがひとつも存在しないとき True(1)、ひとつでも照合するとき False(0) を返します。
- FreeQ[expr, form、階数指定子1] は 式exprの階数指定子1 (Levelを参照) で指定される階数の部分式の中に パターン式1 に照合するものがひとつも存在しないとき True(1)、ひとつでも照合するとき False(0) を返します。
MatchQ †
- MatchQ[expr, form] は 式exprがパターンform に照合するとき True(1)、照合しないとき False(0) を返します。
MatrixQ †
- MatrixQ[expr] は式exprの値が行列の時 True(1) になり、それ以外は False(0) になります。
- MatrixQ[expr, form] は式exprの値が行列で、その各要素がすべて関数 テストform を作用させた時真 (非0) の場合 True(1) になり、それ以外は False(0) になります。
MemberQ †
- MemberQ[expr, form] は 式exprの全ての部分式の中に パターンformに照合するものが存在するとき True(1)、照合しないとき False(0) を返します。
- MemberQ[expr, form、階数指定子1] は exprの階数指定子1 (Level を参照) で指定される階数の部分式の中に パターンform に照合するものが存在するとき True(1)、照合しないとき False(0) を返します。
Negative †
- Negative[x]は, xが負の数である場合にはTrue(1)を返す。
- xが負でない数であることが明白な場合にはFalse(0)を返す。
- 明白でない場合、未評価のままにする。(x<0)と出る。
NonNegative †
- NonNegative[x]は, xが負でない数である場合に、True(1)を返す。
- xが負であることが明白な場合に、False(0)を返す。
- 明白でない場合には未評価のままにする。(x>=0)と出る。
NumberQ †
- 数のとき True(1)、それ以外はFalse(0)を返します。
OddQ †
- 奇数のとき True(1)、それ以外はFalse(0)を返します。
Positive †
- Positive[x]は, xが正の数である場合にはTrue(1)を返す。
- xが正でない数であることが明白な場合にはFalse(0)を返す。
- 明白でない場合、未評価のままにする。(x>0)と出る。
RealQ †
- RealQ[x]はxが実数のとき、True(1)、それ以外はFalse(0)を返します。
SameQ, === †
- expr1 === expr2 は両辺の結果が SAD の要素として同一の値(式)のとき True(1)、それ以外は False(0) を返します。
StringQ †
- StringQ[expr]は式exprが文字列のとき True(1)、それ以外は False(0)を返します。
UnsameQ, <=> †
- expr1 <=> expr2 は両辺の結果が SAD の要素として同一の値(式)でない時 True(1)、それ以外は False(0) を返します。
VectorQ †
- VectorQ[expr] は式exprの値が一階 のリストの時 True(1) になり、それ以外は False(0) になります。
- VectorQ[expr, form] は式exprの値が、その要素がすべて関数 テストformを作用させた時真 (非0) の場合 True(1) になり、それ以外は False(0) になります。
条件判断 †
If †
- If[expr, then] は 式exprを評価し、その結果が True ならば式then を評価しその結果を返します。そうでなければ Null を返します。
- If[expr, then, else] は 式exprを評価し、その結果が True ならば式thenを、偽ならば式elseを評価しその結果を返します。どちらでもなければ Null を返します。
- If[expr, then, else1, else2] は式exprを評価し、その結果が True ならば式then を、偽ならば式else1を、どちらでもなければ式else2を評価しその結果を返します。
Or, || †
- expr1 || expr2 || ... は論理和ですが、その結果が真になるまで、式expr1、式expr2、...を評価し続けます。真になれば残りの式はそれ以上評価されず、True(1) が返されます。したがって、実質的な条件判断としても利用できます。
Add, && †
- expr1 && expr2 && ... は論理積ですが、その結果が偽になるまで、式expr1、式expr2、...を評価し続けます。偽になれば残りの式はそれ以上評価されず、False(0) が返されます。したがって、実質的な条件判断としても利用できます。
Not, ~ †
Switch †
Switch[expr0, form1, expr1, form2, expr2, ... ] はまず 式expr0 を評価し、その結果がパターンform1に照合すれば 式expr1 を評価し値を返します。そうでなければパターンform2, ... と照合されるまで進みます。もしどのパターンとも照合しなければ Switch の式そのものが返ります。
- もしどれとも照合しないときに 式a を評価したければ、引き数の最後に _, 式a と書けば実行できます。
Which †
Which[test1, value1, test2, value2, ... ] は 条件test1 を評価し真になれば式value1を評価し値を返します。そうでなければ 条件test2, ... と真になるまで進みます。もしどの条件も真でなければ Which の式そのものが返ります。
- もしどれも真でないときに式a を評価したければ、引き数の最後に True, 式a と書けば実行できます。
ループ †
Do †
- Do[expr, n] は反復指定子nで指定された回数だけ 式expr を評価し、最期に Null を返します。
- 途中で Break[] が呼ばれると反復は中断します。
- 途中で Continue[] が呼ばれると式1の評価は中断しますが、反復は続きます。
While †
- While[test, expr] は 条件式testを毎回評価し、結果が真(非0)である限り 式valueを評価しつづけます。最期に Null を返します。
- 途中で Break[] が呼ばれると反復は中断します。
For †
- For[開始1, 条件1, 増分1, 式1] はまず、開始1 を評価します。次ぎに条件1が真である限り、式1 と増分1 をこの順に評価します。
- 途中で Break[] が呼ばれると反復は中断します。
Scan †
- Scan[関数1, リスト1] は 関数1 を リスト1 の1階の各要素に適用します。最期に Null を返します。
- Scan[関数1, リスト1, 階数指定子1] は 関数1 をリスト1の、階数指定子1 (Levelを参照) で指定される各要素に適用します。最後に Null を返します。
- Scan[関数1, リスト1] は Do[関数1[ リスト1i ], {i, Length[リスト1]}] と同じ結果になりますが、一般に速度が速く効率的です。(「添字はできるだけ避けよ。」)
Sum †
- Sum[expr, n] は反復指定子n (Table を参照)で指定された回数だけ式exprを評価し、それらの結果の合計を返します。
Product †
- Product[expr, n] は反復指定子n (Table を参照)で指定された回数だけ式exprを評価し、それらの結果の積を返します。
プログラムの中断、例外処理 †
Break †
- Break[] はDo, While, For の実行を中断し、それらの次の式に制御を移します。
Continue †
- Continue[] は Do のその回の実行を中断しますが、反復は継続します。
Return †
- Return[expr] は関数の実行を中断し、式exprの値をその関数の値として返します。
Exit †
Throw †
- Throw[expr] は Catch の中で用いられ、プログラムの実行を中断し、式exprの値を Catch の値として返します。
Catch †
- Catch[expr1] は式expr1を評価し、その値を返します。途中で Throw[expr2] が呼ばれると、プログラムはそこで中断し、式expr2の値を返します。
式の評価の制御 †
Hold †
- Hold[expr] は式exprを評価せず、Hold[expr] の形のままの式を結果として返します。
- Hold[Sin[x]] ⇒ Hold[Sin[x]]。
- 組み込み関数*1が式exprとして評価される場合に関しては、組み込み関数の引数が構文解析時*2に評価値が確定している場合、構文解析段階で評価が行われます。即ち、Hold[Sin[1]]を評価した場合には、Hold[0.841470984807896]と結果を返しますが、x=1;Hold[Sin[x]]ではHold[Sin[x]]と結果を返します。
- 式exprの一部を評価するには With を使います。
- ある式の一部を 評価せずに取り出すには Extract と Hold を組み合わせて使います。
- Extract[Hold[{Sin[x], Cos[x]}], {1, 2}, Hold] ⇒ Hold[Cos[x]]。
ReleaseHold †
- ReleaseHold[Hold[expr]] は式exprを評価し、その結果を返します。
- x=2;ReleaseHold[Hold[Sqrt[x]]] ⇒ 2。
- 引き数が上の様に頭部に Hold を持たない場合、ReleaseHold[expr] は式exprを評価し、その結果を返します。
- ReleaseHold[ {Hold[Sqrt[x]]} ] ⇒ {Hold[Sqrt[x]]}。
Evaluate †
- f [..., Evaluate[expr], ...] は関数 f の引き数の評価の有無の指定にかかわらず、expr を評価した値を関数f に渡します。
- x=4;Evaluate[Sqrt[x]] ⇒ 2。
- Sqrt[Evaluate[Sqrt[4]]] ⇒ 1.414213562373095。
- 上の形のように関数の引き数の頭部以外に Evaluate が現われる場合は Evaluate[expr] はそれがもし評価されればexpr を評価した値を返します。
- Hold[Evaluate[Sqrt[4]]] ⇒ Hold[Evaluate[2]]。
- Hold[{Evaluate[Sqrt[4]]}] ⇒ Hold[{Evaluate[2]}]。
- 式exprの一部を評価するには With を使います。
Unevaluated †
- f [..., Unevaluated[expr], ...] は関数 f の引き数の評価の有無の指定にかかわらず、式exprを評価せずそのままの形で関数 f に渡します。
シンボルの設定、診断 †
Clear †
- Clear[シンボル1, シンボル2, ...] はシンボル1, シンボル2, ... に割り当てられている全ての値及び関数の定義を解除します。
- Clear[シンボル1[引き数1, ...], ...] はシンボル1 に割り当てられている上方値のうち、シンボル1[引き数1, ...] の形を含むものを解除します。
Unset †
- シンボル1 =. はシンボル1 に割り当てられている全ての値及び関数の定義を解除します。
- シンボル1[引き数1, ...] =. はシンボル1[引き数1, ...] に割り当てられている関数の定義だけを解除します。
- 上方値 は TagSet と Unset を併用して解除します。例: c/: a[b, c, d] =. 。
- 部品シンボルに対しては 部品シンボル1 =. は DeleteWidget[部品シンボル1] と同じ働きをします。
Names †
- Names[pattern] はその名前が文字列パターンpattern(文字列の照合を参照) に照合する、既に定義されたシンボル名達をリストにして返します。
- Names["Arc*"] ⇒ {"ArcTanh", "ArcCosh", "ArcSinh", "ArcTan", "ArcCos", "ArcSin"}。
Protect †
- Protect[シンボル1, シンボル2, ...] はこれ以後の シンボル1, シンボル2, ... への値や関数の割り当てを禁止します。
- 局所シンボル は Protect できません。
- システムが用意する関数やシンボルは Protect されています。
Unprotect †
- Unprotect[シンボル1, シンボル2, ...] はこれ以後の シンボル1, シンボル2, ... への値や関数の割り当てを許可します。
AutoLoad †
- 必要に応じてある関数ライブラリをロードするには AutoLoad を使います。
- AutoLoad[シンボル1, シンボル2, ..., ファイル1] は シンボル1, シンボル2, ... が次に評価される時に ファイル1 の内容が評価されるという仮の定義をします。
- ファイル1 には シンボル1, シンボル2, ... の真の定義を書いておきます。
Order †
- Order[expr1, expr2]は 式expr1が式expr2に先行することが標準的な順序である場合には1を、式expr1が式expr2に続くことが標準的である場合には-1を与える。
- 式expr1が式expr2と等しい場合には0を与える。