2 * Introduction to Function Definition::
5 * Functions and Variables for Function Definition::
8 @c -----------------------------------------------------------------------------
9 @node Introduction to Function Definition, Function, Function Definition, Function Definition
10 @section Introduction to Function Definition
11 @c -----------------------------------------------------------------------------
13 @c -----------------------------------------------------------------------------
14 @node Function, Macros, Introduction to Function Definition, Function Definition
15 @c NEEDS WORK, THIS TOPIC IS IMPORTANT
16 @c MENTION DYNAMIC SCOPE (VS LEXICAL SCOPE)
18 @c -----------------------------------------------------------------------------
21 @category{Function definition} @category{Programming}
24 @c -----------------------------------------------------------------------------
25 @subsection Ordinary functions
26 @c -----------------------------------------------------------------------------
38 匿名関数も @code{lambda}を使って生成することができます。
42 f(i,j) := block ([], ...);
43 map (lambda ([i], i+1), l)
47 は、項それぞれに1を足したリストを返しますが、
54 を@code{f}の代わりに使うことができます。
56 (訳注: 元マニュアルの編集ミスでしょうか。以下の内容が一貫すると思います。
63 は、項それぞれに1を足したリストを返しますが、
70 を@code{f}の代わりに使うことができます。)
74 余分な引数のリストに割り当てられる最後の引数を持つことで、
78 最後の引数変数を@code{[]}でくくると、残りの引数のリストがその引数変数に割り当てられます。)
85 (%i3) f (a, b, [u]) := [a, b, u];
86 (%o3) f(a, b, [u]) := [a, b, u]
87 (%i4) f (1, 2, 3, 4, 5, 6);
88 (%o4) [1, 2, [3, 4, 5, 6]]
95 f(x) := (expr1, expr2, ...., exprn);
98 とします。 @var{exprn}の値が関数が返すものになります。
100 もし関数内部のある式から@code{return}したいなら、
101 @code{block}と@code{return}を使わなければいけません。
104 block ([], expr1, ..., if (a > 10) then return(a), ..., exprn)
107 はそれ自身式で、関数定義の右辺にとって代わることができます。
108 この際、最後の式よりも早くreturnが起こるかもしれません。
110 @c COPY THIS STUFF TO @defun block AS NEEDED
111 @c ESPECIALLY STUFF ABOUT LOCAL VARIABLES
112 ブロックの中の最初の@code{[]}は、
113 @code{[a: 3, b, c: []]}のように、変数と変数割り当てのリストを含むかもしれません。
114 @code{[a: 3, b, c: []]}は、3つの変数@code{a},@code{b},@code{c}が
115 コードが、@code{block}内部や@code{block}内部からコールされた関数内部で実行される限り、
116 グローバル値を参照しないように、しかしむしろ特別な値を持つようにします。
117 変数がブロックの開始から抜ける時間まで続くので、これは、@i{動的}バインドと呼ばれます。
118 一旦@code{block}から戻るか、そこから出ると、(もし存在するなら)変数の古い値が戻されます。
119 この方法で変数を保護することは確かによい考えです。
120 ブロック変数に関する割り当ては、並列に行われることに注意してください。
121 これは、もし先に@code{c: a}を使ったら、@code{c}の値はブロックにちょうど入った時、まだ
122 @code{a}がバインドされる前の@code{a}の値であることを意味します。
126 block ([a: a], expr1, ... a: a+3, ..., exprn)
130 @code{a}の外部の値を変更されないよう保護しますが、その値がなんだったかアクセス可能にします。
131 割り当ての右辺は、バインドが起こる前に入る文脈の中で評価されます。
133 ただ@code{block ([x], ...}を使うことは、
134 ちょうどまるで新しいMaximaセッションに入ったかのように、@code{x}がそれ自身を値として持つようにします。
136 関数の実際の引数は、ブロックの変数と厳密に同じ方法で扱われます。
140 f(x) := (expr1, ..., exprn);
152 block ([x: 1], expr1, ..., exprn)
155 を実行したかのような類似の文脈を持ちます。
158 関数内部では、@code{define}とたぶん@code{buildq}を使うことが役に立ちます。
160 Inside functions, when the right hand side of a definition, may be computed at runtime, it is useful to use @code{define} and possibly @code{buildq}.
162 @c -----------------------------------------------------------------------------
163 @subsection Array functions
164 @c -----------------------------------------------------------------------------
166 配列関数は、初めて与えられた引数でコールされた時、関数値を記憶し、
167 同じ引数が与えられた時、再計算することなしに記憶した値を返します。
168 そんな関数はしばしば@i{メモ化関数}と呼ばれます。
170 配列関数名は、(グローバルリスト@code{functions}ではなく)
171 グローバルリスト@code{arrays}に追加されます。
175 @code{listarray}は記憶された値を返します。
176 @code{dispfun}と@code{fundef}は配列関数の定義を返します。
178 @code{arraymake}は、通常の関数に対する@code{funmake}のように、
181 通常の関数に対する@code{apply}のように、
183 配列関数に対して、@code{map}に厳密に似たものはありません。
184 @code{map(lambda([@var{x}], @var{a}[@var{x}]), @var{L})}または
185 @code{makelist(@var{a}[@var{x}], @var{x}, @var{L})}
186 ―@var{L}はリストです―は、目的からそれほど遠くありませんけれども。
189 通常の関数に対する@code{remfunction}のように、
190 (記憶された関数値も含めて、)配列関数の定義を削除します。
192 @code{kill(@var{a}[@var{x}])}は、配列関数@var{a}の引数@var{x}に関して記憶された
194 次回、引数@var{x}で@var{a}がコールされた時、
197 関数定義も削除する@code{kill(@var{a})}または@code{remarray(@var{a})}を除いて、
198 記憶された値すべてを一度に削除する方法はありません。
200 @c -----------------------------------------------------------------------------
201 @node Macros, Functions and Variables for Function Definition, Function, Function Definition
203 @c -----------------------------------------------------------------------------
205 @c -----------------------------------------------------------------------------
207 @deffn {関数} buildq (@var{L}, @var{expr})
209 リスト@var{L}で指名された変数を式 @var{expr}に
210 並列に代入します。@var{expr}は評価しません。
211 @code{buildq}が代入を実行した後、
212 結果の式は整理はされますが、評価されません。
214 @var{L}の要素はシンボルまたは割り当て式@code{@var{symbol}: @var{value}}です。
216 すなわち、ある変数が割り当ての右辺へバインドされるのは、
217 @code{buildq}がコールされた文脈でのバインドです。
218 変数リスト@var{L}内でその変数がバインドされるのではありません。
219 もし@var{L}の中のある変数に明示的な割り当てがないなら、
220 @code{buildq}でのバインドは、
221 @code{buildq}がコールされた文脈でのそれと同じです。
223 そして、@var{L}で指名された変数は並列に@var{expr}に代入されます。
224 すなわち、すべての変数への代入は他の代入がされる前に決まります。
225 だから、1つの変数の代入は他には一切効果を持ちません。
228 任意の変数 @var{x}が @var{expr}の中で @code{splice (@var{x})}のように現れるなら、
229 @var{x}はリストにバインドされなければいけませんし、
230 リストは、代入の代わりに@var{expr} に接合(内挿)されます。
232 @var{expr}の中の@var{L}に現れない任意の変数は、
233 たとえそれらが@code{buildq}がコールされた文脈の中でバインドを持っていても、
238 @code{a}は明示的に @code{x}にバインドされ、
239 一方で @code{b}は、コールする文脈で同じバインド(すなわち29)を持ち、
240 @code{c}は逐語的に繰り越されます。
241 結果の式は、明示的な評価 @code{''%}まで評価されません。
244 @c (a: 17, b: 29, c: 1729)$
245 @c buildq ([a: x, b], a + b + c);
249 (%i1) (a: 17, b: 29, c: 1729)$
250 (%i2) buildq ([a: x, b], a + b + c);
257 @code{foo}の引数の中でそのように現れ、
258 @code{bar}の引数の中に内挿されます。
261 @c buildq ([e: [a, b, c]], foo (x, e, y));
262 @c buildq ([e: [a, b, c]], bar (x, splice (e), y));
265 (%i1) buildq ([e: [a, b, c]], foo (x, e, y));
266 (%o1) foo(x, [a, b, c], y)
267 (%i2) buildq ([e: [a, b, c]], bar (x, splice (e), y));
268 (%o2) bar(x, a, b, c, y)
272 もし代入の前に整理が適用されたら、これら2つの結果は同じになったはずです。
274 @c buildq ([e: [a, b, c]], splice (e) + splice (e));
275 @c buildq ([e: [a, b, c]], 2 * splice (e));
278 (%i1) buildq ([e: [a, b, c]], splice (e) + splice (e));
279 (%o1) 2 c + 2 b + 2 a
280 (%i2) buildq ([e: [a, b, c]], 2 * splice (e));
284 @var{L}の中の変数は並列にバインドされます;
286 最初の結果は、@code{foo (b, b)}になったはずです。
288 二番目の結果を@code{subst}の結果と比較してください。
289 @code{subst}は代入を順次実行します。
292 @c buildq ([a: b, b: a], foo (a, b));
293 @c buildq ([u: v, v: w, w: x, x: y, y: z, z: u],
294 @c bar (u, v, w, x, y, z));
295 @c subst ([u=v, v=w, w=x, x=y, y=z, z=u],
296 @c bar (u, v, w, x, y, z));
299 (%i1) buildq ([a: b, b: a], foo (a, b));
301 (%i2) buildq ([u: v, v: w, w: x, x: y, y: z, z: u],
302 bar (u, v, w, x, y, z));
303 (%o2) bar(v, w, x, y, z, u)
304 (%i3) subst ([u=v, v=w, w=x, x=y, y=z, z=u],
305 bar (u, v, w, x, y, z));
306 (%o3) bar(u, u, u, u, u, u)
309 変数や式が左辺に、それらの値が右辺にある等式のリストを構成します。
310 @code{macroexpand}は@code{show_values}が返す式を表示します。
313 @c show_values ([L]) ::= buildq ([L], map ("=", 'L, L));
314 @c (a: 17, b: 29, c: 1729)$
315 @c show_values (a, b, c - a - b);
316 @c macroexpand (show_values (a, b, c - a - b));
319 (%i1) show_values ([L]) ::= buildq ([L], map ("=", 'L, L));
320 (%o1) show_values([L]) ::= buildq([L], map("=", 'L, L))
321 (%i2) (a: 17, b: 29, c: 1729)$
322 (%i3) show_values (a, b, c - a - b);
323 (%o3) [a = 17, b = 29, c - b - a = 1683]
324 (%i4) macroexpand (show_values (a, b, c - a - b));
325 (%o4) map(=, '([a, b, c - b - a]), [a, b, c - b - a])
329 引数のいくつかが固定されたもう1つの関数を生成します。
333 @c buildq ([f, a], lambda ([[x]], apply (f, append (a, x))))$
334 @c by3 : curry ("*", 3);
338 (%i1) curry (f, [a]) :=
339 buildq ([f, a], lambda ([[x]], apply (f, append (a, x))))$
340 (%i2) by3 : curry ("*", 3);
341 (%o2) lambda([[x]], apply(*, append([3], x)))
347 @category{Function definition}
351 @c -----------------------------------------------------------------------------
353 @deffn {関数} macroexpand (@var{expr})
355 @code{expr}がマクロ関数コールの時、
356 @var{expr}のマクロ展開を、評価はせずに、返します。
357 そうでなければ、@code{macroexpand}は@var{expr}を返します。
359 もし@var{expr}の展開が別のマクロ関数コールをもたらすなら、
362 @code{macroexpand}は引数をクォートします。
363 しかしながら、もしマクロ関数コールの展開が副作用を持つなら,
366 @code{::=}, @code{macros}, @code{macroexpand1}も参照してください。
372 @c h (x) ::= buildq ([x], g (x - a));
374 @c macroexpand (h (y));
378 (%i1) g (x) ::= x / 99;
382 (%i2) h (x) ::= buildq ([x], g (x - a));
383 (%o2) h(x) ::= buildq([x], g(x - a))
386 (%i4) macroexpand (h (y));
397 @category{Function application}
401 @c -----------------------------------------------------------------------------
402 @anchor{macroexpand1}
403 @deffn {関数} macroexpand1 (@var{expr})
405 @code{expr}がマクロ関数コールの時、
406 @var{expr}のマクロ展開を、評価せずに、返します。
407 そうでなければ、@code{macroexpand1}は@var{expr}を返します。
409 @code{macroexpand}は引数をクォートします。
410 しかしながら、もしマクロ関数コールの展開が副作用を持つなら,
413 もし@var{expr}の展開が別のマクロ関数コールをもたらすなら、
416 @code{::=}, @code{macros}, @code{macroexpand}も参照してください。
422 @c h (x) ::= buildq ([x], g (x - a));
424 @c macroexpand1 (h (y));
428 (%i1) g (x) ::= x / 99;
432 (%i2) h (x) ::= buildq ([x], g (x - a));
433 (%o2) h(x) ::= buildq([x], g(x - a))
436 (%i4) macroexpand1 (h (y));
445 @category{Function application}
449 @c -----------------------------------------------------------------------------
451 @defvr {Global variable} macros
454 @code{macros}は、ユーザー定義のマクロ関数のリストです。
455 マクロ関数定義演算子@code{::=}は、このリストに新しいマクロ関数を入れ、
456 @code{kill}, @code{remove}, @code{remfunction}はリストからマクロ関数を削除します。
458 @code{infolists}も参照してください。
461 @category{Function definition} @category{Global variables}
465 @c -----------------------------------------------------------------------------
467 @deffn {関数} splice (@var{a})
469 @code{splice}が@code{buildq}内部に現れた時だけ、
470 アトム@var{a}で指名されたリストを式に接合(内挿)します;
471 そうでなければ、@code{splice}は未定義関数として扱われます。
474 @var{a}単独として(@code{splice}なしに)現れたら、
475 @var{a}はリストとして、結果の中に代入されます(内挿されません)。
476 @code{splice}の引数はアトムだけを取り得ます;
477 リストリテラルやリストをもたらす式を取ることはできません。
479 通常、@code{splice}は、関数や演算子の引数を提供します。
481 @code{buildq}内部の式@code{f (splice (@var{a}))}は、
482 @code{f (@var{a}[1], @var{a}[2], @var{a}[3], ...)}に展開されます。
484 @code{buildq}内部の式@code{"o" (splice (@var{a})}は、
485 @code{"o" (@var{a}[1], @var{a}[2], @var{a}[3], ...)}に展開されます。
486 ここで@code{o}は、任意のタイプの演算子を取り得ます(通常は複数の引数を取るものです)。
487 演算子はダブルクォート@code{"}でくくられなければいけないことに注意してください。
492 @c buildq ([x: [1, %pi, z - y]], foo (splice (x)) / length (x));
493 @c buildq ([x: [1, %pi]], "/" (splice (x)));
494 @c matchfix ("<>", "<>");
495 @c buildq ([x: [1, %pi, z - y]], "<>" (splice (x)));
498 (%i1) buildq ([x: [1, %pi, z - y]], foo (splice (x)) / length (x));
500 (%o1) -----------------------
501 length([1, %pi, z - y])
502 (%i2) buildq ([x: [1, %pi]], "/" (splice (x)));
506 (%i3) matchfix ("<>", "<>");
508 (%i4) buildq ([x: [1, %pi, z - y]], "<>" (splice (x)));
509 (%o4) <>1, %pi, z - y<>
513 @category{Function definition}
517 @c end concepts Function Definition
519 @c -----------------------------------------------------------------------------
520 @node Functions and Variables for Function Definition, , Macros, Function Definition
521 @section Functions and Variables for Function Definition
522 @c -----------------------------------------------------------------------------
524 @c -----------------------------------------------------------------------------
526 @deffn {関数} apply (@var{F}, [@var{x_1}, ..., @var{x_n}])
528 @code{@var{F}(@var{x_1}, ..., @var{x_n})}を構成、評価します。
530 @code{apply}は、配列関数を通常の関数と区別しようとはしません;
531 @var{F}が配列関数の名前の時、@code{apply}は@code{@var{F}(...)}(カギ括弧の代わりに括弧での関数コール)を評価します。
532 @code{arrayapply}は、この場合、カギ括弧ありで関数コールを評価します。
536 @code{apply}は、引数を評価します。
537 この例では、@code{min}が@code{L}の値に適用されます。
540 @c L : [1, 5, -10.2, 4, 3];
544 (%i1) L : [1, 5, -10.2, 4, 3];
545 (%o1) [1, 5, - 10.2, 4, 3]
546 (%i2) apply (min, L);
550 @code{apply}は、たとえ関数@var{F}が引数をクォートする場合でも、引数を評価します。
553 @c F (x) := x / 1729;
557 @c apply (dispfun, [fname]);
560 (%i1) F (x) := x / 1729;
572 (%i4) dispfun (fname);
573 fname is not the name of a user function.
574 -- an error. Quitting. To debug this try debugmode(true);
575 (%i5) apply (dispfun, [fname]);
584 @code{apply}は関数名@var{F}を評価します。
585 シングルクオート@code{'}は評価を無効にします。
586 @code{demoivre}はグローバル変数の名前であり、また、関数でもあります。
590 @c demoivre (exp (%i * x));
591 @c apply (demoivre, [exp (%i * x)]);
592 @c apply ('demoivre, [exp (%i * x)]);
597 (%i2) demoivre (exp (%i * x));
598 (%o2) %i sin(x) + cos(x)
599 (%i3) apply (demoivre, [exp (%i * x)]);
600 demoivre evaluates to false
601 Improper name or value in functional position.
602 -- an error. Quitting. To debug this try debugmode(true);
603 (%i4) apply ('demoivre, [exp (%i * x)]);
604 (%o4) %i sin(x) + cos(x)
608 @category{Function application}
612 @c -----------------------------------------------------------------------------
614 @deffn {関数} block ([@var{v_1}, ..., @var{v_m}], @var{expr_1}, ..., @var{expr_n})
615 @deffnx {関数} block (@var{expr_1}, ..., @var{expr_n})
617 @code{block}は@var{expr_1}, ..., @var{expr_n}を順に評価し、評価された最後の式の値を返します。
618 順序は@code{go}, @code{throw}, @code{return}関数によって変更することができます。
619 最後の式は、@code{return}もしくは@code{throw}を含む式が評価されないなら、@var{expr_n}です。
620 いくつかの変数@var{v_1}, ..., @var{v_m}がブロックにローカルに宣言できます;
621 これらは同じ名前のグローバル変数と区別されます。
622 変数がローカルに宣言されないなら、リストは省略できます。
623 ブロック内では、@var{v_1}, ..., @var{v_m}以外の変数はグローバル変数です。
625 @code{block}は(存在するなら)変数@var{v_1}, ..., @var{v_m}の現在の値を保存し、
626 変数がそれ自身に評価されるよう変数のバインドを解除します。
627 ローカル変数はブロック内部で任意の値にバインドできますが、
628 ブロックが終了するとき保存された値が戻され、
629 ブロック内で割り当てられた値は失われます。
631 @code{block}内部の宣言@code{local(@var{v_1}, ..., @var{v_m})}は
632 シンボル@var{v_1}, ..., @var{v_m}に関連付けられた性質を保存し、
633 他の式を評価する前に、性質を取り除き、ブロック終了時に元に戻します。
634 いくつかの宣言は、@code{:=}、@code{array}, @code{dependencies}, @code{atvalue}, @code{matchdeclare},
635 @code{atomgrad}, @code{constant}, @code{nonscalar}その他を含むシンボルの性質として実装されます。
636 @code{local}の効果は、ブロック内部のみで有効な宣言を作ります;
637 そうでなければ、ブロック内部の宣言は実際にグローバル宣言となります。
639 @code{block}は他の@code{block}内部でも現れます。
640 ローカル変数が、新しいブロックが評価されるたびに確立されます。
641 ローカル変数は、内包するブロックではグローバルです。
642 ブロックの中で、変数がローカルでないなら、その値は内包するブロックによって割り当てられた最新の値です。
643 そうでなければ、グローバル環境の変数の値になります。
644 このポリシーは「動的スコープ」の普通の理解と一致します。
646 ブロックの値は、最後の文もしくはブロックから陽に終了するのに使われる関数@code{function}の引数の値です。
647 関数@code{go}は、@code{go}の引数でタグされたブロックの文に制御を移すのに使われます。
648 例えば、@code{block ([x], x:1, loop, x: x+1, ..., go(loop), ...)}。
649 @code{go}の引数はブロック内部に現れるタグの名前でなければなりません。
650 @code{go}を含んだブロック以外のブロック内部のタグへ飛ぶのに@code{go}を使うことはできません。
652 ブロックは、典型的な場合、関数定義の右辺に現れますが、他の場所でも使うことができます。
655 @category{Expressions} @category{Programming}
659 @c REPHRASE, NEEDS EXAMPLE
661 @c -----------------------------------------------------------------------------
663 @deffn {関数} break (@var{expr_1}, ..., @var{expr_n})
665 @var{expr_1}, ..., @var{expr_n}を評価し、印字し、それから
666 ユーザーが環境を検査し変更できるところでMaximaブレイクを引き起こします。
667 @code{exit;}をタイプすると、計算が再開されます。
674 @c FOR SOME REASON throw IS IN SOME OTHER FILE. MOVE throw INTO THIS FILE.
675 @c NEEDS CLARIFICATION
677 @c -----------------------------------------------------------------------------
679 @deffn {関数} catch (@var{expr_1}, ..., @var{expr_n})
681 @var{expr_1}, ..., @var{expr_n}を1つずつ評価します;
682 もしどれかが形式@code{throw (arg)}の式の評価に至るなら、
683 @code{catch}の値は@code{throw (arg)}の値であり、もう式は評価されません。
685 入れ子の任意の深さを通過して、@code{throw}を含む最も近い@code{catch}に飛びます。
686 もし@code{throw}を含む@code{catch}がないなら、
690 いかなる@code{throw}の評価にも至らないなら、
691 @code{catch}の値は@var{expr_n}の値です。
694 (%i1) lambda ([x], if x < 0 then throw(x) else f(x))$
695 (%i2) g(l) := catch (map (''%, l))$
696 (%i3) g ([1, 2, 3, 7]);
697 (%o3) [f(1), f(2), f(3), f(7)]
698 (%i4) g ([1, 2, -3, 7]);
703 もし@code{l}が非負数だけから成るなら、
704 @code{l}の要素それぞれの@code{f}のリストを返します;
705 そうでなければ、@code{g}は "catches" the
706 first negative element of
707 @code{l}の最初の負の要素を「キャッチ」して、それを「スロー」します。
710 @category{Programming}
714 @c -----------------------------------------------------------------------------
716 @deffn {関数} compfile (@var{filename}, @var{f_1}, @dots{}, @var{f_n})
717 @deffnx {関数} compfile (@var{filename}, functions)
718 @deffnx {関数} compfile (@var{filename}, all)
720 Maxima関数をLispに翻訳し、翻訳したコードをファイル@var{filename}に書き込みます。
722 @code{compfile(@var{filename}, @var{f_1}, ..., @var{f_n})}は
724 @code{compfile (@var{filename}, functions)}と
725 @code{compfile (@var{filename}, all)}はユーザー定義関数をすべて翻訳します。
727 Lisp翻訳は評価されず、出力ファイルはLispコンパイラによって処理もされません。
728 @c SO LET'S CONSIDER GIVING THIS FUNCTION A MORE ACCURATE NAME.
729 @code{translate}はLisp翻訳を生成し評価します。
730 @code{compile_file}はMaximaをLispに翻訳し、Lispコンパイラを実行します。
732 @code{translate}, @code{translate_file}, @code{compile_file}も参照してください。
735 @category{Translation and compilation}
739 @c THIS VARIABLE IS OBSOLETE: ASSIGNING compgrind: true CAUSES compfile
740 @c TO EVENTUALLY CALL AN OBSOLETE FUNCTION SPRIN1.
741 @c RECOMMENDATION IS TO CUT THIS ITEM, AND CUT $compgrind FROM src/transs.lisp
743 @c デフォルト値: @code{false}
745 @c When @code{compgrind} is @code{true}, function definitions printed by
746 @c @code{compfile} are pretty-printed.
750 @c -----------------------------------------------------------------------------
752 @deffn {関数} compile (@var{f_1}, ..., @var{f_n})
753 @deffnx {関数} compile (functions)
754 @deffnx {関数} compile (all)
756 Maxima関数@var{f_1}, ..., @var{f_n}をLispに翻訳し、
758 翻訳された関数それぞれについてLisp関数@code{COMPILE}をコールします。
759 @code{compile}は、コンパイルされた関数名のリストを返します。
761 @code{compile (all)}や@code{compile (functions)}は、
762 ユーザー定義関数すべてをコンパイルします。
764 @code{compile}は引数をクォートします;
765 クォートクォート演算子@code{'@w{}'}はクォートに優先します。
768 @category{Translation and compilation}
772 @c -----------------------------------------------------------------------------
774 @deffn {関数} define (@var{f}(@var{x_1}, @dots{}, @var{x_n}), @var{expr})
775 @deffnx {関数} define (@var{f}[@var{x_1}, @dots{}, @var{x_n}], @var{expr})
776 @deffnx {関数} define (funmake (@var{f}, [@var{x_1}, @dots{}, @var{x_n}]), @var{expr})
777 @deffnx {関数} define (arraymake (@var{f}, [@var{x_1}, @dots{}, @var{x_n}]), @var{expr})
778 @deffnx {関数} define (ev (@var{expr_1}), @var{expr_2})
780 引数@var{x_1}, @dots{}, @var{x_n}を持ち、
781 @var{expr}の中身を持つ@var{f}という名前の関数を定義します。
782 @code{define}は、いつも(陽にクオートされていない限り)、2番目の引数を評価します。
783 定義された関数は、(かっこでくくられた引数を持つ)通常のMaxima関数
784 もしくは(カギ括弧でくくられた引数を持つ)配列関数です。
786 最後の関数の引数@var{x_n}が要素1つのリストの時、
787 @code{define}によって定義される関数は、可変な数の引数を受け入れます。
788 実際の引数は、形式的な引数, @var{x_1}, ..., @var{x_(n - 1)}に1対1に割り当てられます。
789 実際の引数がさらに存在するなら@var{x_n}にリストとして割り当てられます。
791 @code{define}の最初の引数が@code{@var{f}(@var{x_1}, ..., @var{x_n})}もしくは
792 @code{@var{f}[@var{x_1}, ..., @var{x_n}]}の形の式の時、
793 関数の引数は評価されますが、既にその名前の関数や変数があったとしても@var{f}は評価されません。
795 最初の引数が演算子@code{funmake}もしくは@code{arraymake}, @code{ev}を伴う式の時、
796 最初の引数は評価されます;これは、本体だけでなく、関数名が計算されることを許します。
798 すべての関数定義は同じ名前空間で現れます;
799 関数gの中で関数@code{f}を定義することは、@code{f}のスコープを@code{g}に自動的に限定することにはなりません。
800 しかしながら、@code{local(f)}は、関数@code{f}の定義を、
801 @code{local}が現れたブロックや他の合成式内部でのみ有効とします。
803 もしある形式的な引数@var{x_k}が(評価の後)クォートされたシンボルならば、
804 @code{define}によって定義される関数は、対応する実際の引数を評価しません。
805 そうでければ、すべての実際の引数は評価されます。
807 @code{:=}や@code{::=}も参照してください。
811 @code{define}は、(陽にクォートされない限り)いつも二番目の引数を評価します
814 @c expr : cos(y) - sin(x);
815 @c define (F1 (x, y), expr);
817 @c F2 (x, y) := expr;
821 (%i1) expr : cos(y) - sin(x);
822 (%o1) cos(y) - sin(x)
823 (%i2) define (F1 (x, y), expr);
824 (%o2) F1(x, y) := cos(y) - sin(x)
826 (%o3) cos(b) - sin(a)
827 (%i4) F2 (x, y) := expr;
828 (%o4) F2(x, y) := expr
830 (%o5) cos(y) - sin(x)
833 @code{define}が定義する関数は、通常のMaxima関数も配列関数も取り得ます。
836 @c define (G1 (x, y), x.y - y.x);
837 @c define (G2 [x, y], x.y - y.x);
840 (%i1) define (G1 (x, y), x.y - y.x);
841 (%o1) G1(x, y) := x . y - y . x
842 (%i2) define (G2 [x, y], x.y - y.x);
843 (%o2) G2 := x . y - y . x
847 最後の、または唯一の引数@var{x_n}が1要素のリストの時、
848 @code{define}が定義した関数は可変の数の引数を受け付けます。
851 @c define (H ([L]), '(apply ("+", L)));
855 (%i1) define (H ([L]), '(apply ("+", L)));
856 (%o1) H([L]) := apply("+", L)
862 演算子@code{funmake}, @code{arraymake}, または@code{ev}を含む式なら、
868 @c define (funmake (F, [u]), cos(u) + 1);
869 @c define (arraymake (F, [u]), cos(u) + 1);
870 @c define (foo (x, y), bar (y, x));
871 @c define (ev (foo (x, y)), sin(x) - cos(y));
874 (%i1) [F : I, u : x];
876 (%i2) funmake (F, [u]);
878 (%i3) define (funmake (F, [u]), cos(u) + 1);
879 (%o3) I(x) := cos(x) + 1
880 (%i4) define (arraymake (F, [u]), cos(u) + 1);
881 (%o4) I := cos(x) + 1
883 (%i5) define (foo (x, y), bar (y, x));
884 (%o5) foo(x, y) := bar(y, x)
885 (%i6) define (ev (foo (x, y)), sin(x) - cos(y));
886 (%o6) bar(y, x) := sin(x) - cos(y)
890 @category{Function definition}
894 @c SEE NOTE BELOW ABOUT THE DOCUMENTATION STRING
895 @c @deffn {関数} define_variable (@var{name}, @var{default_value}, @var{mode}, @var{documentation})
897 @c -----------------------------------------------------------------------------
898 @anchor{define_variable}
899 @deffn {関数} define_variable (@var{name}, @var{default_value}, @var{mode})
901 グローバル変数をMaxima環境に導入します。
902 @c IMPORT OF FOLLOWING STATEMENT UNCLEAR: IN WHAT WAY IS define_variable
903 @c MORE USEFUL IN TRANSLATED CODE ??
904 @code{define_variable}は、ユーザーが書いたパッケージで役に立ちます。
905 パッケージはしばしば翻訳されたりコンパイルされたりします。
907 @code{define_variable}は以下のステップを実行します:
911 @code{mode_declare (@var{name}, @var{mode})}は、
912 @var{name}のモードを翻訳器に宣言します。
913 可能なモードのリストについては、@code{mode_declare}を参照してください。
916 もし変数がバインドされていなければ、@var{default_value}が@var{name}に割り当てられます。
919 @code{declare (@var{name}, special)}はそれをspecialと宣言します。
920 @c CLARIFY THE MEANING OF SPECIAL FOR THE BENEFIT OF READERS OTHER THAN LISP PROGRAMMERS
923 @var{name}が宣言されたモードのただ1つの割り当てられた値であることを
925 @var{name}をテスト関数に関連づけます。
930 @c FOLLOWING STATEMENT APPEARS TO BE OUT OF DATE.
931 @c EXAMINING DEFMSPEC $DEFINE_VARIABLE AND DEF%TR $DEFINE_VARIABLE IN src/trmode.lisp,
932 @c IT APPEARS THAT THE 4TH ARGUMENT IS NEVER REFERRED TO.
933 @c EXECUTING translate_file ON A MAXIMA BATCH FILE WHICH CONTAINS
934 @c define_variable (foo, 2222, integer, "THIS IS FOO");
935 @c DOES NOT PUT "THIS IS FOO" INTO THE LISP FILE NOR THE UNLISP FILE.
936 @c The optional 4th argument is a documentation string. When
937 @c @code{translate_file} is used on a package which includes documentation
938 @c strings, a second file is output in addition to the Lisp file which
939 @c will contain the documentation strings, formatted suitably for use in
940 @c manuals, usage files, or (for instance) @code{describe}.
942 @code{value_check}プロパティは、
943 @code{define_variable}を介して
944 @code{any}以外のモードに定義された任意の変数に割り当てられることができます。
945 @code{value_check}プロパティは、1変数のラムダ式または関数名です。
946 それは値を変数に割り当てようとする時にコールされます。
947 @code{value_check}関数の引数は期待値です。
949 @code{define_variable}は@code{default_value}を評価し、
950 @code{name}と@code{mode}をクォートします。
951 @code{define_variable}は@code{name}の現在値を返します。
952 それは、もし@code{name}がそこでバインドされてないなら@code{default_value}で
953 そうでないなら@code{name}の以前の値です。
957 @code{foo}はブーリアン変数で、初期値@code{true}を持ちます。
960 @c define_variable (foo, true, boolean);
967 (%i1) define_variable (foo, true, boolean);
974 Error: foo was declared mode boolean, has value: %pi
975 -- an error. Quitting. To debug this try debugmode(true);
980 @code{bar}は整数変数で、素数でなければいけません。
983 @c define_variable (bar, 2, integer);
984 @c qput (bar, prime_test, value_check);
985 @c prime_test (y) := if not primep(y) then
986 @c error (y, "is not prime.");
992 (%i1) define_variable (bar, 2, integer);
994 (%i2) qput (bar, prime_test, value_check);
996 (%i3) prime_test (y) := if not primep(y) then
997 error (y, "is not prime.");
998 (%o3) prime_test(y) := if not primep(y)
1000 then error(y, "is not prime.")
1005 #0: prime_test(y=1440)
1006 -- an error. Quitting. To debug this try debugmode(true);
1011 @code{baz_quux}は、値を割り当てられない変数です。
1012 モード@code{any_check}は@code{any}のようですが、
1013 @code{any_check}は@code{value_check}メカニズムを可能にしますが、
1017 @c define_variable (baz_quux, 'baz_quux, any_check);
1018 @c F: lambda ([y], if y # 'baz_quux then
1019 @c error ("Cannot assign to `baz_quux'."));
1020 @c qput (baz_quux, ''F, value_check);
1021 @c baz_quux: 'baz_quux;
1022 @c baz_quux: sqrt(2);
1026 (%i1) define_variable (baz_quux, 'baz_quux, any_check);
1028 (%i2) F: lambda ([y], if y # 'baz_quux then
1029 error ("Cannot assign to `baz_quux'."));
1030 (%o2) lambda([y], if y # 'baz_quux
1032 then error(Cannot assign to `baz_quux'.))
1033 (%i3) qput (baz_quux, ''F, value_check);
1034 (%o3) lambda([y], if y # 'baz_quux
1036 then error(Cannot assign to `baz_quux'.))
1037 (%i4) baz_quux: 'baz_quux;
1039 (%i5) baz_quux: sqrt(2);
1040 Cannot assign to `baz_quux'.
1041 #0: lambda([y],if y # 'baz_quux then
1042 error("Cannot assign to `baz_quux'."))(y=sqrt(2))
1043 -- an error. Quitting. To debug this try debugmode(true);
1049 @category{Translation and compilation}
1053 @c -----------------------------------------------------------------------------
1055 @deffn {関数} dispfun (@var{f_1}, @dots{}, @var{f_n})
1056 @deffnx {関数} dispfun (all)
1058 ユーザー定義関数@var{f_1}, ..., @var{f_n}の定義を表示します。
1059 引数それぞれは、(@code{::=}で定義された)マクロ名、
1060 (@code{:=}や@code{define}で定義された)通常の関数、
1061 (@code{:=}y@code{define}で定義された、しかし引数をカギ括弧@code{[ ]}でくくった)
1063 (@code{:=}y@code{define}で定義された、しかしいくつかの引数をカギ括弧@code{[ ]}で、他の引数を括弧@code{( )}でくくった)添字付き関数、
1064 特別な添字の値で選択された添字付き関数の族の1つ、
1068 @code{dispfun (all)}は、
1069 @code{functions}, @code{arrays}, @code{macros}リストで与えられた中で、
1070 定数添字で定義された添字付き関数を除いたユーザー定義関数すべてを表示します。
1074 (@code{%t1}, @code{%t2}, など)
1075 中間式ラベルを生成し、関数定義をラベルに割り当てます。
1076 対照的に、@code{fundef}は関数定義を返します。
1078 @code{dispfun}は引数をクォートします;
1079 クォートクォート演算子@code{'@w{}'}はクォートに優先します。
1080 @code{dispfun}は表示された関数に対応する中間式ラベルのリストを返します。
1085 @c m(x, y) ::= x^(-y);
1086 @c f(x, y) := x^(-y);
1087 @c g[x, y] := x^(-y);
1088 @c h[x](y) := x^(-y);
1089 @c i[8](y) := 8^(-y);
1090 @c dispfun (m, f, g, h, h[5], h[10], i[8]);
1094 (%i1) m(x, y) ::= x^(-y);
1097 (%i2) f(x, y) := x^(-y);
1100 (%i3) g[x, y] := x^(-y);
1104 (%i4) h[x](y) := x^(-y);
1108 (%i5) i[8](y) := 8^(-y);
1112 (%i6) dispfun (m, f, g, h, h[5], h[10], i[8]);
1142 (%o12) [%t6, %t7, %t8, %t9, %t10, %t11, %t12]
1145 (%o12) [m(x, y) ::= x , f(x, y) := x , g := x ,
1148 h (y) := x , h (y) := --, h (y) := ---, i (y) := 8 ]
1154 @category{Function definition} @category{Display functions}
1158 @c -----------------------------------------------------------------------------
1160 @deffn {関数} fullmap (@var{f}, @var{expr_1}, @dots{})
1162 @code{map}と似ていますが、@code{fullmap}は、主演算子が同じでなくなるまで、
1163 部分式すべてに再帰的にマッピングを続けます。
1165 @code{fullmap}は、ある行列操作のための整理に使われています;
1166 このように、Maximaは時々、たとえ@code{fullmap}がユーザーに陽にコールされなくても、
1167 @code{fullmap}に関係したエラーメッセージを生成します。
1179 (%i2) fullmap (g, %);
1180 (%o2) g(b) g(c) + g(a)
1181 (%i3) map (g, %th(2));
1186 @category{Function application} @category{Expressions}
1190 @c -----------------------------------------------------------------------------
1192 @deffn {関数} fullmapl (@var{f}, @var{list_1}, @dots{})
1194 @code{fullmap}に似ていますが、@code{fullmapl}はリストや行列にのみマップします。
1199 @c fullmapl ("+", [3, [4, 5]], [[a, 1], [0, -1.5]]);
1202 (%i1) fullmapl ("+", [3, [4, 5]], [[a, 1], [0, -1.5]]);
1203 (%o1) [[a + 3, 4], [4, 3.5]]
1207 @category{Function application} @category{Expressions}
1211 @c -----------------------------------------------------------------------------
1213 @defvr {システム変数} functions
1216 @code{functions}は、現在のセッションでの通常のMaxima関数のリストです。
1217 通常の関数は、@code{define}や@code{:=}で構成された関数であり、
1218 括弧@code{()}でコールされます。
1219 関数はMaximaプロンプトで定義することができ、また、
1220 @code{load}や@code{batch}がロードするMaximaファイルの中で定義することができます。
1222 (例えば@code{F[x]}のように、カギ括弧でコールされる)配列関数と
1223 (例えば@code{F[x](y)}のように、カギ括弧と括弧でコールされる)添字付き関数は、
1224 @code{functions}ではなくグローバル変数@code{arrays}にリストされます。
1226 Lisp関数はどのリストにも保持されません。
1231 @c F_1 (x) := x - 100;
1232 @c F_2 (x, y) := x / y;
1233 @c define (F_3 (x), sqrt (x));
1234 @c G_1 [x] := x - 100;
1235 @c G_2 [x, y] := x / y;
1236 @c define (G_3 [x], sqrt (x));
1237 @c H_1 [x] (y) := x^y;
1242 (%i1) F_1 (x) := x - 100;
1243 (%o1) F_1(x) := x - 100
1244 (%i2) F_2 (x, y) := x / y;
1246 (%o2) F_2(x, y) := -
1248 (%i3) define (F_3 (x), sqrt (x));
1249 (%o3) F_3(x) := sqrt(x)
1250 (%i4) G_1 [x] := x - 100;
1251 (%o4) G_1 := x - 100
1253 (%i5) G_2 [x, y] := x / y;
1257 (%i6) define (G_3 [x], sqrt (x));
1258 (%o6) G_3 := sqrt(x)
1260 (%i7) H_1 [x] (y) := x^y;
1265 (%o8) [F_1(x), F_2(x, y), F_3(x)]
1267 (%o9) [G_1, G_2, G_3, H_1]
1271 @category{Function definition} @category{Global variables}
1275 @c -----------------------------------------------------------------------------
1277 @deffn {関数} fundef (@var{f})
1281 @c PROBABLY THIS WOULD BE CLEARER AS A BULLET LIST
1282 引数は、(@code{::=}で定義された)マクロの名前か、
1283 (@code{:=}もしくは@code{define}で定義された)通常の関数か、
1284 (@code{:=}や@code{define}で定義され、引数がカギ括弧でくくられた)配列関数か、
1285 (@code{:=}や@code{define}で定義され、いくつかの引数がカギ括弧でくくられ、残りがかっこでくくられた)添字関数か、
1286 特別な添字の値によって選択された添字関数族の1つか、一定の添字で定義された添字関数です。
1288 @code{fundef}は引数をクォートします;
1289 クォートクォート演算子@code{'@w{}'}はクォートに優先します。
1291 @code{fundef (@var{f})}は@var{f}の定義を返します。
1292 対照的に、@code{dispfun (@var{f})}は中間式ラベルを生成し、ラベルに定義を割り当てます。
1294 @c PROBABLY NEED SOME EXAMPLES HERE
1296 @category{Function definition}
1300 @c -----------------------------------------------------------------------------
1302 @deffn {関数} funmake (@var{F}, [@var{arg_1}, @dots{}, @var{arg_n}])
1304 式@code{@var{F}(@var{arg_1}, ..., @var{arg_n})}を返します。
1305 戻り値は整理されますが、評価されません。
1306 だから関数@var{F}はたとえ存在してもコールされません。
1308 @code{funmake}は配列関数と通常の関数を区別しようとしません;
1310 @code{funmake}は@code{@var{F}(...)}を返します
1311 (すなわち、カギ括弧の代わりに括弧での関数コール)。
1312 @code{arraymake}は、この場合,カギ括弧での関数コールを返します。
1314 @code{funmake}は引数を評価します。
1318 通常のMaxima関数に適用された@code{funmake}。
1321 @c F (x, y) := y^2 - x^2;
1322 @c funmake (F, [a + 1, b + 1]);
1326 (%i1) F (x, y) := y^2 - x^2;
1328 (%o1) F(x, y) := y - x
1329 (%i2) funmake (F, [a + 1, b + 1]);
1330 (%o2) F(a + 1, b + 1)
1333 (%o3) (b + 1) - (a + 1)
1336 マクロに適用された@code{funmake}。
1339 @c G (x) ::= (x - 1)/2;
1340 @c funmake (G, [u]);
1344 (%i1) G (x) ::= (x - 1)/2;
1346 (%o1) G(x) ::= -----
1348 (%i2) funmake (G, [u]);
1356 添字付き関数に適用された@code{funmake}。
1359 @c H [a] (x) := (x - 1)^a;
1360 @c funmake (H [n], [%e]);
1362 @c funmake ('(H [n]), [%e]);
1366 (%i1) H [a] (x) := (x - 1)^a;
1368 (%o1) H (x) := (x - 1)
1370 (%i2) funmake (H [n], [%e]);
1372 (%o2) lambda([x], (x - 1) )(%e)
1376 (%i4) funmake ('(H [n]), [%e]);
1384 いかなる種類の関数にも定義されていないシンボルへ適用された
1388 @c funmake (A, [u]);
1392 (%i1) funmake (A, [u]);
1398 @code{funmake}は引数を評価しますが、戻り値を評価しません。
1401 @c det(a,b,c) := b^2 -4*a*c;
1402 @c (x : 8, y : 10, z : 12);
1404 @c funmake (f, [x, y, z]);
1408 (%i1) det(a,b,c) := b^2 -4*a*c;
1410 (%o1) det(a, b, c) := b - 4 a c
1411 (%i2) (x : 8, y : 10, z : 12);
1415 (%i4) funmake (f, [x, y, z]);
1416 (%o4) det(8, 10, 12)
1421 Maximaは@code{funmake}の戻り値を整理します。
1424 @c funmake (sin, [%pi / 2]);
1427 (%i1) funmake (sin, [%pi / 2]);
1432 @category{Function application} @category{Expressions}
1436 @c -----------------------------------------------------------------------------
1438 @deffn {関数} lambda ([@var{x_1}, ..., @var{x_m}], @var{expr_1}, ..., @var{expr_n})
1439 @deffnx {関数} lambda ([[@var{L}]], @var{expr_1}, ..., @var{expr_n})
1440 @deffnx {関数} lambda ([@var{x_1}, ..., @var{x_m}, [@var{L}]], @var{expr_1}, ..., @var{expr_n})
1441 ラムダ式 (すなわち、匿名関数)を定義し返します。
1442 関数は要求された引数@var{x_1}, ..., @var{x_m}を持ち、
1443 また、オプション引数@var{L}を持つかもしれません。オプション引数は関数本体の中にリストとして現れます。
1444 関数の戻り値は@var{expr_n}です。
1445 ラムダ式は変数に割り当てることができ、通常の関数のように評価できます。
1446 ラムダ式は関数名が期待されるいくつかのコンテキストで現れるかもしれません。
1449 バインドされていないローカル変数@var{x_1}, ..., @var{x_m}が生成されます。
1451 @code{block}の中や別の@code{lambda}の中で現れるかもしれません;
1452 ローカル変数は、別の@code{block}や@code{lambda}が評価される度に毎回確立されます。
1453 ローカル変数は内包する@code{block}や@code{lambda}にはグローバルのように見えます。
1455 その値は、(もし割り当てられたなら)内包する@code{block}や@code{lambda}で直近に割り当てられた値です。
1456 そうでなければ、グローバル環境での変数の値です。
1457 このポリシーは「動的スコープ」の普通の理解と一致するかもしれません。
1460 @var{expr_1}から@var{expr_n}までが順に評価されます。
1461 特殊変数@code{%%}―直前の式の値を表します―が認識されます。
1462 @code{throw}と@code{catch}も式のリストの中に現れるかもしれません。
1464 @code{block}で囲まれない限り
1465 @code{return}はラムダ式の中には現れません。
1466 @code{block}で囲まれた場合、
1467 ブロックがたまたま @var{expr_n}に至るということでない限り、
1468 @code{return}はラムダ式の戻り値ではなくブロックの戻り値を定義します。
1469 同様に、@code{go}は、@code{block}で囲まれない限りラムダ式の中に現れません。
1471 @code{lambda}は引数をクォートします;
1472 クォートクォート演算子@code{'@w{}'}はクォートに優先します。
1478 ラムダ式は変数に割り当てることができ、通常の関数のように評価できます。
1482 @c f: lambda ([x], x^2);
1486 (%i1) f: lambda ([x], x^2);
1488 (%o1) lambda([x], x )
1496 関数評価が期待される文脈で現れるかもしれません。
1500 @c lambda ([x], x^2) (a);
1501 @c apply (lambda ([x], x^2), [a]);
1502 @c map (lambda ([x], x^2), [a, b, c, d, e]);
1505 (%i3) lambda ([x], x^2) (a);
1508 (%i4) apply (lambda ([x], x^2), [a]);
1511 (%i5) map (lambda ([x], x^2), [a, b, c, d, e]);
1513 (%o5) [a , b , c , d , e ]
1518 他の変数はグローバル変数のように見えます。
1519 ある特殊な評価が@code{'@w{}'}のようにある方法で強制されない限り、
1520 グローバル変数はラムダ式が評価される時評価されます。
1526 @c g: lambda ([a], a*b);
1529 @c g2: lambda ([a], a*''b);
1536 (%i8) g: lambda ([a], a*b);
1537 (%o8) lambda([a], a b)
1543 (%i11) g2: lambda ([a], a*''b);
1544 (%o11) lambda([a], a %gamma)
1555 同じ名前のローカル変数がマスクしない限り、
1560 @c h: lambda ([a, b], h2: lambda ([a], a*b), h2(1/2));
1564 (%i14) h: lambda ([a, b], h2: lambda ([a], a*b), h2(1/2));
1566 (%o14) lambda([a, b], h2 : lambda([a], a b), h2(-))
1568 (%i15) h(%pi, %gamma);
1575 @code{lambda}は引数をクォートするので、
1577 "@code{a}を掛ける"関数を定義しません。
1578 以下のラムダ式@code{i2}のように、
1579 そんな関数は@code{buildq}を介して定義することができます。
1583 @c i: lambda ([a], lambda ([x], a*x));
1585 @c i2: lambda([a], buildq([a: a], lambda([x], a*x)));
1590 (%i16) i: lambda ([a], lambda ([x], a*x));
1591 (%o16) lambda([a], lambda([x], a x))
1593 (%o17) lambda([x], a x)
1594 (%i18) i2: lambda([a], buildq([a: a], lambda([x], a*x)));
1595 (%o18) lambda([a], buildq([a : a], lambda([x], a x)))
1598 (%o19) lambda([x], -)
1600 (%i20) i2(1/2)(%pi);
1607 ラムダ式は、可変の数の引数を取ることができます。
1608 それは、唯一のまたは最後の引数として@code{[@var{L}]}で指定されます。
1609 引数は関数本体の中にリストとして現れます。
1613 @c f : lambda ([aa, bb, [cc]], aa * cc + bb);
1614 @c f (foo, %i, 17, 29, 256);
1615 @c g : lambda ([[aa]], apply ("+", aa));
1616 @c g (17, 29, x, y, z, %e);
1619 (%i1) f : lambda ([aa, bb, [cc]], aa * cc + bb);
1620 (%o1) lambda([aa, bb, [cc]], aa cc + bb)
1621 (%i2) f (foo, %i, 17, 29, 256);
1622 (%o2) [17 foo + %i, 29 foo + %i, 256 foo + %i]
1623 (%i3) g : lambda ([[aa]], apply ("+", aa));
1624 (%o3) lambda([[aa]], apply(+, aa))
1625 (%i4) g (17, 29, x, y, z, %e);
1626 (%o4) z + y + x + %e + 46
1630 @category{Function definition}
1634 @c NEEDS CLARIFICATION AND EXAMPLES
1636 @c -----------------------------------------------------------------------------
1638 @deffn {関数} local (@var{v_1}, @dots{}, @var{v_n})
1640 シンボル@var{v_1}, ..., @var{v_n}に関連付けられた性質を保存し、
1641 他の式を評価する前にすべての性質を取り除き、
1642 @code{local}が現れたブロックや他の合成式の終了時に保存した性質を元に戻します。
1644 いくつかの宣言は、@code{:=}、@code{array}, @code{dependencies}, @code{atvalue}, @code{matchdeclare},
1645 @code{atomgrad}, @code{constant}, @code{nonscalar}その他を含むシンボルの性質として実装されます。
1646 @code{local}の効果は、ブロック内部のみで有効な宣言を作ります;
1647 そうでなければ、ブロック内部の宣言は実際にグローバル宣言となります。
1649 @code{local}は、@code{block}や関数定義の本体や@code{lambda}式の中に現れます。
1652 @code{local}は引数をクォートします。
1653 @code{local}は@code{done}を返します。
1660 @c foo (x) := 1 - x;
1662 @c block (local (foo), foo (x) := 2 * x, foo (100));
1666 (%i1) foo (x) := 1 - x;
1667 (%o1) foo(x) := 1 - x
1670 (%i3) block (local (foo), foo (x) := 2 * x, foo (100));
1677 @category{Function definition} @category{Programming}
1681 @c -----------------------------------------------------------------------------
1682 @anchor{macroexpansion}
1683 @defvr {オプション変数} macroexpansion
1684 デフォルト値: @code{false}
1686 @code{macroexpansion}は
1690 展開を記憶する代価で、置き換えは次の式評価をスピードアップするかもしれません。
1694 マクロ関数コールをマクロ関数の展開で置き換えられません。
1697 マクロ関数コールが初めて評価された時、展開が記憶されます。
1699 (@code{print}やグローバル変数への割り当てのような)いかなる副作用も
1700 最初にマクロ関数コールが評価された時だけ起こります。
1701 式の中の展開は、同じマクロ関数コールを持つ他の式に影響を与えません。
1703 マクロ関数コールが初めて評価された時、展開でコールを置き換え、
1704 マクロ関数がコールされた式を変更します。
1706 (@code{print}やグローバル変数への割り当てのような)いかなる副作用も
1707 最初にマクロ関数コールが評価された時だけ起こります。
1708 式の中の展開は、同じマクロ関数コールを持つ他の式に影響を与えません。
1713 @code{macroexpansion}が@code{false}の時、
1714 コールする式が評価される時毎回マクロ関数がコールされ、
1718 @c f (x) := h (x) / g (x);
1719 @c g (x) ::= block (print ("x + 99 is equal to", x),
1720 @c return (x + 99));
1721 @c h (x) ::= block (print ("x - 99 is equal to", x),
1722 @c return (x - 99));
1723 @c macroexpansion: false;
1729 (%i1) f (x) := h (x) / g (x);
1733 (%i2) g (x) ::= block (print ("x + 99 is equal to", x),
1735 (%o2) g(x) ::= block(print("x + 99 is equal to", x),
1737 (%i3) h (x) ::= block (print ("x - 99 is equal to", x),
1739 (%o3) h(x) ::= block(print("x - 99 is equal to", x),
1741 (%i4) macroexpansion: false;
1744 x - 99 is equal to x
1745 x + 99 is equal to x
1756 x - 99 is equal to x
1757 x + 99 is equal to x
1763 @code{macroexpansion}が@code{expand}の時、
1768 @c f (x) := h (x) / g (x);
1769 @c g (x) ::= block (print ("x + 99 is equal to", x),
1770 @c return (x + 99));
1771 @c h (x) ::= block (print ("x - 99 is equal to", x),
1772 @c return (x - 99));
1773 @c macroexpansion: expand;
1779 (%i1) f (x) := h (x) / g (x);
1783 (%i2) g (x) ::= block (print ("x + 99 is equal to", x),
1785 (%o2) g(x) ::= block(print("x + 99 is equal to", x),
1787 (%i3) h (x) ::= block (print ("x - 99 is equal to", x),
1789 (%o3) h(x) ::= block(print("x - 99 is equal to", x),
1791 (%i4) macroexpansion: expand;
1794 x - 99 is equal to x
1795 x + 99 is equal to x
1811 @code{macroexpansion}が@code{expand}の時、
1816 @c f (x) := h (x) / g (x);
1817 @c g (x) ::= block (print ("x + 99 is equal to", x),
1818 @c return (x + 99));
1819 @c h (x) ::= block (print ("x - 99 is equal to", x),
1820 @c return (x - 99));
1821 @c macroexpansion: displace;
1827 (%i1) f (x) := h (x) / g (x);
1831 (%i2) g (x) ::= block (print ("x + 99 is equal to", x),
1833 (%o2) g(x) ::= block(print("x + 99 is equal to", x),
1835 (%i3) h (x) ::= block (print ("x - 99 is equal to", x),
1837 (%o3) h(x) ::= block(print("x - 99 is equal to", x),
1839 (%i4) macroexpansion: displace;
1842 x - 99 is equal to x
1843 x + 99 is equal to x
1849 (%t6) f(x) := ------
1860 @category{Function application} @category{Global flags}
1865 @c -----------------------------------------------------------------------------
1866 @anchor{mode_checkp}
1867 @defvr {オプション変数} mode_checkp
1870 @c WHAT DOES THIS MEAN ??
1871 @code{mode_checkp}が@code{true}の時、
1872 @code{mode_declare}はバインドされた変数のモードをチェックします。
1873 @c NEED SOME EXAMPLES HERE.
1876 @category{Translation flags and variables}
1880 @c -----------------------------------------------------------------------------
1881 @anchor{mode_check_errorp}
1882 @defvr {オプション変数} mode_check_errorp
1883 デフォルト値: @code{false}
1885 @c WHAT DOES THIS MEAN ??
1886 @code{mode_check_errorp}が@code{true}の時、
1887 @code{mode_declare}はエラーをコールします。
1888 @c NEED SOME EXAMPLES HERE.
1891 @category{Translation flags and variables}
1896 @c -----------------------------------------------------------------------------
1897 @anchor{mode_check_warnp}
1898 @defvr {オプション変数} mode_check_warnp
1901 @c WHAT DOES THIS MEAN ??
1902 @code{mode_check_warnp}が@code{true}の時、
1904 @c NEED SOME EXAMPLES HERE.
1907 @category{Translation flags and variables}
1911 @c NEEDS CLARIFICATION AND EXAMPLES
1913 @c -----------------------------------------------------------------------------
1914 @anchor{mode_declare}
1915 @deffn {関数} mode_declare (@var{y_1}, @var{mode_1}, @dots{}, @var{y_n}, @var{mode_n})
1917 @code{mode_declare}は、
1919 変数と関数のモードを宣言するのに使われます。
1920 @code{mode_declare}は、通常、
1921 関数定義の始めやMaximaスクリプトの始めに置かれたり、対話プロンプトで実行されたりします。
1923 @code{mode_declare}の引数は、
1926 @code{boolean}, @code{fixnum}, @code{number}, @code{rational}, @code{float}のいずれか1つです。
1928 同じモードを持つように宣言される変数すべてのリストも取り得ます。
1930 @c WHAT DOES THE FOLLOWING STATEMENT MEAN ???
1931 もし変数が配列で、かつ、参照される配列のすべての要素が値を持つなら、
1934 array(yi, dim1, dim2, ...)
1936 よりむしろ@code{array (yi, complete, dim1, dim2, @dots{})}を
1937 最初に配列のバインドを宣言する時に使うべきです。
1938 @c WHAT DOES THE FOLLOWING STATEMENT MEAN ???
1940 モード@code{fixnum} (@code{float})なら、
1941 @code{complete}の代わりに@code{fixnum} (@code{float})を使ってください。
1942 @c WHAT DOES THE FOLLOWING STATEMENT MEAN ???
1943 もし配列のすべての要素が同じモード―@code{m}としましょう―なら、
1947 mode_declare (completearray (yi), m))
1952 配列を使う数値コードは、例えば、10 x 10の浮動小数点配列のために
1955 mode_declare (completearray (a [10, 10]), float)
1958 というように、期待される配列サイズを宣言することでより速く実行されるかもしれません
1960 引数として@code{function (f_1, f_2, ...)}を使うことで
1961 関数の結果のモードを宣言することができます;
1962 ここで@code{f_1}, @code{f_2}, @dots{}は関数名です。
1966 mode_declare ([function (f_1, f_2, ...)], fixnum)
1970 @code{f_1}, @code{f_2}, ...が返す値が1ワード整数であることを宣言します。
1972 @code{modedeclare}は@code{mode_declare}と同義です。
1975 @category{Translation and compilation}
1979 @c WHAT IS THIS ABOUT ??
1980 @c NEEDS CLARIFICATION AND EXAMPLES
1982 @c -----------------------------------------------------------------------------
1983 @anchor{mode_identity}
1984 @deffn {関数} mode_identity (@var{arg_1}, @var{arg_2})
1986 @code{mode_declare}と@code{macros}で
1987 例えば、flonumsのリストのリストや他の合成データオブジェクトを宣言するのに
1989 @code{mode_identity}の最初の引数は、@code{mode_declare}に与えられるような
1990 プリミティブな値モード名(すなわち、@code{float}, @code{fixnum}, @code{number},
1991 @code{list}, @code{any}のいずれか)であり、
1992 二番目の引数は、評価され、@code{mode_identity}の値として返される式です。
1993 しかしながら、もし戻り値が最初の引数で宣言されたモードによって許されていないなら、
1995 重要なことは、MaximaによってLisp翻訳器に命じた式のモードが、二番目の引数のなかで続く一切から独立して、最初の引数として与えられるそれだということです。
1996 例えば、@code{x: 3.3; mode_identity (fixnum, x);}はエラーをもたらします。
1997 @code{mode_identity (flonum, x)}は3.3を返します。
1998 これは多くの使い道があります。例えば、もし@code{first (l)}が数を返すと知っていたなら、
1999 @code{mode_identity (number, first (l))}と書くかもしれません。
2000 しかしながら、それをするもっと効率的な方法は、
2003 firstnumb (x) ::= buildq ([x], mode_identity (number, first(x)));
2007 そして数のリストの最初の要素を取る時毎回@code{firstnumb}を使うことです。
2010 @category{Translation and compilation}
2014 @c -----------------------------------------------------------------------------
2015 @anchor{remfunction}
2016 @deffn {関数} remfunction (@var{f_1}, ..., @var{f_n})
2017 @deffnx {関数} remfunction (all)
2019 シンボル@var{f_1}, ..., @var{f_n}の関数定義をアンバインドします。
2020 引数は、(@code{:=}もしくは@code{define}で生成された)通常の関数名もしくは(@code{::=}で生成された)マクロ関数をとります。
2022 @code{remfunction (all)}は関数定義すべてをアンバインドします。
2024 @code{remfunction}は引数をクォートします。
2026 @code{remfunction}は、関数定義はアンバインドされたシンボルのリストを返します。
2027 シンボルに関数定義がなければ、シンボルの代わりに@code{false}を返します。
2029 @code{remfunction}は配列関数すなわち添字付き関数には適用されません。
2030 これらのタイプの関数には@code{remarray}を適用します。
2033 @category{Function definition}
2037 @c NEEDS MORE WORK !!!
2038 @defvr {オプション変数} savedef
2041 @code{savedef}が@code{true}の時、
2043 ユーザー関数のMaximaバージョンが保持されます。
2044 これは、定義が@code{dispfun}によって表示されることを許し、
2047 @code{savedef}が@code{false}の時、
2048 解釈された関数の名前は、@code{functions}リストから取り除かれます。
2051 @category{Translation flags and variables}
2056 @c IS THERE ANY REASON TO SET transcompile: false ??
2057 @c MAYBE THIS VARIABLE COULD BE PERMANENTLY SET TO true AND STRUCK FROM THE DOCUMENTATION.
2059 @c -----------------------------------------------------------------------------
2060 @anchor{transcompile}
2061 @defvr {オプション変数} transcompile
2064 @code{transcompile}が@code{true}の時、
2065 @code{translate}と@code{translate_file}は
2066 翻訳コードをコンパイルにより適したものにする宣言を生成します。
2067 @c BUT THE DECLARATIONS DON'T SEEM TO BE NECESSARY, SO WHAT'S THE POINT AGAIN ??
2069 @code{compfile}は実行中@code{transcompile: true}を設定します。
2072 @category{Translation flags and variables}
2076 @c -----------------------------------------------------------------------------
2078 @deffn {関数} translate (@var{f_1}, @dots{}, @var{f_n})
2079 @deffnx {関数} translate (functions)
2080 @deffnx {関数} translate (all)
2082 ユーザー定義関数@var{f_1}, @dots{}, @var{f_n}をMaxima言語からLispに翻訳し、
2084 通常、翻訳された関数は元の関数より速く実行されます。
2086 @code{translate (all)}や@code{translate (functions)}は、
2090 より効率的なコードを生成するために可能な時は
2091 先頭に@code{mode_declare}コールを含むべきです。
2095 f (x_1, x_2, ...) := block ([v_1, v_2, ...],
2096 mode_declare (v_1, mode_1, v_2, mode_2, ...), ...)
2101 ここで、@var{x_1}, @var{x_2}, ... は関数のパラメータであり、
2102 @var{v_1}, @var{v_2}, ...はローカル変数です。
2104 もし@code{savedef}が@code{false}なら(以下を参照してください)
2105 翻訳された関数の名前は、@code{functions}リストから削除され、
2106 @code{props}リストに加えられます。
2108 完全にデバッグされない限り、関数は翻訳すべきではありません。
2111 もしされていないなら、厳密ですが、最適でないコードが生成されます。
2114 @code{simp}スイッチを@code{false}―翻訳される式の整理を抑制します―
2117 スイッチ@code{translate}は、もし@code{true}なら、
2118 ユーザー関数のLispへの自動翻訳をもたらします。
2120 LispとMaximaのバージョンの間である非互換性が存在する可能性があるので、
2122 翻訳前にした方法を同一に動作するわけではないことに注意してください。
2124 もし変数のいずれかが@code{mode_declare}された標準有理式(CRE)なら
2125 複数の引数を取る@code{rat}関数と@code{ratvars}関数は使うべきではありません。
2127 @code{prederror: false}設定は翻訳されません。
2128 @c WHAT ABOUT % AND %% ???
2130 @code{savedef} - もし@code{true}なら、
2131 関数が@code{translate}された時、Maximaバージョンのユーザー関数を残すようにします。
2132 これは、定義を@code{dispfun}で表示することを可能にし、
2135 @code{transrun} - もし@code{false}なら、
2136 すべての関数について、翻訳バージョンではなく、
2137 インタープリトされるバージョン(まだあると仮定して)が実行されるようにします。
2139 @code{translate}が返す結果は、翻訳された関数名のリストです。
2142 @category{Translation and compilation}
2146 @c -----------------------------------------------------------------------------
2147 @anchor{translate_file}
2148 @deffn {関数} translate_file (@var{maxima_filename})
2149 @deffnx {関数} translate_file (@var{maxima_filename}, @var{lisp_filename})
2151 MaximaコードのファイルをLispコードのファイルに翻訳します。
2152 @code{translate_file}は3つのファイル名のリストを返します:
2153 Maximaファイル名、Lispファイル名、翻訳についての追加情報を含むファイル名。
2154 @code{translate_file}は引数を評価します。
2156 @code{translate_file ("foo.mac"); load("foo.LISP")}は、
2157 例えば、@code{'@w{}'}と@code{%}の利用といった若干の制約を除いて、
2158 コマンド@code{batch ("foo.mac")}と同じです。
2159 @c FIGURE OUT WHAT THE RESTRICTIONS ARE AND STATE THEM
2161 @code{translate_file (@var{maxima_filename})}は
2162 Maximaファイル@var{maxima_filename}を
2163 同様に名付けらたLispファイルに翻訳します。
2164 例えば、@code{foo.mac}は@code{foo.LISP}に翻訳されます。
2165 Maximaのファイル名はディレクトリ名を含むかもしれません。
2166 その場合、Lisp出力ファイルは、Maxima入力が来たのと同じディレクトリに書かれます。
2168 @code{translate_file (@var{maxima_filename}, @var{lisp_filename})}は、
2169 Maximaファイル@var{maxima_filename}をLispファイル@var{lisp_filename}に翻訳します。
2170 @code{translate_file}は、どんなものでも、@code{lisp_filename}の
2172 Lisp出力ファイルのファイル名の拡張子は、いつも@code{LISP}です。
2173 Lispファイル名はディレクトリ名を含むかもしれません。
2174 その場合、Lisp出力ファイルは指定されたディレクトリに書かれます。
2176 @code{translate_file}は、翻訳器のファイル
2177 様々な度合いの厳しさの翻訳器警告メッセージのファイルも書き出します。
2178 このファイルのファイル名拡張子は @code{UNLISP}です。
2179 このファイルは、翻訳されたコードの中のバグを追跡するために、
2180 あいまいかもしれませんが、価値ある情報を含むかもしれません。
2181 @code{UNLISP}ファイルはいつもMaxima入力が来るのと同じディレクトリに書かれます。
2183 @code{translate_file}は
2184 Lispコードがコンパイルされるすぐに宣言や定義が効力を発揮するようにするLispコードを発行します。
2185 このトピックに関してさらに知るには@code{compile_file}を参照してください。
2187 @c CHECK ALL THESE AND SEE WHICH ONES ARE OBSOLETE
2189 @code{tr_array_as_ref},
2190 @c tr_bind_mode_hook EXISTS BUT IT APPEARS TO BE A GROTESQUE UNDOCUMENTED HACK
2191 @c WE DON'T WANT TO MENTION IT
2192 @c @code{tr_bind_mode_hook},
2193 @code{tr_bound_function_applyp},
2194 @c tr_exponent EXISTS AND WORKS AS ADVERTISED IN src/troper.lisp
2195 @c NOT OTHERWISE DOCUMENTED; ITS EFFECT SEEMS TOO WEAK TO MENTION
2197 @code{tr_file_tty_messagesp},
2198 @code{tr_float_can_branch_complex},
2199 @code{tr_function_call_default},
2201 @code{tr_optimize_max_loop},
2202 @code{tr_semicompile},
2203 @code{tr_state_vars},
2204 @code{tr_warnings_get},
2205 @code{tr_warn_bad_function_calls},
2206 @code{tr_warn_fexpr},
2207 @code{tr_warn_meval},
2208 @code{tr_warn_mode},
2209 @code{tr_warn_undeclared},
2210 @code{tr_warn_undefined_variable}
2215 @category{Translation and compilation}
2219 @c -----------------------------------------------------------------------------
2221 @defvr {オプション変数} transrun
2224 @code{transrun}が@code{false}の時、
2225 すべての関数について、翻訳バージョンではなく、
2226 インタープリトされるバージョン(まだあると仮定して)が実行されるようにします。
2229 @category{Translation flags and variables}
2233 @c IN WHAT CONTEXT IS tr_array_as_ref: false APPROPRIATE ??? NOT SEEING THE USEFULNESS HERE.
2234 @c ALSO, I GUESS WE SHOULD HAVE AN ITEM FOR translate_fast_arrays, ANOTHER CONFUSING FLAG ...
2236 @c -----------------------------------------------------------------------------
2237 @anchor{tr_array_as_ref}
2238 @defvr {オプション変数} tr_array_as_ref
2241 もし@code{translate_fast_arrays}が@code{false}なら、
2242 @code{translate_file}が発行するLispコードの中の配列参照は、
2243 @code{tr_array_as_ref}によって影響されます。
2244 @code{tr_array_as_ref}が@code{true}の時、
2246 そうでなければ、配列名は翻訳されたコードの中で文字リテラルとして現れます。
2248 もし@code{translate_fast_arrays}が@code{true}なら、
2249 @code{tr_array_as_ref}は効果を持ちません。
2252 @category{Translation flags and variables}
2256 @c WHY IS THIS FLAG NEEDED ??? UNDER WHAT CIRCUMSTANCES CAN TRANSLATION
2257 @c OF A BOUND VARIABLE USED AS A FUNCTION GO WRONG ???
2259 @c -----------------------------------------------------------------------------
2260 @anchor{tr_bound_function_applyp}
2261 @defvr {オプション変数} tr_bound_function_applyp
2264 @code{tr_bound_function_applyp}が@code{true}の時、
2265 もし(関数引数のような)バインドされた変数が関数として使われていることが見つかったら
2267 @c WHAT DOES THIS MEAN ??
2268 @code{tr_bound_function_applyp}は、
2269 そんな場合に生成されたコードに影響しません。
2272 @code{g (f, x) := f (x+1)}のような式は警告メッセージをトリガーします。
2275 @category{Translation flags and variables}
2279 @c -----------------------------------------------------------------------------
2280 @anchor{tr_file_tty_message}
2281 @defvr {オプション変数} tr_file_tty_messagesp
2282 デフォルト値: @code{false}
2284 @code{tr_file_tty_messagesp}が@code{true}の時、
2286 @code{translate_file}が生成するメッセージがコンソールに表示され、
2287 @code{false}の時、ファイルの翻訳に関するメッセージは
2288 UNLISPファイルに挿入されるだけです。
2291 @category{Translation flags and variables}
2295 @c THIS FLAG APPEARS TO HAVE NO EFFECT. SHOULD CUT OUT THIS ITEM AND RELATED CODE.
2296 @c NOTE THAT THERE IS CODE IN src/transf.lisp WHICH USES THIS FLAG BUT THE MODE
2297 @c FLAG IS LOST SOMEWHERE ALONG THE WAY TO THE LISP OUTPUT FILE.
2299 @c -----------------------------------------------------------------------------
2300 @anchor{tr_float_can_branch_complex}
2301 @defvr {オプション変数} tr_float_can_branch_complex
2305 translator to assume that
2306 関数@code{acos}, @code{asin}, @code{asec}, @code{acsc}が複素数の結果を返すことができることを仮定するように命じます。
2308 @code{tr_float_can_branch_complex}の表面上の効果は以下の通りです。
2309 しかしながら、このフラグは翻訳器出力上の効果を持ちません。
2312 たとえ (@code{mode_declare}が設定したように)@code{x}がモード@code{float}でも
2313 @code{acos(x)}はモード@code{any}です。
2315 @code{x}がモード@code{float}の時だけ
2316 @code{acos(x)}はモード@code{float}です。
2319 @category{Translation flags and variables}
2323 @c -----------------------------------------------------------------------------
2324 @anchor{tr_function_call_default}
2325 @defvr {オプション変数} tr_function_call_default
2326 デフォルト値: @code{general}
2328 @code{false}は、あきらめて@code{meval}をコールすることを意味し、
2329 @code{expr}は、引数が固定されたLisp関数を仮定することを意味します。
2330 @code{general}、デフォルトは
2331 @code{mexprs}や@code{mlexprs}にはよいが@code{macros}にはよくないコードを与えます。
2332 @code{general}は、コンパイルされたコードの中で変数バインドが正確であることを保証します。
2333 @code{general}モードでは、
2334 F(X)を翻訳する時、もしFがバインドされた変数なら、
2335 @code{apply (f, [x])}を意味すると仮定され、適切な警告と合わせてそのように翻訳されます。
2337 デフォルト設定で警告メッセージがないことは、
2338 Maximaインタープリタと、翻訳、コンパイルされたコードの完全互換性を意味します。
2341 @category{Translation flags and variables}
2345 @c -----------------------------------------------------------------------------
2347 @defvr {オプション変数} tr_numer
2348 デフォルト値: @code{false}
2350 @code{tr_numer}が@code{true}の時、
2352 それらを持つアトム、例えば、@code{%pi}に使われます。
2355 @category{Translation flags and variables}
2359 @c -----------------------------------------------------------------------------
2360 @anchor{tr_optimize_max_loop}
2361 @defvr {オプション変数} tr_optimize_max_loop
2364 @code{tr_optimize_max_loop}は、
2365 翻訳器のマクロ展開と最適化パスが形式を検討する際繰り返す最大回数です。
2366 これはマクロ展開エラーや終了しない最適化プロパティをキャッチします。
2369 @category{Translation flags and variables}
2373 @c -----------------------------------------------------------------------------
2374 @anchor{tr_semicompile}
2375 @defvr {オプション変数} tr_semicompile
2376 デフォルト値: @code{false}
2378 @code{tr_semicompile}が@code{true}の時、
2379 @code{translate_file}と@code{compfile}は、
2380 マクロ展開されたが、Lispコンパイラによって機械語にコンパイルされない形式を出力します。
2383 @category{Translation flags and variables}
2388 @c ARE ANY OF THESE OBSOLETE ??
2390 @c -----------------------------------------------------------------------------
2391 @anchor{tr_state_vars}
2392 @defvr {システム変数} tr_state_vars
2395 [transcompile, tr_semicompile, tr_warn_undeclared, tr_warn_meval,
2396 tr_warn_fexpr, tr_warn_mode, tr_warn_undefined_variable,
2397 tr_function_call_default, tr_array_as_ref,tr_numer]
2400 翻訳された出力の形式に影響するスイッチのリスト。
2401 @c DOES THE GENERAL USER REALLY CARE ABOUT DEBUGGING THE TRANSLATOR ???
2403 この情報はシステムの人たちに役に立ちます。
2404 翻訳された生成物を与えられた状態で生成されるべきだったものと比較することによって、
2408 @category{Translation flags and variables}
2413 @c tr_warnings_get EXISTS AND FUNCTIONS AS ADVERTISED (SORT OF) -- RETURNS *tr-runtime-warned*
2414 @c WHICH HAS ONLY A FEW KINDS OF WARNINGS PUSHED ONTO IT; IT'S CERTAINLY NOT COMPREHENSIVE
2415 @c DO WE REALLY NEED THIS SLIGHTLY WORKING FUNCTION ??
2417 @c -----------------------------------------------------------------------------
2418 @anchor{tr_warnings_get}
2419 @deffn {関数} tr_warnings_get ()
2421 現在の翻訳の間に翻訳器が与える警告のリストを印字します。
2424 @category{Translation and compilation}
2428 @c -----------------------------------------------------------------------------
2429 @defvr {オプション変数} tr_warn_bad_function_calls
2432 - 翻訳時にされた不適切な宣言のせいで正確でないかもしれない関数コールが行われている時、
2436 @category{Translation flags and variables}
2440 @c -----------------------------------------------------------------------------
2441 @anchor{tr_warn_fexpr}
2442 @defvr {オプション変数} tr_warn_fexpr
2443 デフォルト値: @code{compfile}
2445 - もしFEXPRに遭遇したら、警告を与えます。
2446 FEXPRは、通常、翻訳コードの中で出力されるべきではありません。
2447 合法で特殊なプログラム形式はすべて翻訳されます。
2450 @category{Translation flags and variables}
2454 @c -----------------------------------------------------------------------------
2455 @anchor{tr_warn_meval}
2456 @defvr {オプション変数} tr_warn_meval
2457 デフォルト値: @code{compfile}
2459 - もし関数@code{meval}がコールされたら、警告を与えます。
2460 もし@code{meval}がコールされたら、それは翻訳の中の問題を示します。
2463 @category{Translation flags and variables}
2467 @c -----------------------------------------------------------------------------
2468 @anchor{tr_warn_mode}
2469 @defvr {オプション変数} tr_warn_mode
2472 - 変数がそのモードに不適切な値を割り当てられた時、警告を与えます。
2475 @category{Translation flags and variables}
2479 @c -----------------------------------------------------------------------------
2480 @anchor{tr_warn_undeclared}
2481 @defvr {オプション変数} tr_warn_undeclared
2482 デフォルト値: @code{compile}
2484 - 未宣言変数についての警告をいつTTYに送るかを決めます。
2487 @category{Translation flags and variables}
2491 @c -----------------------------------------------------------------------------
2492 @anchor{tr_warn_undefined_variable}
2493 @defvr {オプション変数} tr_warn_undefined_variable
2496 - 未定義のグローバル変数が見られた時、警告を与えます。
2499 @category{Translation flags and variables}
2503 @c -----------------------------------------------------------------------------
2504 @anchor{compile_file}
2505 @deffn {関数} compile_file (@var{filename})
2506 @deffnx {関数} compile_file (@var{filename}, @var{compiled_filename})
2507 @deffnx {関数} compile_file (@var{filename}, @var{compiled_filename}, @var{lisp_filename})
2509 Maximaファイル@var{filename}をLispに翻訳し、Lispコンパイラを実行し、
2510 もし翻訳とコンパイルが成功したら、コンパイルされたコードをMaximaにロードします。
2512 @code{compile_file}は4つのファイル名のリストを返します:
2513 元のMaximaファイル、Lisp翻訳、翻訳時ノート、コンパイルされたコード。
2514 もしコンパイルが失敗したら、4番目の項目は@code{false}です。
2516 Lispコードがコンパイルされると(コンパイルされたコードをロードすることなしに)すぐに
2517 いくつかの宣言と定義は効力を発揮します。
2518 これらは@code{:=}演算子で定義された関数、
2519 @code{::=}演算子で定義されたマクロ、
2520 @c HEDGE -- DON'T KNOW IF THERE IS ANOTHER WAY
2521 @code{alias}, @code{declare},
2522 @code{define_variable}, @code{mode_declare},
2523 @code{infix}, @code{matchfix},
2524 @code{nofix}, @code{postfix}, @code{prefix},
2528 コンパイルされたコードがロードされるまで
2531 (@code{tr_numer}, など)翻訳フラグへの割り当ては翻訳時に効果を持ちません。
2533 @c @code{compile_file} may mistake warnings for errors and
2534 @c return @code{false} as the name of the compiled code when, in fact,
2535 @c the compilation succeeded. This is a bug.
2536 @c REPORTED AS SOURCEFORGE BUG # 1103722.
2538 @var{filename}は@code{:lisp}文を含むことができません。
2540 @code{compile_file}は引数を評価します。
2543 @category{Translation and compilation}
2547 @c NEEDS CLARIFICATION
2549 @c -----------------------------------------------------------------------------
2550 @anchor{declare_translated}
2551 @deffn {関数} declare_translated (@var{f_1}, @var{f_2}, @dots{})
2553 MaximaコードのファイルをLispに翻訳する時、
2554 ファイルの中で見る関数が翻訳された関数としてコールされるか、コンパイルされた関数としてコールされるか、また、どの関数がMaxima関数か未定義なのか、翻訳器が知ることは重要です。
2556 たとえまだLisp関数値を持たないシンボルがコール時にそれを持つだろうが、
2558 @code{fn}がLisp関数になるつもりであることを翻訳器が知らない時、
2559 @code{(MFUNCTION-CALL fn arg1 arg2 ...)}が生成されます。
2562 @category{Translation and compilation}