Siguiente: , Anterior: , Subir: Programación   [Índice general][Índice]

37.1 Lisp y Maxima

Maxima fue escrito en Lisp, y es muy fácil tener acceso a funciones y variables Lisp desde Maxima y viceversa. Los símbolos Lisp y los símblos Maxima están claramente diferenciados por medio de una convención de nombres. Un símblo Lisp el cual comienza con un signo pesos $ corresponde a un símbolo Maxima sin el signo pesos. Un símbolo Maxima el cual comienza con un signo de cierre de interrogación ? corresponde a un símbolo Lisp sin dicho signo. Por ejemplo, el símbolo Maxima foo corresponde a el símbolo Lisp $FOO, mientras que el símbolo Maxima ?foo corresponde a el símbolo Lisp FOO, tenga en cuenta que ?foo esta escrito sin espacio entre ? y foo; de otra manera se estaría invocando a describe ("foo").

El guión -, asterisco *, u otros carácteres especiales en símbolos Lisp deben ser escritos mediante un backslash \ si aparecen en código Maxima. Por ejemplo, el identificador Lisp *foo-bar* se debe escribir ?\*foo\-bar\* en Maxima.

Se puede ejecutar código Lisp desde una sesión de Maxima. Una línea Lisp (que contenga una o más formas) puede ser ejecutada por medio de un comando especial :lisp. Por ejemplo,

(%i1) :lisp (foo $x $y)

se llama a la función Lisp foo con variables Maxima x y y como argumentos. La instrucción :lisp puede aparecer en el prompt interactivo o en un archivo que sea procesado por batch o demo, pero no en un archivo que sea procesado por load, batchload, translate_file o compile_file.

La función to_lisp() abre una sesión interactiva con el interprete Lisp. Escribiendo (to-maxima) se cierra la sesión con Lisp y se retorna a Maxima.

Las funciones y variables Lisp las cuales esten para ser visibles en Maxima como funciones y variables con nombres oridinarios (sin una puntuación especial), deben tener nombres tipo Lisp que comiencen con el signo pesos $.

Maxima distingue entre letras minúsculas y mayúsculas en identificadores. Existen algunas reglas que gobiernan la traducción de nombres entre Lisp y Maxima.

  1. Un identificador Lisp que no se encuentra encerrado en barras verticales corresponde a un identificador Maxima en minúscula. Que el idenficador Lisp esté en mayúscula, minúscula o una combinación de ambas, no afecta en nada. Por ejemplo, los identificadores Lisp $foo, $FOO, y $Foo, todos corresponden al identificador Maxima foo. Esto es así porque $foo, $FOO y $Foo se convierten por defecto al símbolo $FOO de Lisp.
  2. Un identificador Lisp el cual se encuentre todo en mayúscula o todo en minúscula y encerrado entre barras verticales corresponde a un identicador Maxima con el caso contrario. Esto es, de mayúsculas cambia a minúsculas y de minúsculas cambia a mayúsculas. E.g., el identificador Lisp |$FOO| y |$foo| corresponden los identificadores Maxima foo y FOO, respectivamente.
  3. Un identificador Lisp el cual esta escrito mezclando letras mayúsculas y minúsculas y se encuentra entre barras verticales corresponde a un identificador Maxima con la misma escritura. E.g., el identificador Lisp |$Foo| corresponde a el identificador Maxima Foo.

La macro Lisp #$ permite el uso de expresiones Maxima dentro de código Lisp. #$expr$ extiende a una expresión Lisp equivalente a la expresión Maxima expr.

(msetq $foo #$[x, y]$)

Esto tiene el mismo efecto que:

(%i1) foo: [x, y];

La función Lisp displa imprime una expresión en formato Maxima.

(%i1) :lisp #$[x, y, z]$ 
((MLIST SIMP) $X $Y $Z)
(%i1) :lisp (displa '((MLIST SIMP) $X $Y $Z))
[x, y, z]
NIL

Las funciones definidas en Maxima no son funciones Lisp ordinarias. La función Lisp mfuncall llama a una función Maxima. Por ejemplo:

(%i1) foo(x,y) := x*y$
(%i2) :lisp (mfuncall '$foo 'a 'b)
((MTIMES SIMP) A B)

Algunas funciones Lisp son compartidas en el paquete Maxima, las cuales se listan a continuación:

complement, continue, //, float, functionp, array, exp, listen, signum, atan, asin, acos, asinh, acosh, atanh, tanh, cosh, sinh, tan, break, y gcd.


Siguiente: , Anterior: , Subir: Programación   [Índice general][Índice]