Vorige: Einführung in nutzerdefinierte Operatoren, Nach oben: Nutzerdefinierte Operatoren [Inhalt][Index]
Deklariert op als einen Infix-Operator. Ein Infix-Operator hat eine
Funktionsdefinition mit zwei Argumenten. Der Infix-Operator steht zwischen den
Operanden. Zum Beispiel ist die Subtraktion -
ein Infix-Operator.
infix(op)
deklariert op als einen Infix-Operator mit einem
links- und rechtsseitigen Vorrang von jeweils 180.
infix(op, lbp, rbp)
deklariert op als einen
Infix-Operator mit den angegebenen Werten für den links- und rechtsseitigen
Vorrang.
infix(op, lbp, rbp, lpos, rpos, pos)
deklariert op als einen Infix-Operator mit den angegebenen
Vorrängen sowie den Wortarten lpos, rpos und pos für
den linken und den rechten Operanden sowie das Ergebnis des Operators.
Beispiele:
Sind die rechtsseitigen und linksseitigen Vorränge eines Operators op größer als die entsprechenden Vorränge eines anderen Operators, dann hat der Operator op Vorrang.
(%i1) :lisp (get '$+ 'lbp) 100 (%i1) :lisp (get '$+ 'rbp) 100 (%i1) infix ("##", 101, 101); (%o1) ## (%i2) "##"(a, b) := sconcat("(", a, ",", b, ")"); (%o2) (a ## b) := sconcat("(", a, ",", b, ")") (%i3) 1 + a ## b + 2; (%o3) (a,b) + 3 (%i4) infix ("##", 99, 99); (%o4) ## (%i5) 1 + a ## b + 2; (%o5) (a+1,b+2)
Ein größerer linksseitige Vorrang lbp bewirkt, dass der Operator op rechts-assoziativ ist. Ein größerer rechtsseitiger Vorrang macht dagegen den Operator op links-assoziativ.
(%i1) infix ("##", 100, 99); (%o1) ## (%i2) "##"(a, b) := sconcat("(", a, ",", b, ")")$ (%i3) foo ## bar ## baz; (%o3) (foo,(bar,baz)) (%i4) infix ("##", 100, 101); (%o4) ## (%i5) foo ## bar ## baz; (%o5) ((foo,bar),baz)
Maxima kann Syntaxfehler beim Einlesen eines Ausdrucks feststellen, wenn der eingelesene Operand nicht die für den Operator definierte Wortart hat.
(%i1) infix ("##", 100, 99, expr, expr, expr); (%o1) ## (%i2) if x ## y then 1 else 0; Incorrect syntax: Found algebraic expression where logical expression expected if x ## y then ^ (%i2) infix ("##", 100, 99, expr, expr, clause); (%o2) ## (%i3) if x ## y then 1 else 0; (%o3) if x ## y then 1 else 0
Deklariert einen Matchfix-Operator mit dem linksseitigen Begrenzungszeichen ldelimiter und dem rechtsseitigen Begrenzungszeichen rdelimiter.
Ein Matchfix-Operator hat eine beliebige Anzahl an Argumenten, die zwischen
dem linksseitigen und dem rechtsseitigen Begrenzungszeichen stehen. Das
Begrenzungszeichen kann eine beliebige Zeichenkette sein. Einige Zeichen wie
%
, ,
, $
und ;
können nicht als Begrenzungszeichen
definiert werden.
Ein linksseitiges Begrenzungszeichen kann nicht verschiedene rechtsseitige Begrenzungszeichen haben.
Maxima-Operatoren können als Matchfix-Operatoren definiert werden, ohne
dass sich die sonstigen Operatoreigenschaften ändern. So kann zum Beispiel
der Operator +
als Matchfix-Operator definiert werden.
matchfix(ldelimiter, rdelimiter, arg_pos, pos)
definiert die Wortarten für die Argumente arg_pos und das Ergebnis
pos sowie das linksseitige ldelimiter und rechtsseitige
rdelimiter Begrenzungszeichen.
Die zu einem Matchfix-Operator zugehörige Funktion kann jede
nutzerdefinierte Funktion sein, die mit :=
oder define
definiert
wird. Die Definition der Funktion kann mit dispfun(ldelimiter)
ausgegeben werden.
Maxima kennt nur den Operator für Listen [ ]
als Matchfix-Operator.
Klammern ( )
und Anführungszeichen " "
arbeiten wie
Matchfix-Operatoren, werden aber vom Parser nicht als Matchfix-Operatoren
behandelt.
matchfix
wertet die Argumente aus. matchfix
gibt das erste
Argument ldelimiter als Ergebnis zurück.
Beispiele:
Begrenzungszeichen können eine beliebige Zeichenkette sein.
(%i1) matchfix ("@@", "~"); (%o1) @@ (%i2) @@ a, b, c ~; (%o2) @@a, b, c~ (%i3) matchfix (">>", "<<"); (%o3) >> (%i4) >> a, b, c <<; (%o4) >>a, b, c<< (%i5) matchfix ("foo", "oof"); (%o5) foo (%i6) foo a, b, c oof; (%o6) fooa, b, coof (%i7) >> w + foo x, y oof + z << / @@ p, q ~; >>z + foox, yoof + w<< (%o7) ---------------------- @@p, q~
Matchfix-Operatoren können für nutzerdefinierte Funktionen definiert werden.
(%i1) matchfix ("!-", "-!"); (%o1) "!-" (%i2) !- x, y -! := x/y - y/x; x y (%o2) !-x, y-! := - - - y x (%i3) define (!-x, y-!, x/y - y/x); x y (%o3) !-x, y-! := - - - y x (%i4) define ("!-" (x, y), x/y - y/x); x y (%o4) !-x, y-! := - - - y x (%i5) dispfun ("!-"); x y (%t5) !-x, y-! := - - - y x (%o5) done (%i6) !-3, 5-!; 16 (%o6) - -- 15 (%i7) "!-" (3, 5); 16 (%o7) - -- 15
nary(op)
definiert einen N-ary
-Operator op mit einem
linksseitigen Vorrang von 180. Der rechtsseitige Vorrang wird nicht benötigt.
nary(op, bp, arg_pos, pos)
definiert einen
N-ary
-Operator op mit einem rechtsseitigen Vorrang von bp und
der Wortart arg_pos für den Operanden und der Wortart pos für das
Ergebnis.
Ein N-ary
-Operator ist ein Operator, der eine beliebige Anzahl an
Argumenten haben kann. Die Argumente werden durch den Operator voneinander
getrennt, so ist zum Beispiel +
ein N-ary
-Operator und
A+B+C
.
Im Unterschied zur Definition eines Operators kann eine Funktion f
auch
als nary
mit der Funktion declare
deklariert werden. Die
Deklaration hat Auswirkung auf die Vereinfachung der Funktion. Zum Beispiel
wird ein Ausdruck j(j(a,b),j(c,d)
zu j(a,b,c,d)
vereinfacht.
nofix(op)
definiert den Operator op als einen Nofix-Operator.
nofix(op, pos)
definiert einen Nofix-Operator mit der
Wortart pos für das Ergebnis.
Nofix-Operatoren sind Operatoren, die kein Argument haben. Tritt ein solcher
Operator allein auf, wird die dazugehörige Funktion ausgewertet. Zum Beispiel
beendet die Funktion quit()
eine Maxima-Sitzung. Wird diese Funktion
mit nofix("quit")
als ein Nofix-Operator definiert, genügt die
Eingabe von quit
, um eine Maxima-Sitzung zu beenden.
postfix (op)
definiert einen Postfix-Operator op.
postfix (op, lbp, lpos, pos)
definiert einen
Postfix-Operator op mit einem linksseitigem Vorrang von lbp sowie
den Wortarten lpos für den Operanden und pos für das Ergebnis.
Ein Postfix-Operator hat einen Operanden, der dem Operator vorangestellt ist.
Ein Beispiel ist der !
-Operator mit 3!
. Die Funktion
postfix("x")
erweitert die Maxima-Syntax um den Postfix-Operator
x
.
prefix (op)
definiert einen Prefix-Operator op.
prefix (op, lbp, lpos, pos)
definiert einen
Prefix-Operator op mit einem rechtsseitigem Vorrang von rbp sowie
den Wortarten rpos für den Operanden und pos für das Ergebnis.
Ein Prefix-Operator hat einen Operanden, der dem Operator nachfolgt. Mit
prefix("x")
wird die Maxima-Syntax um einen Prefix-Operator x
erweitert.
Vorige: Einführung in nutzerdefinierte Operatoren, Nach oben: Nutzerdefinierte Operatoren [Inhalt][Index]