Anterior: Operadores de asignación, Subir: Operadores [Índice general][Índice]
Declara op como operador infijo.
Un operador infijo es una función de dos argumentos,
con el nombre de la función escrito entre sus argumentos.
Por ejemplo, el operador de sustracción -
es un operador infijo.
infix (op)
declara op como operador infijo
con fuerzas de ligadura por la izquierda y por la derecha iguales a 180, que es el valor por defecto,
y partes izquierda y derecha iguales a any
.
infix (op, lbp, rbp)
declara op como operador infijo
con fuerzas de ligadura por la izquierda y por la derecha declaradas en los argumentos, siendo las partes izquierda y derecha iguales a any
.
infix (op, lbp, rbp, lpos, rpos, pos)
declara op como operador infijo con fuerzas de ligadura por la
izquierda y por la derecha, junto con los tipos de expresiones correspondientes
a lpos, rpos y pos, que son el operando de la izquierda,
el de la derecha y el operador del resultado; los tipos reconocidos son:
expr
, clause
y any
, que indican expresión algebraica,
expresión booleana o cualquier otra, respectivamente. Maxima puede detectar
algunos errores sintácticos comparando los tipos declarados con los de la expresión
actual.
La precedencia de op con respecto a otros operadores deriva de las fuerzas de ligadura de los operadores en cuestión. Si las fuerzas de ligadura a izquierda y derecha de op son ambas mayores que las fuerzas de ligadura a izquierda y derecha de otro operador, entonces op tiene preferencia sobre el otro operador. Si las fuerzas de ligadura no son ambas mayores o menores, se aplican otras relaciones más complejas.
La asociatividad de op depende de las fuerzas de ligadura. Una mayor fuerza de ligadura a la izquierda (lbp) implica que op sea evaluado antes que otros operadores a su izquierda en la expresión, mientras que mayor fuerza de ligadura a la derecha (rbp) implica que op sea evaluado antes que otros operadores a su derecha en la expresión. Así, si lbp es mayor, op es asociativo por la derecha, mientras que si rbp es mayor, op es asociativo por la izquierda.
Véase también Syntax
.
Ejemplos:
Si las fuerzas de ligadura a izquierda y derecha de op son ambas mayores que las fuerzas de ligadura a izquierda y derecha de otro operador, entonces op tiene preferencia sobre el otro operador.
(%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)
Mayor lbp hace a op asociativo por la derecha, mientras que mayor rbp hace a op asociativo por la izquierda.
(%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 puede detectar algunos errores sintácticos comparando los tipos declarados con los de la expresión actual.
(%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
Declara un operador "matchfix" con delimitadores a la izquierda y derecha, ldelimiter y rdelimiter, respectivamente. Los delimitadores son cadenas alfanuméricas.
Un operador "matchfix" es una función con un número arbitrario de argumentos, de manera que los argumentos se presentan entre los delimitadores de la izquierda y derecha. Los delimitadores pueden ser cualquier tipo de cadena, en tanto que el analizador sintáctico pueda distinguirlos de los operandos y de expresiones con operadores. En la práctica esto excluye delimitadores como %
, ,
, $
y ;
, necesitando aislar los delimitadores con espacios en blanco. El delimitador de la derecha puede ser igual o diferente del de la izquierda.
Un delimitador de la izquierda sólo puede asociarse con un único delimitador de la derecha; dos operadores "matchfix" diferentes no pueden tener el mismo delimitador por la izquierda.
Un operador ya existente puede declararse como operador "matchfix" sin necesidad de que cambie el resto de propiedades. En particular, los operadores de Maxima tales como la suma +
pueden ser declarados como "matchfix".
La llamada matchfix (ldelimiter, rdelimiter, arg_pos, pos)
declara el argumento arg_pos y el resultado pos, así
como los delimitadores ldelimiter y rdelimiter.
Los argumentos arg_pos y pos son tipos de funciones,
reconociéndose como tales: expr
, clause
y any
,
los cuales hacen referencia a una expresión algebraica, booleana o
de cualquier otro tipo, respectivamente.
Maxima puede detectar ciertos errores sintácticos comparando el
tipo de expresión declarado con el de la expresión actual.
La función que ejecutará una operación "matchfix" será una típica función definida por el usuario. La función de operador se define por el método habitual con :=
o define
. Los argumentos pueden escribirse entre los delimitadores, o con el delimitador izquierdo como una cadena precedida de apóstrofo y seguidamente los argumentos entre paréntesis. La llamada dispfun (ldelimiter)
muestra la definición de la función.
El único operador "matchfix" de Maxima es el constructor de listas [ ]
. Los paréntesis ( )
y las comillas dobles " "
actúan como operadores "matchfix", pero son tratados como operadores "matchfix" por el analizador sintáctico de Maxima.
Ejemplos:
(%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~
(%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
Un operador n-ario denota una función con un número arbitrario de
argumentos entre los que se intercal el símbolo del operador,
como en A+B+C
. La instrucción nary("x")
declara x
como operador n-ario. Las funciones se pueden declarar como n-arias;
de modo que si se ejecuta declare(j,nary)
, el simplificador
transforma j(j(a,b),j(c,d))
en j(a, b, c, d)
.
Los operadores no-fijos se utilizan para definir funciones sin argumentos.
La mera presencia de tal operador en una instrucción hará que se
evalúe la función correspondiente. Por ejemplo, cuando se teclea exit;
para salir de una interrupción de Maxima, exit
se comporta como una
función no-fija. La instrucción nofix("x")
declara x
como operador no-fijo.
Anterior: Operadores de asignación, Subir: Operadores [Índice general][Índice]