シングルクォート演算子'は評価を抑制します。
シンボルにシングルクォートを用いると、シンボルが評価されません。
関数コールにシングルクォートを用いると、 関数の引数は(抑制されない限り)評価されますが、関数コールは評価されません。結果は、関数コールの名詞形です。
括弧でくくられた式にシングルクォートを用いると、
式の中のすべてのシンボルと関数コールは評価されません。
例えば、'(f(x))は、式f(x)を評価しないことを意味します。
'f(x)(f(x)ではなくfへ適用されたシングルクォート)は[x]に適用されたfの名詞形を返します。
シングルクォートは式整理を抑制しません。
グローバルフラグ noundispが trueの時、名詞はシングルクォート付きで表示されます。
このスイッチは関数定義を表示するときには、常にtrueです。
例:
シンボルにシングルクォートを用いると、シンボルが評価されません。
(%i1) aa: 1024;
(%o1) 1024
(%i2) aa^2;
(%o2) 1048576
(%i3) 'aa^2;
2
(%o3) aa
(%i4) ''%;
(%o4) 1048576
関数コールにシングルクォートを用いると、関数の引数は評価されますが、関数コールが評価されません。 結果は、関数コールの名詞形です。
(%i1) x0: 5;
(%o1) 5
(%i2) x1: 7;
(%o2) 7
(%i3) integrate (x^2, x, x0, x1);
218
(%o3) ---
3
(%i4) 'integrate (x^2, x, x0, x1);
7
/
[ 2
(%o4) I x dx
]
/
5
(%i5) %, nouns;
218
(%o5) ---
3
括弧でくくられた式にシングルクォートを用いると、式の中のすべてのシンボルと関数コールは評価されません。
(%i1) aa: 1024; (%o1) 1024 (%i2) bb: 19; (%o2) 19 (%i3) sqrt(aa) + bb; (%o3) 51 (%i4) '(sqrt(aa) + bb); (%o4) bb + sqrt(aa) (%i5) ''%; (%o5) 51
シングルクォートは式整理を抑制しません。
(%i1) sin (17 * %pi) + cos (17 * %pi); (%o1) - 1 (%i2) '(sin (17 * %pi) + cos (17 * %pi)); (%o2) - 1
Maximaは組み込み数学関数による浮動小数点演算を整理とみなします。
(%i1) sin(1.0); (%o1) .8414709848078965 (%i2) '(sin(1.0)); (%o2) .8414709848078965
クォートクォート演算子''(シングルクォートマーク2つ)は、入力式の中の評価を部分修正します。
一般式exprにクォートクォートを用いると、入力式の中のexprにexprの値を代入します。
式の演算子にクォートクォートを用いると、(もし動詞でないなら)演算子は名詞から動詞に変わります。
クォートクォート演算子は入力パーサが適用します;
クォートクォート演算子はパースされた入力式の一部としては格納されません。
クォートクォート演算子は、パースされるといつもすぐに適用され、クォートできません。
このように、関数定義やラムダ式、シングルクォート'でクォートされた式の中のように通常評価が抑制される時も、
クォートクォートがあると評価を実行します。
例:
一般式exprにクォートクォートを用いると、入力式の中のexprにexprの値を代入します。
(%i1) expand ((a + b)^3);
3 2 2 3
(%o1) b + 3 a b + 3 a b + a
(%i2) [_, ''_];
3 3 2 2 3
(%o2) [expand((b + a) ), b + 3 a b + 3 a b + a ]
(%i3) [%i1, ''%i1];
3 3 2 2 3
(%o3) [expand((b + a) ), b + 3 a b + 3 a b + a ]
(%i4) [aa : cc, bb : dd, cc : 17, dd : 29];
(%o4) [cc, dd, 17, 29]
(%i5) foo_1 (x) := aa - bb * x;
(%o5) foo_1(x) := aa - bb x
(%i6) foo_1 (10);
(%o6) cc - 10 dd
(%i7) ''%;
(%o7) - 273
(%i8) ''(foo_1 (10));
(%o8) - 273
(%i9) foo_2 (x) := ''aa - ''bb * x;
(%o9) foo_2(x) := cc - dd x
(%i10) foo_2 (10);
(%o10) - 273
(%i11) [x0 : x1, x1 : x2, x2 : x3];
(%o11) [x1, x2, x3]
(%i12) x0;
(%o12) x1
(%i13) ''x0;
(%o13) x2
(%i14) '' ''x0;
(%o14) x3
式の演算子にクォートクォートを用いると、(もし動詞でないなら)演算子は名詞から動詞に変わります。
(%i1) declare (foo, noun); (%o1) done (%i2) foo (x) := x - 1729; (%o2) ''foo(x) := x - 1729 (%i3) foo (100); (%o3) foo(100) (%i4) ''foo (100); (%o4) - 1629
クォートクォート演算子は入力パーサが適用します; クォートクォート演算子はパースされた入力式の一部としては格納されません。
(%i1) [aa : bb, cc : dd, bb : 1234, dd : 5678];
(%o1) [bb, dd, 1234, 5678]
(%i2) aa + cc;
(%o2) dd + bb
(%i3) display (_, op (_), args (_));
_ = cc + aa
op(cc + aa) = +
args(cc + aa) = [cc, aa]
(%o3) done
(%i4) ''(aa + cc);
(%o4) 6912
(%i5) display (_, op (_), args (_));
_ = dd + bb
op(dd + bb) = +
args(dd + bb) = [dd, bb]
(%o5) done
関数定義やラムダ式、シングルクォート'でクォートされた式の中のように
通常評価が抑制される時も、
クォートクォートがあると評価を実行します。
(%i1) foo_1a (x) := ''(integrate (log (x), x));
(%o1) foo_1a(x) := x log(x) - x
(%i2) foo_1b (x) := integrate (log (x), x);
(%o2) foo_1b(x) := integrate(log(x), x)
(%i3) dispfun (foo_1a, foo_1b);
(%t3) foo_1a(x) := x log(x) - x
(%t4) foo_1b(x) := integrate(log(x), x)
(%o4) [%t3, %t4]
(%i5) integrate (log (x), x);
(%o5) x log(x) - x
(%i6) foo_2a (x) := ''%;
(%o6) foo_2a(x) := x log(x) - x
(%i7) foo_2b (x) := %;
(%o7) foo_2b(x) := %
(%i8) dispfun (foo_2a, foo_2b);
(%t8) foo_2a(x) := x log(x) - x
(%t9) foo_2b(x) := %
(%o9) [%t7, %t8]
(%i10) F : lambda ([u], diff (sin (u), u));
(%o10) lambda([u], diff(sin(u), u))
(%i11) G : lambda ([u], ''(diff (sin (u), u)));
(%o11) lambda([u], cos(u))
(%i12) '(sum (a[k], k, 1, 3) + sum (b[k], k, 1, 3));
(%o12) sum(b , k, 1, 3) + sum(a , k, 1, 3)
k k
(%i13) '(''(sum (a[k], k, 1, 3)) + ''(sum (b[k], k, 1, 3)));
(%o13) b + a + b + a + b + a
3 3 2 2 1 1
(利用者もしくはシステム)関数や変数、配列等に対して別名を与えます。 任意の偶数個の引数を取ります。
引数arg_1, …, arg_nで指定された環境下で 式exprを評価します。 引数は、スイッチ(ブーリアンフラグ)だったり、割り当てだったり、 等式だったり、関数だったりします。 evは評価の結果(別の式)を返します。
評価は以下のようにステップを追って実行されます。
simpを引数に指定するとexprを整理します。falseなら整理を抑制するスイッチsimpの設定に関わらずです。
noevalを引数に指定するとevの評価フェイズを抑制します。
(以下のステップ(4)を参照してください。)
これは、他のスイッチとの連携時や、exprを再評価せずに再整理をさせる時に役に立ちます。
nounsを引数に指定するとexprの中の名詞形式
(典型的には、'integrateや'diffのような未評価関数)を評価します。
expandを引数に指定すると展開します。
expand (m, n)を引数に指定すると、
maxposexとmaxnegexの値をそれぞれmとnに設定して、展開します。
detoutを引数に指定すると、exprの中で計算されるどんな逆行列も、逆行列の外側に行列式を保つようにします。
diffを引数に指定するとexprの中のすべての微分を実行します。
derivlist (x, y, z, ...)を引数に指定すると指定された変数に関する微分のみを実行します。
rischを引数に指定すると
exprの中の積分をRischアルゴリズムを使って評価します。
rischを参照してください。
特殊なシンボルnounsを使った時には標準の積分ルーチンが呼び出されます。
floatを引数に指定すると非整数有理数を浮動小数点に変換します。
numerを引数に指定すると数値引数が指定された(指数関数を含む)いくつかの数学関数を浮動小数点に評価します。
また、exprの中の numerval宣言された変数は、宣言された値に置き換えられます。
また、floatスイッチをオンにします。
predを引数に指定すると述語(trueもしくはfalseに評価される式)を評価します。
evalを引数に指定するとexprの特別な後評価をします。(ステップ(5)を参照。)
evalは複数回起こるかもしれません。evalのそれぞれのインスタンスのために、式は再評価されます。
evflagを参照)として宣言されたアトムAを引数に指定すると、
exprの評価の最中、Aがtrueにバインドされます。
V: expression(もしくは代わりにV=expression)を引数に指定すると、
exprの評価の最中、Vがexpressionの値にバインドされます。
もしVがMaximaオプションなら、exprの評価の最中、Vの値にexpressionが使われることに注意してください。
もしevの複数の引数がこのタイプの場合、並列してバインドされます。
もしVが非アトムの式なら、バインドではなく、代入が実行されます。
Fが評価関数(evfun参照)として宣言されている場合、
Fを引数に指定すると Fが exprに適用されます。
sum)でも引数に指定すると、
exprの中にそれらの名前が現れた時それらが動詞であるかのように評価します。
F(x)としましょう)を、
exprの今回の評価の目的のため、
F(X) := expressionをevの引数に与えて、局所的に定義することができます。
evに与えられた追加の引数であるかのように扱います。
これにより、 solveが返すような、与えられた等式のリスト
(例えば、 [X=1,Y=A**2])や
等式の名前のリスト(例えば、 [%t1, %t2]。ここで %t1, %t2は等式)が使えます。
evの引数は、代入等式と評価関数以外はどんな順序で与えてもかまいません。
代入等式は左から右へ順に扱われ、
評価関数は、例えば、 ev (expr, ratsimp, realpart)は
realpart (ratsimp (expr))と扱われるように、合成されます。
simp, numer, floatスイッチは、ブロックの中でローカルにも、
またMaximaの中でグローバルにも設定でき、その場合,リセットされるまで効果を保ちます。
numerとfloatスイッチがともにtrueでない場合、
もしexprが標準有理式(CRE)なら、evが返す式もまたCREです。
%i2のように) %だったりするので、
その場合,このステップは単にラベルされた式を取り出し、
evはその式に対して機能することになります。
noevalが指定されていない限り)結果の式は再評価され、
引数に従って整理されます。
exprの中のどんな関数コールもその中の変数が評価された後実行されること、
ev(F(x))は F(ev(x))のように振る舞うことに注意してください。
evalのそれぞれのインスタンスのために、step (3)(4)を繰り返します。
例:
(%i1) sin(x) + cos(y) + (w+1)^2 + 'diff (sin(w), w);
d 2
(%o1) cos(y) + sin(x) + -- (sin(w)) + (w + 1)
dw
(%i2) ev (%, numer, expand, diff, x=2, y=1);
2
(%o2) cos(w) + w + 2 w + cos(1) + 2.449599732693821
evのために、代わりのトップレベルの文法が提供されています。
それによって、ev()なしに引数をタイプして入力するだけでよくなります。
すなわち、単に以下のように書けます。
expr, arg_1, ..., arg_n
これは、例えば、関数やブロックの中など、他の式の一部としては許されません。
以下の例では並列のバインドプロセスに注意してください。
(%i3) programmode: false;
(%o3) false
(%i4) x+y, x: a+y, y: 2;
(%o4) y + a + 2
(%i5) 2*x - 3*y = 3$
(%i6) -3*x + 2*y = -4$
(%i7) solve ([%o5, %o6]);
Solution
1
(%t7) y = - -
5
6
(%t8) x = -
5
(%o8) [[%t7, %t8]]
(%i8) %o6, %o8;
(%o8) - 4 = - 4
(%i9) x + 1/x > gamma (1/2);
1
(%o9) x + - > sqrt(%pi)
x
(%i10) %, numer, x=1/2;
(%o10) 2.5 > 1.772453850905516
(%i11) %, pred;
(%o11) true
ev (expr)のコールの引数として、
evalは
exprの追加の評価をもたらします。
evを参照してください。
例:
(%i1) [a:b,b:c,c:d,d:e]; (%o1) [b, c, d, e] (%i2) a; (%o2) b (%i3) ev(a); (%o3) c (%i4) ev(a),eval; (%o4) e (%i5) a,eval,eval; (%o5) e
シンボルxがevflagプロパティを持つ時、
式ev(expr, x)や対話プロンプトでのexpr, xは、
ev(expr, x = true)と同値です。
すなわち、exprが評価される間、xはtrueにバインドされます。
式declare(x, evflag)は、変数xにevflagプロパティを与えます。
デフォルトでevflagプロパティを持つフラグは以下の通りです:
algebraic cauchysum demoivre dotscrules %emode %enumer exponentialize exptisolate factorflag float halfangles infeval isolate_wrt_times keepfloat letrat listarith logabs logarc logexpand lognegint lognumer m1pbranch numer_pbranch programmode radexpand ratalgdenom ratfac ratmx ratsimpexpons simp simpproduct simpsum sumexpand trigexpand
例:
(%i1) sin (1/2);
1
(%o1) sin(-)
2
(%i2) sin (1/2), float;
(%o2) 0.479425538604203
(%i3) sin (1/2), float=true;
(%o3) 0.479425538604203
(%i4) simp : false;
(%o4) false
(%i5) 1 + 1;
(%o5) 1 + 1
(%i6) 1 + 1, simp;
(%o6) 2
(%i7) simp : true;
(%o7) true
(%i8) sum (1/k^2, k, 1, inf);
inf
====
\ 1
(%o8) > --
/ 2
==== k
k = 1
(%i9) sum (1/k^2, k, 1, inf), simpsum;
2
%pi
(%o9) ----
6
(%i10) declare (aa, evflag);
(%o10) done
(%i11) if aa = true then YES else NO;
(%o11) NO
(%i12) if aa = true then YES else NO, aa;
(%o12) YES
関数Fがevfunプロパティを持つ時、
式ev(expr, F)や(対話プロンプトでの)expr, Fは、
F(ev(expr))と同値です。
もし2つ以上のevfun関数F, Gなどが指定されたなら、関数は指定された順に適用されます。
式declare(F, evfun)は、関数Fにevfunプロパティを与えます。
デフォルトでevfunプロパティを持つ関数は以下の通りです:
bfloat factor fullratsimp logcontract polarform radcan ratexpand ratsimp rectform rootscontract trigexpand trigreduce
例:
(%i1) x^3 - 1;
3
(%o1) x - 1
(%i2) x^3 - 1, factor;
2
(%o2) (x - 1) (x + x + 1)
(%i3) factor (x^3 - 1);
2
(%o3) (x - 1) (x + x + 1)
(%i4) cos(4 * x) / sin(x)^4;
cos(4 x)
(%o4) --------
4
sin (x)
(%i5) cos(4 * x) / sin(x)^4, trigexpand;
4 2 2 4
sin (x) - 6 cos (x) sin (x) + cos (x)
(%o5) -------------------------------------
4
sin (x)
(%i6) cos(4 * x) / sin(x)^4, trigexpand, ratexpand;
2 4
6 cos (x) cos (x)
(%o6) - --------- + ------- + 1
2 4
sin (x) sin (x)
(%i7) ratexpand (trigexpand (cos(4 * x) / sin(x)^4));
2 4
6 cos (x) cos (x)
(%o7) - --------- + ------- + 1
2 4
sin (x) sin (x)
(%i8) declare ([F, G], evfun);
(%o8) done
(%i9) (aa : bb, bb : cc, cc : dd);
(%o9) dd
(%i10) aa;
(%o10) bb
(%i11) aa, F;
(%o11) F(cc)
(%i12) F (aa);
(%o12) F(bb)
(%i13) F (ev (aa));
(%o13) F(cc)
(%i14) aa, F, G;
(%o14) G(F(cc))
(%i15) G (F (ev (aa)));
(%o15) G(F(cc))
「無限評価」モードにします。evは、値が変わらなくなるまで式を繰り返し評価します。
このモードで変数(Xとします)が評価されることを避けるには、単にX='Xをevの引数として含めます。
ev (X, X=X+1, infeval)のような式は、もちろん、無限ループを引き起こします。
nounsはevflagの1つです。
evコマンドのオプションとして使われる時、
nounsは、式の中に現れる「名詞」形すべてを「動詞」にevします。すなわち、それらを評価します。
noun, nounify, verb, verbifyも参照してください。