Índice

Uso do Lisp


Maxima é escrito em Lisp, uma linguagem de programação realmente única que foi desenvolvida por John McCarthy no MIT. A mais recente publicação sobre Lisp é possivelmente:

McCarthy, John:
Recursive Functions of Symbolic Expressions and Their Computation, Part I Communications of the ACM, Vol. 3, April 1960, pp. 184-195

Para inserir uma peça de Lisp, você escreve:

:lisp (list 'a 'b 'c)
:q(a b c)

Para entrar no modo Lisp, você escreve :lisp, para completar o modo Lisp e retornar ao Maxima, você escreve :q em uma nova linha. O texto Lisp por si mesmo não deve conter um encerramento de linha.

Alternativamente, você pode inserir

to_lisp();

para entrar no modo lista. Aqui está a transcrição completa de uma sessão curta de Lisp:

(%i1) to_lisp();
Type (to-maxima) to restart MAXIMA> (cons 'a 'b)
(A . B) MAXIMA> (append '(a b c) '(d e f))
(A B C D E F) MAXIMA> (reverse '(a b c))
(C B A) MAXIMA> (mapcar '(lambda(x) (list x)) '(a b c))
((A) (B) (C)) MAXIMA> (run)
Maxima restarted.

Essas são expressões Lisp realmente muito simples. Elas podem trazer para você conhecimento Lisp volta para a vida e fornece a você umas poucas dicas sobre o dialeto usado pelo Maxima.

A representação interna de expressões

No modo Lisp, você pode acessar a representação interna de expressões armazenadas em células de resultado. Para obter um resultado, você insere o rótulo de célula de resultado escrita entre barras verticais e com um sinal de dólar prefixado:

(%i1) (sin(x) + cos(x) + sin(x)/sec(x));
sin(x)
(%o1) ------ + sin(x) + cos(x)
sec(x)
(%i2)
to_lisp();
Type (to-maxima) to restart

MAXIMA>
$%o1
((MPLUS SIMP) ((%COS SIMP) $X) ((%SIN SIMP) $X)
((MTIMES SIMP) ((MEXPT SIMP) ((%SEC SIMP) $X) -1)
((%SIN SIMP) $X)))
MAXIMA>
(to-maxima)

$%o1 responde a representação interna da expressão na célula de valor %o1. Para melhor legibilidade, esse resultado é fornecido aqui na forma formatada:

((MPLUS SIMP) 
((%COS SIMP) $X)
((%SIN SIMP) $X)
((MTIMES SIMP)
((MEXPT SIMP)
((%SEC SIMP) $X)
-1
)
((%SIN SIMP) $X)
) )
(%i1) 'integrate(sin(x)*exp(x), x);
/
[ x
(%o1) I %e sin(x) dx
]
/
(%i2)
to_lisp();
Type (to-maxima) to restart

MAXIMA>
$%o1
((%INTEGRATE SIMP)
((MTIMES SIMP) ((MEXPT SIMP) $%E $X) ((%SIN SIMP) $X))
$X)

O segundo elemento do nível mais alto (cadr $%o1) é o integrando, o terceiro elemento do nível mais alto (caddr $%o1) é a variável de integração. Com esse conhecimento podemos realizar a integração em Lisp:

MAXIMA> ($INTEGRATE (cadr $%o1) (caddr $%o1))
((MTIMES SIMP) ((RAT SIMP) 1 2) ((MEXPT SIMP) $%E $X)
((MPLUS SIMP) ((MTIMES SIMP) -1 ((%COS SIMP) $X))
((%SIN SIMP) $X)))
MAXIMA>
(to-maxima)


Índice