Next: User defined operators, Previous: Operators for Equations, Up: Operators [Contents][Index]
割り当て演算子。
左辺が(添字のない)単純変数の時、 :は右辺を評価し、その値を左辺に関連づけます。
左辺がリストや行列、宣言されたMaxima配列、Lisp配列の添字指定された要素の時、 右辺がその要素に割り当てられます。 添字は存在している要素を示していなければなりません; 先に列挙した対象は、存在していない要素を名付けることで拡張することはできません。
左辺が未宣言のMaxima配列の添字指定された要素の時、 もし既に存在しているなら、右辺はその要素に割り当てられ、 もしまだ存在していなければ新しい要素が確保されます。
左辺が単純変数や添字あり変数のリストの時、 右辺はリストに評価されなければなりません。 そして、右辺の要素が左辺の要素に平行に割り当てられます。
killやremvalueも参照してください。
それらは左辺とその値の関連をアンドゥします。
例:
単純変数への割り当て
(%i1) a; (%o1) a (%i2) a : 123; (%o2) 123 (%i3) a; (%o3) 123
リストの要素への割り当て
(%i1) b : [1, 2, 3]; (%o1) [1, 2, 3] (%i2) b[3] : 456; (%o2) 456 (%i3) b; (%o3) [1, 2, 456]
割り当ては未宣言配列を生成する。
(%i1) c[99] : 789; (%o1) 789 (%i2) c[99]; (%o2) 789 (%i3) c; (%o3) c (%i4) arrayinfo (c); (%o4) [hashed, 1, [99]] (%i5) listarray (c); (%o5) [789]
多重割り当て
(%i1) [a, b, c] : [45, 67, 89]; (%o1) [45, 67, 89] (%i2) a; (%o2) 45 (%i3) b; (%o3) 67 (%i4) c; (%o4) 89
多重割り当ては平行に実行されます。
この例ではaとbの値が置換されます。
(%i1) [a, b] : [33, 55]; (%o1) [33, 55] (%i2) [a, b] : [b, a]; (%o2) [55, 33] (%i3) a; (%o3) 55 (%i4) b; (%o4) 33
割り当て演算子。
::は、::は右辺はもちろん左辺も評価することを除いて、:と同じです。
例:
(%i1) x : 'foo; (%o1) foo (%i2) x :: 123; (%o2) 123 (%i3) foo; (%o3) 123 (%i4) x : '[a, b, c]; (%o4) [a, b, c] (%i5) x :: [11, 22, 33]; (%o5) [11, 22, 33] (%i6) a; (%o6) 11 (%i7) b; (%o7) 22 (%i8) c; (%o8) 33
マクロ関数定義の演算子。
::=は、引数をクォートする関数(歴史的理由によりマクロと呼ばれる)を定義します。
そして、それが返す式(マクロ展開と呼ばれる)はマクロが呼ばれた文脈の中で評価されます。
それ以外はマクロ関数は通常の関数と同じです。
macroexpandは(評価せずに)マクロ展開を返します。
fooがマクロ関数の時、
macroexpand (foo (x))に続けて ``%を実行すると、
それは foo (x)と同値です。
::=は、新しいマクロ関数の名前をグローバルリスト macrosに追加します。
killや remove, remfunctionは、マクロ関数定義をアンバインドし、
macrosから名前を削除します。
fundefや dispfunはそれぞれマクロ関数定義を返し、
それをラベルに割り当てます。
評価対象となる式を構成するために、
マクロ関数は一般的にbuildq, splice式を含みます。
例
マクロ関数は引数をクォートします。
だから、メッセージ(1)は y - zの値ではなく、 y - zを示します。
マクロ展開(クォートされた式 '(print ("(2) x is equal to", x))は、
マクロが呼ばれた文脈(表示メッセージ(2))の中で評価されます。
(%i1) x: %pi$
(%i2) y: 1234$
(%i3) z: 1729 * w$
(%i4) printq1 (x) ::= block (print ("(1) x is equal to", x),
'(print ("(2) x is equal to", x)))$
(%i5) printq1 (y - z);
(1) x is equal to y - z
(2) x is equal to %pi
(%o5) %pi
通常の関数は引数を評価します。だから、メッセージ(1)は y - zの値を示します。
戻り値は評価されず、従って、メッセージ(2)は ``%で陽に評価されるまで出力されません。
(%i1) x: %pi$
(%i2) y: 1234$
(%i3) z: 1729 * w$
(%i4) printe1 (x) := block (print ("(1) x is equal to", x),
'(print ("(2) x is equal to", x)))$
(%i5) printe1 (y - z);
(1) x is equal to 1234 - 1729 w
(%o5) print((2) x is equal to, x)
(%i6) ''%;
(2) x is equal to %pi
(%o6) %pi
macroexpandはマクロ展開を返します。
fooがマクロ関数の時、
macroexpand (foo (x))の後 ``%を実行すると、foo (x)と同値です。
(%i1) x: %pi$
(%i2) y: 1234$
(%i3) z: 1729 * w$
(%i4) g (x) ::= buildq ([x], print ("x is equal to", x))$
(%i5) macroexpand (g (y - z));
(%o5) print(x is equal to, y - z)
(%i6) ''%;
x is equal to 1234 - 1729 w
(%o6) 1234 - 1729 w
(%i7) g (y - z);
x is equal to 1234 - 1729 w
(%o7) 1234 - 1729 w
関数定義の演算子。
f(x_1, .., x_n) := exprは、
引数がx_1, ..., x_nで関数本体がexprの、fという名前の関数を定義します。
:=は(クォートクォート``で陽に評価されない限り)関数本体は評価しません。
定義される関数は(引数をかっこでくくる)通常のMaxima関数か、(引数をかぎかっこでくくる)配列関数です。
最後の引数x_nが要素1つのリストの時、:=で定義された関数は可変の数の引数をとります。
実際の引数は、形式的な引数x_1, …, x_(n - 1)に一対一に割り当てられ、
さらに引数があれば、x_nにリストとして割り当てられます。
関数定義すべては、同じ名前空間を使います;
別の関数gの中で関数fを定義することは、fのスコープをgに限定しません。
しかし、local(f)は、関数fの定義をlocalが現れたブロックや他の合成式内に限定します。
もしある形式引数x_kがクォートされたシンボルなら、:=で定義された関数は対応する実際の引数を評価しません。
それ以外の場合、実際の引数はすべて評価されます。
例:
:=は(クォートクォートで陽に評価されない限り)関数本体を評価しません。
(%i1) expr : cos(y) - sin(x); (%o1) cos(y) - sin(x) (%i2) F1 (x, y) := expr; (%o2) F1(x, y) := expr (%i3) F1 (a, b); (%o3) cos(y) - sin(x) (%i4) F2 (x, y) := ''expr; (%o4) F2(x, y) := cos(y) - sin(x) (%i5) F2 (a, b); (%o5) cos(b) - sin(a)
:=で定義された関数は、通常のMaxima関数か、配列関数です。
(%i1) G1 (x, y) := x.y - y.x;
(%o1) G1(x, y) := x . y - y . x
(%i2) G2 [x, y] := x.y - y.x;
(%o2) G2 := x . y - y . x
x, y
最後の引数x_nが要素1つのリストの時、
:=で定義された関数は、可変の数の引数を取ります。
(%i1) H ([L]) := apply ("+", L);
(%o1) H([L]) := apply("+", L)
(%i2) H (a, b, c);
(%o2) c + b + a
localはローカル関数定義を可能にします。
(%i1) foo (x) := 1 - x; (%o1) foo(x) := 1 - x (%i2) foo (100); (%o2) - 99 (%i3) block (local (foo), foo (x) := 2 * x, foo (100)); (%o3) 200 (%i4) foo (100); (%o4) - 99
Next: User defined operators, Previous: Operators for Equations, Up: Operators [Contents][Index]