Maxima branch_5_47_base_7_g39559bd_dirty Manual: Assignment operators

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

### 7.6 Assignment operators

演算子: :

  割り当て演算子。

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

  左辺がリストや行列、宣言された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

  Evaluation ·Operators ·

演算子: ::

  割り当て演算子。

  `::`は、`::`は右辺はもちろん左辺も評価することを除いて、`:`と同じです。

  例:

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

  Evaluation ·Operators ·

演算子: ::=

  マクロ関数定義の演算子。 `::=`は、引数をクォートする関数（歴史的理由によりマクロと呼ばれる）を定義します。 そして、それが返す式（マクロ展開と呼ばれる）はマクロが呼ばれた文脈の中で評価されます。 それ以外はマクロ関数は通常の関数と同じです。

  `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

  Function definition ·Operators ·

演算子: :=

  関数定義の演算子。 `f(x_1, .., x_n) := expr`は、 引数がx_1, ..., x_nで関数本体がexprの、fという名前の関数を定義します。 `:=`は（クォートクォート````で陽に評価されない限り）関数本体は評価しません。 定義される関数は（引数をかっこでくくる）通常のMaxima関数か、（引数をかぎかっこでくくる）配列関数です。

  最後の引数x_nが要素１つのリストの時、`:=`で定義された関数は可変の数の引数をとります。 実際の引数は、形式的な引数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が要素１つのリストの時、 `:=`で定義された関数は、可変の数の引数を取ります。

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

  Function definition ·Operators ·

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