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]