2 @c versao pt_BR baseada no md5sum abaixo:
3 @c 735c640397e886d271d4de87d783df89 Operators.texi
6 * Introduction to operators::
7 * Arithmetic operators::
8 * Relational operators::
10 * Operators for Equations::
11 * Assignment operators::
12 * User defined operators::
15 @c -----------------------------------------------------------------------------
16 @node Introduction to operators, Arithmetic operators, Operators, Operators
17 @section Introduction to operators
18 @c -----------------------------------------------------------------------------
20 @'{E} poss@'{i}vel definir novos operadores com determinada preced@^{e}ncia, para remover a defini@,{c}@~{a}o de
21 operadores j@'{a} existentes, ou para redefinir a precedencia de operadores existentes. Um
22 operador pode ser un@'{a}rio pr@'{e}fixado ou un@'{a}rio p@'{o}sfixado, bin@'{a}rio infixo, en@'{a}rio infixo,
23 matchfix, ou nofix. "Matchfix" significa um par de s@'{i}mbolos que abra@,{c}a seu argumento
24 ou seus argumentos, e "nofix" significa um operador sem argumentos.
25 Como exemplo de diferentes tipos de operadores, existe o seguinte.
28 @item un@'{a}rio prefixado
29 nega@,{c}@~{a}o @code{- a}
30 @item un@'{a}rio p@'{o}sfixado
32 @item bin@'{a}rio infixo
33 exponencia@,{c}@~{a}o @code{a^b}
34 @item en@'{a}rio infixo
35 adi@,{c}@~{a}o @code{a + b}
37 os colch@^{e}tes envolvendo uma lista @code{[a, b]}
40 (N@~{a}o existe operadores internos "nofix"; para um exemplo de tal operador,
43 O mecanismo para definir um novo operador @'{e} direto. @'{E} somente necess@'{a}rio
44 declarar uma fun@,{c}@~{a}o como um operador; a fun@,{c}@~{a}o operador pode ou n@~{a}o
47 Um exemplo de operadores definidos pelo usu@'{a}rio @'{e} o seguinte. Note que que a chamada expl@'{i}cita de
48 da fun@,{c}@~{a}o @code{"dd" (a)} @'{e} equivalente a @code{dd a}, da mesma forma
49 @code{"<-" (a, b)} @'{e} equivalente a @code{a <- b}. Note tamb@'{e}m que as fun@,{c}@~{o}es
50 @code{"dd"} e @code{"<-"} n@~{a}o est@~{a}o definidas no exemplo.
58 @c "<-" (a, "dd" (b));
71 (%i6) "<-" (a, "dd" (b));
75 As fun@,{c}@~{o}es do Maxima que definem novos operadores s@~{a}o sumarizadas na tabela adiante,
76 equilibrando (padr@~{a}o) poder associado @`{a} esquerda e poder associada @`{a} direita (left binding power, right binding power, lbp e rbp, respectivamente).
77 @c REWORK FOLLOWING COMMENT.
78 @c IT'S NOT CLEAR ENOUGH, GIVEN THAT IT'S FAIRLY IMPORTANT
79 (For@,{c}a associada determina a preced@^{e}ncia do operador. Todavia, uma vez que o poder associado @`{a} esquerda e o poder
80 associado @`{a} direita podem ser diferentes, associar poder @'{e} um pouco mais complicado que
81 preced@^{e}ncia.) Alguma das fun@,{c}@~{o}es de defini@,{c}@~{a}o de opera@,{c}@~{a}o recebem argumentos
82 adicionais; veja as descri@,{c}@~{o}es de fun@,{c}@~{a}o para detalhes.
84 @c MAKE ANCHORS FOR ALL 6 FUNCTIONS AND CHANGE @code TO @ref ACCORDINGLY
95 (poder associado n@~{a}o aplic@'{a}vel)
97 (poder associado n@~{a}o aplic@'{a}vel)
100 Para compara@,{c}@~{a}o, aqui est@'{a} alguns operadores internos e seus poderes associados
132 As fun@,{c}@~{o}es @mref{remove}
134 removem propriedades de operador de um @'{a}tomo.
135 O comando @code{remove ("@var{a}", op)} remove as propriedades de operador de @var{a}.
136 O comando @code{kill ("@var{a}")} remove todas as propriedades de @var{a}, incluindo as
137 propriedades de operador. Note que o nome do operador deve estar entre
140 @c MAYBE COPY THIS EXAMPLE TO remove AND/OR kill
143 @c "##" (a, b) := a^b;
145 @c remove ("##", op);
157 (%i2) "##" (a, b) := a^b;
162 (%i4) remove ("##", op);
165 Incorrect syntax: # is not a prefix operator
177 Incorrect syntax: # is not a prefix operator
185 @category{Operadores} @category{Sintaxe}
188 @c -----------------------------------------------------------------------------
189 @node Arithmetic operators, Relational operators, Introduction to operators, Operators
190 @section Arithmetic operators
191 @c -----------------------------------------------------------------------------
193 @c -----------------------------------------------------------------------------
199 @fnindex Adi@,{c}@~{a}o
200 @fnindex Subtra@,{c}@~{a}o
201 @fnindex Multiplica@,{c}@~{a}o
203 @fnindex Exponencia@,{c}@~{a}o
211 Os s@'{i}mbolos @code{+} @code{*} @code{/} e @code{^} representam adi@,{c}@~{a}o,
212 multiplica@,{c}@~{a}o, divis@~{a}o, e exponencia@,{c}@~{a}o, respectivamente. Os nomes desses
213 operadores s@~{a}o @code{"+"} @code{"*"} @code{"/"} e @code{"^"}, que podem aparecer
214 onde o nome de uma fun@,{c}@~{a}o ou operador for necess@'{a}rio.
216 Os simbolos @code{+} e @code{-} representam adi@,{c}@~{a}o un@'{a}ria e nega@,{c}@~{a}o,
217 respectivamente, e os nomes desses operadores s@~{a}o @code{"+"} e @code{"-"},
220 Subtra@,{c}@~{a}o @code{a - b} @'{e} representado internamente no Maxima como adi@,{c}@~{a}o,
221 @code{a + (- b)}. Express@~{o}es tais como @code{a + (- b)} s@~{a}o mostradas como
222 subtra@,{c}@~{a}o. Maxima reconhece @code{"-"} somente como o nome do operador
223 un@'{a}rio de nega@,{c}@~{a}o, e n@~{a}o como o nome do operador bin@'{a}rio de subtra@,{c}@~{a}o.
225 Divis@~{a}o @code{a / b} @'{e} representado internamente no Maxima como multiplica@,{c}@~{a}o,
226 @code{a * b^(- 1)}. Express@~{o}es tais como @code{a * b^(- 1)} s@~{a}o mostradas como
227 divis@~{a}o. Maxima reconhece @code{"/"} como o nome do operador de divis@~{a}o.
229 Adi@,{c}@~{a}o e multiplica@,{c}@~{a}o s@~{a}o operadores en@'{a}rios comutativos.
230 Divis@~{a}o e exponencia@,{c}@~{a}o s@~{a}o operadores bin@'{a}rios n@~{a}o comutativos.
232 Maxima ordena os operandos de operadores comutativos para construir uma
233 representa@,{c}@~{a}o can@^{o}nica. Para armazenamento interno, a ordena@,{c}@~{a}o @'{e} determinada por
235 Para exibi@,{c}@~{a}o, a ordena@,{c}@~{a}o da adi@,{c}@~{a}o @'{e} determinada por
236 @mrefcomma{ordergreatp}
237 e para a multiplica@,{c}@~{a}o, @'{e} a mesma que a ordena@,{c}@~{a}o interna.
239 Computa@,{c}@~{o}es aritm@'{e}ticas s@~{a}o realizadas sobre n@'{u}meros literais (inteiros, racionais,
240 em ponto flutuantes comuns, e grandes n@'{u}meros em ponto flutuante). Exceto para exponencia@,{c}@~{a}o, todas as opera@,{c}@~{o}es
241 aritm@'{e}ticas sobre n@'{u}meros s@~{a}o simplificadas para n@'{u}meros. Exponencia@,{c}@~{a}o @'{e} simplificada
242 para um n@'{u}mero se ou o operando for um n@'{u}mero em ponto flutuante comum ou um grande n@'{u}mero em ponto flutuante ou se o resultado
243 for um inteiro exato ou um racional; de outra forma uma exponencia@,{c}@~{a}o pode ser simplificada
245 ou outra exponencia@,{c}@~{a}o ou esquerda sem modifica@,{c}@~{a}o.
247 Propaga@,{c}@~{a}o de ponto flutuante se aplica a c@'{a}lculos aritm@'{e}ticos: se qualquer operando for
248 um grande n@'{u}mero em ponto flutuante, o resultado @'{e} um grande n@'{u}mero em ponto flutuante; de outra forma, se um operando for um n@'{u}mero em ponto
249 flutuante comum, o resultado @'{e} um n@'{u}mero em ponto flutuante comum; de outra forma, os operandos s@~{a}o racionais
250 ou inteiros e o resultado @'{e} um racional ou um inteiro.
252 Computa@,{c}@~{o}es aritm@'{e}ticas s@~{a}o uma simplifica@,{c}@~{a}o, n@~{a}o uma avalia@,{c}@~{a}o.
253 Dessa forma a aritm@'{e}tica @'{e} realizada em express@~{o}es entre aspas duplas (mas simplificadas).
255 Opera@,{c}@~{o}es aritm@'{e}ticas s@~{a}o aplicadas elemento-a-elemento para listas quando o sinalizador
256 global @mref{listarith}
257 for @code{true}, e sempre aplicada elemento-a-elemento para
258 matrizes. Quando um operando for uma lista ou matriz e o outro for um operando de
259 algum outro tipo, o outro operando @'{e} combinado com cada um dos elementos da
264 Adi@,{c}@~{a}o e multiplica@,{c}@~{a}o s@~{a}o operadores en@'{a}rios comutativos.
265 Maxima ordena os operando para construir uma representa@,{c}@~{a}o can@^{o}nica.
266 Os nomes desses operadores s@~{a}o @code{"+"} e @code{"*"}.
269 @c c + g + d + a + b + e + f;
270 @c [op (%), args (%)];
271 @c c * g * d * a * b * e * f;
272 @c [op (%), args (%)];
273 @c apply ("+", [a, 8, x, 2, 9, x, x, a]);
274 @c apply ("*", [a, 8, x, 2, 9, x, x, a]);
277 (%i1) c + g + d + a + b + e + f;
278 (%o1) g + f + e + d + c + b + a
279 (%i2) [op (%), args (%)];
280 (%o2) [+, [g, f, e, d, c, b, a]]
281 (%i3) c * g * d * a * b * e * f;
283 (%i4) [op (%), args (%)];
284 (%o4) [*, [a, b, c, d, e, f, g]]
285 (%i5) apply ("+", [a, 8, x, 2, 9, x, x, a]);
287 (%i6) apply ("*", [a, 8, x, 2, 9, x, x, a]);
292 Divis@~{a}o e exponencia@,{c}@~{a}o s@~{a}o operadores bin@'{a}rios n@~{a}o comutativos.
293 Os nomes desses operadores s@~{a}o @code{"/"} e @code{"^"}.
297 @c [map (op, %), map (args, %)];
298 @c [apply ("/", [a, b]), apply ("^", [a, b])];
301 (%i1) [a / b, a ^ b];
305 (%i2) [map (op, %), map (args, %)];
306 (%o2) [[/, ^], [[a, b], [a, b]]]
307 (%i3) [apply ("/", [a, b]), apply ("^", [a, b])];
313 Subtra@,{c}@~{a}o e divis@~{a}o s@~{a}o representadas internamente
314 em termos de adi@,{c}@~{a}o e multiplica@,{c}@~{a}o, respectivamente.
317 @c [inpart (a - b, 0), inpart (a - b, 1), inpart (a - b, 2)];
318 @c [inpart (a / b, 0), inpart (a / b, 1), inpart (a / b, 2)];
321 (%i1) [inpart (a - b, 0), inpart (a - b, 1), inpart (a - b, 2)];
323 (%i2) [inpart (a / b, 0), inpart (a / b, 1), inpart (a / b, 2)];
329 Computa@,{c}@~{o}es s@~{a}o realizadas sobre n@'{u}meros literais.
330 Aplica-se propaga@,{c}@~{a}o de n@'{u}meros em ponto flutuante.
333 @c 17 + b - (1/2)*29 + 11^(2/4);
334 @c [17 + 29, 17 + 29.0, 17 + 29b0];
337 (%i1) 17 + b - (1/2)*29 + 11^(2/4);
339 (%o1) b + sqrt(11) + -
341 (%i2) [17 + 29, 17 + 29.0, 17 + 29b0];
342 (%o2) [46, 46.0, 4.6b1]
345 Computa@,{c}@~{a}o aritm@'{e}ticas s@~{a}o uma simplifica@,{c}@~{a}o, n@~{a}o uma avalia@,{c}@~{a}o.
349 @c '(17 + 29*11/7 - 5^3);
351 @c '(17 + 29*11/7 - 5^3);
356 (%i2) '(17 + 29*11/7 - 5^3);
362 (%i4) '(17 + 29*11/7 - 5^3);
368 Aritm@'{e}tica @'{e} realizada elemento-a-elemento em listas (dependendo de
369 @code{listarith}) e matrizes.
372 @c matrix ([a, x], [h, u]) - matrix ([1, 2], [3, 4]);
373 @c 5 * matrix ([a, x], [h, u]);
374 @c listarith : false;
375 @c [a, c, m, t] / [1, 7, 2, 9];
378 @c [a, c, m, t] / [1, 7, 2, 9];
382 (%i1) matrix ([a, x], [h, u]) - matrix ([1, 2], [3, 4]);
388 (%i2) 5 * matrix ([a, x], [h, u]);
392 (%i3) listarith : false;
394 (%i4) [a, c, m, t] / [1, 7, 2, 9];
398 (%i5) [a, c, m, t] ^ x;
401 (%i6) listarith : true;
403 (%i7) [a, c, m, t] / [1, 7, 2, 9];
407 (%i8) [a, c, m, t] ^ x;
409 (%o8) [a , c , m , t ]
413 @category{Operadores}
417 @c -----------------------------------------------------------------------------
421 Operador de exponencia@,{c}@~{a}o.
422 Maxima reconhece @code{**} como o mesmo operador que @mref{^}
424 e @code{**} @'{e} mostrado como @code{^} na sa@'{i}da unidimensional,
425 ou colocando o expoente como um super-escrito na sa@'{i}da bidimensional.
427 A fun@,{c}@~{a}o @mref{fortran}
428 mostra o operador de exponencia@,{c}@~{a}o como @code{**},
429 independente de esse operador de exponencia@,{c}@~{a}o vir de uma entrada @code{**} ou de uma entrada @code{^}.
436 @c string (x**y + x^z);
437 @c fortran (x**y + x^z);
440 (%i1) is (a**b = a^b);
445 (%i3) string (x**y + x^z);
447 (%i4) fortran (x**y + x^z);
453 @category{Operadores}
457 @c -----------------------------------------------------------------------------
461 @fnindex Exponencia@,{c}@~{a}o n@~{a}o comutativa
464 Operador de exponencia@,{c}@~{a}o n@~{a}o comutativa.
465 O operador @code{^^} @'{e} o operador de exponencia@,{c}@~{a}o n@~{a}o comutativa que corresponde @`{a} multiplica@,{c}@~{a}o
466 n@~{a}o comutativa @code{.}, da mesma forma que o operador de exponencia@,{c}@~{a}o comum @code{^}
467 corresponde ao operador de multiplica@,{c}@~{a}o comutativa @code{*}.
469 A exponencia@,{c}@~{a}o n@~{a}o comutativa @'{e} mostrada como @code{^^} na sa@'{i}da unidimensional,
470 e pela comoca@,{c}@~{a}o do expoente como um super-escrito entre os sinais de "menor que" e "maior que" @code{< >}
471 na sa@'{i}da bidimensional.
476 @c a . a . b . b . b + a * a * a * b * b;
477 @c string (a . a . b . b . b + a * a * a * b * b);
480 (%i1) a . a . b . b . b + a * a * a * b * b;
483 (%i2) string (a . a . b . b . b + a * a * a * b * b);
484 (%o2) a^3*b^2+a^^2 . b^^3
488 @category{Operadores}
492 @c -----------------------------------------------------------------------------
496 @fnindex Multiplica@,{c}@~{a}o n@~{a}o comutativa
499 O operador ponto, para multiplica@,{c}@~{a}o (n@~{a}o comutativa) de matrizes.
500 Quando @code{"."} for usado nessa situa@,{c}@~{a}o, deve ter um espa@,{c}o em branco antes e outro depois
501 do ponto, e.g. @code{A . B}. Esse procedimento distingue o ponto da multiplica@,{c}@~{a}o n@~{a}o comutativa do ponto
502 decimal de um n@'{u}mero em ponto flutuante de forma clara.
510 @code{dotconstrules},
518 @category{Operadores}
522 @c -----------------------------------------------------------------------------
523 @node Relational operators, Logical operators, Arithmetic operators, Operators
524 @section Relational operators
525 @c -----------------------------------------------------------------------------
527 @c -----------------------------------------------------------------------------
533 @fnindex Menor que ou equal
534 @fnindex Maior que ou equal
538 @deffnx {Operator} <=
539 @deffnx {Operator} >=
542 Os s@'{i}mbolos @code{<} @code{<=} @code{>=} e @code{>} representam menor que, menor
543 que ou igual a, maior que ou igual a, e maior que, respectivamente. Os nomes
544 desses operadores s@~{a}o @code{"<"} @code{"<="} @code{">="} e @code{">"}, os quais
545 podem aparecer onde o nome de uma fun@,{c}@~{a}o ou operador seja necess@'{a}rio.
547 Esses operadores relacionais s@~{a}o todos operadores bin@'{a}rios; constru@,{c}@~{o}es tais como
548 @code{a < b < c} n@~{a}o s@~{a}o reconhecidas pelo Maxima.
550 Express@~{o}es relacionais s@~{a}o avaliadas para valores Booleanos @footnote{Nota do tradutor: George Boole - 1815/1864 - Lincoln, Inglaterra.} atrav@'{e}s das fun@,{c}@~{o}es
553 e atrav@'{e}s das constru@,{c}@~{o}es de programa@,{c}@~{a}o
554 @mrefcomma{if} @mrefcomma{while}
556 Express@~{o}es relacionais
557 n@~{a}o s@~{a}o avaliadas de outra forma ou simplificadas para valores Booleanos, embora os
558 argumentos de express@~{o}es relacionais sejam avaliados (quando avalia@,{c}@~{a}o n@~{a}o for
559 de outra forma evitada atrav@'{e}s do uso do ap@'{o}strofo).
561 Quando uma express@~{a}o relacional n@~{a}o puder ser avaliada para @code{true} ou @code{false},
562 o comportamento de @code{is} e @code{if} @'{e} governado pelo sinalizador global
564 Quando @code{prederror} for @code{true}, @code{is} e
565 @code{if} dispara um erro. Quando @code{prederror} for @code{false}, @code{is}
566 retorna @code{unknown}, e @code{if} retorna uma express@~{a}o condicional
567 parcialmente avaliada.
569 A fun@,{c}@~{a}o @code{maybe} sempre comporta-se como @code{prederror} onde @code{false}, e
570 @code{while} e @code{unless} sempre comporta-se como @code{prederror} onde
573 Operadores relacionais n@~{a}o s@~{a}o distributivos sobre listas ou outras agrega@,{c}@~{o}es.
575 Veja tamb@'{e}m @mrefcomma{=} @mrefcomma{#} @mrefcomma{equal}
580 Express@~{o}es relacionais s@~{a}o avaliadas para valores Booleanos atrav@'{e}s de algumas fun@,{c}@~{o}es e
581 constru@,{c}@~{o}es de programa@,{c}@~{a}o.
584 @c [x, y, z] : [123, 456, 789];
587 @c if x >= z then 1 else 0;
588 @c block ([S], S : 0, for i:1 while i <= 100 do S : S + i,
592 (%i1) [x, y, z] : [123, 456, 789];
593 (%o1) [123, 456, 789]
598 (%i4) if x >= z then 1 else 0;
600 (%i5) block ([S], S : 0, for i:1 while i <= 100 do S : S + i,
605 Espress@~{o}es relacionais n@~{a}o s@~{a}o avaliadas ou simplificadas de outra forma para vlores
606 Booleanos, embora os argumentos de express@~{o}es relacionais sejam avaliados.
609 @c [x, y, z] : [123, 456, 789];
610 @c [x < y, y <= z, z >= y, y > z];
614 (%o1) [123, 456, 789]
615 (%i2) [x < y, y <= z, z >= y, y > z];
616 (%o2) [123 < 456, 456 <= 789, 789 >= 456, 456 > 789]
618 (%o3) [true, true, true, false]
622 @category{Operadores}
626 @c -----------------------------------------------------------------------------
627 @node Logical operators, Operators for Equations, Relational operators, Operators
628 @section Logical operators
629 @c -----------------------------------------------------------------------------
633 @c -----------------------------------------------------------------------------
635 @deffn {Operador} and
637 @fnindex Conjun@,{c}@~{a}o l@'{o}gica
640 O operador l@'{o}gico de conjun@,{c}@~{a}o. O operador @code{and} @'{e} um operador en@'{a}rio infixo;
641 seus operandos s@~{a}o express@~{o}es Booleanas, e seu resultado @'{e} um valor Booleano.
643 O operador @code{and} for@,{c}a avalia@,{c}@~{a}o de um ou mais de seus operandos (da mesma forma que @mref{is}
644 ), e pode for@,{c}ar a avalia@,{c}@~{a}o de todos os operandos.
646 Operandos s@~{a}o avaliados na ordem em que aparecerem. O operador @code{and} avalia
647 somente a quantidade de operandos necess@'{a}rias para determinar o resultado. Se qualquer
648 operando for @code{false}, o resultado @'{e} @code{false} e nenhum operando da@'{i} em diante @'{e}
651 O sinalizador global @mref{prederror}
652 governa o comportamento de @code{and} quando um
653 operando avaliado n@~{a}o puder ser determinado @code{true} ou @code{false}.
654 O operador @code{and} mostra uma mensagem de erro quando @code{prederror} for @code{true}.
655 De outra forma, operandos que n@~{a}o avaliam para @code{true} ou @code{false} s@~{a}o
656 aceitos, e o resultado @'{e} uma express@~{a}o Booleana.
658 O operador @code{and} n@~{a}o @'{e} comutativo: @code{a and b} pode n@~{a}o ser igual a
659 @code{b and a} devido ao tratamento de operandos indeterminados.
662 @category{Operadores}
668 @c -----------------------------------------------------------------------------
670 @deffn {Operador} not
672 @fnindex Nega@,{c}@~{a}o l@'{o}gica
675 O operador de nega@,{c}@~{a}o l@'{o}gica. O operador @code{not} @'{e} um operador prefixado;
676 seu operando @'{e} uma express@~{a}o Booleana, e seu resultado @'{e} um valor Booleano.
678 O operador @code{not} for@,{c}a avalia@,{c}@~{a}o de seus operandos (da mesma forma que @code{is}).
680 O sinalizador global @mref{prederror}
681 governa o comportamento de @code{not} quando seu
682 operando n@~{a}o puder ser determinado @code{true} ou @code{false}. O operador @code{not}
683 mostra uma mensagem de erro quando @code{prederror} for @code{true}. De outra forma,
684 operandos que n@~{a}o avaliam para @code{true} ou @code{false} s@~{a}o aceitos,
685 e o resultado @'{e} uma express@~{a}o Booleana.
688 @category{Operadores}
694 @c -----------------------------------------------------------------------------
698 @fnindex Disjun@,{c}@~{a}o l@'{o}gica
701 O operador de disjun@,{c}@~{a}o l@'{o}gica. O operador @code{or} @'{e} um operador en@'{a}rio infixo;
702 seus operandos s@~{a}o express@~{o}es Booleana, e seu resultado @'{e} um valor Booleano.
704 O operador @code{or} for@,{c}a avalia@,{c}@~{a}o de um ou mais de seus operandos (da mesma forma que @mref{is}
705 ), e pode for@,{c}ar a avalia@,{c}@~{a}o de todos os operandos.
707 Operandos s@~{a}o avaliados na ordem em que eles aparecem. O operador @code{or} avalia
708 somente a quantidade de operandos necess@'{a}ria para determinar o resultado. Se qualquer
709 operando for @code{true}, o resultado @'{e} @code{true} e nenhum operando adicional @'{e}
712 O sinalizador global @mref{prederror}
713 governa o comportamento de @code{or} quando um
714 operando avaliado n@~{a}o pode ser determinado @code{true} ou @code{false}.
715 O operando @code{or} mostra uma mensagem de erro quando @code{prederror} for @code{true}.
716 De outra forma, operandos que n@~{a}o avaliam para @code{true} ou @code{false} s@~{a}o
717 aceitos, e o resultado @'{e} uma express@~{a}o Booleana.
719 O operando @code{or} n@~{a}o @'{e} comutativo: @code{a or b} pode n@~{a}o ser igual a @code{b or a}
720 devido ao tratamento de operandos indeterminados.
723 @category{Operadores}
727 @c -----------------------------------------------------------------------------
728 @node Operators for Equations, Assignment operators, Logical operators, Operators
729 @section Operators for Equations
730 @c -----------------------------------------------------------------------------
732 @c -----------------------------------------------------------------------------
736 @fnindex Diferente (desigualdade sint@'{a}tica)
739 Representa a nega@,{c}@~{a}o da igualdade sint@'{a}tica @mrefdot{=}
741 Note que devido @`{a}s regras para avalia@,{c}@~{a}o de express@~{o}es predicadas
742 (em particular devido a @code{not @var{expr}} ocasionar a avalia@,{c}@~{a}o de @var{expr}),
743 @code{not @var{a} = @var{b}} @'{e} equivalente a @code{is(@var{a} # @var{b})},
744 ao inv@'{e}s de ser equivalente a @code{@var{a} # @var{b}}.
767 (%i6) is (not a = b);
772 @category{Operadores}
776 @c -----------------------------------------------------------------------------
780 @fnindex Operador de equa@,{c}@~{a}o
781 @fnindex Igual (igualdade sint@'{a}tica)
784 O operador de equa@,{c}@~{a}o.
786 Uma express@~{a}o @code{@var{a} = @var{b}}, por si mesma, representa uma equa@,{c}@~{a}o
787 n@~{a}o avaliada, que pode ou n@~{a}o manter-se. Equa@,{c}@~{o}es n@~{a}o avaliadas podem aparecer como
788 argumentos a @mref{solve}
790 ou a alguma outra fun@,{c}@~{a}o.
792 A fun@,{c}@~{a}o @mref{is}
793 avalia @code{=} para um valor Booleano.
794 O comando @code{is(@var{a} = @var{b})} avalia @code{@var{a} = @var{b}} para @code{true}
795 quando @var{a} e @var{b} forem identicos. Isto @'{e}, @var{a} e @var{b} s@~{a}o @'{a}tomos
796 que s@~{a}o identicos, ou eles n@~{a}o s@~{a}o @'{a}tomos e seus operadores s@~{a}o identicos e
797 seus argumentos s@~{a}o identicos. De outra forma, @code{is(@var{a} = @var{b})}
798 avalia para @code{false}; @code{is(@var{a} = @var{b})} nunca avalia para @code{unknown}. Quando
799 @code{is(@var{a} = @var{b})} for @code{true}, @var{a} e @var{b} s@~{a}o ditos serem
800 sintaticamente iguais, em oposi@,{c}@~{a}o a express@~{o}es equivalentes, para o que
801 @code{is(equal(@var{a}, @var{b}))} @'{e} @code{true}. Express@~{o}es podem ser
802 equivalentes e n@~{a}o sintaticamente iguais.
804 A nega@,{c}@~{a}o de @code{=} @'{e} representada por @mrefdot{#}
805 Da mesma forma que o @code{=}, uma express@~{a}o @code{@var{a} # @var{b}}, por si mesma, n@~{a}o @'{e}
806 avaliada. O comando @code{is(@var{a} # @var{b})} avalia @code{@var{a} # @var{b}} para
807 @code{true} ou @code{false}.
809 Al@'{e}m de @code{is}, alguns outros oeradores avaliam @code{=} e @code{#}
810 para @code{true} ou @code{false}, s@~{a}o eles @mrefcomma{if} @mrefcomma{and}
814 Note que pelo fato de as regras para avalia@,{c}@~{a}o de express@~{o}es predicadas
815 (em particular pelo fato de @code{not @var{expr}} causar a avalia@,{c}@~{a}o de @var{expr}),
816 @code{not @var{a} = @var{b}} @'{e} equivalente a @code{is(@var{a} # @var{b})},
817 ao inv@'{e}s de ser equivalente a @code{@var{a} # @var{b}}.
819 As fun@,{c}@~{o}es @mref{rhs}
821 retornam o primeiro membro e o segundo membro da equa@,{c}@~{a}o,
822 respectivamente, de uma equa@,{c}@~{a}o ou inequa@,{c}@~{a}o.
824 Veja tamb@'{e}m @mref{equal}
829 Uma express@~{a}o @code{@var{a} = @var{b}}, por si mesma, representa
830 uma equa@,{c}@~{a}o n@~{a}o avaliada, que pode ou n@~{a}o se manter.
833 @c eq_1 : a * x - 5 * y = 17;
834 @c eq_2 : b * x + 3 * y = 29;
835 @c solve ([eq_1, eq_2], [x, y]);
836 @c subst (%, [eq_1, eq_2]);
840 (%i1) eq_1 : a * x - 5 * y = 17;
842 (%i2) eq_2 : b * x + 3 * y = 29;
844 (%i3) solve ([eq_1, eq_2], [x, y]);
846 (%o3) [[x = ---------, y = -----------]]
848 (%i4) subst (%, [eq_1, eq_2]);
850 196 a 5 (29 a - 17 b)
851 (%o4) [--------- - --------------- = 17,
853 196 b 3 (29 a - 17 b)
854 --------- + --------------- = 29]
858 (%o5) [17 = 17, 29 = 29]
861 O comando @code{is(@var{a} = @var{b})} avalia @code{@var{a} = @var{b}} para @code{true}
862 quando @var{a} e @var{b} forem sintaticamente iguais (isto @'{e}, identicos).
863 Express@~{o}es podem ser equivalentes e n@~{a}o sintaticamente iguais.
866 @c a : (x + 1) * (x - 1);
868 @c [is (a = b), is (a # b)];
869 @c [is (equal (a, b)), is (notequal (a, b))];
872 (%i1) a : (x + 1) * (x - 1);
873 (%o1) (x - 1) (x + 1)
877 (%i3) [is (a = b), is (a # b)];
879 (%i4) [is (equal (a, b)), is (notequal (a, b))];
883 Alguns operadores avaliam @code{=} e @code{#} para @code{true} ou @code{false}.
886 @c if expand ((x + y)^2) = x^2 + 2 * x * y + y^2 then FOO else
888 @c eq_3 : 2 * x = 3 * x;
889 @c eq_4 : exp (2) = %e^2;
890 @c [eq_3 and eq_4, eq_3 or eq_4, not eq_3];
893 (%i1) if expand ((x + y)^2) = x^2 + 2 * x * y + y^2 then FOO else
896 (%i2) eq_3 : 2 * x = 3 * x;
898 (%i3) eq_4 : exp (2) = %e^2;
901 (%i4) [eq_3 and eq_4, eq_3 or eq_4, not eq_3];
902 (%o4) [false, true, true]
905 Devido a @code{not @var{expr}} causar a avalia@,{c}@~{a}o de @var{expr},
906 @code{not @var{a} = @var{b}} @'{e} equivalente a @code{is(@var{a} # @var{b})}.
909 @c [2 * x # 3 * x, not (2 * x = 3 * x)];
910 @c is (2 * x # 3 * x);
913 (%i1) [2 * x # 3 * x, not (2 * x = 3 * x)];
914 (%o1) [2 x # 3 x, true]
915 (%i2) is (2 * x # 3 * x);
920 @category{Operadores}
924 @c -----------------------------------------------------------------------------
925 @node Assignment operators, User defined operators, Operators for Equations, Operators
926 @section Assignment operators
927 @c -----------------------------------------------------------------------------
929 @c -----------------------------------------------------------------------------
933 @fnindex Operador de atribui@,{c}@~{a}o
936 Operador de atribui@,{c}@~{a}o.
938 Quando o primeiro membro @'{e} uma vari@'{a}vel simples (n@~{a}o uma vari@'{a}vel de subscrito), @code{:}
939 avalia seu segundo membro e associa aquele valor ao primeiro membro da equa@,{c}@~{a}o.
941 Quando o primeiro membro for um elemento subscrito de uma lista, matriz, Vetor est@'{a}tico do
942 Maxima explicitamente declarado, ou um vetor est@'{a}tico do Lisp, o segundo membro @'{e} atribu@'{i}do @`{a}quele elemento.
943 O subscrito deve dar nome a um elemento existente; tais objetos n@~{a}o podem ser extendidos
944 dando nome a elementos n@~{a}o existentes.
946 Quando o primeiro membro da igualdade for um elemento com subscrito de um vetor est@'{a}tico do Maxima n@~{a}o declarado,
947 o segundo emebro @'{e} atribu@'{i}do a aquele elemento, se esse elemento j@'{a} existia anteriormente,
948 ou um novo elemento @'{e} alocado, se ele n@~{a}o existir anteriormente.
950 Quando o primeiro membro for uma lista de vari@'{a}veis simples e/ou de vari@'{a}veis de subscritos, o
951 segundo membro deve avaliar para uma lista, e os elementos do segundo membro
952 s@~{a}o atribu@'{i}dos a elementos do primeiro membro, paralelamente.
954 Veja tamb@'{e}m @mref{kill}
955 e @mrefcomma{remvalue} que removem associa@,{c}@~{o}es entre
956 o primeiro membro e seu valor.
960 Atribui@,{c}@~{a}o a uma vari@'{a}vel simples.
976 Atribui@,{c}@~{a}o a um elemento de uma lista.
992 Atribui@,{c}@~{a}o cria um vetor est@'{a}tico n@~{a}o declarado.
1008 (%i4) arrayinfo (c);
1009 (%o4) [hashed, 1, [99]]
1010 (%i5) listarray (c);
1014 Atribui@,{c}@~{a}o multipla.
1017 @c [a, b, c] : [45, 67, 89];
1023 (%i1) [a, b, c] : [45, 67, 89];
1033 Atribui@,{c}@~{a}o m@'{u}ltipla @'{e} realizada paralelamente.
1034 Os valores de @code{a} e @code{b} s@~{a}o comutados nesse exemplo.
1037 @c [a, b] : [33, 55];
1043 (%i1) [a, b] : [33, 55];
1045 (%i2) [a, b] : [b, a];
1054 @category{Avalia@,{c}@~{a}o} @category{Operadores}
1058 @c -----------------------------------------------------------------------------
1061 @deffn {Operador} ::
1063 @fnindex Operador de atribui@,{c}@~{a}o (avalia o primeiro membro da igualdade)
1066 Operador de atribui@,{c}@~{a}o.
1068 O operador @code{::} funciona da mesma forma que @mref{:}
1069 (o que se pode concluir pela leitura do t@'{o}pico correspondente a @mref{:}
1070 ) exceto que @code{::} avalia
1071 o primeiro e o segundo membros da atribui@,{c}@~{a}o.
1080 @c x :: [11, 22, 33];
1092 (%i4) x : '[a, b, c];
1094 (%i5) x :: [11, 22, 33];
1105 @category{Avalia@,{c}@~{a}o} @category{Operadores}
1109 @c -----------------------------------------------------------------------------
1111 @deffn {Operador} ::=
1113 @fnindex Operador de defini@,{c}@~{a}o de fun@,{c}@~{a}o macro
1116 Operador de defini@,{c}@~{a}o de fun@,{c}@~{a}o de Macro.
1117 O operador @code{::=} define uma fun@,{c}@~{a}o (chamada uma "macro" por raz@~{o}es hist@'{o}ricas) a qual
1118 n@~{a}o avalia seus argumentos, e a express@~{a}o que o @code{::=} retorna (chamada "expans@~{a}o de
1119 macro") @'{e} avaliada no contexto a partor do qual a macro foi chamada.
1120 Uma fun@,{c}@~{a}o de macro @'{e}, em outras ocasi@~{o}es, a mesma coisa que uma defini@,{c}@~{a}o de fun@,{c}@~{a}o comum.
1122 A fun@,{c}@~{a}o @mref{macroexpand}
1123 retorna uma expans@~{a}o de macro (sem que essa expans@~{a}o seja avaliada).
1124 A fun@,{c}@~{a}o @code{macroexpand (qualquercoisa (x))} seguida por @code{''%} @'{e} equivalente a
1125 @code{qualquercoisa (x)} quando @code{qualquercoisa} for uma fun@,{c}@~{a}o de macro.
1127 O operador @code{::=} coloca o nome de fun@,{c}@~{a}o de nova macro dentro da lista global
1128 @mrefdot{macros} @mrefcomma{kill} @mrefcomma{remove}
1129 e @mref{remfunction}
1130 @w{} desassociam defini@,{c}@~{o}es de fun@,{c}@~{a}o de macro e remove nomes da lista global @code{macros}.
1132 A fun@,{c}@~{a}o @mref{fundef}
1133 retorna uma defini@,{c}@~{a}o de fun@,{c}@~{a}o de macro. A fun@,{c}@~{a}o @mref{dispfun}
1134 alem de retornar a defini@,{c}@~{a}o atribui a essa defini@,{c}@~{a}o um r@'{o}tulo.
1136 Fun@,{c}@~{o}es de macro comumente possuem express@~{o}es @mref{buildq}
1138 para contruir uma express@~{a}o, que @'{e} ent@~{a}o avaliada.
1142 A fun@,{c}@~{a}o de macro n@~{a}o avalia seus argumentos, ent@~{a}o a messagem (1) mostra @code{y - z}, n@~{a}o
1143 o valor de @code{y - z}. A expans@~{a}o de macro (a express@~{a}o com ap@'{o}strofo
1144 @code{'(print ("(2) x @'{e} igual a", x))}) @'{e} avaliada no contexto a partir do qual
1145 a macro foi chamada, mostrando a mensagem (2).
1151 @c printq1 (x) ::= block (print ("(1) x @'{e} igual a", x),
1152 @c '(print ("(2) x @'{e} igual a", x)))$
1159 (%i4) printq1 (x) ::= block (print ("(1) x @'{e} igual a", x),
1160 '(print ("(2) x @'{e} igual a", x)))$
1161 (%i5) printq1 (y - z);
1162 (1) x @'{e} igual a y - z
1163 (2) x @'{e} igual a %pi
1167 Uma fun@,{c}@~{a}o comum avalia seus argumentos, ent@~{a}o mensagem (1) mostra o valor de
1168 @code{y - z}. O valor de retorno n@~{a}o @'{e} avaliado, ent@~{a}o mensagem (2) n@~{a}o @'{e} mostrada
1169 at@'{e} a avalia@,{c}@~{a}o expl@'{i}cita @code{''%}.
1175 @c printe1 (x) := block (print ("(1) x @'{e} igual a", x),
1176 @c '(print ("(2) x @'{e} igual a", x)))$
1184 (%i4) printe1 (x) := block (print ("(1) x @'{e} igual a", x),
1185 '(print ("(2) x @'{e} igual a", x)))$
1186 (%i5) printe1 (y - z);
1187 (1) x is equal to 1234 - 1729 w
1188 (%o5) print((2) x @'{e} igual a, x)
1190 (2) x @'{e} igual a %pi
1194 A fun@,{c}@~{a}o @code{macroexpand} retorna uma expans@~{a}o de macro.
1195 O comando @code{macroexpand (qualquercoisa (x))} seguido por @code{''%} @'{e} equivalente a
1196 @code{qualquercoisa (x)} quando @code{qualquercoisa} for uma fun@,{c}@~{a}o de macro.
1202 @c g (x) ::= buildq ([x], print ("x @'{e} igual a", x))$
1203 @c macroexpand (g (y - z));
1211 (%i4) g (x) ::= buildq ([x], print ("x @'{e} igual a", x))$
1212 (%i5) macroexpand (g (y - z));
1213 (%o5) print(x @'{e} igual a, y - z)
1215 x is equal to 1234 - 1729 w
1218 x is equal to 1234 - 1729 w
1223 @category{Defini@,{c}@~{a}o de fun@,{c}@~{a}o} @category{Operadores}
1227 @c -----------------------------------------------------------------------------
1229 @deffn {Operador} :=
1231 @fnindex Operador de defini@,{c}@~{a}o de fun@,{c}@~{a}o
1234 O operador de defini@,{c}@~{a}o de fun@,{c}@~{a}o.
1236 O comando @code{@var{f}(@var{x_1}, ..., @var{x_n}) := @var{expr}} define uma fun@,{c}@~{a}o chamada
1237 @var{f} com argumentos @var{x_1}, @dots{}, @var{x_n} e lei de forma@,{c}@~{a}o
1238 @var{expr}. O operador @code{:=} nunca avalia a lei de forma@,{c}@~{a}o (a menos que explicitamente
1239 avaliado por ap@'{o}strofo-ap@'{o}strofo @code{'@w{}'}).
1240 O corpo da função é avaliado sempre que a função for chamada.
1242 O comando @code{@var{f}[@var{x_1}, ..., @var{x_n}] := @var{expr}} define uma então chamada função de vetor estático @footnote{Nota do tradutor: array.}.
1243 Seu corpo de função é avaliado apenas uma vez para cada valor distinto de seus argumentos,
1244 e aquele valor é retornado, sem fazer avaliação do corpo da função,
1245 sempre que os argumentos tiverem aqueles valores novamente.
1246 (Uma funçao desse tipo é comumente conhecida com uma ``função de memoizing''@footnote{Nota do tradutor: memoizing vem do latin -memorandum- e não do latin -memoria- é uma técnica de otimização de memória computacional.}.)
1248 O comando @code{@var{f}[@var{x_1}, ..., @var{x_n}](@var{y_1}, ..., @var{y_m}) := @var{expr}}
1249 é um caso especial de uma função de vetor estático.
1250 O comando @code{@var{f}[@var{x_1}, ..., @var{x_n}]} é uma função de vetor estático que retorna uma expressão @mref{lambda}
1251 com argumentos @code{@var{y_1}, ..., @var{y_m}}.
1252 O corpo da função é avaliado uma única vez para cada valor distinto de @code{@var{x_1}, ..., @var{x_n}},
1253 e o corpo da expressão lambda é aquele valor.
1255 Quando o @'{u}ltimo ou @'{u}nico argumento de fun@,{c}@~{a}o @var{x_n} for uma lista de um elemento, a
1256 fun@,{c}@~{a}o definida por @code{:=} aceita um n@'{u}mero de argumentos vari@'{a}vel. Os argumentos
1257 atuais s@~{a}o atribu@'{i}dos um-a-um a argumentos formais @var{x_1}, @dots{},
1258 @var{x_(n - 1)}, e quaisquer argumentos adicionais, se presentes, s@~{a}o atribu@'{i}dos a
1259 @var{x_n} como uma lista.
1261 Todas as defini@,{c}@~{o}es de fun@,{c}@~{a}o aparecem no mesmo espa@,{c}o de trabalho; definindo uma fun@,{c}@~{a}o
1262 @code{f} dentro de outra fun@,{c}@~{a}o @code{g} n@~{a}o limita automaticamente o escopo
1263 de @code{f} ao escopo de @code{g}. Todavia, @code{local(f)} torna a defini@,{c}@~{a}o da
1264 fun@,{c}@~{a}o @code{f} efetiva somente dentro do bloco ou somente dentro de outra express@~{a}o composta
1265 na qual @mref{local}
1268 Se algum argumento formal @var{x_k} for um s@'{i}mbolo com ap@'{o}strofo no in@'{i}cio, a fun@,{c}@~{a}o definida atrav@'{e}s de
1269 @code{:=} n@~{a}o avalia o argumento atual correspondente. De outra forma todos os
1270 argumentos atuais s@~{a}o avaliados.
1272 Veja tamb@'{e}m @mref{define}
1277 O operador @code{:=} nunca avalia o corpo da fun@,{c}@~{a}o (a menos que explicitamente avaliado por
1278 ap@'{o}strofo-ap@'{o}strofo).
1281 @c expr : cos(y) - sin(x);
1282 @c F1 (x, y) := expr;
1284 @c F2 (x, y) := ''expr;
1288 (%i1) expr : cos(y) - sin(x);
1289 (%o1) cos(y) - sin(x)
1290 (%i2) F1 (x, y) := expr;
1291 (%o2) F1(x, y) := expr
1293 (%o3) cos(y) - sin(x)
1294 (%i4) F2 (x, y) := ''expr;
1295 (%o4) F2(x, y) := cos(y) - sin(x)
1297 (%o5) cos(b) - sin(a)
1300 O comando @code{f(@var{x_1}, ..., @var{x_n}) := ...} define uma fun@,{c}@~{a}o comum.
1303 @c G1(x, y) := (print ("Evaluating G1 for x=", x, "and y=", y), x.y - y.x);
1304 @c G1([1, a], [2, b]);
1305 @c G1([1, a], [2, b]);
1308 (%i1) G1(x, y) := (print ("Evaluating G1 for x=", x, "and y=", y), x.y - y.x);
1309 (%o1) G1(x, y) := (print("Evaluating G1 for x=", x, "and y=",
1311 (%i2) G1([1, a], [2, b]);
1312 Evaluating G1 for x= [1, a] and y= [2, b]
1314 (%i3) G1([1, a], [2, b]);
1315 Evaluating G1 for x= [1, a] and y= [2, b]
1319 O comando @code{f[@var{x_1}, ..., @var{x_n}] := ...} define uma fun@,{c}@~{a}o array (vetor est@'{a}tico).
1322 @c G2[a] := (print ("Evaluating G2 for a=", a), a^2);
1330 (%i1) G2[a] := (print ("Evaluating G2 for a=", a), a^2);
1332 (%o1) G2 := (print("Evaluating G2 for a=", a), a )
1335 Evaluating G2 for a= 1234
1340 Evaluating G2 for a= 2345
1342 (%i5) arrayinfo (G2);
1343 (%o5) [hashed, 1, [1234], [2345]]
1344 (%i6) listarray (G2);
1345 (%o6) [1522756, 5499025]
1348 O comando @code{@var{f}[@var{x_1}, ..., @var{x_n}](@var{y_1}, ..., @var{y_m}) := @var{expr}}
1349 @'{e} um caso especial de uma fun@,{c}@~{a}o array (vetor est@'{a}tico).
1352 @c G3[n](x) := (print ("Evaluating G3 for n=", n), diff (sin(x)^2, x, n));
1360 (%i1) G3[n](x) := (print ("Evaluating G3 for n=", n), diff (sin(x)^2, x, n));
1361 (%o1) G3 (x) := (print("Evaluating G3 for n=", n),
1364 diff(sin (x), x, n))
1366 Evaluating G3 for n= 2
1368 (%o2) lambda([x], 2 cos (x) - 2 sin (x))
1371 (%o3) lambda([x], 2 cos (x) - 2 sin (x))
1374 (%o4) 2 cos (1) - 2 sin (1)
1375 (%i5) arrayinfo (G3);
1376 (%o5) [hashed, 1, [2]]
1377 (%i6) listarray (G3);
1379 (%o6) [lambda([x], 2 cos (x) - 2 sin (x))]
1382 Quando o @'{u}ltimo ou @'{u}nico argumento da fun@,{c}@~{a}o @var{x_n} for uma lista de um elemento,
1383 a fun@,{c}@~{a}o definida atrav@'{e}s de @code{:=} aceita um n@'{u}mero vari@'{a}vel de argumentos.
1386 @c H ([L]) := apply ("+", L);
1390 (%i1) H ([L]) := apply ("+", L);
1391 (%o1) H([L]) := apply("+", L)
1396 A declara@,{c}@~{a}o @code{local} torna uma defini@,{c}@~{a}o de fun@,{c}@~{a}o v@'{a}lida apenas localmente.
1399 @c foo (x) := 1 - x;
1401 @c block (local (foo), foo (x) := 2 * x, foo (100));
1405 (%i1) foo (x) := 1 - x;
1406 (%o1) foo(x) := 1 - x
1409 (%i3) block (local (foo), foo (x) := 2 * x, foo (100));
1416 @category{Defini@,{c}@~{a}o de fun@,{c}@~{a}o} @category{Operadores}
1420 @c -----------------------------------------------------------------------------
1421 @node User defined operators, , Assignment operators, Operators
1422 @section User defined operators
1423 @c -----------------------------------------------------------------------------
1425 @c -----------------------------------------------------------------------------
1427 @deffn {Fun@,{c}@~{a}o} infix @
1428 @fname{infix} (@var{op}) @
1429 @fname{infix} (@var{op}, @var{lbp}, @var{rbp}) @
1430 @fname{infix} (@var{op}, @var{lbp}, @var{rbp}, @var{lpos}, @var{rpos}, @var{pos})
1432 Declara que o operador @var{op} @'{e} um operador infixo. Um operador infixo @'{e} uma fun@,{c}@~{a}o de
1433 dois argumentos, com o nome da fun@,{c}@~{a}o escrito entre os argumentos.
1434 Por exemplo, o operador de substra@,{c}@~{a}o @code{-} @'{e} um operador infixo.
1436 O comando @code{infix (@var{op})} declara que o operador @var{op} @'{e} um operador infixo com poder
1437 associado padr@~{a}o de (esquerda e direita ambas iguais a 180) e classe gramatical (esquerda e
1438 direita ambas iguais a @code{any}).
1439 @c HOW IS pos DIFFERENT FROM lpos AND rpos ??
1441 O comando @code{infix (@var{op}, @var{lbp}, @var{rbp})} declara que @var{op} @'{e} um operador
1442 infixo com poder associado direito e poder associado esquerdo ambos estabelecidos e classe gramatical padr@~{a}o
1443 (esquedo e direito ambos iguais a @code{any}).
1445 O comando @code{infix (@var{op}, @var{lbp}, @var{rbp}, @var{lpos}, @var{rpos}, @var{pos})}
1446 declara que o operador @var{op} @'{e} um operador infixo com poder associado direito e poder associado
1447 esquerdo ambos estabelecidos e classes gramaticais @var{lpos}, @var{rpos}, e @var{pos} para o operando
1448 esquerdo, o operando direito, e o resultado do operador, respectivamente.
1450 "Classe gramatical", referindo-se a declara@,{c}@~{o}es de operador, significa tipo de express@~{a}o.
1451 Tr@^{e}s tipos de express@~{a}o s@~{a}o reconhecidos: @code{expr}, @code{clause}, e @code{any},
1452 indicando uma express@~{a}o alg@'{e}brica, uma express@~{a}o Booleana, ou qualquer tipo de
1453 express@~{a}o, respectivamente. Maxima pode detectar alguns erros de sintaxe comparando a
1454 classe gramatical declarada com uma express@~{a}o atual.
1456 A preced@^{e}ncia do operador @var{op} em rela@,{c}@~{a}o a outro operador vem dos poderes
1457 associados esquerdo e direito dos operadores em quest@~{a}o. Se os poderes associados
1458 esquerdo e direito of @var{op} forem ambos maiores que os oderes associados esquerdo e direito de
1459 algum outro operador, ent@~{a}o o operador @var{op} tem preced@^{e}ncia sobre o outro operador.
1460 Se os poderes associados de um deles n@~{a}o forem ambos n@~{a}o forem ambos maiores ou menores, alguma rela@,{c}@~{a}o mais
1461 complicada acontece.
1463 A associatividade de @var{op} depende de seus poderes associados. Maior poder
1464 associado esquerdo (@var{lbp}) implica que uma inst@^{a}ncia de @var{op} @'{e} avaliada antes de
1465 outros operadores para sua esquerda em uma express@~{a}o, enquanto maior poder associado esquerdo
1466 (@var{rbp}) imprica que uma inst@^{a}ncia de @var{op} @'{e} avaliado antes de outros operadores
1467 para sua direita em uma express@~{a}o. Deesa forma maior poder associado esquerdo (@var{lbp}) torna @var{op}
1468 associativo @`{a} direita, enquanto maior poder associado direito (@var{rbp}) torna @var{op} associativo @`{a} esquerda.
1469 Se @var{lbp} for igual a @var{rbp}, o operador @var{op} @'{e} associativo @`{a} esquerda.
1471 Veja tamb@'{e}m @ref{Introduction to operators}.
1475 Se os poderes associados esqeurdo e direito de @var{op} forem ambos maiores
1476 que os poderes associados esquerdo e direito de algum outro operador,
1477 ent@~{a}o @var{op} tem preced@^{e}ncia sobre o outro operador.
1480 @c :lisp (get '$+ 'lbp)
1481 @c :lisp (get '$+ 'rbp)
1482 @c infix ("##", 101, 101);
1483 @c "##"(a, b) := sconcat("(", a, ",", b, ")");
1485 @c infix ("##", 99, 99);
1489 (%i1) :lisp (get '$+ 'lbp)
1491 (%i1) :lisp (get '$+ 'rbp)
1493 (%i1) infix ("##", 101, 101);
1495 (%i2) "##"(a, b) := sconcat("(", a, ",", b, ")");
1496 (%o2) (a ## b) := sconcat("(", a, ",", b, ")")
1497 (%i3) 1 + a ## b + 2;
1499 (%i4) infix ("##", 99, 99);
1501 (%i5) 1 + a ## b + 2;
1505 Maior @var{lbp} torna @var{op} associativo @`{a} direita,
1506 enquanto maior @var{rbp} torna @var{op} associativo @`{a} esquerda.
1509 @c infix ("##", 100, 99);
1510 @c "##"(a, b) := sconcat("(", a, ",", b, ")")$
1511 @c foo ## bar ## baz;
1512 @c infix ("##", 100, 101);
1513 @c foo ## bar ## baz;
1516 (%i1) infix ("##", 100, 99);
1518 (%i2) "##"(a, b) := sconcat("(", a, ",", b, ")")$
1519 (%i3) foo ## bar ## baz;
1520 (%o3) (foo,(bar,baz))
1521 (%i4) infix ("##", 100, 101);
1523 (%i5) foo ## bar ## baz;
1524 (%o5) ((foo,bar),baz)
1527 Maxima pode detectar alguns erros de sintaxe comparando a
1528 classe gramatical declarada com uma express@~{a}o atual.
1531 @c infix ("##", 100, 99, expr, expr, expr);
1532 @c if x ## y then 1 else 0;
1533 @c infix ("##", 100, 99, expr, expr, clause);
1534 @c if x ## y then 1 else 0;
1537 (%i1) infix ("##", 100, 99, expr, expr, expr);
1539 (%i2) if x ## y then 1 else 0;
1540 Incorrect syntax: Found algebraic expression where logical
1544 (%i2) infix ("##", 100, 99, expr, expr, clause);
1546 (%i3) if x ## y then 1 else 0;
1547 (%o3) if x ## y then 1 else 0
1551 @category{Operadores} @category{Declara@,{c}@~{o}es e infer@^{e}ncias} @category{Sintaxe}
1555 @c -----------------------------------------------------------------------------
1557 @deffn {Fun@,{c}@~{a}o} matchfix @
1558 @fname{matchfix} (@var{ldelimiter}, @var{rdelimiter}) @
1559 @fname{matchfix} (@var{ldelimiter}, @var{rdelimiter}, @var{arg_pos}, @var{pos})
1561 Declara um operador matchfix com delimitadores esquerdo e direito @var{de}
1562 e @var{dd}. Os delimitadores s@~{a}o especificados como sequ@^{e}ncias de caractere.
1564 Um operador "matchfix" @'{e} uma fun@,{c}@~{a}o com qualquer n@'{u}mero de argumentos,
1565 tal que os argumentos ocorrem entre os delimitadores esquerdo e direito.
1566 Os delimitadores podem ser sequencias de caractere, t@~{a}o longas quanto o analizador possa
1567 os delimitadores dos operandos
1568 e de outras express@~{o}es e operadores.
1569 Na pr@'{a}tica isso inviabiliza delimitadores n@~{a}o analis@'{a}veis tais como
1570 @code{%}, @code{,}, @code{$} e @code{;},
1571 e pode exigir isolamento de delimitadores com espa@,{c}o em branco.
1572 O delimitador da direita pode ser igual ou diferente do delimitador da esquerda.
1574 Umdelimitador esquerdo pode ser associado a somente um delimitador direito;
1575 dois diferentes operadores matchfix n@~{a}o podem ter o mesmo delimitador esquerdo.
1577 Um operador existente pode ser declarado novamente como sendo um operador matchfix
1578 sem modificar suas outras propriedades.
1579 Em particular, operadores embutidos como adi@,{c}@~{a}o @code{+} podem
1580 ser declarados matchfix,
1581 mas fun@,{c}@~{o}es de operador n@~{a}o podem ser definidas para operadores embutidos.
1583 O comando @code{matchfix (@var{de}, @var{dd}, @var{clgr_arg},
1584 @var{clgr})} declara que o argumento tem a classe gramatical @var{clgr_arg} e resultado
1585 tem a classe gramatical @var{clgr}, e os delimitadores @var{de} e
1588 "Classe gramatical", referindo-se a declara@,{c}@~{o}es de operador, significa tipo de express@~{a}o.
1589 Tr@^{e}s tipos s@~{a}o reconhecidos: @code{expr}, @code{clause}, e @code{any},
1590 indicando uma express@~{a}o alg@'{e}brica, uma express@~{a}o Booleana, ou qualquer tipo de
1591 express@~{a}o, respectivamente.
1592 Maxima pode detectar alguns erros de sintaxe comparando a
1593 classe gramatical declarada com uma express@~{a}o atual.
1595 @c DUNNO IF WE REALLY NEED TO MENTION BINDING POWER HERE -- AS NOTED IT'S IRRELEVANT
1596 @c An operator declared by @code{matchfix} is assigned a low binding power.
1597 @c Since a matchfix operator must be evaluated before any expression
1598 @c which contains it,
1599 @c binding power is effectively irrelevant
1600 @c to the declaration of a matchfix operator.
1602 A fun@,{c}@~{a}o para realizar uma opera@,{c}@~{a}o matchfix @'{e} uma fun@,{c}@~{a}o
1603 comum definida pelo usu@'{a}rio.
1604 A fun@,{c}@~{a}o de operador @'{e} definida
1606 com o operador de defini@,{c}@~{a}o de fun@,{c}@~{a}o @code{:=} ou com @code{define}.
1607 Os argumentos podem ser escritos entre os delimitadores,
1608 ou com o delimitador esquerdo como uma sequ@^{e}ncia de caracteres entre aspas duplas e os argumentos
1609 em seguida entre par@^{e}ntesis.
1610 O comando @code{dispfun (@var{de})} mostra a defini@,{c}@~{a}o da fun@,{c}@~{a}o.
1612 O @'{u}nico operador matchfix embutido @'{e} o construtor de listas @code{[ ]}.
1613 Os par@^{e}ntesis @code{( )} e as aspas duplas @code{" "}
1614 atuam como operadores matchfix,
1615 mas n@~{a}o s@~{a}o tratados como tais pelo analisador do Maxima.
1617 O comando @code{matchfix} avalia seus argumentos.
1618 O comando @code{matchfix} retorna seu primeiro argumento, @var{de}.
1619 @c HOW TO TAKE AWAY THE MATCHFIX PROPERTY ??
1623 Delimitadores podem ser quase qualquer sequ@^{e}ncia de caracteres.
1626 @c matchfix ("@@", "~");
1628 @c matchfix (">>", "<<");
1630 @c matchfix ("foo", "oof");
1632 @c >> w + foo x, y oof + z << / @@ p, q ~;
1635 (%i1) matchfix ("@@@@", "~");
1637 (%i2) @@@@ a, b, c ~;
1639 (%i3) matchfix (">>", "<<");
1641 (%i4) >> a, b, c <<;
1643 (%i5) matchfix ("foo", "oof");
1645 (%i6) foo a, b, c oof;
1647 (%i7) >> w + foo x, y oof + z << / @@@@ p, q ~;
1648 >>z + foox, yoof + w<<
1649 (%o7) ----------------------
1653 Operadores matchfix s@~{a}o fun@,{c}@~{o}es comuns definidas pelo usu@'{a}rio.
1656 (%i1) matchfix ("!-", "-!");
1658 (%i2) !- x, y -! := x/y - y/x;
1660 (%o2) !-x, y-! := - - -
1662 (%i3) define (!-x, y-!, x/y - y/x);
1664 (%o3) !-x, y-! := - - -
1666 (%i4) define ("!-" (x, y), x/y - y/x);
1668 (%o4) !-x, y-! := - - -
1670 (%i5) dispfun ("!-");
1672 (%t5) !-x, y-! := - - -
1687 @category{Sintaxe} @category{Operadores}
1691 @c -----------------------------------------------------------------------------
1692 @anchor{function_nary}
1693 @deffn {Fun@,{c}@~{a}o} nary @
1694 @fname{nary} (@var{op}) @
1695 @fname{nary} (@var{op}, @var{bp}, @var{arg_pos}, @var{pos})
1697 Um operador @code{nary} é usado para denotar uma função de qualquer número de argumentos,
1698 cada um dos quais separados por uma ocorrência do operador, e.g. A+B or A+B+C.
1699 A função @code{nary("x")} é uma extensão da sintaxe de função para declarar @code{x}
1700 como sendo um operador do tipo @code{nary}. Funções podem ser declaradas para serem @code{nary}. Se
1701 @code{declare(j,nary);} for concluído, diz ao simplificador para simplificar, e.g.
1702 @code{j(j(a,b),j(c,d))} em @code{j(a, b, c, d)}.
1704 Veja tamb@'{e}m @ref{Introduction to operators}.
1707 @category{Operadores} @category{Sintaxe}
1711 @c -----------------------------------------------------------------------------
1713 @deffn {Fun@,{c}@~{a}o} nofix @
1714 @fname{nofix} (@var{op}) @
1715 @fname{nofix} (@var{op}, @var{pos})
1717 Os operadors @code{nofix} são usados para denotar funções que não possuem argumentos.
1718 A mera presença de tal operador em um comando fará com que a
1719 função correspondente seja avaliada. Por exemplo, quando se digita
1720 "exit;" para sair de uma parada do Maxima, "exit" se comporta de forma semelhante a um
1721 operador @code{nofix}. A função @code{nofix("x")} é uma extensão da sintaxe
1722 de função que declara @code{x} como sendo um operador @code{nofix}.
1724 Veja tamb@'{e}m @ref{Introduction to operators}.
1727 @category{Operadores} @category{Sintaxe}
1731 @c -----------------------------------------------------------------------------
1733 @deffn {Fun@,{c}@~{a}o} postfix @
1734 @fname{postfix} (@var{op}) @
1735 @fname{postfix} (@var{op}, @var{lbp}, @var{lpos}, @var{pos})
1737 Operadores @code{postfix} como a variedade @code{prefix} denota fun@,{c}@~{o}es de um
1738 @'{u}nico argumento, mas nesse caso o argumento precede uma
1739 ocorr@^{e}ncia do operador na sequ@^{e}ncia de caracteres de entrada, e.g. 3!. A
1740 fun@,{c}@~{a}o @code{postfix("x")} @'{e} uma fun@,{c}@~{a}o de extens@~{a}o de sintaxe para declarar que @code{x}
1741 @'{e} um operador @code{postfix}.
1743 Veja tamb@'{e}m @ref{Introduction to operators}.
1746 @category{Operadores} @category{Sintaxe}
1750 @c -----------------------------------------------------------------------------
1752 @deffn {Fun@,{c}@~{a}o} prefix @
1753 @fname{prefix} (@var{op}) @
1754 @fname{prefix} (@var{op}, @var{rbp}, @var{rpos}, @var{pos})
1756 Um operador @code{prefix} significa uma fun@,{c}@~{a}o de um argumento,
1757 o qual segue imediatamente uma ocorr@^{e}ncia do operador.
1758 O comando @code{prefix("x")} @'{e} uma fun@,{c}@~{a}o de extens@~{a}o de sintaxe para declarar que @code{x} @'{e} um
1759 operador @code{prefix}.
1761 Veja tamb@'{e}m @ref{Introduction to operators}.
1764 @category{Operadores} @category{Sintaxe}