1 @c -----------------------------------------------------------------------------
2 @c File : Function.de.texi
3 @c License : GNU General Public License (GPL)
5 @c Original : Function.texi revision 14.03.2011
6 @c Translation : Dr. Dieter Kaiser
8 @c Revision : 04.12.2011
10 @c This file is part of Maxima -- GPL CAS based on DOE-MACSYMA
11 @c -----------------------------------------------------------------------------
16 * Funktionen und Variablen f@"ur Funktionsdefinitionen::
19 @c -----------------------------------------------------------------------------
20 @node Funktionen, Makros, Funktionsdefinitionen, Funktionsdefinitionen
22 @c -----------------------------------------------------------------------------
24 @c -----------------------------------------------------------------------------
25 @subsection Gew@"ohnliche Funktionen
27 Eine Maxima-Funktion wird mit dem Operator @mref{:=} oder der Funktion
28 @mref{define} definiert. Im folgenden wird die Funktion @code{f} mit
29 dem Operator @code{:=} definiert:
35 Funktionen, die mit der Funktion @mref{lambda} definiert werden, sind anonyme
36 Funktionen, die keinen Namen haben. Diese werden auch @code{lambda}-Ausdr@"ucke
43 Anonyme Funktionen k@"onnen @"uberall dort verwendet werden, wo eine Funktion
44 als Argument erwartet wird. Das folgende Beispiel gibt eine Liste zur@"uck,
45 bei der jedes Element der Liste @code{L} mit 1 addiert wird:
48 map (lambda ([i], i+1), L)
51 Ist das letzte oder einzige Argument einer Funktion eine Liste mit einem
52 Element, kann eine variable Anzahl an Argumenten an die Funktion @"ubergeben
60 (%i3) f (a, b, [u]) := [a, b, u];
61 (%o3) f(a, b, [u]) := [a, b, u]
62 (%i4) f (1, 2, 3, 4, 5, 6);
63 (%o4) [1, 2, [3, 4, 5, 6]]
66 Die rechte Seite einer Funktionsdefinition ist ein Ausdruck. Mehrere
67 Ausdr@"ucke werden durch Kommata getrennt und mit Klammern umgeben. Das
68 Ergebnis der Funktion ist der Wert des letzten Ausdrucks @code{exprn}:
71 f(x) := (expr1, expr2, ...., exprn);
74 Ein R@"ucksprung mit der Anweisung @mref{return} aus einer Funktion ist
75 m@"oglich, wenn die Definition der Funktion in einen Block eingef@"ugt wird.
76 Ein Block wird mit der @mref{block}-Anweisung definiert. Das folgende Beispiel
77 hat entweder den Wert @code{a} oder den Wert des Ausdrucks @var{exprn} als
81 block ([], expr1, ..., if (a > 10) then return(a), ..., exprn)
84 Das erste paar Klammern @code{[]} in einem Block enth@"alt die Definition von
85 lokalen Variablen wie zum Beispiel @code{[a: 3, b, c: []]}. Die Variablen sind
86 au@ss{}erhalb des Blocks nicht sichtbar. Die Werte von globalen Variablen
87 werden von den lokalen Werten @"uberschrieben. Au@ss{}erhalb des Blocks haben
88 die Variablen, wenn vorhanden, wieder ihre alten Werte. Die Zuweisung der Werte
89 an die lokalen Variablen wird parallel ausgef@"uhrt.
91 Im folgenden Beispiel wird der Wert der globalen Variablen @var{a} der lokalen
92 Variablen @var{a} zugewiesen. @"Anderungen von @var{a} im Block wirken sich
93 nicht auf den globalen Wert der Variablen aus.
96 block ([a: a], expr1, ... a: a+3, ..., exprn)
99 Die Anweisung @code{block ([x], ...)} bewirkt, dass @code{x} als lokale Variable
100 ohne einen Wert verwendet werden kann.
102 Die Argumente einer Funktion werden in gleicher Weise wie lokal definierte
103 Variable behandelt. Die folgende Definition
106 f(x) := (expr1, ..., exprn);
115 hat denselben Effekt wie der folgende Block:
118 block ([x: 1], expr1, ..., exprn)
121 Soll die rechte Seite einer Funktionsdefinition ausgewertet werden,
122 kann die Funktionen @mref{define} f@"ur die Definition der Funktion verwendet
123 werden. Mit der Funktion @mref{buildq} kann die Definition einer Funktion
124 konstruiert werden, wobei die Auswertung gezielt kontrolliert werden kann.
126 @c -----------------------------------------------------------------------------
127 @anchor{Array-Funktionen}
128 @subsection Array-Funktionen
130 Eine Array-Funktion speichert bei dem ersten Aufruf den Funktionswert zu dem
131 Argument. Wird die Array-Funktion mit demselben Argument aufgerufen, wird der
132 gespeicherte Wert zur@"uckgeben, ohne diesen neu zu berechnen. Dies wird auch
137 Das folgende Beispiel zeigt die Definition einer Array-Funktion @code{f}, die
138 die Fakult@"at einer Zahl faktorisiert. Im ersten Aufruf der Funktion mit dem
139 Argument @code{25000} wird eine Rechenzeit von etwa 24 Sekunden ben@"otigt.
140 Der zweite Aufruf mit demselben Argument gibt sofort den abgespeicherten Wert
144 (%i1) f[x]:=factor(x!);
145 (%o1) f := factor(x!)
148 Evaluation took 0.0000 seconds (0.0000 elapsed) using 0 bytes.
151 Evaluation took 23.9250 seconds (26.0790 elapsed) using 3829.778 MB.
153 Evaluation took 0.0000 seconds (0.0000 elapsed) using 0 bytes.
156 Die Namen der Array-Funktionen werden in die Informationsliste @mref{arrays}@w{}
157 und nicht in die Liste @mref{functions} eingetragen. @mref{arrayinfo} gibt eine
158 Liste der Argumente zur@"uck, f@"ur die Werte gespeichert sind und
159 @mref{listarray} gibt die Werte zur@"uck. Die Funktionen @mref{dispfun} und
160 @mref{fundef} geben die Definition der Array-Funktion zur@"uck.
164 Mit dem obigen Beispiel werden die folgenden Ergebnisse ausgegeben.
170 (%o6) [hashed, 1, [25000]]
172 (%t7) f := factor(x!)
177 @mref{arraymake} erzeugt den Aufruf einer Array-Funktion. Dies ist analog zu
178 der Funktion @mref{funmake} f@"ur gew@"ohnliche Funktionen.
179 @mref{arrayapply} wendet eine Array-Funktion auf die Argumente an. Dies
180 entspricht der Funktion @mref{apply} f@"ur gew@"ohnliche Funktionen. Die
181 Funktion @mref{map} hat keine Entsprechung f@"ur Array-Funktionen.
182 Vergleichbare Konstruktionen sind
183 @code{map(lambda([@var{x}], @var{a}[@var{x}]), @var{L})} oder
184 @code{makelist(@var{a}[@var{x}], @var{x}, @var{L})}, wobei @var{L} eine Liste
187 @mref{remarray} entfernt die Definition einer Array-Funktion einschlie@ss{}lich
188 der gespeicherten Werte. Dies entspricht @mref{remfunction} f@"ur gew@"ohnliche
191 @code{kill(@var{a}[@var{x}])} entfernt den f@"ur das Argument @var{x}
192 gespeicherten Wert einer Array-Funktion @var{a}. Beim n@"achsten Aufruf von
193 @var{a} mit dem Argument @var{x} wird der Funktionswert neu berechnet. Es gibt
194 keine M@"oglichkeit, alle gespeicherten Werte zu l@"oschen, ohne dass die
195 Definition der Funktion entfernt wird. Die Kommandos @code{kill(@var{a})} und
196 @code{remarray(@var{a})} l@"oschen alle Werte einschlie@ss{}lich der Definition
199 @c -----------------------------------------------------------------------------
200 @node Makros, Funktionen und Variablen f@"ur Funktionsdefinitionen, Funktionen, Funktionsdefinitionen
202 @c -----------------------------------------------------------------------------
204 @c --- 02.12.2010 DK -----------------------------------------------------------
206 @deffn {Funktion} buildq (@var{L}, @var{expr})
208 Die Variablen der Liste @var{L} werden in den Ausdruck @var{expr} substituiert.
209 Die Substitution wird parallel ausgef@"uhrt. Das Ergebnis der Substitution wird
210 vereinfacht, aber nicht ausgewertet.
212 Die Elemente der Liste @var{L} sind Symbole oder Zuweisungen der Form
213 @code{@var{symbol}: @var{value}}. Die Zuweisungen werden parallel ausgewertet.
214 Der Wert einer Variablen auf der rechten Seite einer Zuweisung ist der globale
215 Wert in dem Kontext in dem @code{buildq} aufgerufen wird und nicht der lokale
216 Wert einer vorhergehenden Zuweisung. Erh@"alt eine Variable keinen Wert, dann
217 beh@"alt die Variable den globalen Wert.
219 Dann werden die in der Liste @var{L} enthaltenen Variablen parallel in den
220 Ausdruck @var{expr} substituiert.
222 Enth@"alt @var{expr} Ausdr@"ucke der Form @code{splice(@var{x})}, muss die
223 Variable @var{x} eine Liste sein. Die Liste wird in den Ausdruck eingef@"ugt.
224 Siehe auch @mrefdot{splice}
226 Variablen in in dem Ausdruck @var{expr}, die nicht in @var{L} enthalten sind,
227 werden nicht durch einen Wert ersetzt, auch wenn es eine globale Variable mit
228 demselben Namen gibt, da der Ausdruck nicht ausgewertet wird.
232 Der Variablen @code{a} wird der Wert zugewiesen. Die Variable @code{b} erh@"alt
233 den globalen Wert. Die Variable @code{c} hat keinen Wert. Das Ergebnis ist
234 ein nicht ausgewerteter Ausdruck. Die Auswertung wird mit dem
235 @nxref{'', Quote-Quote-Operator} @code{''} erzwungen.
238 (%i1) (a: 17, b: 29, c: 1729)$
239 (%i2) buildq ([a: x, b], a + b + c);
245 @code{e} ist eine Liste, die einmal als Argument der Funktion @code{foo}
246 vorliegt und zum anderen in die Argumentliste der Funktion @code{bar}
250 (%i1) buildq ([e: [a, b, c]], foo (x, e, y));
251 (%o1) foo(x, [a, b, c], y)
252 (%i2) buildq ([e: [a, b, c]], bar (x, splice (e), y));
253 (%o2) bar(x, a, b, c, y)
256 Das Ergebnis wird nach der Substitution vereinfacht, ansonsten h@"atten die
257 beiden folgenden Beispiele dasselbe Ergebnis.
260 (%i1) buildq ([e: [a, b, c]], splice (e) + splice (e));
261 (%o1) 2 c + 2 b + 2 a
262 (%i2) buildq ([e: [a, b, c]], 2 * splice (e));
266 Die Variablen der Liste @var{L} erhalten ihren Wert parallel, ansonsten w@"are
267 das erste Ergebnis @code{foo(b,b)}. Substitutionen werden parallel
268 ausgef@"uhrt. Im Gegensatz dazu werden die Substitutionen mit der Funktion
269 @mref{subst} nacheinander ausgef@"uhrt.
272 (%i1) buildq ([a: b, b: a], foo (a, b));
274 (%i2) buildq ([u: v, v: w, w: x, x: y, y: z, z: u],
275 bar (u, v, w, x, y, z));
276 (%o2) bar(v, w, x, y, z, u)
277 (%i3) subst ([u=v, v=w, w=x, x=y, y=z, z=u],
278 bar (u, v, w, x, y, z));
279 (%o3) bar(u, u, u, u, u, u)
282 Konstruktion einer Liste mit Gleichungen mit Variablen oder Ausdr@"ucken auf
283 der linken Seite und deren Werten auf der rechten Seite. Die Funktion
284 @mref{macroexpand} expandiert das Makro @code{show_values}.
287 (%i1) show_values ([L]) ::= buildq ([L], map ("=", 'L, L))$
288 (%i2) (a: 17, b: 29, c: 1729)$
289 (%i3) show_values (a, b, c - a - b);
290 (%o3) [a = 17, b = 29, c - b - a = 1683]
291 (%i4) macroexpand (show_values (a, b, c - a - b));
292 (%o4) map(=, '([a, b, c - b - a]), [a, b, c - b - a])
295 Konstruktion einer Funktion.
298 (%i1) curry (f, [a]) :=
299 buildq ([f, a], lambda ([[x]], apply (f, append (a, x))))$
300 (%i2) by3 : curry ("*", 3);
301 (%o2) lambda([[x]], apply(*, append([3], x)))
307 @c --- 04.12 2011 DK -----------------------------------------------------------
309 @deffn {Funktion} macroexpand (@var{expr})
311 Ist das Argument @var{expr} ein Makro, wird das Makro expandiert, ohne dass es
312 ausgewertet wird. Ansonsten wird @var{expr} zur@"uckgegeben.
314 Ist die Expansion des Makros selbst ein Makro, wird dieses Makro wiederholt
317 @code{macroexpand} wertet das Argument @var{expr} nicht aus. Hat die Expansion
318 des Makros Seiteneffekte, dann werden diese ausgef@"uhrt.
320 Siehe auch @mref{::=} und @mrefdot{macroexpand1}
325 (%i1) g (x) ::= x / 99;
329 (%i2) h (x) ::= buildq ([x], g (x - a));
330 (%o2) h(x) ::= buildq([x], g(x - a))
333 (%i4) macroexpand (h (y));
344 @c --- 04.12.2010 DK -----------------------------------------------------------
345 @anchor{macroexpand1}
346 @deffn {Funktion} macroexpand1 (@var{expr})
348 Gibt die Makro-Expansion von @var{expr} zur@"uck, ohne das Ergebnis auszuwerten.
349 Ist @var{expr} keine Makro-Funktion gibt @code{macroexpand1} das Argument
352 @code{macroexpand1} wertet das Argument nicht aus. Hat die Expansion des Makros
353 Seiteneffekte, dann werden diese ausgef@"uhrt.
355 Enth@"alt die Expansion @var{expr} wiederum Makros, werden diese im Unterschied
356 zur Funktion @code{macroexpand} nicht expandiert.
358 Siehe auch @mref{::=} und @mrefdot{macroexpand}
363 (%i1) g (x) ::= x / 99;
367 (%i2) h (x) ::= buildq ([x], g (x - a))$
370 (%i4) macroexpand1 (h (y));
379 @c --- 03.01.2011 DK -----------------------------------------------------------
380 @defvr {Optionsvariable} macroexpansion
381 Standardwert: @code{false}
383 @code{macroexpansion} kontrolliert die Expansion von Makros.
387 Die Expansion des Makros wird nicht f@"ur die aufrufende Funktion ersetzt.
390 Wird die Makro-Funktion das erste Mal ausgewertet, wird die Expansion des Makros
391 gespeichert. Weitere Aufrufe werten das Makro nicht erneut aus. Seiteneffekte,
392 wie Zuweisungen an globale Variablen, werden nur bei der ersten Auswertung
393 wirksam. Die Expansion des Makros beeinflusst nicht andere Ausdr@"ucke, die das
394 Makro ebenfalls aufrufen.
397 Wird die Makro-Funktion das erste mal ausgewertet, wird die Expansion des Makros
398 in den aufrufenden Ausdruck eingesetzt. Weitere Aufrufe werten das Makro nicht
399 erneut aus. Seiteneffekte, wie Zuweisungen an globale Variablen, werden nur bei
400 der ersten Auswertung wirksam. Die Expansion des Makros beeinflusst nicht
401 andere Ausdr@"ucke, die das Makro ebenfalls aufrufen.
406 Hat @code{macroexpansion} den Wert @code{false}, wird eine Makro-Funktion
407 jedes mal aufgerufen, wenn der aufrufende Ausdruck ausgewertet wird. Der
408 aufrufende Ausdruck wird nicht modifiziert.
411 (%i1) f (x) := h (x) / g (x);
416 (%i2) g (x) ::= block (print ("x + 99 is equal to", x),
419 (%o2) g(x) ::= block(print("x + 99 is equal to", x),
421 (%i3) h (x) ::= block (print ("x - 99 is equal to", x),
423 (%o3) h(x) ::= block(print("x - 99 is equal to", x),
425 (%i4) macroexpansion: false;
447 Hat @code{macroexpansion} den Wert @code{expand}, wird eine Makro-Funktion nur
448 einmal aufgerufen. Der aufrufende Ausdruck wird nicht modifiziert.
451 (%i1) f (x) := h (x) / g (x);
455 (%i2) g (x) ::= block (print ("x + 99 is equal to", x),
457 (%o2) g(x) ::= block(print("x + 99 is equal to", x),
459 (%i3) h (x) ::= block (print ("x - 99 is equal to", x),
461 (%o3) h(x) ::= block(print("x - 99 is equal to", x),
463 (%i4) macroexpansion: expand;
485 Hat @code{macroexpansion} den Wert @code{displace}, wird eine Makro-Funktion
486 nur einmal aufgerufen. Der aufrufende Ausdruck wird modifiziert.
489 (%i1) f (x) := h (x) / g (x);
493 (%i2) g (x) ::= block (print ("x + 99 is equal to", x),
495 (%o2) g(x) ::= block(print("x + 99 is equal to", x),
497 (%i3) h (x) ::= block (print ("x - 99 is equal to", x),
499 (%o3) h(x) ::= block(print("x - 99 is equal to", x),
501 (%i4) macroexpansion: displace;
522 @c --- 04.12.2011 DK -----------------------------------------------------------
524 @defvr {Systemvariable} macros
525 Standardwert: @code{[]}
527 Die Systemvariable @code{macros} ist eine Informationsliste, die die vom Nutzer
528 mit dem Operator @mref{::=} definierten Makros enth@"alt. Wird das Makro mit
529 einer der Funktionen @mrefcomma{kill} @mref{remove} oder @mref{remfunction}
530 gel@"oscht, wird der Eintrag aus der Informationsliste entfernt. Siehe auch die
531 Systemvariable @mrefdot{infolists}
534 @c --- 04.12.2010 DK -----------------------------------------------------------
536 @deffn {Funktion} splice (@var{a})
538 Die Funktion @code{splice} kann nur im Zusammenhang mit der Funktion
539 @mref{buildq} verwendet werden. Das Argument @var{a} bezeichnet eine Liste, die
540 an Stelle von @code{splice(a)} in einen Ausdruck eingef@"ugt wird. @var{a} kann
541 nicht selbst eine Liste oder ein Ausdruck sein, der zu einer Liste auswertet.
546 (%i1) buildq ([x: [1, %pi, z - y]], foo (splice (x)) / length (x));
548 (%o1) -----------------------
549 length([1, %pi, z - y])
550 (%i2) buildq ([x: [1, %pi]], "/" (splice (x)));
554 (%i3) matchfix ("<>", "<>");
556 (%i4) buildq ([x: [1, %pi, z - y]], "<>" (splice (x)));
557 (%o4) <>1, %pi, z - y<>
561 @c -----------------------------------------------------------------------------
562 @node Funktionen und Variablen f@"ur Funktionsdefinitionen, , Makros, Funktionsdefinitionen
563 @section Funktionen und Variablen f@"ur Funktionsdefinitionen
564 @c -----------------------------------------------------------------------------
566 @c --- 04.12.2010 DK -----------------------------------------------------------
568 @deffn {Funktion} apply (@var{F}, [@var{x_1}, @dots{}, @var{x_n}])
570 Konstruiert den Ausdruck @code{@var{F}(@var{arg_1}, ..., @var{arg_n})} und
573 @code{apply} versucht nicht Array-Funktionen von gew@"ohnlichen Funktionen zu
574 unterscheiden. Ist @var{F} der Name eine Array-Funktion, wertet @code{apply}
575 den Ausdruck @code{@var{F}(...)} aus. @mref{arrayapply} entspricht der
576 Funktion @code{apply}, wenn @var{F} eine Array-Funktion ist.
580 @code{apply} wertet die Argumente aus. In diesem Beispiel wird die Funktion
581 @mref{min} auf die Liste @code{L} angewendet.
584 (%i1) L : [1, 5, -10.2, 4, 3];
585 (%o1) [1, 5, - 10.2, 4, 3]
586 (%i2) apply (min, L);
590 @code{apply} wertet die Argumente auch dann aus, wenn die Funktion @code{F}
591 die Auswertung ihrer Argumente unterdr@"uckt.
594 (%i1) F (x) := x / 1729;
608 (%i4) dispfun (fname);
609 fname is not the name of a user function.
610 -- an error. Quitting. To debug this try debugmode(true);
611 (%i5) apply (dispfun, [fname]);
619 @code{apply} wertet den Namen der Funktion @var{F} aus. Mit dem
620 @nxref{', Quote-Operator} @code{'} wird die Auswertung unterdr@"uckt.
621 @mref{demoivre} ist der Name einer globalen Optionsvariable und einer Funktion.
626 (%i2) demoivre (exp (%i * x));
627 (%o2) %i sin(x) + cos(x)
628 (%i3) apply (demoivre, [exp (%i * x)]);
629 demoivre evaluates to false
630 Improper name or value in functional position.
631 -- an error. Quitting. To debug this try debugmode(true);
632 (%i4) apply ('demoivre, [exp (%i * x)]);
633 (%o4) %i sin(x) + cos(x)
637 @c --- 03.01.2011 DK -----------------------------------------------------------
639 @deffn {Funktion} define (@var{f}(@var{x_1}, @dots{}, @var{x_n}), @var{expr})
640 @deffnx {Funktion} define (@var{f}[@var{x_1}, @dots{}, @var{x_n}], @var{expr})
641 @deffnx {Funktion} define (funmake (@var{f}, [@var{x_1}, @dots{}, @var{x_n}]), @var{expr})
642 @deffnx {Funktion} define (arraymake (@var{f}, [@var{x_1}, @dots{}, @var{x_n}]), @var{expr})
643 @deffnx {Funktion} define (ev (@var{expr_1}), @var{expr_2})
645 Definiert eine Funktion mit dem Namen @var{f} und den Argumenten @var{x1},
646 @dots{}, @var{x_n} und der Funktionsdefinition @var{expr}. @code{define}
647 wertet das zweite Argument immer aus.
649 Ist das letzte oder einzige Argument @var{x_n} eine Liste mit einem Element,
650 dann akzeptiert die Funktion eine variable Anzahl an Argumenten. Die Argumente
651 der Funktion werden nacheinander den Variablen @var{x_1}, @dots{}, @var{x_(n-1)}
652 zugewiesen. Sind weitere Argumente vorhanden, werden diese als Liste der
653 Variablen @var{x_n} zugewiesen.
655 Ist das erste Argument der Funktion @code{define} ein Ausdruck der Form
656 @code{@var{f}(@var{x_1}, ..., @var{x_n})} oder @code{@var{f}[@var{x_1}, ...,
657 @var{x_n}]} werden die Argumente der Funktion ausgewertet, aber nicht die
658 Funktion @var{f} selbst. @var{f} wird auch dann nicht ausgewertet, wenn es
659 bereits eine Funktion mit dem Namen @var{f} gibt.
661 Das erste Argument wird dann ausgewertet, wenn es ein Ausdruck mit den
662 Funktionen @mrefcomma{funmake} @mref{arraymake} oder @mref{ev} ist.
664 Alle Funktionsdefinitionen treten in demselben Namensraum auf. Die Definition
665 einer Funktion @code{g} innerhalb einer Funktion @code{f} f@"uhrt nicht
666 automatisch zu einer lokalen Definition. Um eine lokale Funktion zu erhalten,
667 kann @code{lokal(g)} innerhalb der Funktion @code{f} ausgef@"uhrt werden.
668 Siehe auch @mrefdot{local}
670 Ist eines der Argumente @var{x_k} nach der Auswertung ein quotiertes Symbol,
671 wertet die mit @code{define} definierte Funktion das Argument nicht aus.
672 Alle weiteren Argumente der Funktion werden ausgewertet.
674 Siehe auch @mref{:=} und @mrefdot{::=}
678 @code{define} wertet das zweite Argument aus.
681 (%i1) expr : cos(y) - sin(x);
682 (%o1) cos(y) - sin(x)
683 (%i2) define (F1 (x, y), expr);
684 (%o2) F1(x, y) := cos(y) - sin(x)
686 (%o3) cos(b) - sin(a)
687 (%i4) F2 (x, y) := expr;
688 (%o4) F2(x, y) := expr
690 (%o5) cos(y) - sin(x)
694 Mit @code{define} k@"onnen gew@"ohnliche Maxima-Funktionen und Array-Funktionen
698 (%i1) define (G1 (x, y), x.y - y.x);
699 (%o1) G1(x, y) := x . y - y . x
700 (%i2) define (G2 [x, y], x.y - y.x);
701 (%o2) G2 := x . y - y . x
705 Ist das letzte oder einzige Argument @var{x_n} eine Liste mit einem Element,
706 akzeptiert die mit @code{define} definierte Funktion eine variable Anzahl an
710 (%i1) define (H ([L]), '(apply ("+", L)));
711 (%o1) H([L]) := apply("+", L)
716 Ist das erste Argument ein Ausdruck mit den Funktionen @code{funmake},
717 @code{arraymake} oder @code{ev} wird das Argument ausgewertet.
720 (%i1) [F : I, u : x];
722 (%i2) funmake (F, [u]);
724 (%i3) define (funmake (F, [u]), cos(u) + 1);
725 (%o3) I(x) := cos(x) + 1
726 (%i4) define (arraymake (F, [u]), cos(u) + 1);
727 (%o4) I := cos(x) + 1
729 (%i5) define (foo (x, y), bar (y, x));
730 (%o5) foo(x, y) := bar(y, x)
731 (%i6) define (ev (foo (x, y)), sin(x) - cos(y));
732 (%o6) bar(y, x) := sin(x) - cos(y)
736 @c --- 03.01.2011 DK -----------------------------------------------------------
737 @anchor{define_variable}
738 @deffn {Funktion} define_variable (@var{name}, @var{default_value}, @var{mode})
740 Definiert eine globale Variable in der Maxima-Umgebung. @code{define_variable}
741 ist n@"utzlich f@"ur das Schreiben von Paketen, die h@"aufig @"ubersetzt oder
742 kompiliert werden. @code{define_variable} f@"uhrt die folgenden Schritte aus:
746 @code{mode_declare(@var{name}, @var{mode})} deklariert den Typ der Variablen
747 @var{name} f@"ur den @"Ubersetzer. Siehe @mref{mode_declare} f@"ur eine Liste
748 der m@"oglichen Typen.
751 Hat die Variable keinen Wert, wird der Variablen der Wert @var{default_value}
755 @code{declare(@var{name}, special)} deklariert die Variable als Special.
758 Ordnet der Variablen @var{name} eine Testfunktion zu, um sicherzustellen, dass
759 der Variablen nur Werte zugewiesen werden k@"onnen.
762 Einer mit @code{define_variable} definierten Variablen, die einen anderen Typ
763 als @code{any} erhalten hat, kann die Eigenschaft @code{value_check} zugewiesen
764 werden. Die @code{value_check}-Eigenschaft ist eine Aussagefunktion mit einer
765 Variablen oder ein Lambda-Ausdruck, die aufgerufen werden, wenn der Variablen
766 ein Wert zugewiesen werden soll. Das Argument der @code{value_check}-Funktion
767 ist der Wert, den die Variable erhalten soll.
769 @code{define_variable} wertet @code{default_value} aus. Die Argumente
770 @code{name} und @code{mode} werden nicht ausgewertet. @code{define_variable}
771 gibt den aktuellen Wert der Variable @code{name} zur@"uck. Dieser ist
772 @code{default_value}, wenn der Variablen bisher kein Wert zugewiesen wurde.
776 @code{foo} ist eine boolesche Variable mit dem Wert @code{true}.
779 (%i1) define_variable (foo, true, boolean);
786 Error: foo was declared mode boolean, has value: %pi
787 -- an error. Quitting. To debug this try debugmode(true);
792 @code{bar} ist eine Variable mit dem Typ einer ganzen Zahl, die eine Primzahl
796 (%i1) define_variable (bar, 2, integer);
798 (%i2) qput (bar, prime_test, value_check);
800 (%i3) prime_test (y) := if not primep(y) then
801 error (y, "is not prime.");
802 (%o3) prime_test(y) := if not primep(y)
804 then error(y, "is not prime.")
809 #0: prime_test(y=1440)
810 -- an error. Quitting. To debug this try debugmode(true);
815 @code{baz_quux} ist eine Variable, der kein Wert zugewiesen werden kann. Der
816 Typ @code{any_check} ist vergleichbar mit @code{any}. Aber @code{any_check}
817 ruft im Gegensatz zu @code{any} den @code{value_check}-Mechanismus auf.
820 (%i1) define_variable (baz_quux, 'baz_quux, any_check);
822 (%i2) F: lambda ([y], if y # 'baz_quux then
823 error ("Cannot assign to `baz_quux'."));
824 (%o2) lambda([y], if y # 'baz_quux
826 then error(Cannot assign to `baz_quux'.))
827 (%i3) qput (baz_quux, ''F, value_check);
828 (%o3) lambda([y], if y # 'baz_quux
830 then error(Cannot assign to `baz_quux'.))
831 (%i4) baz_quux: 'baz_quux;
833 (%i5) baz_quux: sqrt(2);
834 Cannot assign to `baz_quux'.
835 #0: lambda([y],if y # 'baz_quux then
836 error("Cannot assign to `baz_quux'."))(y=sqrt(2))
837 -- an error. Quitting. To debug this try debugmode(true);
843 @c --- 03.01.2011 DK -----------------------------------------------------------
845 @deffn {Funktion} dispfun (@var{f_1}, @dots{}, @var{f_n})
846 @deffnx {Funktion} dispfun (all)
848 Zeigt die Definitionen der nutzerdefinierten Funktionen @var{f_1}, @dots{},
849 @var{f_n} an. Die Argumente k@"onnen gew@"ohnliche Funktionen, Makros,
850 Array-Funktionen oder indizierte Funktionen sein.
852 @code{dispfun(all)} zeigt die Definitionen aller nutzerdefinierten Funktionen
853 an, die in den Informationslisten @mrefcomma{functions} @mref{arrays} oder
854 @mref{macros} enthalten sind.
856 @code{dispfun} erzeugt Zwischenmarken @code{%t} f@"ur jede einzelne anzuzeigende
857 Funktion und weist die Funktionsdefinitionen den Zwischenmarken zu. Im
858 Gegensatz dazu, zeigt die Funktion @mref{fundef} die Funktionsdefinition ohne
861 @code{dispfun} wertet die Argumente nicht aus. @code{dispfun} gibt eine Liste
862 mit den Zwischenmarken zur@"uck, die zu den angezeigten Funktionen geh@"oren.
867 (%i1) m(x, y) ::= x^(-y);
870 (%i2) f(x, y) := x^(-y);
873 (%i3) g[x, y] := x^(-y);
877 (%i4) h[x](y) := x^(-y);
881 (%i5) i[8](y) := 8^(-y);
885 (%i6) dispfun (m, f, g, h, h[5], h[10], i[8]);
916 (%o12) [%t6, %t7, %t8, %t9, %t10, %t11, %t12]
920 (%o12) [m(x, y) ::= x , f(x, y) := x , g := x ,
923 h (y) := x , h (y) := --, h (y) := ---, i (y) := 8 ]
930 @c --- 15.10.2010 DK -----------------------------------------------------------
932 @deffn {Funktion} fullmap (@var{f}, @var{expr_1}, @dots{})
934 Die Funktion @code{fullmap} ist vergleichbar mit der Funktion @mrefdot{map}@w{}
935 Im Unterschied zu der Funktion @code{map} kann @code{fullmap} auf
936 verschachtelte Ausdr@"ucke angewendet werden.
938 Intern wird @code{fullmap} von Maxima f@"ur die Vereinfachung von Matrizen
939 aufgerufen. Daher k@"onnen bei der Vereinfachung von Matrizen Fehlermeldungen
940 im Zusammenhang mit @code{fullmap} auftreten, ohne dass die Funktion direkt
948 (%i2) fullmap (g, %);
949 (%o2) g(b) g(c) + g(a)
950 (%i3) map (g, %th(2));
955 @c --- 15.10.2010 DK -----------------------------------------------------------
957 @deffn {Funktion} fullmapl (@var{f}, @var{list_1}, @dots{})
959 Die Funktion @code{fullmapl} ist vergleichbar mit @mrefdot{fullmap}@w{}
960 @code{fullmapl} kann jedoch nur auf Matrizen und Listen angewendet werden kann.
965 (%i1) fullmapl ("+", [3, [4, 5]], [[a, 1], [0, -1.5]]);
966 (%o1) [[a + 3, 4], [4, 3.5]]
970 @c --- 19.11.2010 DK -----------------------------------------------------------
972 @defvr {Systemvariable} functions
973 Standardwert: @code{[]}
975 @code{functions} ist eine Informationsliste, die die vom Nutzer mit dem
976 Operator @mref{:=} oder der Funktion @mref{define} definierten Funktionen
977 enth@"alt. Siehe auch die Systemvariable @mrefdot{infolists}
979 Array-Funktionen und indizierte Funktionen werden nicht in die Informationsliste
980 @mrefcomma{functions} sondern in die Informationsliste @mref{arrays}@w{}
986 (%i1) F_1 (x) := x - 100;
987 (%o1) F_1(x) := x - 100
988 (%i2) F_2 (x, y) := x / y;
992 (%i3) define (F_3 (x), sqrt (x));
993 (%o3) F_3(x) := sqrt(x)
994 (%i4) G_1 [x] := x - 100;
997 (%i5) G_2 [x, y] := x / y;
1001 (%i6) define (G_3 [x], sqrt (x));
1002 (%o6) G_3 := sqrt(x)
1004 (%i7) H_1 [x] (y) := x^y;
1009 (%o8) [F_1(x), F_2(x, y), F_3(x)]
1011 (%o9) [G_1, G_2, G_3, H_1]
1015 @c --- 03.01.2011 DK -----------------------------------------------------------
1017 @deffn {Funktion} fundef (@var{f})
1019 Gibt die Definition der Funktion @var{f} zur@"uck.
1021 Das Argument @var{f} kann eine gew@"ohnliche Funktion, eine Makro-Funktion, eine
1022 Array-Funktion oder eine indizierte Funktion sein.
1024 @code{fundef} wertet das Argument aus. Siehe auch @mrefdot{dispfun}
1027 @c --- 03.01.2011 DK -----------------------------------------------------------
1029 @deffn {Funktion} funmake (@var{F}, [@var{arg_1}, @dots{}, @var{arg_n}])
1031 Gibt den Ausdruck @code{@var{F}(@var{arg_1}, ..., @var{arg_n})} zur@"uck. Die
1032 R@"uckgabe wird vereinfacht, aber nicht ausgewertet. Die Funktion @var{F} wird
1033 also nicht aufgerufen, auch wenn diese existiert.
1035 @code{funmake} versucht nicht, Array-Funktionen von gew@"ohnlichen Funktionen zu
1036 unterscheiden. Ist @var{F} der Name einer Array-Funktion, dann gibt
1037 @code{funmake} einen Ausdruck der Form @code{@var{F}(...)} zur@"uck.
1038 F@"ur Array-Funktionen kann die Funktion @mref{arraymake} verwendet werden.
1040 @code{funmake} wertet die Argumente aus.
1044 @code{funmake} angewendet auf eine gew@"ohnliche Funktion.
1047 (%i1) F (x, y) := y^2 - x^2;
1049 (%o1) F(x, y) := y - x
1050 (%i2) funmake (F, [a + 1, b + 1]);
1051 (%o2) F(a + 1, b + 1)
1054 (%o3) (b + 1) - (a + 1)
1057 @code{funmake} angewendet auf ein Makro.
1060 (%i1) G (x) ::= (x - 1)/2;
1062 (%o1) G(x) ::= -----
1064 (%i2) funmake (G, [u]);
1072 @code{funmake} angewendet auf eine indizierte Funktion.
1075 (%i1) H [a] (x) := (x - 1)^a;
1077 (%o1) H (x) := (x - 1)
1079 (%i2) funmake (H [n], [%e]);
1081 (%o2) lambda([x], (x - 1) )(%e)
1085 (%i4) funmake ('(H [n]), [%e]);
1093 @code{funmake} angewendet auf ein Symbol, welches keine Funktion
1097 (%i1) funmake (A, [u]);
1103 @code{funmake} wertet die Argumente, aber nicht die R@"uckgabe aus.
1106 (%i1) det(a,b,c) := b^2 -4*a*c;
1108 (%o1) det(a, b, c) := b - 4 a c
1109 (%i2) (x : 8, y : 10, z : 12);
1113 (%i4) funmake (f, [x, y, z]);
1114 (%o4) det(8, 10, 12)
1119 Maxima vereinfacht den R@"uckgabewert der Funktion @code{funmake}.
1122 (%i1) funmake (sin, [%pi / 2]);
1127 @c --- 04.01.2011 DK -----------------------------------------------------------
1129 @deffn {Funktion} lambda ([@var{x_1}, @dots{}, @var{x_m}], @var{expr_1}, @dots{}, @var{expr_n})
1130 @deffnx {Funktion} lambda ([[@var{L}]], @var{expr_1}, @dots{}, @var{expr_n})
1131 @deffnx {Funktion} lambda ([@var{x_1}, @dots{}, @var{x_m}, [@var{L}]], @var{expr_1}, @dots{}, @var{expr_n})
1133 Definiert einen Lambda-Ausdruck, der auch als anonyme Funktion bezeichnet wird,
1134 und gibt diesen zur@"uck. Die Funktion kann Argumente @var{x_1}, @dots{},
1135 @var{x_m} und optionale Argumente @var{L} haben. Die R@"uckgabe der Funktion
1136 ist das Ergebnis des Ausdrucks @var{exprn}. Ein Lambda-Ausdruck kann einer
1137 Variablen zugewiesen werden und wertet wie eine gew@"ohnliche Funktion aus. Ein
1138 Lambda-Ausdruck kann an solchen Stellen verwendet werden, wo der Name einer
1139 Funktion erwartet wird.
1141 Wird der Lambda-Ausdruck ausgewertet, werden lokale Variablen @var{x_1},
1142 @dots{}, @var{x_m} erzeugt. @code{lambda} kann innerhalb von Bl@"ocken oder
1143 anderen Lambda-Ausdr@"ucken verwendet werden. Mit jeder @code{block}-Anweisung
1144 oder jedem Lambda-Ausdruck werden erneut lokale Variablen erzeugt. Die lokalen
1145 Variablen sind jeweils global zu jeder eingeschlossenen @code{block}-Anweisung
1146 oder zu jedem eingeschlossenen Lambda-Ausdruck. Ist eine Variable innerhalb von
1147 @code{block} oder @code{lambda} nicht lokal, hat sie den Wert der
1148 n@"achst h@"oheren Anweisung, die ihr einen Wert gibt oder den globalen Wert der
1151 Nachdem die lokalen Variablen erzeugt sind, werden die Ausdr@"ucke @var{expr_1},
1152 @dots{}, @var{expr_n} nacheinander ausgewertet. Die Systemvariable @code{%%},
1153 welche das Ergebnis eines vorhergehendes Ausdrucks enth@"alt, kann verwendet
1154 werden. In einem Lambda-Ausdruck k@"onnen die Anweisungen @mref{catch} und
1155 @mref{throw} verwendet werden.
1157 Die @mref{return}-Anweisung kann in einem Lambda-Ausdruck nur verwendet werden,
1158 wenn sie von einer @code{block}-Anweisung eingeschlossen wird. Die
1159 @code{return}-Anweisung definiert jedoch den R@"uckgabewert des Blocks und nicht
1160 des Lambda-Ausdrucks. Auch die @mref{go}-Anweisung kann in einem
1161 Lambda-Ausdrucks nur in einem Block verwendet werden.
1163 @code{lambda} wertet die Argumente nicht aus.
1167 Ein Lambda-Ausdruck kann einer Variablen zugewiesen werden und wie eine
1168 gew@"ohnliche Funktion ausgewertet werden.
1171 (%i1) f: lambda ([x], x^2);
1173 (%o1) lambda([x], x )
1179 Ein Lamda-Ausdruck kann an Stellen verwendet werden, wo der Name einer Funktion
1183 (%i3) lambda ([x], x^2) (a);
1186 (%i4) apply (lambda ([x], x^2), [a]);
1189 (%i5) map (lambda ([x], x^2), [a, b, c, d, e]);
1191 (%o5) [a , b , c , d , e ]
1194 Die Argumente sind lokale Variablen. Andere Variablen sind globale Variablen.
1195 Globale Variablen werden zu dem Zeitpunkt ausgewertet, wenn der Lambda-Ausdruck
1201 (%i8) g: lambda ([a], a*b);
1202 (%o8) lambda([a], a b)
1208 (%i11) g2: lambda ([a], a*''b);
1209 (%o11) lambda([a], a %gamma)
1217 Lambda-Ausdr@"ucke k@"onnen verschachtelt werden. Lokale Variablen eines
1218 @"au@ss{}eren Lambda-Ausdrucks sind global zu den enthaltenen
1219 Lambda-Ausdr@"ucken, au@ss{}er diese werden wieder als lokal erkl@"art.
1222 (%i14) h: lambda ([a, b], h2: lambda ([a], a*b), h2(1/2));
1224 (%o14) lambda([a, b], h2 : lambda([a], a b), h2(-))
1226 (%i15) h(%pi, %gamma);
1232 Da @code{lambda} die Argumente nicht auswertet, definiert der unten angegebene
1233 Ausdruck @code{i} keine Funktion "multipliziere mit @code{a}". Solch eine
1234 Funktion kann mit Hilfe der Funktion @mref{buildq} definiert werden.
1237 (%i16) i: lambda ([a], lambda ([x], a*x));
1238 (%o16) lambda([a], lambda([x], a x))
1240 (%o17) lambda([x], a x)
1241 (%i18) i2: lambda([a], buildq([a: a], lambda([x], a*x)));
1242 (%o18) lambda([a], buildq([a : a], lambda([x], a x)))
1245 (%o19) lambda([x], -)
1247 (%i20) i2(1/2)(%pi);
1253 Ein Lambda-Ausdruck kann eine variable Anzahl an Argumenten haben, wenn das
1254 letzte Argument eine Liste mit einem Element ist.
1257 (%i1) f : lambda ([aa, bb, [cc]], aa * cc + bb);
1258 (%o1) lambda([aa, bb, [cc]], aa cc + bb)
1259 (%i2) f (foo, %i, 17, 29, 256);
1260 (%o2) [17 foo + %i, 29 foo + %i, 256 foo + %i]
1261 (%i3) g : lambda ([[aa]], apply ("+", aa));
1262 (%o3) lambda([[aa]], apply(+, aa))
1263 (%i4) g (17, 29, x, y, z, %e);
1264 (%o4) z + y + x + %e + 46
1268 @c --- 03.01.2011 DK -----------------------------------------------------------
1270 @deffn {Funktion} map (@var{f}, @var{expr_1}, @dots{}, @var{expr_n})
1272 Gibt einen Ausdruck zur@"uck, dessen Hauptoperator derselbe ist, wie der der
1273 Argumente @var{expr_1}, @dots{}, @var{expr_n} aber dessen Operanden das Ergebnis
1274 der Anwendung des Operators @var{f} auf die Teilausdr@"ucke des Ausdrucks sind.
1275 @var{f} ist entweder der Name einer Funktion mit @math{n} Argumenten oder
1276 ein Lambda-Ausdruck mit @math{n} Argumenten.
1278 Hat @mref{maperror} den Wert @code{false}, wird die Anwendung der Funktion
1279 @var{f} gestoppt, (1) wenn die Anwendung auf den k@"urzesten Ausdruck
1280 @var{expr_i} beendet ist und die Ausdr@"ucke nicht alle dieselbe L@"ange haben
1281 oder (2) wenn die Ausdr@"ucke @var{expr_i} einen verschiedenen Typ haben. Hat
1282 @code{maperror} den Wert @code{true} wird in den obigen F@"allen eine
1283 Fehlermeldung ausgegeben.
1285 @c TODO: NICHT UEBERSETZT
1286 @c One of the uses of this function is to @code{map} a function (e.g.
1287 @c @code{partfrac}) onto each term of a very large expression where it
1288 @c ordinarily wouldn't be possible to use the function on the entire expression
1289 @c due to an exhaustion of list storage space in the course of the computation.
1291 @c IN THESE EXAMPLES, SPELL OUT WHAT IS THE MAIN OPERATOR AND SHOW HOW THE
1292 @c RESULT FOLLOWS FROM THE DESCRIPTION STATED IN THE FIRST PARAGRAPH
1297 (%i1) map(f,x+a*y+b*z);
1298 (%o1) f(b z) + f(a y) + f(x)
1299 (%i2) map(lambda([u],partfrac(u,x)),x+1/(x^3+4*x^2+5*x+2));
1301 (%o2) ----- - ----- + -------- + x
1304 (%i3) map(ratsimp, x/(x^2+x)+(y^2+y)/y);
1308 (%i4) map("=",[a,b],[-0.5,3]);
1309 (%o4) [a = - 0.5, b = 3]
1315 @c --- 03.01.2011 DK -----------------------------------------------------------
1317 @deffn {Funktion} mapatom (@var{expr})
1319 Gibt den Wert @code{true} zur@"uck, wenn der Ausdruck @var{expr} von Funktionen
1320 die auf Argumente angewendete werden, als ein Atom betrachtet wird. Als Atome
1321 werden Zahlen, einschlie@ss{}lich rationaler Zahlen und gro@ss{}er
1322 Gleitkommazahlen, Symbole und indizierte Symbole betrachtet.
1325 @c --- 03.01.2011 DK -----------------------------------------------------------
1327 @defvr {Optionsvariable} maperror
1328 Standardwert: @code{true}
1330 Hat @code{maperror} den Wert @code{false}, wird die Anwendung der Funktion
1331 @var{f} gestoppt, (1) wenn die Anwendung auf den k@"urzesten Ausdruck
1332 @var{expr_i} beendet ist und die Ausdr@"ucke nicht alle dieselbe L@"ange haben
1333 oder (2) wenn die Ausdr@"ucke @var{expr_i} einen verschiedenen Typ haben. Hat
1334 @code{maperror} den Wert @code{true} wird in den obigen F@"allen eine
1335 Fehlermeldung ausgegeben.
1338 @c --- 03.01.2011 DK -----------------------------------------------------------
1340 @defvr {Optionsvariable} mapprint
1341 Standardwert: @code{true}
1343 Hat @code{mapprint} den Wert @code{true}, werden verschiedene Informationen von
1344 den Funktionen @mrefcomma{map} @mref{maplist} und @mref{fullmap} ausgegeben.
1345 Dies ist der Fall, wenn die Funktion @code{map} die Funktion @code{apply}
1346 aufruft oder wenn f@"ur die Funktion @code{map} die Argumente eine verschiedene
1349 Hat @code{mapprint} den Wert @code{false}, werden diese Meldungen unterdr@"uckt.
1352 @c --- 03.01.2011 DK -----------------------------------------------------------
1354 @deffn {Funktion} maplist (@var{f}, @var{expr_1}, @dots{}, @var{expr_n})
1356 Wendet die Funktion @var{f} auf die Ausdr@"ucke @var{expr_1}, @dots{},
1357 @var{expr_n} an und gibt das Ergebnis als eine Liste zur@"uck. @var{f} ist der
1358 Name einer Funktion oder ein lambda-Ausdruck.
1360 Im Unterschied zu @code{maplist} gibt die Funktion @mref{map} einen Ausdruck
1361 zur@"uck, der denselben Hauptoperator wie die Ausdr@"ucke @var{expr_i} hat.
1364 @c --- 03.01.2011 DK -----------------------------------------------------------
1366 @deffn {Funktion} outermap (@var{f}, @var{a_1}, @dots{}, @var{a_n})
1368 Wendet die Funktion @var{f} auf jedes Element des @"au@ss{}eren Produktes der
1369 Argumente @var{a_1} @code{x} @var{a_2} @code{x} @dots{} @code{x} @var{a_n} an.
1371 @var{f} ist der Name einer Funktion mit @math{n} Argumenten oder ein
1372 Lambda-Ausdruck mit @math{n} Argumenten. Jedes Argument @var{a_k} kann eine
1373 Liste oder verschachtelte Liste, eine Matrix oder irgendein anderer Ausdruck
1376 @c TODO: OBIGE UEBERSETZUNG FEHLEN
1377 @c Note that the effect of @code{outermap} is different from that of applying
1378 @c @var{f} to each one of the elements of the outer product returned by
1379 @c @code{cartesian_product}. @code{outermap} preserves the structure of the
1380 @c arguments in the return value, while @code{cartesian_product} does not.
1382 @code{outermap} wertet die Argumente aus.
1384 Siehe auch @mrefcomma{map} @mref{maplist} und @mrefdot{apply}
1388 Einfaches Beispiel f@"ur @code{outermap}. Die Funktion @code{F} ist
1392 (%i1) outermap(F, [a, b, c], [1, 2, 3]);
1393 (%o1) [[F(a, 1), F(a, 2), F(a, 3)], [F(b, 1), F(b, 2), F(b, 3)],
1394 [F(c, 1), F(c, 2), F(c, 3)]]
1395 (%i2) outermap(F, matrix([a, b],[c, d]), matrix([1, 2],[3, 4]));
1396 [ [ F(a, 1) F(a, 2) ] [ F(b, 1) F(b, 2) ] ]
1398 [ [ F(a, 3) F(a, 4) ] [ F(b, 3) F(b, 4) ] ]
1400 [ [ F(c, 1) F(c, 2) ] [ F(d, 1) F(d, 2) ] ]
1402 [ [ F(c, 3) F(c, 4) ] [ F(d, 3) F(d, 4) ] ]
1403 (%i3) outermap (F, [a, b], x, matrix ([1, 2], [3, 4]));
1404 [ F(a, x, 1) F(a, x, 2) ] [ F(b, x, 1) F(b, x, 2) ]
1406 [ F(a, x, 3) F(a, x, 4) ] [ F(b, x, 3) F(b, x, 4) ]
1407 (%i4) outermap (F, [a, b], matrix ([1, 2]), matrix ([x], [y]));
1408 [ [ F(a, 1, x) ] [ F(a, 2, x) ] ]
1410 [ [ F(a, 1, y) ] [ F(a, 2, y) ] ]
1411 [ [ F(b, 1, x) ] [ F(b, 2, x) ] ]
1413 [ [ F(b, 1, y) ] [ F(b, 2, y) ] ]
1414 (%i5) outermap ("+", [a, b, c], [1, 2, 3]);
1415 (%o5) [[a + 1, a + 2, a + 3], [b + 1, b + 2, b + 3],
1416 [c + 1, c + 2, c + 3]]
1419 Das Beispiel zeigt die R@"uckgabe der Funktion @code{outermap} detaillierter.
1420 Das erste, zweite und dritte Argument sind eine Matrix, eine Liste und eine
1421 Matrix. Der R@"uckgabewert ist eine Matrix. Jedes Element der Matrix ist eine
1422 Liste und jedes Element der Liste ist eine Matrix.
1425 (%i1) arg_1 : matrix ([a, b], [c, d]);
1429 (%i2) arg_2 : [11, 22];
1431 (%i3) arg_3 : matrix ([xx, yy]);
1433 (%i4) xx_0 : outermap(lambda([x, y, z], x / y + z), arg_1,
1436 [ [[ xx + -- yy + -- ], [ xx + -- yy + -- ]] ]
1437 [ [ 11 11 ] [ 22 22 ] ]
1440 [ [[ xx + -- yy + -- ], [ xx + -- yy + -- ]] ]
1441 [ [ 11 11 ] [ 22 22 ] ]
1443 [ [[ xx + -- yy + -- ], [ xx + -- yy + -- ]] ]
1444 [ [ 11 11 ] [ 22 22 ] ]
1447 [ [[ xx + -- yy + -- ], [ xx + -- yy + -- ]] ]
1448 [ [ 11 11 ] [ 22 22 ] ]
1449 (%i5) xx_1 : xx_0 [1][1];
1451 (%o5) [[ xx + -- yy + -- ], [ xx + -- yy + -- ]]
1453 (%i6) xx_2 : xx_0 [1][1] [1];
1455 (%o6) [ xx + -- yy + -- ]
1457 (%i7) xx_3 : xx_0 [1][1] [1] [1][1];
1461 (%i8) [op (arg_1), op (arg_2), op (arg_3)];
1462 (%o8) [matrix, [, matrix]
1463 (%i9) [op (xx_0), op (xx_1), op (xx_2)];
1464 (%o9) [matrix, [, matrix]
1467 @code{outermap} erh@"alt die Struktur der Argumente im Ergebnis. Die Funktion
1468 @code{cartesian_product} erh@"alt die Struktur der Argumente nicht.
1471 (%i1) outermap (F, [a, b, c], [1, 2, 3]);
1472 (%o1) [[F(a, 1), F(a, 2), F(a, 3)], [F(b, 1), F(b, 2), F(b, 3)],
1473 [F(c, 1), F(c, 2), F(c, 3)]]
1474 (%i2) setify (flatten (%));
1475 (%o2) @{F(a, 1), F(a, 2), F(a, 3), F(b, 1), F(b, 2), F(b, 3),
1476 F(c, 1), F(c, 2), F(c, 3)@}
1477 (%i3) map(lambda([L], apply(F, L)),
1478 cartesian_product(@{a, b, c@}, @{1, 2, 3@}));
1479 (%o3) @{F(a, 1), F(a, 2), F(a, 3), F(b, 1), F(b, 2), F(b, 3),
1480 F(c, 1), F(c, 2), F(c, 3)@}
1481 (%i4) is (equal (%, %th (2)));
1486 @c --- 19.04.2011 DK -----------------------------------------------------------
1487 @anchor{remfunction}
1488 @deffn {Funktion} remfunction (@var{f_1}, @dots{}, @var{f_n})
1489 @deffnx {Funktion} remfunction (all)
1491 Hebt die Bindung der Symbole @var{f_1}, @dots{}, @var{f_n} an ihre
1492 Funktionsdefinitionen auf. Die Argumente k@"onnen die Namen von Funktionen
1493 sein, die mit dem Operator @mref{:=} oder der Funktion @mref{define} definiert
1494 wurden sowie Makro-Funktionen, die mit dem Operator @mref{::=} definiert wurden.
1496 @code{remfunction(all)} entfernt alle Bindungen von Funktionsdefinitionen.
1498 @code{remfunction} gibt eine Liste mit den Symbolen zur@"uck, die von ihren
1499 Funktionsdefinitionen entbunden wurden. @code{false} wird f@"ur die Symbole
1500 zur@"uckgegeben, f@"ur die es keine Funktionsdefinition gibt.
1502 @code{remfunction} wertet die Argumente nicht aus.
1504 @code{remfunction} kann nicht auf Array-Funktionen und indizierte Funktionen
1505 angewendet werden. F@"ur diese Funktionen kann @mref{remarray} verwendet
1509 @c --- 03.01.2011 DK -----------------------------------------------------------
1511 @deffn {Funktion} scanmap (@var{f}, @var{expr})
1512 @deffnx {Funktion} scanmap (@var{f}, @var{expr}, bottomup)
1514 Wendet die Funktion @var{f} rekursiv auf alle Teilausdr@"ucke in @var{expr} an.
1515 Dies kann zum Beispiel verwendet werden, um einen Ausdruck vollst@"andig zu
1521 (%i1) exp:(a^2+2*a+1)*y + x^2$
1522 (%i2) scanmap(factor,exp);
1528 (%i3) scanmap(factor,expand(exp));
1530 (%o3) a y + 2 a y + y + x
1533 Ein weiteres Beispiel f@"ur die Anwendung einer Funktion auf alle
1537 (%i4) expr : u*v^(a*x+b) + c$
1538 (%i5) scanmap('f, expr);
1539 f(f(f(a) f(x)) + f(b))
1540 (%o5) f(f(f(u) f(f(v) )) + f(c))
1543 @code{scanmap (@var{f}, @var{expr}, bottomup)} wendet die Funktion @var{f}
1544 Bottom-up auf den Ausdruck @var{expr} an.
1546 @c TODO: BESSERES BEISPIEL UM DEN UNTERSCHIED ZU ZEIGEN.
1550 f(a*x+b) -> f(f(a*x)+f(b)) -> f(f(f(a)*f(x))+f(b))
1551 scanmap(f,a*x+b,bottomup) -> f(a)*f(x)+f(b)
1552 -> f(f(a)*f(x))+f(b) ->
1553 f(f(f(a)*f(x))+f(b))
1557 @c --- End of file Function.de.texi --------------------------------------------