4 * Introduction to Program Flow::
5 * Functions and Variables for Program Flow::
8 @c -----------------------------------------------------------------------------
9 @node Lisp and Maxima, Garbage Collection, Program Flow, Program Flow
10 @section Lisp and Maxima
11 @c -----------------------------------------------------------------------------
14 Lisp関数や変数をMaximaからアクセスしたり、その逆が簡単にできます。
15 LispとMaximaのシンボルは命名の慣例で区別されます。
16 ドル記号@code{$}で始まるLispシンボルは、ドル記号なしのMaximaシンボルに対応します。
17 @c NEED TO MENTION THIS OR IS IT JUST CLUTTERING ??
18 @c This includes special Maxima variables such as @code{%} and input and output labels,
19 @c which appear as @code{$%}, @code{$%i1}, @code{$%o1}, etc., in Lisp.
20 クエスチョンマーク@code{?}で始まるMaximaシンボルは、クエスチョンマークなしのLispシンボルに対応します。
21 例えば、Maximaシンボル@code{foo}はLispシンボル@code{$FOO}に対応し、
22 Maximaシンボル@code{?foo}はLispシンボル@code{FOO}に対応します。
23 @code{?foo}は、@code{?}と@code{foo}の間にスペースを入れずに書くことに注意してください。でないと、それは@code{describe ("foo")}に間違えられます。
25 Lispシンボルの中に、ハイフン@code{-}やアスタリスク@code{*}、他の特殊文字があれば、
26 Maximaのコードの中では、バックスラッシュ@code{\}でエスケープしないといけません。
27 例えば、Lispの識別子 @code{*foo-bar*}は、Maximaでは、@code{?\*foo\-bar\*}と書きます。
29 Maximaセッションの中で、Lispコードを実行できます。
30 特殊コマンド@code{:lisp}を使って、
31 (1つか複数のフォームを含む)Lispの一行を実行できます。例えば、
34 (%i1) :lisp (foo $x $y)
38 は、Lisp関数@code{foo}をMaxima変数@code{x}, @code{y}を引数としてコールします。
40 対話プロンプトや@code{batch}や@code{demo}によって処理されるファイルの中で使えますが、
41 @code{load}, @code{batchload}, @code{translate_file}, @code{compile_file}が
44 関数@code{to_lisp()}を実行すると、対話的なLispセッションが始まります。
45 @code{(to-maxima)}を入力すると、Lispセッションを終了してMaximaに戻ります。
46 @c I DON'T EVEN WANT TO MENTION USING CTRL-C TO OPEN A LISP SESSION.
47 @c (1) IT TAKES EXTRA SET UP TO GET STARTED NAMELY :lisp (setq *debugger-hook* nil)
48 @c (2) IT GETS SCREWED UP EASILY -- TYPE SOMETHING WRONG AND YOU CAN'T GET BACK TO MAXIMA
49 @c (3) IT DOESN'T OFFER FUNCTIONALITY NOT PRESENT IN THE to_lisp() SESSION
51 Lispの関数や変数を、Maximaで通常の関数名、変数名(特殊な句読点のない名前)に見せるには、
52 Lispの名前をドル記号@code{$}で始めなければなりません。
54 Maximaでは、識別子の中の大文字、小文字が区別されます。
55 LispとMaximaの間の名前変換を決めるルールがあります。
59 縦棒で囲まれていないLisp識別子は、Maximaの小文字の識別子に対応します。
60 Lisp識別子が大文字でも小文字でも混ざっていても無視されます。
61 例えば、Lispの@code{$foo}や@code{$FOO}、@code{$Foo}はすべて
62 Maximaの@code{foo}に対応します。
64 Lispリーダが@code{$foo}, @code{$FOO}, @code{$Foo}を
65 Lispシンボル@code{$FOO}に変換するからです。
67 すべて大文字かすべて小文字で、縦棒で囲まれたLisp識別子は、大文字小文字を逆にしたMaximaの識別子に対応します。
68 例えば、Lispの@code{|$FOO|}, @code{|$foo|}はそれぞれ、Maximaの@code{foo}, @code{FOO}に対応します。
70 大文字小文字が混ざっていて、縦棒で囲まれたLisp識別子は、そのままMaximaの識別子に対応します。
71 例えば、Lispの@code{|$Foo|}はMaximaの@code{Foo}に対応します。
74 @code{#$}Lispマクロを使うと、Maximaの式をLispコードの中で使うことができます。
75 @code{#$@var{expr}$}はMaximaの式@var{expr}と同値なLispの式に展開されます。
78 (msetq $foo #$[x, y]$)
82 これは以下のように入力するのと同じ効果です。
89 Lisp関数@code{displa}は、Maximaフォーマットで式を表示します。
92 (%i1) :lisp #$[x, y, z]$
93 ((MLIST SIMP) $X $Y $Z)
94 (%i1) :lisp (displa '((MLIST SIMP) $X $Y $Z))
99 Maximaで定義された関数は、通常のLisp関数ではありません。
100 Lisp関数@code{mfuncall}は、Maxima関数をコールします。
104 (%i1) foo(x,y) := x*y$
105 (%i2) :lisp (mfuncall '$foo 'a 'b)
109 以下のLisp関数は、Maximaパッケージの中でシャドウされています。
112 complement continue //
113 float functionp array
122 @category{Programming}
125 @c -----------------------------------------------------------------------------
126 @node Garbage Collection, Introduction to Program Flow, Lisp and Maxima, Program Flow
127 @section Garbage Collection
128 @c -----------------------------------------------------------------------------
130 数式処理は膨大なゴミ(最終的には使われない一時的な、もしくは中間の結果)を生む傾向があり、
131 ゴミの効率的な取り扱いは、プログラムをうまく完了させるために非常に重要な場合があります。
133 @c HOW MUCH OF THE FOLLOWING STILL HOLDS ??
134 @c WHAT ABOUT GC IN GCL ON MS WINDOWS ??
135 @c SHOULD WE SAY SOMETHING ABOUT GC FOR OTHER LISPS ??
136 (SunOS 4.0やBSDの幾つかを含む)mprotectシステムコールが利用可能なUNIXシステム
137 上でのGCLでは、階層化(stratified)ガーベッジコレクションが利用可能です。
138 これは、ガーベッジコレクションを最近書き込まれたページに限定します。
139 GCLドキュメントのALLOCATEやGBCを参照してください。
140 Lispレベルで(setq si::*notify-gbc* t)を実行すると、どの領域がより多くの空間を必要としているか決めるのに役立つでしょう。
142 Maximaを走らせる他のLispについては、
143 そのLispのGCの制御の仕方に関するドキュメントを調べてください。
145 @c -----------------------------------------------------------------------------
146 @node Introduction to Program Flow, Functions and Variables for Program Flow, Garbage Collection, Program Flow
147 @section Introduction to Program Flow
148 @c -----------------------------------------------------------------------------
151 @code{go}のようなもっとプリミティブな構成子はもちろん、
152 繰り返しのために@code{do}ループを提供します。
154 @c end concepts Program Flow
156 @c -----------------------------------------------------------------------------
157 @node Functions and Variables for Program Flow, , Introduction to Program Flow, Program Flow
158 @section Functions and Variables for Program Flow
159 @c -----------------------------------------------------------------------------
161 @c -----------------------------------------------------------------------------
163 @deffn {関数} backtrace ()
164 @deffnx {関数} backtrace (@var{n})
167 現在アクティブな関数をコールした関数のリスト、を印字します。
169 @code{backtrace()}はコールスタック全体を印字します。
171 @code{backtrace (@var{n})}は、
172 現在アクティブな関数を含めて、@var{n}個の直近の関数を印字します。
174 @c IS THIS STATMENT REALLY NEEDED ??
175 @c (WHY WOULD ANYONE BELIEVE backtrace CANNOT BE CALLED OUTSIDE A DEBUGGING CONTEXT??)
178 スクリプト、関数、対話プロンプトからコールすることができます。
184 @code{backtrace()}はコールスタック全体を印字します。
187 (%i1) h(x) := g(x/7)$
188 (%i2) g(x) := f(x-11)$
189 (%i3) f(x) := e(x^2)$
190 (%i4) e(x) := (backtrace(), 2*x + 13)$
204 @code{backtrace (@var{n})}は、
205 現在アクティブな関数を含めて、@var{n}個の直近の関数を印字します。
208 (%i1) h(x) := (backtrace(1), g(x/7))$
209 (%i2) g(x) := (backtrace(1), f(x-11))$
210 (%i3) f(x) := (backtrace(1), e(x^2))$
211 (%i4) e(x) := (backtrace(1), 2*x + 13)$
228 @c -----------------------------------------------------------------------------
232 @code{do}文は繰り返しを実行するために使われます。
234 @code{do}文は2編で記述されます。
236 (Fortran, Algol, PL/I, など)いくつかの他のプログラミング言語の中で使われるそれ
240 この形式の、終了条件に関してだけ違う3つの別形があります。
245 @code{for @var{variable}: @var{initial_value} step @var{increment}
246 thru @var{limit} do @var{body}}
248 @code{for @var{variable}: @var{initial_value} step @var{increment}
249 while @var{condition} do @var{body}}
251 @code{for @var{variable}: @var{initial_value} step @var{increment}
252 unless @var{condition} do @var{body}}
255 @c UGH. DO WE REALLY NEED TO MENTION THIS??
256 (代わりに、@code{step}は終了条件や範囲の後与えられるかもしれません。)
258 @var{initial_value}, @var{increment}, @var{limit}, @var{body}は、
260 もし増分が1なら、 "@code{step 1}"は省略できます。
263 @var{initial_value}を @var{variable} (今後、制御変数と呼びます)
266 (1) もし制御変数が @code{thru}指定の範囲を越えたら、もしくは、
267 @code{unless}の条件が @code{true}なら、
268 もしくは、 @code{while}の条件が @code{false}なら、
270 (2) @var{body}が評価されます。
273 いずれかが満たされる時 @code{do}が終了する複数の終了条件を与えることもできます。
275 一般的に、 @code{thru}テストは、
276 もし @var{increment}が非負なら、制御変数が @var{limit}よりも大きい時、
277 または、もし @var{increment}が負なら、制御変数が @var{limit}よりも小さい時、
279 @var{increment}と @var{limit}は、この不等式が決定できる限り、数値でない式も取り得ます。
282 @var{increment}が構文法的に負(例えば負の数)でない限り、
283 Maximaは、 @code{do}が実行される時、正と仮定します。
285 @code{do}は適切に終了しないかもしれません。
287 @var{limit}, @var{increment}, 終了条件は、ループを通して毎回評価されることに注意してください。
288 もしこれらのいずれかがおおくの計算を含み、
289 @var{body}の実行中すべてで変わらない結果をもたらすなら、
290 @code{do}に先立って変数をそれらの値に設定し、その変数を
291 @code{do}形式の中で使うことはもっと効率的です。
293 @code{do}文が通常返す値は、アトム @code{done}です。
295 早い時点で @code{do}から抜けて任意の望みの値を与えるために、
296 関数 @code{return}を @var{body}の中で使うことができます。
297 しかしながら、 @code{block}の中で起こる @code{do}の中の @code{return}は、
298 @code{do}だけから抜けて、 @code{block}からは抜けないことに注意してください。
299 @code{do}から囲んでいる @code{block}に抜けるために、
300 @code{go}関数は使えないことにも注意してください。
302 制御変数はいつも @code{do}にローカルです。
305 @code{do}の外側の同じ名前を持つ変数の値に影響することなく、任意の変数が使えます。
306 制御変数は、 @code{do}が終了した後、バインドされていません。
309 (%i1) for a:-3 thru 26 step 7 do display(a)$
323 (%i2) for i: 1 while i <= 10 do s: s+i;
329 条件@code{while i <= 10}は、
330 @code{unless i > 10}と、また、@code{thru 10}と同値であることに注意してください。
334 (%i2) term: exp (sin (x))$
335 (%i3) for p: 1 unless p > 7 do
336 (term: diff (term, x)/p,
337 series: series + subst (x=0, term)*x^p)$
341 (%o4) -- - --- - -- - -- + -- + x + 1
345 以上は、@code{e^sin(x)}のTaylor級数の8項を与えます。
350 (%i2) for i: 1 thru 5 do
351 for j: i step -1 thru 1 do
355 (%o3) 5 x + 9 x + 12 x + 14 x + 15 x
357 (%i5) for i: 1 thru 10 do
358 (guess: subst (guess, x, 0.5*(x + 10/x)),
359 if abs (guess^2 - 10) < 0.00005 then return (guess));
360 (%o5) - 3.162280701754386
364 Newton-Raphson反復を最大10回使って、
367 戻り値は@code{done}になります。
370 繰り返しそれぞれで量をある他の方法で換えたい時があるかもしれません。
372 @code{step @var{increment}}の代わりに
373 @code{next @var{expression}}を使うことができます。
375 制御変数が毎回@var{expression}の評価結果に設定されるようにします。
378 (%i6) for count: 2 next 3*count thru 20 do display (count)$
386 @c UGH. DO WE REALLY NEED TO MENTION THIS??
387 @code{for @var{variable}: @var{value} ...do...}の代わりとして、
388 構文法@code{for @var{variable} from @var{value} ...do...}が使えます。
390 @code{from @var{value}}を
391 @code{step}や@code{next}値の後や終了条件の後に置くことを許します。
392 もし@code{from @var{value}}が省略されたら、
395 制御変数が実際には決して使われないような繰り返しを実行することに興味があることがあるかもしれません。
397 貧弱な初期推測を使って5の平方根を計算する以下の例にあるように、
398 初期化と更新情報を省略して終了条件だけ与えることが許されます。
402 (%i2) thru 20 do x: 0.5*(x + 5.0/x)$
404 (%o3) 2.23606797749979
405 (%i4) sqrt(5), numer;
406 (%o4) 2.23606797749979
410 無限に@var{body}を評価し続ける@code{do @var{body}}だけを与えることもできます。
411 この場合、関数@code{return}が@code{do}の実行を終了するのに使われるべきです。
414 (%i1) newton (f, x):= ([y, df, dfx], df: diff (f ('x), 'x),
415 do (y: ev(df), x: x - f(x)/y,
416 if abs (f (x)) < 5e-6 then return (x)))$
417 (%i2) sqr (x) := x^2 - 5.0$
418 (%i3) newton (sqr, 1000);
419 (%o3) 2.236068027062195
422 @c DUNNO IF WE NEED THIS LEVEL OF DETAIL; THIS ARTICLE IS GETTING PRETTY LONG
423 (@code{return}が実行された時、
425 @code{do}の値として返そうとすることに注意してください。
426 @code{do}がブロックの最後の文なので、
429 @code{block}の値として返されます。)
431 @code{do}のもう1つ別の形式がMaximaで利用可能です。構文法は:
434 for @var{variable} in @var{list} @var{end_tests} do @var{body}
438 @var{body}の繰り返しのそれぞれで
439 @code{variable}に連続的に割り当てられる任意の式です。
440 オプションの終了テスト@var{end_tests}は、
441 @code{do}の実行を終了するのに使うことができます;
443 @var{list}が使い果たされた時、または、
445 @code{return}が実行された時、
447 (実際には、@code{list}は非アトムの任意の式を取り得えて、連続的な部分が取られます。)
450 (%i1) for f in [log, rho, atan] do ldisp(f(1))$
461 @category{Programming}
465 @c -----------------------------------------------------------------------------
467 @deffn {関数} errcatch (@var{expr_1}, @dots{}, @var{expr_n})
469 @var{expr_1}, @dots{}, @var{expr_n}を1つずつ評価し、
470 もしエラーが起こらないなら、@code{[@var{expr_n}]} (リスト)を返します。
471 もしいずれかの引数の評価中にエラーが起こったら、
472 @code{errcatch} はエラーが伝搬することを抑制し、
473 引数をこれ以上評価せずに空のリスト@code{[]}を返します。
476 もしエラーがチャッチされないなら@code{batch}を終了させるエラーが起こるかもしれないと疑うような
477 @code{batch}ファイルで役立ちます。
480 @category{Programming}
484 @c -----------------------------------------------------------------------------
486 @deffn {関数} error (@var{expr_1}, ..., @var{expr_n})
487 @deffnx {システム変数} error
489 @var{expr_1}, ..., @var{expr_n}を評価して印字します。
490 そして、エラーがあれば、トップレベルMaximaか直近の@code{errcatch}に戻るようにします。
492 変数@code{error}はエラーを記述するリストに設定されます。
493 @code{error}の最初の要素はフォーマット文字列です。
494 引数@var{expr_1}, ..., @var{expr_n}の中の文字列すべてを結合したものです。
497 @code{errormsg()}は@code{error}をフォーマットし印字します。
498 これは直近のエラーメッセージを効果的に再印字します。
501 @category{Programming}
505 @c -----------------------------------------------------------------------------
507 @defvr {オプション変数} error_size
511 現れる式のサイズに従って、エラーメッセージを変更します。
512 もし式のサイズが、Lisp関数@code{ERROR-SIZE}によって決定されるように)
513 @code{error_size}より大きいなら、
514 式は、メッセージの中で、シンボルで置き換えられ、
516 シンボルはリスト@code{error_syms}から取られます。
518 そうでなければ、式は@code{error_size}より小さく、
521 @code{error}と@code{error_syms}も参照してください。
524 @c OUTPUT GENERATED BY THE FOLLOWING
525 @c U: (C^D^E + B + A)/(cos(X-1) + 1)$
527 @c error ("Example expression is", U);
530 @c error ("Example expression is", U);
532 @code{U}のサイズは、@code{ERROR-SIZE}で決められるように、24です。
535 (%i1) U: (C^D^E + B + A)/(cos(X-1) + 1)$
537 (%i2) error_size: 20$
539 (%i3) error ("Example expression is", U);
541 Example expression is errexp1
542 -- an error. Quitting. To debug this try debugmode(true);
549 (%i5) error_size: 30$
551 (%i6) error ("Example expression is", U);
556 Example expression is --------------
558 -- an error. Quitting. To debug this try debugmode(true);
562 @category{Debugging} @category{Display flags and variables}
566 @c -----------------------------------------------------------------------------
568 @defvr {オプション変数} error_syms
569 デフォルト値: @code{[errexp1, errexp2, errexp3]}
572 @code{error_size}より大きな式はシンボルで置き換えられ、
574 シンボルはリスト@code{error_syms}から取られます。
575 最初の大きすぎる式は、@code{error_syms[1]}で置き換えられ、
576 2番目は、@code{error_syms[2]}で置き換えられ、などなど。
578 もし大きすぎる式が@code{error_syms}の要素よりもあれば、
580 @var{n}番目のシンボルは@code{concat ('errexp, @var{n})}と同値です。
582 @code{error}と@code{error_size}も参照してください。
585 @category{Debugging} @category{Display flags and variables}
589 @c -----------------------------------------------------------------------------
591 @deffn {関数} errormsg ()
594 変数@code{error}はメッセージを保持し、
595 @code{errormsg}はそれをフォーマットし印字します。
598 @category{Programming}
602 @c -----------------------------------------------------------------------------
603 @anchor{option_errormsg}
604 @defvr {オプション変数} errormsg
607 @code{false}の時、エラーメッセージの出力は抑制されます。
609 オプション変数@code{errormsg}は
610 ブロックの中でローカル値に設定することはできません。
611 @code{errormsg}のグローバル値が常に存在します。
623 Wrong number of arguments to sin
624 -- an error. To debug this try: debugmode(true);
625 (%i3) errormsg:false;
629 -- an error. To debug this try: debugmode(true);
632 オプション変数@code{errormsg}はブロックの中でローカル値に設定できません。
635 @c f(bool):=block([errormsg:bool], print ("value of errormsg is",errormsg))$
642 (%i1) f(bool):=block([errormsg:bool],
643 print ("value of errormsg is",errormsg))$
647 value of errormsg is true
649 (%i4) errormsg:false;
652 value of errormsg is false
657 @category{Programming}
662 @c AT LEAST SHOULD LIST VARIANTS HERE
664 @c -----------------------------------------------------------------------------
669 Maximaの繰り返し機能の記述に関しては、@code{do}を参照してください。
672 @category{Programming}
676 @c -----------------------------------------------------------------------------
678 @deffn {関数} go (@var{tag})
681 @code{go}の引数でタグ付けされたブロックの文に移すために
682 @code{block}内部で使われます。
686 @code{block}の中の別の文として
691 block ([x], x:1, loop, x+1, ..., go(loop), ...)
694 @code{go}の引数は、同じ@code{block}の中に現れるタグの名前でなければいけません。
695 @code{go}を含む@code{block}以外の@code{block}の中のタグに移るために、
696 @code{go}を使うことはできません。
699 @category{Programming}
703 @c NEEDS CLARIFICATION, EXPANSION, EXAMPLES
704 @c THIS ITEM IS IMPORTANT
706 @c -----------------------------------------------------------------------------
711 @code{if}式の様々な形が認識されます。
713 @code{if @var{cond_1} then @var{expr_1} else @var{expr_0}}
715 もし@var{cond_1}が@code{true}評価されたら@var{expr_1}に*評*価*され、
716 そうでなければ式は@var{expr_0}に評価されます。
718 コマンド @code{if @var{cond_1} then @var{expr_1} elseif @var{cond_2} then @var{expr_2} elseif ... else @var{expr_0}}は、
719 もし@var{cond_k}が@code{true}、かつ、先行する条件がすべて@code{false}なら、
721 もし条件のいずれも@code{true}でないなら、式は@code{expr_0}に評価されます。
724 最後に@code{else false}が仮定されます。
725 すなわち、コマンド @code{if @var{cond_1} then @var{expr_1}}は、
726 @code{if @var{cond_1} then @var{expr_1} else false}と同値で、
727 コマンド @code{if @var{cond_1} then @var{expr_1} elseif ... elseif @var{cond_n} then @var{expr_n}}は、
728 @code{if @var{cond_1} then @var{expr_1} elseif ... elseif @var{cond_n} then @var{expr_n} else false}と同値です。
730 選択肢@var{expr_0}, @dots{}, @var{expr_n}は、任意のMaxima式を取り得ます。
731 入れ子の@code{if}式もあり得ます。
733 対応する条件が@code{true}でない限り、
736 条件@var{cond_1}, ..., @var{cond_n}は、潜在的に、また、実際に
737 @code{true}か@code{false}に評価される式です。
738 条件が実際には@code{true}にも@code{false}にも評価されない時、
739 @code{if}の振る舞いはグローバルフラグ@code{prederror}で決定されます。
740 @code{prederror}が@code{true}の時、
741 もし評価された条件のいずれかが@code{true}にも@code{false}にもならなかったら
743 そうでなければ、@code{true}にも@code{false}にも評価されない条件が受け入れられ、
746 条件は以下のように、他の要素間の関係演算子と論理演算子からなります。
748 @c - SEEMS LIKE THIS TABLE WANTS TO BE IN A DISCUSSION OF PREDICATE FUNCTIONS; PRESENT LOCATION IS OK I GUESS
749 @c - REFORMAT THIS TABLE USING TEXINFO MARKUP (MAYBE)
758 不等号 (値) notequal 関係 関数
767 @category{Programming} @category{Predicate functions}
771 @c NEEDS CLARIFICATION
772 @c THIS ITEM IS IMPORTANT
774 @c -----------------------------------------------------------------------------
776 @deffn {関数} map (@var{f}, @var{expr_1}, @dots{}, @var{expr_n})
778 @code{map}は、主演算子(訳注:内部表現の最上位階層のリストに対応する演算子)は
779 式@var{expr_1}, ..., @var{expr_n}のそれと同じ演算子を使い、
780 そのサブパーツは、引数式の対応するサブパーツに@var{f}を適用した結果である式を返します。
781 @var{f}は@math{n}個の引数の関数名か、@math{n}個の引数のラムダ形式です。
782 (訳注:また、@var{expr_1}, @dots{}, @var{expr_n}は内部表現に階層リスト構造を持つ式です。)
784 @code{maperror} - もし@code{maperror}が@code{fals}eなら、
785 マッピング関数のすべては、(1)もし@var{expr_i}のすべてが同じ長さでなければ、
786 最も短い@var{expr_i}が完了した時点で停止し、
787 (2)もし@var{expr_i}が同じタイプのオブジェクトでなければ、
788 @var{f}をリスト[@var{expr_1}, @var{expr_2}, ...]に適用します。
789 もし@code{maperror}が@code{true}なら、上の2つの場合、エラーメッセージを出力します。
791 この関数の用法の1つは、ある関数(例えば、@code{partfrac})を非常に長い式に適用する際、
792 計算の間にリスト保存領域を枯渇させるため式全体に適応するのが不可能な場合に、
795 @c IN THESE EXAMPLES, SPELL OUT WHAT IS THE MAIN OPERATOR
796 @c AND SHOW HOW THE RESULT FOLLOWS FROM THE DESCRIPTION STATED IN THE FIRST PARAGRAPH
798 (%i1) map(f,x+a*y+b*z);
799 (%o1) f(b z) + f(a y) + f(x)
800 (%i2) map(lambda([u],partfrac(u,x)),x+1/(x^3+4*x^2+5*x+2));
802 (%o2) ----- - ----- + -------- + x
805 (%i3) map(ratsimp, x/(x^2+x)+(y^2+y)/y);
809 (%i4) map("=",[a,b],[-0.5,3]);
810 (%o4) [a = - 0.5, b = 3]
816 @category{Function application}
820 @c -----------------------------------------------------------------------------
822 @deffn {関数} mapatom (@var{expr})
824 @var{expr}がマップルーチンでアトムとして扱われる時だけ@code{true}を返します。
825 "Mapatoms"はアトム、(有理数を含む)数、添字付き変数です。
826 @c WHAT ARE "THE MAPPING ROUTINES", AND WHY DO THEY HAVE A SPECIALIZED NOTION OF ATOMS ??
829 @category{Predicate functions}
833 @c NEEDS CLARIFICATION
835 @c -----------------------------------------------------------------------------
837 @defvr {オプション変数} maperror
840 @code{maperror}が@code{false}の時は、
841 マップ関数すべてに、以下の例のようにさせます。
844 map (@var{f}, @var{expr_1}, @var{expr_2}, @dots{})
848 (1) もし@var{expr_i}のすべてが同じ長さでないなら、
849 最も短い@var{expr_i}の終わりまで完了した時、停止するようにさせ、
850 (2) もし@var{expr_i}すべてが同じタイプのオブジェクトでないなら、
851 @var{f}を[@var{expr_1}, @var{expr_2}, ...]に適用するようにさせます。
853 もし@code{maperror}が@code{true}なら、
854 上の2つの例に関して、エラーメッセージが表示されます。
857 @category{Function application}
861 @c -----------------------------------------------------------------------------
863 @defvr {オプション変数} mapprint
866 @code{mapprint}が@code{true}の時、
867 @code{map}, @code{mapl}, @code{fullmap}からの様々な情報メッセージが
870 @code{map}が@code{apply}を使ったり、@code{map}が
871 最短のリストで切り詰めているような状況を含みます。
873 もし@code{mapprint}が@code{false}なら、これらのメッセージは抑制されます
876 @category{Function application}
880 @c NEEDS CLARIFICATION
882 @c -----------------------------------------------------------------------------
884 @deffn {関数} maplist (@var{f}, @var{expr_1}, @dots{}, @var{expr_n})
885 式@var{expr_1}, @dots{}, @var{expr_n}のパーツに@var{f}を適用した結果のリストを返します。
888 @code{maplist}は@code{map (@var{f}, @var{expr_1}, ..., @var{expr_n})}とは違います。
889 mapは主演算子が@var{expr_i}と同じ式を返します。
890 (整理と@code{map}が@code{apply}を行う場合は例外です。)
894 @category{Function application}
898 @c NEEDS CLARIFICATION
900 @c -----------------------------------------------------------------------------
902 @defvr {オプション変数} prederror
905 @code{prederror}が@code{true}の時、
906 @code{if}文の述語論理か@code{is}関数が
907 @code{true}か@code{false}に評価されるのに失敗した時はいつでも
910 もし@code{false}なら、この場合,代わりに@code{unknown}が返されます。
911 @code{prederror: false}モードは翻訳コードではサポートされません;
912 しかしながら、@code{maybe}は翻訳コードでサポートされます。
914 @code{is}と@code{maybe}も参照してください。
917 @category{Programming} @category{Predicate functions}
921 @deffn {関数} return (@var{value})
922 引数を連れて、陽にブロックから抜けるために使われます。
923 もっと情報を知るには、@code{block}も参照してください。
926 @category{Programming}
930 @c NEEDS CLARIFICATION
931 @deffn {関数} scanmap (@var{f}, @var{expr})
932 @deffnx {関数} scanmap (@var{f}, @var{expr}, bottomup)
933 トップダウン法で、@var{f}を@var{expr}に再帰的に適用します。
934 完全な因数分解が望まれる時、これは最も役に立ちます。
938 (%i1) exp:(a^2+2*a+1)*y + x^2$
939 (%i2) scanmap(factor,exp);
944 Note the way in which
945 @code{scanmap}が与えられた関数@code{factor}を
946 @var{expr}の構成部分式に適用する方法に注意してください;
948 @var{expr}の別の形がscanmapに適用されるなら、結果は異なるかもしれません。
951 @code{exp}の展開形に適用される時、
955 (%i3) scanmap(factor,expand(exp));
957 (%o3) a y + 2 a y + y + x
961 与えられた関数を指数関数を含む部分式すべてに再帰的に適用する方法の別の例です:
964 (%i4) expr : u*v^(a*x+b) + c$
965 (%i5) scanmap('f, expr);
966 f(f(f(a) f(x)) + f(b))
967 (%o5) f(f(f(u) f(f(v) )) + f(c))
970 @code{scanmap (@var{f}, @var{expr}, bottomup)}は、
978 f(a*x+b) -> f(f(a*x)+f(b)) -> f(f(f(a)*f(x))+f(b))
979 scanmap(f,a*x+b,bottomup) -> f(a)*f(x)+f(b)
980 -> f(f(a)*f(x))+f(b) ->
987 @category{Function application}
991 @c -----------------------------------------------------------------------------
993 @deffn {関数} throw (@var{expr})
996 直近の@code{catch}に値を投げ戻します。
998 @code{catch}と一緒に、非ローカルリターンメカニズムとして使われます。
1001 @category{Programming}
1005 @c NEED MORE HERE !!
1006 @c AT LEAST SHOULD LIST ACCEPTABLE VARIANTS
1008 @c -----------------------------------------------------------------------------
1011 @deffn {特殊演算子} while
1012 @deffnx {特殊演算子} unless
1016 @category{Programming}
1020 @c -----------------------------------------------------------------------------
1022 @deffn {関数} outermap (@var{f}, @var{a_1}, @dots{}, @var{a_n})
1025 外積@var{a_1}掛ける@var{a_2} ... 掛ける@var{a_n}の要素のそれぞれに適用します。
1028 @math{n}個の引数の関数の名前か、
1033 リストか、入れ子のリストか、行列か、他の任意の種類の式を取り得ます。
1035 @code{outermap}戻り値は、入れ子の構造です。
1038 @var{x}は最初のリストか入れ子のリストか行列引数と同じ構造を持ち、
1039 @code{@var{x}[i_1]...[i_m]}は、
1040 二番目のリストか入れ子のリストか行列引数と同じ構造を持ち、
1041 @code{@var{x}[i_1]...[i_m][j_1]...[j_n]}は、
1042 三番目のリストか入れ子のリストか行列引数と同じ構造を持ち、
1044 ここで、@var{m}, @var{n}, ...は、
1047 インデックスの数(リストには1つ、行列には2つ、入れ子のリストには1つ以上)です。
1048 リストや行列でない引数は戻り値の構造に影響を与えません。
1050 Note that the effect of
1053 @code{cartesian_product}によって返される
1054 外積の要素のそれぞれに適用することのそれと違います。
1056 @code{outermap}は、戻り値で引数の構造を保ちますが、
1057 @code{cartesian_product}は違います。
1059 @code{outermap}は引数を評価します。
1061 @code{map}, @code{maplist}, @code{apply}も参照してください。
1062 @c CROSS REF OTHER FUNCTIONS HERE ??
1066 @code{outermap}の初等的な例。
1067 よりはっきり引数の組み合わせを示すために、
1071 @c outermap (F, [a, b, c], [1, 2, 3]);
1072 @c outermap (F, matrix ([a, b], [c, d]), matrix ([1, 2], [3, 4]));
1073 @c outermap (F, [a, b], x, matrix ([1, 2], [3, 4]));
1074 @c outermap (F, [a, b], matrix ([1, 2]), matrix ([x], [y]));
1075 @c outermap ("+", [a, b, c], [1, 2, 3]);
1078 (%i1) outermap(F, [a, b, c], [1, 2, 3]);
1079 (%o1) [[F(a, 1), F(a, 2), F(a, 3)], [F(b, 1), F(b, 2), F(b, 3)],
1080 [F(c, 1), F(c, 2), F(c, 3)]]
1081 (%i2) outermap(F, matrix([a, b],[c, d]), matrix([1, 2],[3, 4]));
1082 [ [ F(a, 1) F(a, 2) ] [ F(b, 1) F(b, 2) ] ]
1084 [ [ F(a, 3) F(a, 4) ] [ F(b, 3) F(b, 4) ] ]
1086 [ [ F(c, 1) F(c, 2) ] [ F(d, 1) F(d, 2) ] ]
1088 [ [ F(c, 3) F(c, 4) ] [ F(d, 3) F(d, 4) ] ]
1089 (%i3) outermap (F, [a, b], x, matrix ([1, 2], [3, 4]));
1090 [ F(a, x, 1) F(a, x, 2) ] [ F(b, x, 1) F(b, x, 2) ]
1092 [ F(a, x, 3) F(a, x, 4) ] [ F(b, x, 3) F(b, x, 4) ]
1093 (%i4) outermap (F, [a, b], matrix ([1, 2]), matrix ([x], [y]));
1094 [ [ F(a, 1, x) ] [ F(a, 2, x) ] ]
1096 [ [ F(a, 1, y) ] [ F(a, 2, y) ] ]
1097 [ [ F(b, 1, x) ] [ F(b, 2, x) ] ]
1099 [ [ F(b, 1, y) ] [ F(b, 2, y) ] ]
1100 (%i5) outermap ("+", [a, b, c], [1, 2, 3]);
1101 (%o5) [[a + 1, a + 2, a + 3], [b + 1, b + 2, b + 3],
1102 [c + 1, c + 2, c + 3]]
1105 @code{outermap}の戻り値のより密な検査。
1106 最初の、二番目の、三番目の引数は、それぞれ、行列、リスト、行列です。
1109 それぞれのリストの要素それぞれは行列です。
1112 @c arg_1 : matrix ([a, b], [c, d]);
1113 @c arg_2 : [11, 22];
1114 @c arg_3 : matrix ([xx, yy]);
1115 @c xx_0 : outermap (lambda ([x, y, z], x / y + z), arg_1,
1117 @c xx_1 : xx_0 [1][1];
1118 @c xx_2 : xx_0 [1][1] [1];
1119 @c xx_3 : xx_0 [1][1] [1] [1][1];
1120 @c [op (arg_1), op (arg_2), op (arg_3)];
1121 @c [op (xx_0), op (xx_1), op (xx_2)];
1124 (%i1) arg_1 : matrix ([a, b], [c, d]);
1128 (%i2) arg_2 : [11, 22];
1130 (%i3) arg_3 : matrix ([xx, yy]);
1132 (%i4) xx_0 : outermap(lambda([x, y, z], x / y + z), arg_1,
1135 [ [[ xx + -- yy + -- ], [ xx + -- yy + -- ]] ]
1136 [ [ 11 11 ] [ 22 22 ] ]
1139 [ [[ xx + -- yy + -- ], [ xx + -- yy + -- ]] ]
1140 [ [ 11 11 ] [ 22 22 ] ]
1143 [ [[ xx + -- yy + -- ], [ xx + -- yy + -- ]] ]
1144 [ [ 11 11 ] [ 22 22 ] ]
1147 [ [[ xx + -- yy + -- ], [ xx + -- yy + -- ]] ]
1148 [ [ 11 11 ] [ 22 22 ] ]
1150 (%i5) xx_1 : xx_0 [1][1];
1152 (%o5) [[ xx + -- yy + -- ], [ xx + -- yy + -- ]]
1154 (%i6) xx_2 : xx_0 [1][1] [1];
1156 (%o6) [ xx + -- yy + -- ]
1158 (%i7) xx_3 : xx_0 [1][1] [1] [1][1];
1162 (%i8) [op (arg_1), op (arg_2), op (arg_3)];
1163 (%o8) [matrix, [, matrix]
1164 (%i9) [op (xx_0), op (xx_1), op (xx_2)];
1165 (%o9) [matrix, [, matrix]
1168 @code{outermap}は、戻り値の中で引数の構造を保持します。
1169 @code{cartesian_product}は保持しません。
1172 @c outermap (F, [a, b, c], [1, 2, 3]);
1173 @c setify (flatten (%));
1174 @c map (lambda ([L], apply (F, L)),
1175 @c cartesian_product ({a, b, c}, {1, 2, 3}));
1176 @c is (equal (%, %th (2)));
1179 (%i1) outermap (F, [a, b, c], [1, 2, 3]);
1180 (%o1) [[F(a, 1), F(a, 2), F(a, 3)], [F(b, 1), F(b, 2), F(b, 3)],
1181 [F(c, 1), F(c, 2), F(c, 3)]]
1182 (%i2) setify (flatten (%));
1183 (%o2) @{F(a, 1), F(a, 2), F(a, 3), F(b, 1), F(b, 2), F(b, 3),
1184 F(c, 1), F(c, 2), F(c, 3)@}
1185 (%i3) map(lambda([L], apply(F, L)),
1186 cartesian_product(@{a, b, c@}, @{1, 2, 3@}));
1187 (%o3) @{F(a, 1), F(a, 2), F(a, 3), F(b, 1), F(b, 2), F(b, 3),
1188 F(c, 1), F(c, 2), F(c, 3)@}
1189 (%i4) is (equal (%, %th (2)));
1194 @category{Function application}