Next: , Previous: Operators for Equations, Up: Operators   [Contents][Index]

7.6 Assignment operators

演算子: :

割り当て演算子。

左辺が(添字のない)単純変数の時、 :は右辺を評価し、その値を左辺に関連づけます。

左辺がリストや行列、宣言されたMaxima配列、Lisp配列の添字指定された要素の時、 右辺がその要素に割り当てられます。 添字は存在している要素を示していなければなりません; 先に列挙した対象は、存在していない要素を名付けることで拡張することはできません。

左辺が未宣言のMaxima配列の添字指定された要素の時、 もし既に存在しているなら、右辺はその要素に割り当てられ、 もしまだ存在していなければ新しい要素が確保されます。

左辺が単純変数や添字あり変数のリストの時、 右辺はリストに評価されなければなりません。 そして、右辺の要素が左辺の要素に平行に割り当てられます。

killremvalueも参照してください。 それらは左辺とその値の関連をアンドゥします。

例:

単純変数への割り当て

(%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

多重割り当ては平行に実行されます。 この例ではabの値が置換されます。

(%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に追加します。 killremove, remfunctionは、マクロ関数定義をアンバインドし、 macrosから名前を削除します。

fundefdispfunはそれぞれマクロ関数定義を返し、 それをラベルに割り当てます。

評価対象となる式を構成するために、 マクロ関数は一般的に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がクォートされたシンボルなら、:=で定義された関数は対応する実際の引数を評価しません。 それ以外の場合、実際の引数はすべて評価されます。

define::=も参照してください。

例:

:=は(クォートクォートで陽に評価されない限り)関数本体を評価しません。

(%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: , Previous: Operators for Equations, Up: Operators   [Contents][Index]