@c English version 2011-09-03
@menu
* Introducción al entorno de ejecución::   
* Interrupciones::  
* Funciones y variables para el entorno de ejecución::
@end menu

@node Introducción al entorno de ejecución, Interrupciones, Entorno de Ejecución, Entorno de Ejecución
@section Introducción al entorno de ejecución

El fichero @code{maxima-init.mac} se carga automáticamente cada vez que se empieza a ejecutar Maxima.
Se puede utilizar @code{maxima-init.mac} para personalizar el entorno de Maxima. Si existe, @code{maxima-init.mac} se almacena normalmente en el directorio indicado por @code{maxima_userdir}, aunque puede estar alojado en cualquier otro directorio que esté al alcance de la función  @code{file_search}.

He aquí un ejemplo de fichero @code{maxima-init.mac}:

@example
setup_autoload ("specfun.mac", ultraspherical, assoc_legendre_p);
showtime:all;
@end example

En este ejemplo, @code{setup_autoload} le dice a Maxima que cargue en memoria el fichero @code{specfun.mac} si cualquiera de las funciones @code{ultraspherical} o @code{assoc_legendre_p} es invocada pero todavía no está definida. De esta manera, no es necesario recordar cargar el fichero antes de llamar a las funciones.

La sentencia  @code{showtime: all} le dice a Maxima que haga una asignación a la variable @code{showtime}.
El fichero  @code{maxima-init.mac} puede contener cualesquiera otras asignaciones o sentencias de Maxima.

@node Interrupciones, Funciones y variables para el entorno de ejecución, Introducción al entorno de ejecución, Entorno de Ejecución
@section Interrupciones

El usuario puede detener un cómputo que esté consumiendo recursos excesivos con el carácter ^C (control-C). La acción que se sigue por defecto es la detención del cómputo y la impresión de otro prompt. En este caso, no será posible reiniciar la tarea interrumpida.

Si a la variable Lisp @code{*debugger-hook*} se le asigna @code{nil} haciendo

@example
:lisp (setq *debugger-hook* nil)
@end example

@noindent
entonces tras recibir ^C, Maxima entra en el depurador de Lisp y el usuario podrá utilizar el depurador para inspeccionar el entorno Lisp. La tarea que haya sido interrumpida podrá reiniciarse escribiendo @code{continue} en el depurado de Lisp. La forma de volver a Maxima desde el depurador de Lisp, que no sea la de permitir la computación hasta la terminación de la tarea, dependerá de la versión de Lisp.

En sistemas Unix el carácter ^Z (control-Z) hace que Maxima deje de ejecutarse devolviendo el control al terminal del sistema. El comando @code{fg} hace que la ejecución de Maxima se reanude en el punto que lo dejó.


@node Funciones y variables para el entorno de ejecución,  , Interrupciones, Entorno de Ejecución
@section Funciones y variables para el entorno de ejecución


@defvr {Variable del sistema} maxima_tempdir

La variable @code{maxima_tempdir} almacena la ruta del directorio
en el que Maxima crea ciertos ficheros temporales.
En particular, los ficheros temporales para la realización de
gráficos se guardan en @code{maxima_tempdir}.

El valor que inicialmente toma esta variable es el directorio
de inicio del usuario, si Maxima es capaz de localizarlo; en
caso contrario, Maxima intenta encontrar un directorio que
sea aceptable.

A la variable @code{maxima_tempdir} se le puede asignar una
cadena de caracteres con la ruta del directorio.
@end defvr

@defvr {Variable del sistema} maxima_userdir

La variable @code{maxima_userdir} almacena la ruta del 
directorio en el que Maxima buscará ficheros Lisp y de
Maxima. Maxima también busca en otros directorios, guardando las variables
@code{file_search_maxima} y @code{file_search_lisp} la lista
completa de búsqueda.

El valor que inicialmente toma esta variable es el de un subdirectorio
del directorio de inicio del usuario, si Maxima es capaz de localizarlo;
en caso contrario, Maxima intenta encontrar un directorio que
sea aceptable.

A la variable @code{maxima_userdir} se le puede asignar una
cadena de caracteres con la ruta del directorio.
Sin embargo, cambiando el valor de la variable @code{maxima_userdir}
no se alteran @code{file_search_maxima} ni @code{file_search_lisp},
cuyos contenidos se modifican mediante otro sistema.
@end defvr

@deffn {Función} room ()
@deffnx {Función} room (true)
@deffnx {Función} room (false)

Presenta una descrpción del estado de almacenamiento y gestión de la pila en Maxima. La llamada @code{room} invoca a la función Lisp homónima.

@itemize @bullet
@item
@code{room ()} prints out a moderate description.
@item
@code{room (true)} prints out a verbose description.
@item
@code{room (false)} prints out a terse description.
@end itemize

@end deffn

@deffn {Función} sstatus (@var{keyword}, @var{item})

Si @var{keyword} es el símbolo @code{feature}, @var{item}
será colocado en la lista de propiedades del sistema. Una vez ejecutado
@code{sstatus (keyword, item)}, @code{status (feature, item)} devuelve
@code{true}. Si @var{keyword} es el símbolo @code{nofeature},
@var{item} se borrará de la lista de propiedades del sistema.
Esto puede ser de utilidad para los autores de paquetes, permitiendo
mantener el control sobre las propiedades que se han ido estableciendo.

Véase también @code{status}.

@end deffn


@deffn {Función} status (@code{feature})
@deffnx {Función} status (@code{feature}, @var{item})

Devuelve información sobre la presencia o ausencia de ciertas
propiedades dependientes del sistema.

@itemize @bullet
@item
@code{status (feature)} devuelve una lista con características
del sistema. Éstas incluyen la versión de Lisp, tipo de sistema 
operativo, etc. La lista puede variar de un Lisp a otro.

@item
@code{status (feature, item)} devuelve @code{true} si @var{item}
está en la lista de elementos retornados por @code{status (feature)}
y @code{false} en otro caso.
La función @code{status} no evalúa el argumento @var{item}. El operador
de doble comilla simple, @code{'@w{}'}, permite la evaluación. Una 
propiedad cuyo nombre contenga un carácter especial debe ser suministrada
como un argumento del tipo cadena. Por ejemplo,
@code{status (feature, "ansi-cl")}.
@end itemize

Véase también @code{sstatus}.

La variable @code{features} contiene una lista de propiedades que se 
aplican a expresiones matemáticas. Véanse @code{features} y @code{featurep}
para más información.

@end deffn




@deffn {Función} system (@var{command})
Ejecuta la instrucción @var{command} como un proceso independiente de Maxima.
La instrucción se le pasa a la consola del sistema para su ejecución.
La función @code{system} no está soportada por todos los sistemas operativos, pero suele estarlo en todos los entornos  Unix y similares.

Suponiendo que @code{_hist.out} es una lista de frecuencias que se quieren representar en un diagrama de barras utilizando el programa @code{xgraph},

@example
(%i1) (with_stdout("_hist.out",
           for i:1 thru length(hist) do (
             print(i,hist[i]))),
       system("xgraph -bar -brw .7 -nl < _hist.out"));
@end example

A fin de hacer el diagrama y eliminar el archivo temporal posteriormente, hágase:

@example
system("(xgraph -bar -brw .7 -nl < _hist.out;  rm -f _hist.out)&")
@end example

@end deffn



@deffn {Función} time (%o1, %o2, %o3, ...)

Devuelve una lista de los tiempos, en segundos, que fueron necesarios para calcular los resultados de las salidas @code{%o1}, @code{%o2}, @code{%o3}, .... Los tiempos devueltos son estimaciones hechas por Maxima del tiempo interno de computación. La función @code{time} sólo puede utilizarse para variables correspondientes a líneas de salida; para cualquier otro tipo de variables, @code{time} devuelve @code{unknown}.

Hágase @code{showtime: true} para que Maxima devuelva el tiempo de ejecución de cada línea de salida.

@end deffn

@deffn {Función} timedate ()
@deffnx {Función} timedate (@var{T})

Sin argumento, @code{timedate} devuelve una cadena que 
representa la hora y fecha actuales. La cadena tiene el
formato @code{YYYY-MM-DD HH:MM:SS[+|-]ZZ:ZZ}, donde
los campos indicados son: año, mes, día,
horas, minutos, segundos y número de horas de diferencia
con respecto a la hora GMT.

Con argumento, @code{timedate(@var{T})} devuelve la hora
@var{T} como una cadena con formato @code{YYYY-MM-DD HH:MM:SS[+|-]ZZ:ZZ}.
@var{T} se interpreta como el número de segundos transcurridos
desde la medianoche del uno de enero de 1900, tal como lo devuelve
@code{absolute_real_time}.

Ejemplos:

@code{timedate} sin argumento devuelve una cadena con la hora y fecha actuales.

@c ===beg===
@c d : timedate ();
@c print ("timedate reports current time", d) $
@c ===end===
@example
(%i1) d : timedate ();
(%o1)                      2010-06-08 04:08:09+01:00
(%i2) print ("timedate reports current time", d) $
timedate reports current time 2010-06-08 04:08:09+01:00
@end example

@code{timedate} con argumento devuelve una cadena que representa al propio argumento.

@c ===beg===
@c timedate (0);
@c timedate (absolute_real_time () - 7*24*3600);
@c ===end===
@example
(%i1) timedate (0);
(%o1)                      1900-01-01 01:00:00+01:00
(%i2) timedate (absolute_real_time () - 7*24*3600);
(%o2)                      2010-06-01 04:19:51+01:00
@end example
@end deffn


@deffn {Función} absolute_real_time ()

Devuelve el número de segundos transcurridos desde la medianoche
del 1 de enero de 1900 UTC. Este valor es un número entero
positivo.

Véanse también @code{elapsed_real_time} y @code{elapsed_run_time}.

Ejemplo:

@c ===beg===
@c absolute_real_time ();
@c 1900 + absolute_real_time () / (365.25 * 24 * 3600);
@c ===end===
@example
(%i1) absolute_real_time ();
(%o1)                      3385045277
(%i2) 1900 + absolute_real_time () / (365.25 * 24 * 3600);
(%o2)                   2007.265612087104
@end example

@end deffn

@deffn {Función} elapsed_real_time ()

Devuelve los segundos (incluyendo fracciones de segundo) 
transcurridos desde que Maxima se inició (o reinició) la sesión de
Maxima. Este valor es un decimal en coma flotante.

Véanse también @code{absolute_real_time} y @code{elapsed_run_time}.

Ejemplo:

@c ===beg===
@c elapsed_real_time ();
@c expand ((a + b)^500)$
@c elapsed_real_time ();
@c ===end===
@example
(%i1) elapsed_real_time ();
(%o1)                       2.559324
(%i2) expand ((a + b)^500)$
(%i3) elapsed_real_time ();
(%o3)                       7.552087
@end example

@end deffn

@deffn {Función} elapsed_run_time ()

Devuelve una estimación en segundos (incluyendo fracciones de segundo) 
durante los cuales Maxima ha estado realizando cálculos desde que se
inició (o reinició) la sesión actual. 
Este valor es un decimal en coma flotante.

Véanse también @code{absolute_real_time} y @code{elapsed_real_time}.

Ejemplo:

@c ===beg===
@c elapsed_run_time ();
@c expand ((a + b)^500)$
@c elapsed_run_time ();
@c ===end===
@example
(%i1) elapsed_run_time ();
(%o1)                         0.04
(%i2) expand ((a + b)^500)$
(%i3) elapsed_run_time ();
(%o3)                         1.26
@end example

@end deffn

