Mario de Lama
malar@arrakis.es
http://www.arrakis.es/~malar
En la calculadora se pueden ocultar las variables y los directorios. ¿Qué quiero decir con ocultar? Supón que tienes un directorio que se llama TRABAJO, las variables y/o subdirectorios que hay en él las vemos en el menú VAR y podemos recuperarlos en la pila, ejecutarlos, ordenarlos, etc. Pues podemos hacer que esas variables permanezcan en el directorio TRABAJO pero que al dar VAR no nos aparezcan en el menú, de esta forma podremos seguir trabajando con ellas pero sólo si sabemos que están allí y su nombre. Por ejemplo, si tenemos una variable llamada AGENDA -que nos ejecuta un programa para gestionar números de teléfonos y direcciones- y la ocultamos, sólo nosotros que sabemos cuál es su nombre y que está ahí podremos poner AGENDA en el nivel 1: y dando a ENTER correr dicho programa.
No tenemos más que crear una variable de nombre nulo (null-name variable) y a partir de ella todas las que haya hacia la derecha en el menú VAR quedarán ocultas. Para crear variables sólo tenemos que guardar un objeto (mediante STO) en un nombre de variable (cualquier combinación de caracteres entre comillas simples, salvo los prohibidos en la página 5-6 de la guía de usuario) La variable de nombre nulo es la que resulta de guardar un objeto entre dos comillas simples sin nada entre ellas (''). Puede ser cualquier objeto, incluido un directorio. Sólo hay un inconveniente, que no podemos introducir las dos comillas simples en la pila y presionar ENTER ya que el sistema operativo de la máquina nos lo impide, en la pila no aparece nada. Hay una forma de solventar esto: Con el lenguaje System RPL.
Para el que no sepa qué lenguaje es éste, baste decir que es de más bajo nivel que el normal de la calculadora, el User RPL, y por ello más rápido y peligroso. A nada que te equivoques puedes borrar toda la memoria de usuario de la calculadora: ¿Os suena "Try to Recover Memory?" ?. Pues id con cuidado al experimentar con lo que sigue, lo mejor sería hacer un backup de la memoria para poder recuperar todo lo que tengáis ahora en ella.
La orden de System que crea un nombre de variable a partir de un string cualquiera (incluidos "", "3", "]", etc.) es "$>ID", si tenéis el suficiente conocimiento de System como para saber compilar esta orden, hacedlo y obtendréis un bonito External que os creará un nombre de variable a partir de cualquier cadena que tengáis en 1: (también de la cadena nula: ""). Si no sabes cómo compilarla no te preocupes ya que podemos obtener el mismo resultado llamando a la dirección de memoria ROM en la que está guardado este comando poniendo para ello una cadena en el nivel 1 y a continuación introduciendo #5B15h SYSEVAL. Este comando (SYSEVAL seguramente viene de System Eval) sólo viene reseñado en la Guía de Usuario dentro del índice de operaciones (pag. G-49) y nos remite al misterioso libro AUR, en el que tampoco nos aclara mucho ya que sólo nos dice que sirve para evaluar objetos sin nombre del sistema operativo especificados por su dirección de memoria. Todos los comandos de la calculadora podemos evaluarlos si ponemos en la pila su dirección de memoria y ejecutamos SYSEVAL. Esto es muy peligroso ya que podemos borrar la memoria a la mínima. Por ejemplo, si en 1: tenemos un número real en vez de una cadena de caracteres y ejecutamos la anterior orden (#5B15h SYSEVAL) borraremos la memoria con toda seguridad, probadlo si deseáis ver como desaparecen esos bonitos programas que tanto os ha costado hacer ;->
Naturalmente que podéis hacer un programa de forma que no tengáis que teclear la dirección de memoria y SYSEVAL cada vez que deseéis crear una variable de nombre prohibido. Nos quedaría así: << #5B15h SYSEVAL >>. Podéis transformarlo en un misterioso << External >> usándolo como argumento del programa pack de Joe Horn (Goodie Disk #2). Para acabar de quedar como un experto puedes usar strip de Simone Rapisarda (en el GD#6) y tendrás sólo el External sin los delimitadores. En total habrás reducido el tamaño de los 25,5 by de << #5B15h SYSEVAL >> a los 2,5 by del último External y no sólo eso sino que este último tarda cerca de un 42% menos de tiempo en ejecutarse.
Ahora ya podemos esconder cualquier variable, cread un directorio y dentro de él cread la variable 'A' con un 7 en ella, a continuación tenéis que poner un cero en la pila (o lo que deseéis guardar en la variable de nombre nulo) y la cadena nula en 1:. Ejecutad #5B15h SYSEVAL y veréis que os aparecen las dos comillas simples. En la pila debéis tener:
4:
3:
2: 0
1: ''
Sólo queda dar a STO y veréis como el menú VAR queda vacío. La variable 'A' ha desaparecido pero si tecleamos A ENTER en la pila nos aparece 7. También podemos hacer :
4:
3:
2: "Hola"
1: 'A'
Y dar STO a continuación. Si ahora evaluamos 'A' nos saldrá su nuevo contenido "Hola" en 1:
Para hacer que las variables ocultas aparezcan de nuevo tenemos que borrar esta variable. Para ello pondremos su nombre en la pila con "" #5B15h SYSEVAL y daremos a PURGE. Ya tenemos de nuevo la variable 'A' en el menú de VAR.
Para rizar el rizo podemos crear un directorio de nombre nulo en vez de una variable. Además de escondernos todas las variables del directorio podremos acceder a él (poniendo su nombre en la pila y dando EVAL a continuación) y guardar lo que deseemos como si fuese otro directorio más.
Hay un sólo directorio donde no podemos crear variables ocultas por este método: El directorio HOME. Haced la prueba: Dentro de HOME teclead "" #5B15h SYSEVAL EVAL y veréis que aparecemos en un directorio oculto que tiene tres variables: 'Alarms' (lista con todas las alarmas), 'UserKeys' (lista con todas las asignaciones de teclas de usuario) y 'UserKeys.CRC' (un número que es el CRC de control de la anterior lista). Mucho cuidado, no las borréis o juguéis con ellas ya que podéis borrar la memoria muy fácilmente. También podéis guardar cosas en este directorio, pero os aconsejo mucha prudencia. Para regresar al directorio HOME basta con dar UPDIR o HOME.
Puesto que hay que tener tanto cuidado con los SYSEVAL os doy compilado prohivar. Este programilla transformará cualquier cadena de caracteres de 1: en el nombre de variable correspondiente. Si en 1: no hay una cadena dará el mensaje "Bad Argument Type". El código en System es:
:: CK&DISPATCH1 * Chequea que el argumento del nivel 1 ... str * ... sea una cadena de caracteres. $>ID * La convierte en nombre de variable. ;También puedes llegar a él sabiendo las direcciones de memoria de estos comandos y teniendo los programas pack y strip , de los que ya hemos hablado antes. Para ello crea el programa:
<< # 18FB2h SYSEVAL # 0400Dh SYSEVAL # 05B15h SYSEVAL <<Ahora pásale pack y strip. Llegarás al mismo resultado que si lo hubieras compilado, verás que tiene el mismo tamaño que prohivar y si los pones en la pila a ambos y ejecutas el test SAME obtendrás que efectivamente son iguales. Ten mucho cuidado en teclear las direcciones de memoria correctas.
Si quieres ver una aplicación práctica de esto puedes bajarte editor.zip. Es un editor-visor de textos y gráficos. Cuando lo pases a la calculadora verás que es un directorio con una sola variable DAME, sin embargo hay un montón de variables ocultas (no borres la variable sin nombre, directorio en este caso, ya que el programa lo utiliza y no funcionaría). Ocurre una cosa curiosa: Si recuperas con RCL el contenido de DAME en la pila verás que no aparece nada ¿Cómo es que funciona si está vacía?. La primera persona que me diga cómo lo he hecho que me lo comente y le pondré en la web al lado de este texto. Si no puedes dar con la solución mándame un e-mail a malar@arrakis.es y te lo resolveré
Hay otra utilidad para este programa: Si deseas borrar un directorio rápidamente sólo tienes que esconder todas las variables que hay en él y a continuación poner su nombre en la pila y dar PURGE. A 'casi' todos los efectos el directorio está vacío y podemos eliminarlo con este comando. En esto se basa el programa fpgdir del GD #5:
\<< IF DUP TYPE 6 == THEN IF DUP VTYPE -1 == THEN DROP ELSE IF DUP VTYPE 15 == THEN DUP EVAL 0 # 15777h SYSEVAL DUP PURGE STO UPDIR PURGE ELSE 515 DOERR END END ELSE 514 DOERR END \>>Puedes ver que aquí se utiliza la dirección # 15777h para crear el nombre nulo. Esta se corresponde con el comando NULLID de System RPL y crea directamente el nombre nulo en la pila. Podéis usar este para esconder variables y el otro para crear nombres prohibidos de variables.
A pesar de lo que en un principio se creía, dentro de HOME hay una forma de esconder variables que no es yendo al directorio oculto. Hasta ahora si intentábamos crear un directorio oculto en HOME con << 0 "" #5B15h SYSEVAL STO >> nos encontrábamos con el mensaje "Directory Not Allowed" pero en el GD #8 Joe Horn nos presentó el programa htrim de Simone Rapisarda. Sólo funciona en HOME y acepta como argumentos una lista o el entero 0. Si le damos una lista con nombres de variables las ordena y oculta todas las variables que hay en HOME y que no aparecen en dicha lista. Si la lista está vacía esconde todas las variables y si damos un cero como argumento descubre todas las variables ocultas.
Finalmente os voy a contar cómo crear directorios temporales que podéis utilizar para lo que os resulte oportuno en vuestros programas. Usaremos para ello el programa de Rick Grevelle tdir del GD #5. Los argumentos son: Una cadena en 2: y una lista tal como las usadas con el comando TMENU (Guía de Usuario pag. 30-5) en 1: Las uniremos en una sola con 2 \->LIST y a continuación ejecutamos TDIR. Podéis ver que os aparece un menú cuya única variable es un directorio con el nombre que hemos puesto. Pulsando la tecla correspondiente entramos en él y tenemos acceso a sus variables. Espero que os sirva de algo.