System RPL Con Debug 4x 18-01-2012
System RPL Con Debug 4x 18-01-2012
System RPL Con Debug 4x 18-01-2012
en
System RPL
Con Debug4x
Prefacio
Las características de programación de la calculadora gráfica HP 50g
son muy poderosas. Estas te permiten hacer prácticamente cualquier
cosa. Sin embargo, los comandos de programación que son
directamente accesibles al usuario (el lenguaje User RPL) no son los
únicos que podemos usar.
Hay otro lenguaje: el lenguaje System RPL. El lenguaje User RPL es
un subconjunto de System RPL, es decir, sólo una pequeña fracción de
su poder. Sin embargo, el lenguaje System RPL no está bien
documentado. Los documentos existentes sólo son un conjunto de
comandos con sus diagramas de pila (algunos mal escritos o
incompletos) y una pequeña o nula descripción. ¿Cómo hacemos para
aprender a programar en System RPL?
El propósito de este libro es exactamente ese: ser un camino para
que alguien que ya ha aprendido User RPL pueda aprender a manejar el
verdadero poder de la calculadora.
En este libro podrás aprender a usar el programa Debug4x para
poder realizar bibliotecas en el lenguaje System RPL.
I Objetos de la HP 50g 13
V Apéndices ???
Introducción
Si conoces como crear programas en User RPL (si no sabes, deberías aprender
primero eso antes de continuar leyendo este libro), entonces sólo conoces parte de lo que la
calculadora HP puede hacer. El lenguaje de programación System RPL te da el poder de
hacer muchas cosas que ni siquiera imaginaste. Por ejemplo, en System RPL puedes
manejar objetos de todos los tipos disponibles. Con User RPL solamente puedes acceder a
algunos de estos. También puedes hacer operaciones matemáticas con 15 dígitos de
precisión, usar arreglos con elementos no numéricos, y mucho más. System RPL puede ser
usado para hacer las mismas cosas que los programas hechos en User RPL, pero mucho
más rápido.
Pero antes de que empecemos a hablar de System RPL, vayamos atrás, al User RPL
para explicar como funciona realmente. Sabemos que estás ansioso por empezar desde ya
con las cosas grandes, pero la siguiente información es importante para un buen
entendimiento de System RPL.
Los programas (hechos en User o en System) no son guardados internamente usando
los nombres de los comandos. Sólo son guardadas las direcciones de los objetos. Cada una
de estas direcciones ocupa sólo 2.5 bytes (o más, si la dirección es un rompointer o un
flashpointer). Cuando un programa es ejecutado, lo único que realmente hace este es una
especie de “salto” a esas direcciones. Esta manera de guardar los programas obedece a
dos propósitos. 2.5 bytes es menor que los nombres de los comandos, por lo tanto el
programa ocupará una menor memoria. Y la ejecución del programa es mucho más rápida
puesto que durante la ejecución, buscar las direcciones de los nombres no toma mucho
tiempo. La mayoría de las veces, las direcciones apuntan a otros programas con más saltos
a otros programas con más saltos, etc. La calculadora recuerda el camino de las direcciones
de los saltos anteriores, por eso puedes tener tantos saltos como sean necesarios sin
preocuparte de esto. Cuando el programa llamado termina, tu retornas a donde estabas
antes. Por supuesto, los saltos deben terminar en algún lugar, aún en un programa escrito
en lenguaje de máquina o en un objeto que solamente se coloca en la pila (números,
cadenas, etc). Esto es muy similar al concepto de llamado a una función o subrutina en
lenguajes de alto nivel.
Pero si los programas son sólo direcciones ¿cómo pueden ser editados? La respuesta
es que la calculadora tiene una tabla con los nombres de los comandos User y sus
correspondientes direcciones. De esta manera, cuando pones un programa User RPL en la
pila, la HP busca en la tabla para conseguir el nombre del comando correspondiente a la
dirección guardada en memoria, y luego muestra el programa en forma leíble.
Puedes luego editarlo, y después que la edición es hecha, la HP nuevamente busca en
la tabla las direcciones de los comandos ingresados, y sólo estas direcciones son guardadas
en la memoria. Esta es la razón por la que editar un programa User RPL largo toma mucho
tiempo, pero también es la razón de que el programa se ejecute más rápido.
Todo esto funciona para los comandos que tienen nombre. Pero hay más de cuatro mil
comandos sin nombre. Esta es una de las diferencias entre User RPL y Sysytem RPL.
User RPL, el lenguaje descrito en la "Guía del Usuario" (el lenguaje cuyos programas
tiene los delimitadores « »), puede acceder solamente a los comandos con nombre. (en
realidad, con User también puedes tener acceso a los comandos sin nombre mediante los
comandos SYSEVAL, LIBEVAL y FLASHEVAL, si conoces las direcciones de los comandos.
Pero esto no es muy eficiente, salvo para un uso ocasional). System RPL puede acceder a
todos los comandos. En consecuencia, los programas System RPL no pueden ser editados
directamente. Para editarlos se necesitan herramientas especiales. Tienes dos opciones
para desarrollar software para la HP en el lenguaje System RPL. Los programas pueden
escribirse y probarse en una PC usando Debug4x con el emulador, o también puedes
escribir software directamente en la calculadora si descargas e instalas algunas bibliotecas
necesarias. En el apéndice A encontrarás información sobre las herramientas disponibles
para escribir programas System RPL.
El programar en System RPL es mucho más poderoso y mucho más rápido porque la
mayoría de los comandos de System no hace verificación de errores. En System RPL, el
programador debe estar seguro de que no ocurrirán errores, pues si ocurren entonces un
crash podría suceder. Por ejemplo, si un comando requiere dos argumentos en la pila y
estos no están o no son del tipo que la función requiere entonces podría suceder un reinicio
en frio (warmstart) o aún peor: una pérdida de memoria. Naturalmente, hay comandos para
verificar que hay suficientes argumentos, comandos para verificar el tipo del argumento y
comandos para verificar otras posibles condiciones de error. La diferencia es que lo más
probable es que tu verifiques que todos los argumentos estén presentes una sola vez, al
comienzo del programa, sin necesidad de hacer después más verificaciones. En cambio, en
User RPL, cada comando de un programa hace verificación de errores, de esta manera
muchas verificaciones son hechas innecesariamente, volviendo más lento el programa.
En este punto, podrías preguntarte “¿Si los comandos no tienen nombre, cómo puedo
programar en System RPL?” Como se dijo antes, todos los comandos tienen direcciones, de
manera que tu puedes llamar a sus direcciones directamente. Por ejemplo, para llamar al
comando cuya dirección es 331C5 cuando programas en la calculadora puedes usar:
PTR 331C5
Cuando programas en Debug 4x puedes usar:
ASSEMBLE
CON(5) #331C5
RPL
Cualquiera que sea la dirección, esta será ejecutada. Pero hay una forma más fácil.
Los comandos tienen nombres. Los nombres no son guardados de la misma manera que los
comandos del User. Pero el equipo de diseño de la HP les ha dado nombres y estos
nombres son guardados en las herramientas para crear programas en System RPL. Cuando
escribes un programa usando aquellos nombres, el compilador System RPL busca los
nombres en las tablas y los convierte a direcciones. Esto es llamado compilación. Algunas
herramientas pueden también hacer lo contrario: convertir las direcciones en nombres de
comandos (como cadenas de caracteres). Esto es llamado descompilación.
Algunos de estos comandos son clasificados como “soportados”: se garantiza su
permanencia en la misma posición de la memoria en todas las versiones de ROM de la
calculadora. En consecuencia, sus direcciones no cambiarán, de manera que los
programadores pueden usarlos de forma segura. (Nota que esto no significa que ellos
estarán en la misma dirección en diferentes calculadoras como HP48 series y HP49 series).
Pero hay también comandos que son clasificados como “no soportados”. Para estos, no hay
garantía de que permanecerán en la misma dirección en diferentes versiones de ROM. En
las listas de entradas de este libro, los comandos no soportados son encerrados por
paréntesis como por ejemplo: (CURSOR_PART).
Sin embargo, nota que todas las entradas no soportadas listadas en este libro son
estables. El equipo de diseño de la HP ha indicado que todas las direcciones de la HP49
series en los rangos 025EC–0B3C7 y 25565–40000 permanecerán sin cambios, aún los
comandos no soportados en esos rangos.
Actualmente hay 3 tipos de entradas: la descripción hecha arriba trató principalmente
con las direcciones normales de 2.5 bytes, las cuales apuntan directamente a algunas
direcciones de la ROM. La mayoría de entradas son de este tipo. Pero también hay entradas
rompointer y entradas flashpointer.
Los rompointer apuntan a comandos que están dentro de alguna biblioteca. En este
libro a los rompointers les anteponemos el caracter ~. Por ejemplo, para el comando
˜ChooseSimple que se describe en el libro de esta manera:
Direcc. Nombre Descripción
0630B3 ˜ChooseSimple ( $titulo {items} ob T )
Si programas en la calculadora puedes escribirlo de estas 3 maneras:
ROMPTR2 ˜ChooseSimple
ROMPTR B3 63
ROMPTR 0B3 063
Y si programas en el editor de Debug 4x puedes escribirlo de estas 2 maneras:
ROMPTR ChooseSimple
ROMPTR 0B3 063
Las flashpointers apuntan a subrutinas que están dentro de la memoria flash. En este
libro a los flashpointers les anteponemos el carácter ^. Por ejemplo, para el comando ˆZ>R
que se describe en el libro de esta manera:
Direcc. Nombre Descripción
0F6006 ˆZ>R (Z % )
Convierte un entero a real.
Si programas en la calculadora puedes escribirlo de estas 3 maneras:
FPTR2 ^IfKeyChoose
FPTR 6 F6
FPTR 006 0F6
Y si programas en el editor de Debug 4x puedes escribirlo de estas 2 maneras:
FLASHPTR IfKeyChoose
FLASHPTR 006 0F6
1.1 Tu primer programa en System RPL
Crearemos un programa System RPL muy simple y lo explicaremos en detalles. Este
programa hallará el área de un círculo, dándole el radio en la pila. Ver en el Apéndice A la
información sobre como compilarlo.
::
CK1NOLASTWD ( verifica si hay un argumento )
CK&DISPATCH1 ( verifica si el argumento es real )
BINT1 ( si es real hace lo siguiente)
::
%2 %^ ( eleva al cuadrado el radio )
%PI ( pone PI en la pila )
%* ( y multiplica los dos números de la pila )
;
;
Antes de empezar a analizarlo, es importante notar que System RPL distingue
mayúsculas de minúsculas. Por lo tanto pi es diferente de PI, el cual es diferente de pI.
También, como habrás adivinado, todo lo que está entre paréntesis () es considerado como
un comentario. Las líneas que tienen un asterisco * como su primer caracter son también
comentarios.
La primera línea contiene la marca de inicio del programa, los caracteres :: (llamado
también DOCOL). La marca que nos señala el final del programa es ; (llamada SEMI).
Continuando, hay un comando llamado CK1NOLASTWD. Este comando verifica si hay
un argumento en la pila, y si no hay genera el mensaje de error “Muy pocos argumentos”. El
siguiente comando CK&DISPATCH0, verifica el tipo de argumento y permite al programador
hacer diferentes cosas para diferentes tipos de argumentos. Nuestro programa sólo soporta
un tipo de argumento: los números reales (representado aquí por BINT1, el número uno
como un entero binario. Ver el capítulo 2). Si otro tipo de argumento está presente en la pila
aparece el mensaje de error “Argumento incorrecto”. La verificación de argumentos es
descrita en detalle en el capítulo 30.
Después de esto viene el código para ejecutar en el caso de que el objeto presente en
la pila sea un número real. Nota que el código está entre los delimitadores :: y ;. Esto es
porque el programa sólo espera un objeto después del tipo de argumento (BINT1). Aquí,
este único objeto es un programa (subprograma). Este es un tipo de objeto compuesto. Un
objeto compuesto es un objeto único que puede tener varios objetos dentro de el. De
manera, que si queremos ejecutar varios comandos, estos comandos deben estar dentro de
un programa.
El resto del programa es muy simple. El número real 2 es puesto en la pila, y el radio
(ingresado por el usuario) es elevado a ese exponente (2).
Finalmente, π es puesto en la pila y el radio al cuadrado es multiplicado por este. En la
pila ahora está el área del círculo.
El tamaño de este programa es de 25 bytes, en contraste a los 20 bytes del programa
escrito en User RPL « SQ p * ->NUM ». Sin embargo, la versión User RPL tomó 0.0156
segundos para el cálculo. La versión System RPL tomó solamente 0.0019 segundos.
Recuerda que si bien en este ejemplo el programa System RPL resultó tener un mayor
tamaño, generalmente esto no sucederá.
1.2 Sobre la lista de entradas
En los siguientes capítulos, los diagramas de pila para describir a los comandos usan
códigos para representar cada tipo de objeto. Aquí, una lista de tales códigos.
Abreviatura Significado
Ob cualquier objeto
1...n n objetos
# Entero binario del System (BINT)
HXS cadena hexadecimal (HXS)
CHR caracter
$ cadena de caracteres
T bandera o flag TRUE
F bandera o flag FALSE
flag bandera o flag TRUE o FALSE
% número real
%% número real extendido
%C número complejo
%%C número complejo extendido
z, Z, ZINT Número entero de precisión infinita
N Número entero positivo de precisión infinita
s, symb simbólico
u, unit objeto unidad
{} lista
M, MAT, MATRIX matrix
2DMATRIX matriz de dos dimensiones
1DMATRIX matriz de una dimensión
ARRY arreglo (array)
[[]] arreglo de dos dimensiones
[] arreglo de una dimensión
RealArry arreglo real
CmpArry arreglo complejo
LNKARRY arreglo vinculado (linked array)
V, [] vector
P polynom, a list of Qs
Q ZINT or P
meta, ob1..obn #n objeto meta
grob objeto gráfico
menu menu: un programa o una lista
sign tabla de signos
Los diagramas de pila de los comandos User RPL usan algunas abreviaturas adicionales:
Abreviatura Significado
x, y real, lista, objeto genérico en User RPL
c, (,) número complejo
# cadena hexadecimal (Entero binario del User)
_ ángulo (un número real)
m, n entero (ZINT)
fecha fecha en el formato DD.MMAAAA or MM.DDAAAA
name nombre global
prog, prg programa
f, func función
F integral de f
Parte I
Objetos de la
HP 50g
Capítulo 2
2.1.5 Tests
Direcc. Nombre Descripción
03D19 #= ( # flag )
03D4E #<> ( # flag )
03CE4 #< ( # flag )
03D83 #> ( # flag )
03CC7 #0<> ( # flag )
03CA6 #0= ( # flag )
3530D #1<> ( # flag )
352FE #1= ( # flag )
36711 #2<> ( # flag )
352F1 #2= ( # flag )
352E0 #3= ( # flag )
366FD #5= ( # flag )
366BC #<3 ( # flag )
36739 #>1 ( # flag )
aka: ONE#>
358C2 2DUP#< ( # #' # #' flag )
358F8 2DUP#> ( # #' # #' flag )
363CE ONE_EQ ( # flag )
Usa EQ como test.
35268 OVER#= ( # #' # flag )
358DC 2DUP#= ( # #' # #' flag )
36694 OVER#0= ( # #' # #' flag )
352BD DUP#0= ( # # flag )
366A8 OVER#< ( # #' # flag )
3531C DUP#1= ( # # flag )
36725 OVER#> ( # #' # flag )
3532B DUP#0<> ( # # flag )
366D0 DUP#<7 ( # # flag )
Retorna TRUE si el argumento es menor que #7.
36676 2#0=OR ( # # flag )
Retorna TRUE si alguno de los dos bints es cero.
Capítulo 3
Números Reales
Los número reales pueden ser creados de dos maneras.
La primera es solamente escribiéndolos sin ningún prefijo. Pero este método también
puede ser usado para crear bints. ¿Entonces, como hace el compilador para saber cuando
tu quieres un número real o un bint? Si el número incluye un punto y/o un exponente,
entonces es un número real. De lo contrario, es un bint.
Así para escribir el número real 5 puedes escribir de estas cuatro maneras:
5.
5.E0
% 5.
% 5
En el editor de Debug4x además puedes usar estas otras dos maneras:
5E0
5e0
Sin embargo, el método preferido es usar la estructura % <dec>. De esta manera, te
aseguras de conseguir siempre un número real y el código será más entendible.
Como en el caso de los bints, hay también muchos números reales ya incorporados en la
ROM y están listados abajo. Estos te permitirán ahorrar memoria. Por ejemplo, % 5 ocupa
10.5 bytes, pero %5 sólo ocupa 2.5 bytes.
Las operaciones básicas que usan números reales son: %+, %-, %*, %/ y %ˆ. Pero
también hay muchas otras, las cuales son listadas abajo.
También hay otro tipo de números reales, los cuales no son accesibles directamente al
usuario y a los programas de User RPL. Estos son los Números Reales Extendidos (o
Largos). Estos funcionan como los números reales normales, pero hay dos diferencias:
Los números reales extendidos son creados usando la estructura %% <dec>. Si tienes
un número real extendido en la pila, este se muestra como un número real normal, pero
siempre en notación científica. Las operaciones básicas son las mismas, excepto que usan
el prefijo %% en vez de %. Aclaremos de una vez lo siguiente: en User RPL el comando +
adiciona cualquier tipo de objetos, por ejemplo números reales, objetos simbólicos, matrices,
agrega elementos a listas, etc. En System RPL, el comando %+ solamente funciona para
dos números reales. Para sumar dos números enteros binarios debes usar #+. Para sumar
dos números reales extendidos usa el comando %%+. Si llamas a un comando con los
argumentos equivocados es posible que en tu sistema ocurra un crash.
Para convertir números reales a números reales extendidos usa el comando %>%%. El
comando que hace lo opuesto es %%>%. Para convertir un bint a número real (normal) el
comando a usar es UNCOERCE, y el comando opuesto es COERCE. Abajo hay una lista de
más comandos de conversión y otros comandos relacionados a número reales y a números
reales extendidos.
3.1 Referencia
3.1.1 Numeros reales ya incorporados en ROM
Direcc. Nombre Descripción
2FB0A %-MAXREAL -9.99E499
2FAB1 %-9 -9
2FA9C %-8 -8
2FA87 %-7 -7
2FA72 %-6 -6
2FA5D %-5 -5
2FA48 %-4 -4
2FA33 %-3 -3
2FA1E %-2 -2
2FA09 %-1 -1
2FB34 %-MINREAL -1E-499
2F937 %0 0
2FB1F %MINREAL 1E-499
27118 %.1 .1
339BE %.5 .5
339D3 (%-.5) -.5
2F94C %1 1
270EE (%1.8) 1.8
2F961 %2 2
339A9 %e e
2F976 %3 3
2FAC6 %PI π
2F98B %4 4
2F9A0 %5 5
2F9B5 %6 6
2F9CA %7 7
2F9DF %8 8
2F9F4 %9 9
339E8 %10 10
2FCE6 %11 11
2FCFB %12 12
2FD10 %13 13
2FD25 %14 14
2FD3A %15 15
2FD4F %16 16
2FD64 %17 17
2FD79 %18 18
2FD8E %19 19
2FDA3 %20 20
2FDB8 %21 21
2FDCD %22 22
2FDE2 %23 23
2FDF7 %24 24
2FE0C %25 25
2FE21 %26 26
2FE36 %27 27
2FE4B (%28) 28
2FE60 (%29) 29
Direcc. Nombre Descripción
2FE75 (%30) 30
2FE8A (%31) 31
2FE9F (%32) 32
2FEB4 (%33) 33
2FEC9 (%34) 34
2FEDE (%35) 35
27103 %80 80
27E5D %100 100
339FD %180 180
33A12 (%200) 200
33A3C (%400) 400
33A27 %360 360
2FC7D (%1200) 1200
2FC92 (%2400) 2400
2FCA7 (%4800) 4800
0CF0B5 (~%TICKSsec) 8192
2FCBC (%9600) 9600
2FCD1 (%15360) 15360
0CD0B5 (~%TICKSmin) 491520
0CB0B5 (~%HrTicks) 29491200
0C90B5 ROMPTR 0B5 0C9 707788800
0C70B5 (~%TICKSweek) 4954521600
2FAF5 %MAXREAL 9.99E499
2F180 1REV ( 6.28318530718 )
( 360. )
( 400. )
Retorna el ángulo de una revolución, correspondiente al modo
angular actual.
3.1.4 Conversión
Direcc. Nombre Descripción
2FFAC %>%% ( % %% )
35ECA %>%%SWAP ( ob % %% ob )
2FF9B %%>% ( %% % )
30E47 2%>%% ( % % %% %% )
30E5B 2%%>% ( %% %%' % %' )
262F6 UNCOERCE (# % )
3F495 UNCOERCE2 (# # % % )
36BFA UNCOERCE%% ( # %% )
2EFCA HXS>% ( hxs % )
05D2C C%>% ( C% %re %im )
2B3FD %IP># ( % #ABS(IP(%)) )
Para un número real, toma su parte entera. Luego halla su
valor absoluto y finalmente lo convierte a bint.
0F6006 ˆZ>R (Z % )
Convierte entero a real.
18A006 ˆZ2%% ( Z %% )
Convierte entero a real extendido.
197006 ˆOBJ2REAL ( Z/% % )
Si el argumento es un entero, lo convierte a real.
Si el argumento es un real, no hace nada.
Para otros objetos, genera el error “Argumento incorrecto”.
4.1 Referencia
4.1.1 Números Complejos ya incorporados en ROM
Direcc. Nombre Descripción
27DE4 C%0 (0,0)
27E09 C%1 (1,0)
27DBF C%-1 (-1,0)
27E2E C%%1 (%%1,%%0)
4.1.2 Conversión
Direcc. Nombre Descripción
261D9 C%%>C% ( C%% C% )
05C27 %>C% ( %re %im C% )
362F2 SWAP%>C% ( %im %re C% )
261FC Re>C% ( %re C% )
25E9C C>Re% ( C% %re )
25E9B C>Im% ( C% %im )
18C006 ˆE%%>C%% ( %%re %%im C%% )
Convierte dos reales extendidos a un complejo extendido.
261CF %%>C% ( %%re %%im C% )
25E82 C%>%% ( C% %%re %%im )
25E83 C%>%%SWAP ( C% %%im %%re )
05DBC C%%>%% ( C%% %%re %%im )
188006 ˆC2C%% ( C C%% )
Convierte entero gaussiano a complejo extendido.
189006 ˆZZ2C%%ext ( Zre Zim C%% )
Crea un complejo extendido a partir de dos enteros.
18B006 ˆC%>C%% ( C% C%% )
Convierte complejo a complejo extendido.
15E006 ˆRIXCext ( Zre Zim C )
Crea un entero gausiano.
15F006 ˆIRXCext ( Zim Zre C )
Crea un entero gausiano.
4.1.3 Operaciones con Complejos
Direcc. Nombre Descripción
25E8F C%CˆC ( C% C%' C%'' )
25E90 C%CˆR ( C% % C%' )
25E94 C%RˆC ( % C% C%' )
25E84 C%ABS ( C% % )
Módulo del número complejo.
50C006 ˆCZABS ( C% C% )
( C%% %% )
( symb symb/Z/% )
Módulo del número complejo. También funciona para números
complejos escritos en forma simbólica.
261ED C%CHS ( C% -C% )
25E81 C%1/ ( C% 1/C% )
25E98 C%SQRT ( C% √C% )
25E95 C%SGN ( C% C%/C%ABS )
261F2 C%CONJ ( C% C%' )
25E88 C%ARG ( C% % )
Halla el argumento del complejo en el actual formato de ángulo
(rad, deg, grad). El ángulo devuelto está en <-180º;180º]
25E91 C%EXP ( C% eˆC% )
25E92 C%LN ( C% ln C% )
25E93 C%LOG ( C% log C% )
25E87 C%ALOG ( C% 10ˆC% )
25E96 C%SIN ( C% sin C% )
25E8D C%COS ( C% cos C% )
25E99 C%TAN ( C% tan C% )
25E89 C%ASIN ( C% asin C% )
25E85 C%ACOS ( C% acos C% )
25E8B C%ATAN ( C% atan C% )
25E97 C%SINH ( C% sinh C% )
25E8E C%COSH ( C% cosh C% )
25E9A C%TANH ( C% tanh C% )
25E8A C%ASINH ( C% asinh C% )
25E86 C%ACOSH ( C% acosh C% )
25E8C C%ATANH ( C% atanh C% )
261DE C%%CHS ( C%% -C%% )
261E3 C%%CONJ ( C%% C%%' )
515006 ˆARG2 ( im re meta )
Retorna un meta que representa al argumento.
517006 ˆQUADRANT ( re im ?re>0 ?im>0 newre newim % )
Retorna Z0 Z1 Z-2 ó Z-1 de tal manera que el argumento del
correspondiente número complejo sea Z*π/2 + theta donde Ө
está en el intervalo [0, π/2].
51E006 ˆC%%SQRT ( C%% C%%' )
Retorna una de las raíces cuadradas del número complejo.
4.1.4 Tests
Enteros (ZINTS)
Este tipo de objeto está presente a partir de la HP 49. Los números enteros (llamados
también ZINTS) son objetos que pueden representar a números muy grandes. En la mayoría
de los casos, no es necesario preocuparse si el usuario ingresó numeros enteros como
argumentos para un programa El mecanismo de verificación de tipos de objetos (descrito en
la sección 30.2) convertirá los enteros a reales la mayoría de veces.
Si quieres manejar a los números enteros como tales (sin convertirlos a reales) hay
varios comandos que manipulan números enteros. Ya que los números enteros en realidad
forman parte del CAS de la HP 50g, estos comandos no son descritos aquí. En vez de eso,
el capítulo 45 es el lugar donde podrás ver la documentación sobre los comandos que
manejan a los ZINTs.
Para escribir un entero en la pila escribe la palabra ZINT.
Por ejemplo, el siguiente código:
:: ZINT 45 ZINT -49 ;
Coloca los enteros 45 y -49 en la pila.
Capítulo 6
Caracteres y Cadenas
Caracteres y cadenas son dos tipos de datos que tienen texto.
Los caracteres no son accesibles directamente en User RPL. Los caracteres son
objetos que sólo pueden tener un carácter. Puedes crearlos usando la estructura:
CHR <char> o usando uno de los caracteres ya incorporados en ROM listados abajo. Por
ejemplo, en el editor de Debug 4x, para escribir el carácter F puedes escribir de cualquiera
de estas dos formas:
CHR F
CHR \46
Sin embargo, sólo la primera forma es posible cuando programas en la calculadora.
Para convertir un carácter a bint, usa CHR>#. El bint devuelto es el código ASCII para el
caracter. El comando opuesto es #>CHR.
Las cadenas (o strings) son insertadas en tu programa con $ "<cadena>", o
simplemente "<cadena>". Hay algunas cadenas ya incorporadas que se listan abajo.
Es posible convertir un carácter en cadena con el comando CHR>$.
Dos comandos útiles que tratan con cadenas son LEN$ y &$. El primero retorna la
longitud (número de caracteres) de una cadena como un bint, y el segundo concatena dos
cadenas. Para conseguir una subcadena (parte de una cadena) usa el comando SUB$. Este
comando toma tres argumentos: la cadena original, la posición inicial (un bint) y la posición
final (también un bint). Todo lo que esté entre la posición inicial y final (inclusive) será
retornado.
Otro comando es POS$, el cual busca dentro de una cadena (en nivel 3) por un
carácter o cadena (en nivel 2), empezando desde una posición especificada (en nivel 1). La
posición de la primera ocurrencia de la cadena buscada en la otra cadena es retornada
(como un bint) en el nivel 1. Si esta no puede ser encontrada devuelve #0.
6.1 Referencia
6.1.1 Caracteres ya incorporados en ROM
Direcc. Nombre Descripción
33D2B CHR_00 '\00' (carácter 0d 00h)
El carácter NULO.
33F77 CHR_Newline '\0a' (carácter 10d 0Ah)
El carácter NUEVA_LÍNEA.
33D32 CHR_... '...' (carácter 31d 1Fh)
33F93 CHR_Space ' ' (carácter 32d 20h)
El carácter ESPACIO.
33D39 CHR_DblQuote '"' (carácter 34d 22h)
33D40 CHR_# '#' (carácter 35d 23h)
33F70 CHR_LeftPar '(' (carácter 40d 28h)
33F85 CHR_RightPar ')' (carácter 41d 29h)
33D47 CHR_* '*' (carácter 42d 2Ah)
33D4E CHR_+ '+' (carácter 43d 2Bh)
33D55 CHR_, ',' (carácter 44d 2Ch)
33D5C CHR_- '-' (carácter 45d 2Dh)
33D63 CHR_. '.' (carácter 46d 2Eh)
Direcc. Nombre Descripción
33D6A CHR_/ '/' (carácter 47d 2Fh)
33D71 CHR_0 '0' (carácter 48d 30h)
33D78 CHR_1 '1' (carácter 49d 31h)
33D7F CHR_2 '2' (carácter 50d 32h)
33D86 CHR_3 '3' (carácter 51d 33h)
33D8D CHR_4 '4' (carácter 52d 34h)
33D94 CHR_5 '5' (carácter 53d 35h)
33D9B CHR_6 '6' (carácter 54d 36h)
33DA2 CHR_7 '7' (carácter 55d 37h)
33DA9 CHR_8 '8' (carácter 56d 38h)
33DB0 CHR_9 '9' (carácter 57d 39h)
33DB7 CHR_: ':' (carácter 58d 3Ah)
33DBE CHR_; ';' (carácter 59d 3Bh)
33DC5 CHR_< '<' (carácter 60d 3Ch)
33DCC CHR_= '=' (carácter 61d 3Dh)
33DD3 CHR_> '>' (carácter 62d 3Eh)
33DDA CHR_A 'A' (carácter 65d 41h)
33DE1 CHR_B 'B' (carácter 66d 42h)
33DE8 CHR_C 'C' (carácter 67d 43h)
33DEF CHR_D 'D' (carácter 68d 44h)
33DF6 CHR_E 'E' (carácter 69d 45h)
33DFD CHR_F 'F' (carácter 70d 46h)
33E04 CHR_G 'G' (carácter 71d 47h)
33E0B CHR_H 'H' (carácter 72d 48h)
33E12 CHR_I 'I' (carácter 73d 49h)
33E19 CHR_J 'J' (carácter 74d 4Ah)
33E20 CHR_K 'K' (carácter 75d 4Bh)
33E27 CHR_L 'L' (carácter 76d 4Ch)
33E2E CHR_M 'M' (carácter 77d 4Dh)
33E35 CHR_N 'N' (carácter 78d 4Eh)
33E3C CHR_O 'O' (carácter 79d 4Fh)
33E43 CHR_P 'P' (carácter 80d 50h)
33E4A CHR_Q 'Q' (carácter 81d 51h)
33E51 CHR_R 'R' (carácter 82d 52h)
33E58 CHR_S 'S' (carácter 83d 53h)
33E5F CHR_T 'T' (carácter 84d 54h)
33E66 CHR_U 'U' (carácter 85d 55h)
33E6D CHR_V 'V' (carácter 86d 56h)
33E74 CHR_W 'W' (carácter 87d 57h)
33E7B CHR_X 'X' (carácter 88d 58h)
33E82 CHR_Y 'Y' (carácter 89d 59h)
33E89 CHR_Z 'Z' (carácter 90d 5Ah)
33FA1 CHR_[ '[' (carácter 91d 5Bh)
33FA8 CHR_] ']' (carácter 93d 5Dh)
33F9A CHR_UndScore '_' (carácter 95d 5Fh)
33E90 CHR_a 'a' (carácter 97d 61h)
33E97 CHR_b 'b' (carácter 98d 62h)
33E9E CHR_c 'c' (carácter 99d 63h)
33EA5 CHR_d 'd' (carácter 100d 64h)
33EAC CHR_e 'e' (carácter 101d 65h)
33EB3 CHR_f 'f' (carácter 102d 66h)
33EBA CHR_g 'g' (carácter 103d 67h)
Direcc. Nombre Descripción
33EC1 CHR_h 'h' (carácter 104d 68h)
33EC8 CHR_i 'i' (carácter 105d 69h)
33ECF CHR_j 'j' (carácter 106d 6Ah)
33ED6 CHR_k 'k' (carácter 107d 6Bh)
33EDD CHR_l 'l' (carácter 108d 6Ch)
33EE4 CHR_m 'm' (carácter 109d 5Dh)
33EEB CHR_n 'n' (carácter 110d 6Eh)
33EF2 CHR_o 'o' (carácter 111d 6Fh)
33EF9 CHR_p 'p' (carácter 112d 70h)
33F00 CHR_q 'q' (carácter 113d 71h)
33F07 CHR_r 'r' (carácter 114d 72h)
33F0E CHR_s 's' (carácter 115d 73h)
33F15 CHR_t 't' (carácter 116d 74h)
33F1C CHR_u 'u' (carácter 117d 75h)
33F23 CHR_v 'v' (carácter 118d 76h)
33F2A CHR_w 'w' (carácter 119d 77h)
33F31 CHR_x 'x' (carácter 120d 78h)
33F38 CHR_y 'y' (carácter 121d 79h)
33F3F CHR_z 'z' (carácter 122d 7Ah)
33FAF CHR_{ '{' (carácter 123d 7Bh)
33FB6 CHR_} '{' (carácter 125d 7Dh)
33F5B CHR_Angle '∠' (carácter 128d 80h)
33F69 CHR_Integral '∫' (carácter 132d 84h)
33F62 CHR_Deriv '∂' (carácter 136d 88h)
33F46 CHR_-> '→' (carácter 141d 8Dh)
33F4D CHR_<< '«' (carácter 171d ABh)
33F54 CHR_>> '»' (carácter 187d BBh)
33F7E CHR_Pi 'π' (carácter 135d 87h)
33F8C CHR_Sigma '∑' (carácter 133d 85h)
33FBD CHR_<= '≤' (carácter 137d 89h)
33FC4 CHR_>= '≥' (carácter 138d 8Ah)
33FCB CHR_<> '≠' (carácter 139d 8Bh)
matrices y
DESCOMP FORMATO ANCHO DE COMILLAS COMILLAS programas
ANCHO
SYS RPL NUMÉRICO PALABRA ID ÚNICO UNIDAD varias
lineas
Un objeto más
FSTR1 allá de
FLAG 85 ACTUAL ACTUAL SI NO DcompWidth (1L) NO
FSTR2 SIEMPRE
FSTR4 ESTANDAR TODO SI SI DcompWidth SI
FSTR5 ESTANDAR TODO NO SI Ilimitado (1L) NO
FSTR6 ACTUAL ACTUAL SI NO DcompWidth SI
Ilimitado (1L)
FSTR7
ACTUAL TODO SI SI Prog y matr (nL) SI
FSTR8 ACTUAL ACTUAL SI NO DcompWidth SI
Un objeto más
FSTR9
ACTUAL ACTUAL SI NO allá de 32 (1L) NO
FSTR10 ESTANDAR TODO SI SI 21 SI
FSTR11 ESTANDAR TODO SI SI 32 SI
FSTR12 FLAG 85 ESTANDAR TODO SI SI Ilimitado (1L) NO
FSTR13 ACTUAL TODO NO SI DcompWidth SI
Ejemplos
Ejemplo 1 Cadenas
Forzando a una cadena a no sobrepasar un tamaño determinado
El siguiente NULLNAME fuerza a una cadena a que tenga como máximo un número de
caracteres indicado en la pila como bint.
Los siguientes NULLNAME ponen una cadena en negrita, cursiva, subrayado o inversa.
Las cadenas retornadas estarán en la forma: "\13\0X\13………\13\0X\13".
Cadenas hexadecimales son los numeros que son llamados Enteros Binarios en el
manual oficial de Hewlett Packard, los cuales pueden ser representados en varias bases. En
System RPL estos son llamados Cadenas Hexadecimales. Son creados usando la estructura
HXS <long> <cuerpo_hex>. Donde long es la longitud de la cadena (número de nibbles
o digitos hexadecimales), en forma hexadecimal, y cuerpo_hex es el contenido de este. La
parte complicada de esto es que, debido a la arquitectura interna de la HP, debes ingresar el
contenido en orden inverso. Por ejemplo, para conseguir la cadena #12AD7h, debes
ingresar HXS 5 7DA21. Para conseguir #12345678h usa HXS 8 87654321.
En System RPL, las cadenas hexadecimales pueden ser de cualquier longitud, no
como en User RPL, donde estas estaban limitadas a 16 nibbles o 64 bits.
Para convertir de cadena hexadecimal a entero binario y viceversa, usa los comandos
HXS># y #>HXS respectivamente. Para convertir un HXS a número real y viceversa, usa
#>% (o HXS>%) y %># respectivamente.
Ver abajo para más comandos relacionados a cadenas hexadecimales.
7.1 Referencia
7.1.1 Conversión
Direcc. Nombre Descripción
059CC #>HXS ( # hxs )
Convierte bint a hxs. La longitud del hxs será cinco.
2EFCB %># ( % hxs )
Convierte número real a hxs. Debería llamarse %>HXS.
7.1.3 Tests
Estos tests son para comparar dos cadenas hexadecimales.
Estos comandos primero truncan o amplian los argumentos de acuerdo a la actual longitud
de palabra y luego hacen la comparación.
Los identificadores son usados para representar los nombres de objetos guardados en
memoria (es decir, variables). En user, estos aparecen en la pila entre comillas simples, esto
es, ''. En System RPL, son creados con ID <name>. Cuando usas esta estructura, no
siempre consigues tener el identificador en la pila. Este es siempre evaluado.
Por ejemplo, si la variable anumber contiene 123.45 y tu pones en alguna parte de tu
programa ID anumber, el identificador es evaluado, llamando al contenido de la variable.
De esta manera, en la pila aparecerá 123.45.
Para poner un id en la pila, usa ' ID <name>. Como verás en el capítulo 20, el
comando ' pone el objeto que está a continuación en la pila. Esto es llamado citación.
Sin embargo, ID <name> (sin el ') pondrá también el id en la pila si aún no existe la
variable llamada <name>. Este comportamiento es similar al observado cuando ingresas una
variable sin las comillas simples en la línea de comandos de la calculadora.
Puedes convertir una cadena en un id usando $>ID. La transformación opuesta se
consigue con el comando ID>$.
También hay otro tipo de identificadores: los identificadores temporales, también
llamados lams. Estos son usados cuando creas variables locales, y tu aprenderás sobre
estos más tarde en el capítulo 19. Son creados con LAM <name>, y trabajan de manera
bastante parecida a los ids normales (variables globales).
Puesto que los ids están estrechamente relacionados al acceso a la memoria, los
comandos relacionados con estos son tratados en el capítulo 25.
Capítulo 9
9.1 Referencia
Direcc. Nombre Descripción
05E81 >TAG ( ob $tag tagged )
Etiqueta un objeto.
2F266 USER$>TAG ( ob $tag tagged )
Etiqueta un objeto con un máximo de 255 caracteres en $tag.
2F223 %>TAG ( ob % tagged )
Convierte real a cadena usando el actual formato de número y
etiqueta objeto.
05F2E ID>TAG ( ob id/lam tagged )
Etiqueta objeto con nombre global (id) o nombre local (lam).
05E9F {}>TAG_ ( { id ob } tagged )
( { lam ob } tagged )
Etiqueta objeto con nombre global (id) o nombre local (lam).
37B04 TAGOBS ( ob $tag tagged )
( ob.. { $.. } tagged... )
Etiqueta uno o más objetos.
37ABE STRIPTAGS ( tagged ob )
( ob ob )
Quita todas las etiquetas del objeto.
37AEB STRIPTAGSl2 ( tagged ob' ob ob' )
( ob ob' ob ob' )
Quita todas las etiquetas del objeto del nivel 2.
05EC9 TAG>_ ( tagged ob $tag )
Quita solamente la etiqueta más externa.
Capítulo 10
Arreglos (Arrays)
Actualmente hay dos grupos de objetos que representan formaciones en la calculadora
HP.
El primer grupo (que se describe en este capítulo) ha existido desde la HP48: son los
arreglos normales (aquellos que en User RPL pueden ser sólo de números reales o números
complejos), y los arreglos vinculados (linked arrays), los cuales no son accesibles usando
User RPL.
La HP49 introduce un nuevo tipo de objeto para representar formaciones: las matrices
simbólicas. Debido a que estas son parte del HP49 CAS, son descritas en el capítulo 46.
En User RPL, los arreglos pueden ser solamente de reales o números complejos. En
System RPL, puedes tener arreglos de cualquier cosa, hasta arreglos de arreglos. Nota que
un arreglo no es un objeto compuesto (ver capítulo 11), aunque parezca un compuesto.
También nota que un arreglo puede contener objetos solamente de un tipo.
En el editor de Debug4x, los arreglos son ingresados de esta manera:
ARRY 2 3 [ % 1. % 2. % 3. % 4. % 5. %6. ] resulta [ [ 1. 2. 3. ] [ 4. 5. 6. ] ]
ARRY 3 [ % 11. % 12. % 13. ] resulta [ 11. 12. 13. ]
ARRY [ % 11. % 12. % 13. ] resulta [ 11. 12. 13. ]
ARRY 2 3 [ “a” “b” “c” “d” “e” “f” ] resulta [ [ “a” “b” “c” ] [ “d” “e” “f” ] ]
Donde el primer número es el número de filas y el siguiente es el número de columnas. Si el
arreglo es un vector sólo será necesario el número de elementos e incluso este número se
puede omitir.
En User RPL, sólo puedes usar arreglos de una o de dos dimensiones. En cambio, en
System RPL, también puedes usar arreglos de más de dos dimensiones. Sólo debes escribir
a continuación de la palabra ARRY las longitudes de cada dimensión. En el siguiente
ejemplo, el resultado es un arreglo de tres dimensiones.
ARRY 2 2 4 [ “a” “b” “c” “d” “e” “f” “g” “h” “i” “j” “k” “l” “m” “n” “o” “p” ]
resulta [ [ [ “a” “b” “c” “d” ] [ “e” “f” “g” “h” ] ] [ [ “i” “j” “k” “l” ] [ “m” “n” “o” “p” ] ] ]
En un arreglo vinculado pueden no estar presentes todos los objetos. En este caso el
puntero a los objetos ausentes debe ser cero. Por ejemplo en el siguiente arreglo vinculado:
LNKARRY 5 [ % 11. % 12. % 13. ]
Faltan los elementos cuarto y quinto. Por lo tanto, los punteros correspondientes al
cuarto objeto y quinto objeto deben ser ceros.
También puedes crear un arreglo de números reales o complejos (normales, no
extendidos) poniéndolos en la pila e ingresando una lista con las dimensiones del arreglo
(números reales, no bints) en el nivel 1. Luego ejecuta ˆXEQ>ARRY. Este comando hace
verificaciones para asegurarse que hay suficientes argumentos y estos son de los tipos
permitidos.
El comando ˆARSIZE retorna el número de elementos en un arreglo. Puedes conseguir
las dimensiones de un arreglo con ˆDIMLIMITS, el cual retorna una lista de bints que
representan las dimensiones del arreglo.
Para conseguir un elemento de un arreglo, pon el número del elemento en el nivel 2, el
arreglo en el nivel 1 y ejecuta GETATELN. Conseguirás el elemento y TRUE.
Todas las entradas de aquí, tratán con los arreglos normales (aún cuando algunos de
estos funcionan también para arreglos vinculados y Matrices Simbólicas). Para entradas
específicas de Matrices Simbólicas ver el capítulo 46.
10.1 Referencia
10.1.1 Dimensiones
Direcc. Nombre Descripción
035A9 DIMLIMITS_ ( ARRY {#L1,#L2,…#Ln} )
( LNKARRY {#L1,#L2,…#Ln} )
Retorna una lista con tantos bints como dimensiones tiene el
arreglo.
Cada bint representa la longitud de una dimensión del arreglo.
Para arreglos de una dimensión, retorna una lista con un bint
que es el número de elementos.
Para arreglos de dos dimensiones, retorna una lista con dos
bints: el número de filas y de columnas.
Para arreglos de tres dimensiones retorna una lista con tres
bints, etc.
16E006 ˆDIMLIMITS ( ARRY {#L1,#L2,…#Ln} )
( LNKARRY {#L1,#L2,…#Ln} )
( 2DMATRIX {#m #n} )
( 1DMATRIX {#elem} )
Similar al comando DIMLIMITS_, pero también funciona para
matrices simbólicas.
03562 ARSIZE_ ( ARRY # )
( LNKARRY # )
Retorna el número de elementos como un bint.
35E006 ˆARSIZE ( ARRY # )
( LNKARRY # )
( MATRIX # )
Similar al comando ARSIZE_, pero también funciona para
matrices simbólicas.
36183 OVERARSIZE ( ARRY ob ARRY ob # )
( LNKARRY ob LNKARRY ob # )
( MATRIX ob MATRIX ob # )
Hace OVER luego ^ARSIZE.
3BA001 FLASHPTR 001 3BA ( [[]] #filas #cols T )
( [] #elem F )
( 2DLNKARRY #filas #cols T )
( 1DLNKARRY #elem F )
Retorna el tamaño de un arreglo o arreglo vinculado de una o
de dos dimensiones.
Para arreglos o arreglos vinculados de tres o más dimensiones,
retorna las longitudes de las dos primeras dimensiones y TRUE.
16D006 ˆMDIMS ( [[]] #filas #cols T )
( [] #elem F )
( 2DMATRIX #filas #cols T )
( 1DMATRIX #elem F )
Similar a FLASHPTR 001 3BA, pero no funciona para arreglos
vinculados y si funciona para matrices simbólicas.
35FD8 MDIMSDROP ( [[]] #filas #cols )
( [] #elem )
( 2DMATRIX #filas #cols )
( 1DMATRIX #elem )
Hace ˆMDIMS luego DROP.
10.1.2 Obtener un elemento de un arreglo
Direcc. Nombre Descripción
0371D GETATELN ( #ubic ARRY ob T )
( #ubic LNKARRY ob T )
( #ubic LNKARRY F )
Retorna un elemento del arreglo o arreglo vinculado y TRUE.
El bint no debe ser mayor al tamaño del arreglo o arreglo
vinculado.
Si el elemento no se encuentra en el arreglo vinculado (cuando
el puntero del elemento es cero), retorna FALSE.
260F8 PULLREALEL ( RealArry #ubic RealArry % )
( CmpArry #ubic CmpArry % ) (1 ≤ #ubic ≤ 2N)
Consigue un elemento de un arreglo real que tiene una o dos
dimensiones.
Para un arreglo complejo de 1 o 2 dimensiones, consigue la
parte real o imaginaria de uno de sus elementos.
Por ejemplo:
ARRY [ C% 11. 31. C% 12. 32. ] BINT3 PULLREALEL
Devuelve el número real: 12.
260F3 PULLCMPEL ( CmpArry #ubic CmpArry C% )
( RealArry #ubic RealArry C% ) (1≤#ubic≤floor(N/2))
Consigue un elemento de un arreglo complejo que tiene una o
dos dimensiones.
Para un arreglo real de 1 o 2 dimensiones, retorna un número
complejo cuyas componentes son los números de las
posiciones #2*ubic y #2*ubic+1. Por ejemplo:
ARRY [ 11. 12. 13. 14. 15. 16. ] BINT3 PULLCMPEL
Devuelve el número complejo: (15.,16.)
35B006 ˆPULLEL[S] ( RealArry #ubic RealArry % )
( CmpArry #ubic CmpArry C% )
( MATRIX #ubic MATRIX ob )
Retorna el elemento de la posición especificada.
Funciona también para matrices simbólicas.
10.1.6 Conversión
Direcc. Nombre Descripción
003007 ˆArryToList ( [] {} ) Comentado [LR7]: CONVERSAO LISTA>MATRIZ
( [[]] {{}} )
Convierte un arreglo a lista.
Funciona para arreglos con objetos de cualquier tipo.
Sólo funciona para arreglos de una o de dos dimensiones.
001007 ˆListToArry ( {}/{{}} []/[[]] TRUE )
( {}/{{}} FALSE )
( 1DMATRIX/2DMATRIX []/[[]] TRUE )
( 1DMATRIX/2DMATRIX FALSE )
( []/[[]] FALSE )
( ob FALSE )
Convierte la lista (o lista de listas) a arreglo real o complejo y
pone TRUE en la pila.
Si no es posible hacer la conversión, retorna FALSE.
También funciona para matrices simbólicas.
La conversión sólo es posible cuando todos los elementos son
reales o todos son complejos.
169006 ˆBESTMATRIXTYPE ( {}/{{}} []/[[]] )
( {}/{{}} {}/{{}} )
( 1DMATRIX/2DMATRIX []/[[]] )
( 1DMATRIX/2DMATRIX 1DMATRIX/2DMATRIX )
( []/[[]] []/[[]] )
( ob ob )
Hace lo mismo que ˆListToArry pero no retorna un flag.
178006 ˆMATRIX2ARRAY ( 1DMATRIX []/1DMATRIX )
( 2DMATRIX [[]]/2DMATRIX )
( []/[[]] []/[[]] )
Intenta convertir matriz a arreglo real o arreglo complejo incluso
cambiando elementos (evaluando los objetos simbólicos y si es
necesario, llamando al contenido de los nombres globales o
locales o evaluandolos. Genera el error “Argumento incorrecto”
si hay elementos no permitidos para formar matriz).
Si no es posible lo deja como matriz convirtiendo los
elementos que se puedan a reales o complejos.
Este comando demora para formaciones grandes.
172006 ˆCKNUMARRY ( 1DMATRIX [] )
( 2DMATRIX [[]] )
( []/[[]] []/[[]] )
Si en la pila hay un arreglo, no hace nada.
Si en la pila hay una matriz, llama a ˆMATRIX2ARRAY. De no
ser posible la conversión a arreglo real o complejo, manda el
mensaje de error “Argumento incorrecto”.
10.1.7 Crear Arreglos con el editor de matrices (MTRW)
Los comandos de esta sección tienen un comportamiento diferente según el estado del flag
del sistema número 91.
Cuando el flag del sistema número 91 está activado, se acepta la entrada de objetos de
cualquier tipo. Además, si uno sale del editor presionando ENTER, en la pila aparecerá una
lista de listas y TRUE.
Cuando el flag del sistema número 91 está desactivado, se acepta sólo la entrada de objetos
de algunos tipos como reales, complejos, ids, lams, symbs y enteros. Además, si uno sale
del editor presionando ENTER, en la pila aparecerá un arreglo o una matriz simbólica y
TRUE.
Si uno se retira del editor presionando CANCL, en la pila sólo aparecerá FALSE.
El siguiente NULLNAME hace lo mismo (sólo verifica que exista el último elemento).
Por ejemplo:
:: { BINT5 BINT3 } GetFromARRY ;
Permite obtener el elemento ubicado en la fila 5 y en la columna 3 de un arreglo de dos
dimensiones ubicado en la pila.
Caso 1: General
El arreglo inicial y el arreglo final tienen cualquier dimensión y tienen objetos de cualquier
tipo.
Por ejemplo:
ARRY 4 2 [ # B # C # D # E # F # 10 # 11 # 12 ]
' :: INDEX@ #>$ "/" &$ ISTOP@ #1- #>$ &$ ": " &$ SWAP #>$ &$ ;
Prog1a1ARRY
Devuelve:
El arreglo inicial y el arreglo final son arreglos reales y sólo tienen una o dos dimensiones.
Este NULLNAME es más rápido que el del caso general, usarlo cuando sea posible.
El arreglo inicial y el arreglo final son arreglos complejos y sólo tienen una o dos
dimensiones.
Este NULLNAME es más rápido que el del caso general, usarlo cuando sea posible.
ARRY 4 3 [ 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ]
' :: %2 %* ;
Prog1a1RealArry
Devuelve:
Por ejemplo:
Devuelve:
Caso 1: General
Tanto los 2 arreglos iniciales como el arreglo final tienen objetos de cualquier tipo y pueden
tener cualquier número de dimensiones.
Por ejemplo, el siguiente programa retorna un arreglo donde cada elemento es la suma de
los cuadrados de los elementos de los 2 arreglos.
Prog2a1ARRY
Retorna:
[[ 122. 148. ]
[ 178. 212. ]
[ 250. 292. ]
[ 338. 388. ]]
Caso 2: Arreglos Reales de 1 o de 2 dimesiones
Tanto los 2 arreglos iniciales como el arreglo final son arreglos reales de 1 o de 2
dimensiones.
Este NULLNAME es más rápido que el del caso general, usarlo cuando sea posible.
Por ejemplo, el siguiente programa retorna un arreglo donde cada elemento es la suma de
los cuadrados de los elementos de los 2 arreglos.
Prog2a1RealArry
Retorna:
[[ 122. 148. ]
[ 178. 212. ]
[ 250. 292. ]
[ 338. 388. ]]
Caso 3: Arreglos Complejos de 1 o de 2 dimesiones
Tanto los 2 arreglos iniciales como el arreglo final son arreglos complejos de 1 o de 2
dimensiones.
Este NULLNAME es más rápido que el del caso general, usarlo cuando sea posible.
Por ejemplo, el siguiente programa retorna un arreglo complejo donde cada elemento es la
suma de los elementos de los 2 arreglos complejos.
Prog2a1CmpArry
Retorna:
[[ (12.,14.) (16.,18.) ]
[ (20.,22.) (24.,26.) ]]
10.2.9 Aplicar un programa a los elementos de varios arreglos
Para evaluar un programa o comando a los elemento de varios arreglos, puedes usar alguno
de los siguientes 2 NULLNAME:
Caso 1: General
Tanto los arreglos iniciales como el arreglo final tienen objetos de cualquier tipo y pueden
tener cualquier número de dimensiones.
Devuelve:
Tanto los arreglos iniciales como el arreglo final son arreglos reales de 1 o de 2 dimensiones.
Este NULLNAME es más rápido que el del caso general, usarlo cuando sea posible.
Tanto los arreglos iniciales como el arreglo final son arreglos complejos de 1 o de 2
dimensiones.
Este NULLNAME es más rápido que el del caso general, usarlo cuando sea posible.
Caso arreglo numérico: Este NULLNAME es mucho más rápido que el anterior,
pero sólo funciona para arreglos reales o complejos.
Caso arreglo numérico: Este NULLNAME es más rápido que el anterior, pero sólo
funciona para arreglos reales o complejos.
Objetos Compuestos
Los objetos compuestos tienen otros objetos dentro de ellos. A diferencia de los arreglos,
diferentes tipos de objetos pueden ser parte de los objetos compuestos. Ya hemos visto un
objeto compuesto en la introducción, cuando usamos un objeto programa para agrupar
varios objetos dentro de un objeto único.
Todos los objetos compuestos son similares en su estructura: empiezan con una palabra
la cual depende del tipo de objeto compuesto y terminan con la palabra SEMI.
Además de los objetos programa, otros objetos compuestos son las listas, los objetos
simbólicos (descritos en el capítulo 14), los objetos unidad (descritos en el capítulo 13) y las
matrices (descritas en el capítulo 46).
Puedes crear una lista empezando con {, y terminando con }. Dentro de esta puedes
poner tantos objetos como desees, de cualquier tipo.
Objetos programa son delimitados por :: y ;.
Objetos unidad son delimitados por UNIT y ;.
Objetos simbólicos son delimitados por SYMBOL y ;.
Para concatenar dos objetos compuestos, pon estos en la pila y usa &COMP. Para
agregar un objeto al comienzo o al final de un compuesto, primero pon el compuesto en la
pila, luego el objeto, y usa >HCOMP o >TCOMP, respectivamente.
Para conseguir la longitud de un compuesto (el número de objetos, como un bint), sólo
pon el compuesto en el nivel uno de la pila y usa el comando LENCOMP.
Para descomponer un compuesto obteniendo en la pila todos sus objetos y el número de
elementos (como con el comando OBJ de User RPL) usa INNERCOMP. La única
diferencia es que el número de objetos es retornada como un bint. Para conseguir algún
objeto de un compuesto, pon el compuesto en el nivel 2, la posición del objeto en el nivel1
(como un bint, por supuesto), y ejecuta NTHELCOMP. Si el número estuvo fuera de rango,
obtendrás FALSE, de otra manera obtendrás el objeto deseado y TRUE. NTHCOMPDROP
es la entrada de arriba, seguida por DROP.
Y para conseguir parte de un compuesto, usar SUBCOMP. Poner en el nivel 3 el
compuesto, en el nivel 2 la posición inicial y en el nivel 1 la posición final, ambos como bints
(desde ahora todos los argumentos numéricos serán bints, a menos que se indique lo
contrario). SUBCOMP verifica si los números no están fuera de rango,. Si lo están un
compuesto nulo (vacío) es retornado.
Otros comandos son listados en la sección de referencia de abajo.
La estructura de un objeto programa es la siguiente:
11.1.4 Listas
Direcc. Nombre Descripción
055E9 NULL{} ( {} )
Pone una lista vacía en la pila.
36ABD DUPNULL{}? ( {} {} flag )
159006 ˆDUPCKLEN{} ( {} {} #n )
( ob ob #1 )
Retorna la longitud de la lista o 1 para otro tipo de objetos.
29D18 ONE{}N ( ob { ob } )
36202 TWO{}N ( ob1 ob2 { ob1 ob2 } )
36216 THREE{}N ( ob1 ob2 ob3 { ob1 ob2 ob3 } )
361EE #1-{}N ( ob1..obn #n+1 {} )
2B42A PUTLIST ( ob #i {} {}' )
Reemplaza objeto en la posición indicada. Asume un #i válido.
2FC006 ˆINSERT{}N ( {} ob # {}' )
Inserta objeto en la lista de tal manera que tendrá la posición #
en la lista final.
# debe ser menor o igual que la longitud de lista final.
Si # es cero, >TCOMP es usado.
2FB006 ˆNEXTPext ( lista lista1 lista2 )
Extrae en lista2 todas las ocurrencias del primer objeto de lista,
los objetos restantes van a la lista1. lista1 = lista-lista2.
2FD006 ˆCOMPRIMext ( {} {}' )
Suprime múltiples ocurrencias en una lista.
15A006 ˆCKCARCOMP ( {} ob1 )
( ob ob )
Retorna el primer elemento para listas, o el objeto mismo.
2EF5A apndvarlst ( {} ob {}' )
Agrega el objeto al final de la lista, si ob aún no está en la lista.
0FE006 ˆAppendList ( {} ob {}' )
Equivale a apndvarlst, pero más rápido.
4EB006 ˆprepvarlist ( {} ob {}' )
Agrega el objeto al inicio de la lista si ob aún no está en la lista.
Si ob está en la lista, lo mueve al inicio de la lista.
100006 ˆSortList ( L test_de2argumentos L' )
Ordena la lista según el test.
En la lista final L', el test retornaría FALSE al evaluar cada
par de elementos consecutivos.
Para ordenar reales ascendentemente el test puede ser ' %>.
28A006 ˆPIext ( {} ob )
Retorna el producto de todos los elementos de una lista.
25ED3 EqList? ( {} flag )
( ob F )
Si la lista tiene menos de dos elementos, retorna TRUE.
Si el segundo elemento de la lista no es lista, retorna TRUE.
En otro caso, retorna FALSE.
11.1.5 Objetos Programa
' :: %3 %^ ; Prog1a1Comp
INNERDUP ( ob1...obn #n #n )
ZERO_DO (DO)
( ... #n )
ROLL ( ... obi )
2GETEVAL ( ... obi' )
ISTOP@ ( ... obi' #n )
LOOP
( ob1'...obn' #n )
1GETABND ( ob1'...obn' #n #tipo )
COMPN_ ( comp' )
;
Por ejemplo:
Devuelve:
Otro ejemplo:
Devuelve:
>R ( comp1 )
INNERDUP ( ob11...ob1n #n #n )
ZERO_DO (DO)
( ... #n )
ROLL ( ... ob1i )
RSWAP
'R ( ... ob1i ob2i )
RSWAP
2GETEVAL ( ... obi' )
ISTOP@ ( ... obi' #n )
LOOP
( ob1'...obn' #n )
1GETABND ( ob1'...obn' #n #tipo )
COMPN_ ( comp' )
;
Por ejemplo:
Devuelve:
Por ejemplo:
{ 11. 12. 13. }
{ 100. 200. 300. }
BINT2
' %+
Prog2a1Comp
Devuelve:
3GETLAM ( #n-1 )
ZERO_DO (DO)
RSWAP ( ... )
RDUP ( ... )
'R'R ( ... ob1 ob2 )
RDROP ( ... ob1 ob2 )
'R ( ... ob1 ob2 ob1 )
DROP ( ... ob1 ob2 )
RSWAP ( ... ob1 ob2 )
2GETEVAL ( ... ob1' )
LOOP
( ob1',ob2'...obn-1' )
3GETLAM ( ob1',ob2'...obn-1' #n-1 )
1GETABND ( ob1',ob2'...obn-1' #n-1 #tipo )
COMPN_ ( comp' )
RDROP ( comp' )
;
Por ejemplo:
Devuelve:
{ 2. 10. 3. }
11.2.5 Aplicando un programa o comando a grupos de varios
elementos dentro de un compuesto
Para evaluar un programa o comando a grupos de ‘S’ elementos dentro de un compuesto,
puedes usar el siguiente NULLNAME
Por ejemplo:
Devuelve:
{ 2. 10. 3. }
11.2.6 Aplicar un programa o comando a todos los elementos de
un compuesto hasta agotar el compuesto y retornar un
solo objeto como resultado
En User RPL se podia usar el comando STREAM para listas.
Veamos algunos ejemplos en User RPL:
:: INNERCOMP ( ob1...obn #n )
DUP#1= ( ob1...obn #n flag )
caseDROP
( ob1...obn #n )
ONE_DO (DO)
( ob1...ob' ob'' )
1GETLAM ( ob1...ob' ob'' prog2a1 )
EVAL ( ob1...ob''' )
LOOP
( ob )
;
ABND ( ob )
;
Los siguientes cuatro programas tienen el mismo efecto que los NULLNAME de la página
anterior.
' %+ StreamRevComp
' %* StreamRevComp
* Retorna TRUE si todos los elementos del compuesto son nombres globales
NULLNAME TodosTrue?Comp_id? ( comp -> flag )
::
' TYPEIDNT?
TodosTrue?Comp
;
* Retorna TRUE si todos los elementos del compuesto son reales o enteros
NULLNAME TodosTrue?Comp_%?_or_Z? ( comp -> flag )
::
' :: ( ob )
DUPTYPEREAL? ( ob flag )
SWAP ( flag ob )
TYPEZINT? ( flag flag' )
OR ( flag'' )
;
TodosTrue?Comp
;
11.2.8 ¿Cómo saber si al evaluar un test a cada elemento de un
compuesto, al menos una vez resulta TRUE?
Puedes usar el siguiente NULLNAME
12.1 Referencia
Objetos Unidad
Las unidades son otro tipo de objetos compuestos. En realidad, no es difícil incluir uno en
un programa, sólo es laborioso.
Las unidades empiezan con la palabra UNIT y terminan con ;. Dentro, tienen a los
comandos que definen la unidad. La mejor manera de comprender como una unidad está
representada es descompilandola. El objeto unidad 980_cm/sˆ2 puede ser creado usando
el siguiente código:
::
UNIT
% 980.
CHR c
"m"
umP
"s"
%2
um^
um/
umEND
;
;
Como puedes ver, la creación de unidades es hecha en notación polaca inversa usando
las palabras umˆ, um*, um/ y umP. El significado de las tres primeras palabras es fácil de
adivinar. La última (umP) es usada para crear prefijos (kilo, mega, mili, etc.). Primero ingresa
el prefijo como un carácter, y luego el nombre de la unidad como una cadena. Luego ingresa
umP y la unidad con su prefijo es creada. Luego llama a las otras palabras que sean
necesarias. Para terminar una unidad usa la palabra umEND, la cual junta el número
(ingresado primero) a la unidad. El código de arriba se puede hacer más corto si usamos
caracteres y cadenas ya incorporados en ROM (listados en el capítulo 6).
Puesto que las unidades son objetos compuestos, puedes usar los comandos referentes
a objetos compuestos (capítulo 11) al manejar unidades. Por ejemplo, puedes usar
INNERCOMP para descomponer una unidad en un objeto meta (ver capítulo 12). Para crear
un objeto unidad a partir de un objeto meta usa el comando EXTN. Por ejemplo, el programa
de abajo agrega la unidad m/s al número que está en la pila.
::
CK1NOLASTWD
CKREAL
"m"
"s"
um/
umEND
BINT5
EXTN
;
Observa que las palabras que empiezan con um, cuando son ejecutadas, solo se ponen
ellas mismas en la pila.
Varias operaciones pueden ser hechas con unidades. La lista completa está dada abajo.
Las más importantes son UM+, UM-, UM* y UM/, cuyos significados son obvios; UMCONV,
equivalente al comando CONVERT de User RPL; UMSI, equivalente al comando UBASE de
User RPL, y U>nbr, el cual retorna la parte numérica de una unidad.
13.1 Referencia
13.1.1 Creando Unidades
Direcc. Nombre Descripción
2D74F um* * marca
2D759 um/ / marca
2D763 umˆ ˆ marca
2D76D umP Operador para el prefijo de la unidad. Explicado arriba.
2D777 umEND Operador que marca el final de la unidad.
05481 EXTN ( ob1..obn #n u )
Crea un objeto unidad.
Para saber si la unidad que está en la pila es válida o inválida, puedes usar lo siguiente.
Devuelve TRUE si la unidad es válida o FALSE si la unidad es inválida.
Por ejemplo, retorna TRUE para la unidad 12_N*s
También retorna TRUE para la unidad 12_N*ZZZ si ZZZ es una variable global que contiene
a una unidad válida.
Para saber si dos objetos de unidad son compatibles (tienen la misma dimensión) o no,
puedes usar la siguiente subrutina. En la pila deben estar dos unidades válidas. Devuelve
TRUE si son compatibles o FALSE si no lo son.
B) Ejecuta el comando ->S2. A continuación verás la representación System RPL del objeto
algebraico en la pila.
C) Selecciona Edit, luego Copy Stack.
Este procedimiento también es útil para la mayoría de los demás objetos, como por ejemplo
objetos gráficos, objetos unidad, programas, etc.
En lugar de ejecutar S2, puedes usar el siguiente programa User RPL el cual retorna la
representación System RPL del objeto en una sóla línea.
« S2
IF -92. FC?
THEN 15. OVER SIZE SUB
END
"
" " " SREPL DROP
"
;
@" " ;" SREPL DROP
" " " " SREPL DROP
" " " " SREPL DROP
" " " " SREPL DROP
" " " " SREPL DROP
" " " " SREPL DROP
" " " " SREPL DROP
" " " " SREPL DROP
" " " " SREPL DROP
" " " " SREPL DROP
" " " " SREPL DROP
»
14.1 Referencia
Los objetos gráficos (grobs) representan imágenes, dibujos, etc. Si quieres escribir
programas que dibujen algo en la pantalla, debes conocer como usar los grobs, porque el
contenido de la pantalla es un grob y tendrás que dibujar en ese grob o insertar otro grob en
el grob de la pantalla.
En la sección de referencia hay comandos para crear, manipular y mostrar objetos
gráficos.
Cuando tratamos con objetos gráficos debes tener dos cosas en mente:
1. Varios comandos que hacen operaciones con grobs, manipulan directamente al grob
sin hacer una copia de este. Por lo tanto, todos los punteros a ese objeto en la pila serán
modificados. Puedes usar el comando CKREF para asegurarte que ese objeto es único.
Para más información de la memoria temporal ver la sección 25.1.4. Este tipo de
operaciones son denominadas “tipo bang” y se indica esto en la explicación de cada
comando en las secciones de referencia de comandos.
2. Existen dos pantallas en las calculadoras hp: pantalla de textos (ABUFF) y pantalla
gráfica (GBUFF). La primera se usa para mostrar los objetos que están en la pila y la
segunda para graficar funciones o datos estadísticos. (Más información sobre estas en el
capítulo 39 sobre la pantalla). Para insertar un grob en alguna de estas pantallas puedes
usar el comando GROB! o el comando XYGROBDISP.
3. Para poner la pantalla de texto en la pila, debes llamar al comando ABUFF. ( grob )
4. Para poner la pantalla gráfica en la pila, debes llamar al comando GBUFF. ( grob )
5. Para volver activa a la pantalla de texto, debes llamar al comando TOADISP. ( )
6. Para volver activa a la pantalla gráfica, debes llamar al comando TOGDISP. ( )
15.1 Referencia
15.1.1 Grobs ya incorporados en ROM
Direcc. Nombre Descripción
27AA3 (NULLPAINT) ( grob )
0x0 Grob nulo.
27D3F CROSSGROB ( grob )
5x5 Cursor cruz
27D5D MARKGROB ( grob )
5x5 Grob marca
0860B0 ˜grobAlertIcon 9x9 Grob ícono de alerta
27D7B (NullMenuLbl) 21x8 Etiqueta de menu normal vacía
2E25C (InvLabelGrob) 21x8 Etiqueta de menú inversa vacía
279F6 (StdBaseLabel) 21x8 Etiqueta de menu normal vacía inversa
2E198 (BoxLabelGrobInv) 21x8 Etiqueta de menú con cuadrado inversa vacía
2E1FA (DirLabelGrobInv) 21x8 Etiqueta de menú tipo directorio inversa vacía
0870B0 ˜grobCheckKey 21x8 Etiqueta de menú con un “CHK”
0880B0 ROMPTR 0B0 088 131x7 Grob título
15.1.2 Dimensiones
Direcc. Nombre Descripción
26085 GROBDIM ( grob #h #w )
Retorna la altura y el ancho del grob.
25EBB DUPGROBDIM ( grob grob #h #w )
Retorna la altura y el ancho del grob.
36C68 GROBDIMw ( grob #w )
Retorna sólo el ancho del grob.
2F324 CKGROBFITS ( g1 g2 #n #m g1 g2' #n #m )
Reduce grob2, si este no cabe en grob1 (si quisieramos
insertarlo en el grob1 en las posiciones #n,#m).
2F320 CHECKHEIGHT ( ABUFF/GBUFF #h )
Si #h es menor a 80 (#50) en la HP 50g y HP 49g+, agrega
80-h lineas horizontales al grob en la parte inferior.
Generalmente, #h es la altura inicial del grob, y de esta
manera, se fuerza a que el grob tenga una altura final de por lo
menos 80.
El gráfico debe tener un ancho diferente a cero.
El siguiente NULLNAME fuerza a que el grob de la pila tenga por lo menos una altura de 72.
Las bibliotecas (libraries) son objetos muy complejos que contienen una colección de
comandos. Algunos de estos comandos tienen nombre y son accesibles al usuario. Pero
otros, no tienen nombre y, por lo tanto, son “ocultos”. Los objetos de respaldo (backups) son
usados por la calculadora, para guardar el contenido de todo el directorio HOME y
restaurarlo mas tarde, cuando se desee.
La integridad de ambos objetos puede ser verificada porque tienen un código CRC unido
a ellos.
Un rompointer (tambien llamado nombre XLIB) es un puntero a un comando en una
biblioteca. La única forma de acceder a un comando oculto en una biblioteca es a través de
un rompointer.
Un rompointer tiene dos números. El número de la biblioteca al que pertenece y el
número del comando.
Para insertar un rompointer en tu programa usa la siguiente estructura:
ROMPTR <lib> <cmd>, donde <lib> es el número de la biblioteca, y <cmd> es el
número del comando y su menor valor posible es 000. Ambos números se especifican en
forma hexadecimal. Los rompointers siempre se ejecutan automáticamente (como los
nombres globales y locales), de tal manera que tienes que citarlos (ver sección 20.2) si
quieres tenerlos en la pila.
16.1 Referencia
16.1.1 Operaciones
Direcc. Nombre Descripción
25EEB NEXTLIBBAK ( #addr backup/library #nextaddr )
Retorna la siguiente biblioteca o backup.
16.1.2 Rompointers
Direcc. Nombre Descripción
07E50 #>ROMPTR ( #lib #cmd ROMPTR )
Crea un rompointer.
08CCC ROMPTR># ( ROMPTR #lib #cmd )
Retorna el número de bilioteca y el número de comando de un
rompointer.
07E99 ROMPTR@ ( ROMPTR ob T )
( ROMPTR F )
Llama al contenido de un rompointer.
35C40 DUPROMPTR@ ( ROMPTR ROMPTR ob T )
( ROMPTR ROMPTR F )
Hace DUP luego ROMPTR@.
35BFF RESOROMP ( ob )
Llama al contenido del siguiente objeto en el runstream (el cual
debe ser un rompointer).
Equivale a usar :: 'R ROMPTR@ DROP ;
Por ejemplo:
:: RESOROMP ROMPTR 0B3 001 ;
retorna el contenido del rompointer.
02FEF (ROMSEC) ( ROMPTR ? )
Llama al contenido del rompointer y hace EVAL.
Si el rompointer no es encontrado, genera el error:
"Nombre XLIB indefinido"
081FB (ROMPTRDECOMP) ( ROMPTR ID T )
( ROMPTR F )
Si es un comando de User RPL, convierte el rompointer en un
id con el mismo nombre.
07C18 (COMPILEID) ( id comando T )
( id id T )
( id id F )
Si el id tiene el mismo nombre que un comando de User RPL,
retorna el comando (pointer o rompointer) y TRUE.
Si el id no tiene el nombre de un comando de User RPL:
- Si existe en el directorio actual o en uno de arriba, agrega
TRUE.
- De lo contrario, agrega FALSE.
34FCD ROM-WORD? ( ob flag )
Retorna TRUE para comandos de User RPL que no sean
rompointer y que sean el contenido de un rompointer.
34FC0 DUPROM-WORD? ( ob ob flag )
DUP, luego ROM-WORD?
Direcc. Nombre Descripción
07E76 (PTR>ROMPTR) ( ob ROMPTR )
Para un comando de User RPL que no sea rompointer y que
sea el contenido de un rompointer, retorna el rompointer que lo
llama.
35A88 ?>ROMPTR ( ob ROMPTR )
( ob ob )
Si ROM-WORD? y TYPECOL? dan TRUE, hace PTR>ROMPTR_
Por ejemplo:
:: ' xSIN ?ROMPTR> ; Retorna: ROMPTR 002 051
35AAB ?ROMPTR> ( ROMPTR ob )
( ROMPTR ROMPTR )
( ob ob )
Si el contenido de ROMPTR es un puntero que existe en
INHARDROM? entonces retorna ese puntero. Por ejemplo:
:: ' ROMPTR 002 051 ?ROMPTR> ; Retorna: xSIN
Cuando creas una biblioteca con algún programa que guarde archivos para su uso
posterior, puedes guardar ese archivo como un Library Data. Los Library Data no pueden ser
manipulados por el usuario, de manera que no es fácil alterar su contenido con User RPL.
La estructura de un Library Data es la siguiente:
También puedes usar la siguiente alternativa más rápida, con una parte escrita en
lenguaje ensamblador (extraído del comando ROMPTR 0E4 011, que es llamado por los
comandos del entorno MSOLVR, Multiple Solver Equation).
Para retornar sólo el número de biblioteca del LibraryData, puedes usar cualquiera de los
siguientes 3 NULLNAME. El primero toma más tiempo y el último es el más rápido.
Entradas
Generales
en
System RPL
Capítulo 18
::
%12 %13
{ LAM first LAM sec } BIND ( ) ( crea nuevo entorno temporal )
( ) ( first contiene 12, y sec contiene 13 )
LAM first ( %12 ) ( llama al contenido de first: 12 )
LAM sec ( %13 ) ( llama al contenido de sec: 13 )
%+ ( %25 )
' LAM first ( %25 lam )
STO ( ) ( guarda esa suma en first )
::
%12 %13
{ NULLLAM NULLLAM } BIND ( ) ( crea nuevo entorno temporal )
( ) ( LAM1 contiene a 13, LAM2 contiene a 12 )
2GETLAM ( %12 ) ( llama al contenido de LAM2: 12 )
1GETLAM ( %13 ) ( llama al contenido de LAM1: 13 )
%+ ( %25 )
2PUTLAM ( ) ( guarda esa suma en LAM2 )
La numeración de los lams es hecha en el mismo orden que los niveles que tenían en
la pila: 1GETLAM contiene al objeto que estaba en el nivel uno, 2GETLAM contiene al objeto
que estaba en el nivel dos, etc.
Hay comandos para llamar y guardar directamente hasta la variable número 27 (usar
1GETLAM a 27GETLAM_, para llamarlas y usar 1PUTLAM hasta 27PUTLAM_ para cambiar
su valor). Para acceder a variables con números mayores a 27 (lo cual probablemente no
ocurrirá con frecuencia) usar GETLAM, el cual toma como argumento a un bint que
representa el número de la variable y retorna su contenido; y PUTLAM, el cual toma como
argumentos a un objeto y al número de la variable y guarda ese objeto en la variable
especificada.
::
%102
%101
{ LAM n2 LAM n1 } BIND
%104
%103
{ NULLLAM NULLLAM } BIND
ABND
ABND
;
Primero, este programa asigna 102 a n2 y 101 a n1, pero estos nombres no son
usados después en el programa. En su lugar, 1GETLAM es usado para acceder al valor del
lam creado más recientemente, esto es, 101, al cual también pudo accederse con LAM n1.
Luego, 2GETLAM retorna el valor del siguiente lam, o sea 102.
Las cosas se vuelven más complicadas cuando otro entorno es creado, esta vez con
lams sin nombre. Ahora 1GETLAM retorna 103, el cual pertenece al nuevo entorno y fue la
última variable creada. De igual manera, 2GETLAM también retorna una variable creada en
el entorno más reciente. Si nosotros queremos acceder al valor del lam que antes tenía el
número uno, necesitamos agregar el número de variables creadas en el nuevo entorno (es
decir, dos) más uno (la pseudo-variable de uso interno) al número previo.
Por lo tanto, para conseguir el valor del lam 1 del entorno previo, debemos agregar tres
a uno, obteniendo 4GETLAM. Y esto retorna, como se esperaba a 101. Del mismo modo,
5GETLAM retorna 102, lo mismo que 2GETLAM retornaba antes del segundo BIND.
Naturalmente, después del primer ABND (correspondiente a la creación de los lams
que contenían los valores 104 y 103), 1GETLAM y 2GETLAM nuevamente retornarán 101 y
102, respectivamente.
Si has podido comprender lo explicado, no tendrás problemas para anidar entornos
temporales cuando sea necesario.
19.4 Otras Formas de Crear LAMS
Primero, en vez de una lista de lams, puedes siempre poner cada lam en la pila, luego
el número de lams que se crearán, y ejecutar el comando DOBIND en lugar de BIND. En
realidad, BIND es equivalente a :: INNERCOMP DOBIND ;.
Sin deseas crear un gran número de variables sin nombre (por ejemplo, 24 variables),
en lugar de ingresar el siguiente código (el cual toma 67.5 bytes)
...
{ NULLLAM NULLLAM NULLLAM NULLLAM NULLLAM NULLLAM
NULLLAM NULLLAM NULLLAM NULLLAM NULLLAM NULLLAM
NULLLAM NULLLAM NULLLAM NULLLAM NULLLAM NULLLAM
NULLLAM NULLLAM NULLLAM NULLLAM NULLLAM NULLLAM }
BIND
...
usa este, el cual toma sólo15 bytes, ahorrando 52.5 bytes:
... ' NULLLAM BINT24 NDUPN {}N BIND ...
Sin embargo, ¿para que crear un compuesto si este sera disgregado más tarde?
Reemplaza {}N BIND por DOBIND, y ahorra 2.5 bytes más.
O también puedes usar BINT24 ' NULLLAM CACHE. Sin embargo, si usas esto, dos
variables adicionales son creadas (en lugar de una), de manera que debes agregar uno a las
posiciones de las variables de los ejemplos previos.
Cuando descompilas código, a veces puedes encontrar cosas como esta
... ZEROZEROZERO BINT3 DOBIND ...
La cual es otra manera de crear variables locales sin nombre. Esto funciona porque en lugar
de NULLLAM, cualquier objeto de la ROM con dirección fija puede usarse, como ZERO en
este ejemplo.
Lo mostrado a continuación es la manera más compacta de crear entornos temporales
para N variables locales sin nombre.
xNAME EjTempEnv
::
CK0
31. 32. 33.
{ LAM A LAM B LAM C } BIND
ABND
ABND
ABND
;
19.6 Referencia
19.6.1 IDs y LAMs ya Incorporados en ROM
Direcc. Nombre Descripción
272FE NULLID ( id )
Pone identificador nulo (vacío) sin evaluar en la pila.
2B3AB NULLLAM ( ob )
( lam )
Retorna el contenido de la variable local sin nombre creada
más recientemente. Si no hay ninguna, retorna el lam.
Para retornar siempre una variable local sin nombre en la pila,
debes escribir: ' NULLLAM
27155 'IDX ( id )
Pone ID X sin evaluar en la pila.
27AE9 ('IDPAR) ( id )
Pone ID PPAR sin evaluar en la pila.
27B25 ('IDTPAR) ( id )
Pone ID TPAR sin evaluar en la pila.
27B07 ('IDVPAR) ( id )
Pone ID VPAR sin evaluar en la pila.
271D3 (IDSTARTERR) ( {} )
Pone { ID STARTERR } sin evaluar en la pila.
27308 (EvalNULLID) Evalúa el id nulo.
Si en el directorio actual hay una variable global de nombre
nulo, evalúa su contenido.
De lo contrario, fija al directorio oculto como el nuevo directorio
actual.
2715F (ID_X) ID X
272F3 (CUREQ) ID EQ
27937 (ID_SIGMADAT) ID ∑DAT
3EA01 (ID_CST) ID CST
2798A (ID_FV) ID FV
27963 (ID_I%YR) ID I%YR
2795A (ID_N) ID N
2797D (ID_PMT) ID PMT
2799A (ID_PYR) ID PYR
27972 (ID_PV) ID PV
27946 (ID_SIGMAPAR) ID ∑PAR
271D8 (ID_STARTERR) ID STARTERR
271B9 (ID_STARTUP) ID STARTUP
3EF97 (ID_S) ID S
27B2F (ID_TPAR) ID TPAR
27B11 (ID_VPAR) ID VPAR
271A3 (IDIOPAR) ID IOPAR
19.6.2 Conversión
Direcc. Nombre Descripción
05B15 $>ID ( $ ID )
362DE DUP$>ID ( $ $ ID )
05AED (ID>LAM) ( ID LAM )
05B01 (LAM>ID) ( LAM ID )
19.6.3 Entornos Temporales
Direcc. Nombre Descripción
074D0 BIND ( obn..ob1 {lamn..lam1} )
Crea n lams.
074E4 DOBIND ( obn..ob1 lamn..lam1 #n )
Crea n lams.
36518 1LAMBIND ( ob )
Crea un lam sin nombre.
Equivale a hacer: { NULLLAM } BIND
36513 DUP1LAMBIND ( ob ob )
Hace DUP luego 1LAMBIND.
155006 ˆ2LAMBIND ( ob1 ob2 )
Crea dos lams sin nombre.
Equivale a hacer: { NULLLAM NULLLAM } BIND
156006 ˆ3LAMBIND ( ob1 ob2 ob3 )
Crea tres lams sin nombre.
Equivale a hacer: { NULLLAM NULLLAM NULLLAM } BIND
0DE0B0 ˜nNullBind ( obn..ob1 #n )
Crea n variables sin nombre. 1LAM tiene al contador, 2LAM al
primer objeto, 3LAM al segundo objeto, etc.
Equivale a usar ' NULLLAM CACHE
36A77 dvarlsBIND ( ob )
Crea la variable local LAM 'dvar.
Equivale a usar { LAM 'dvar } BIND
07497 ABND ()
Abandona el entorno temporal creado más recientemente.
34D00 CACHE ( obn...ob1 #n lam )
Crea n+1 variables todas con el mismo nombre. 1LAM tiene al
contador, 2LAM al primer objeto, 3LAM al segundo objeto, etc.
34EBE DUMP ( NULLLAM ob1..obn #n )
Inversa de CACHE, cuando el entorno temporal se creó con
variables sin nombre.
Siempre hace recolección de basura.
No abandona el entorno temporal.
34D58 SAVESTACK ( obn...ob1 )
()
Guarda todos los objetos de la pila y el número de ellos en un
entorno temporal. 1LAM tiene al contador, 2LAM al objeto del
nivel uno, 3LAM al del nivel dos, etc.
34FA6 undo ( obm’...ob1’ obn...ob1 )
()
Borra todos los objetos de la pila, y coloca en esta los objetos
del entorno temporal creados por SAVESTACK, excepto al
contador.
No abandona el entorno temporal.
07943 @LAM ( lam ob T )
( lam F )
Intenta llamar al contenido del lam.
Si el lam existe, entonces retorna su valor y TRUE.
De lo contrario, sólo retorna FALSE.
Nota: si el lam existe en varios entornos, llama al de un entorno
más reciente.
02FD6 (DoLam) ( lam ob )
Intenta llamar al contenido del lam. Si no existe ese lam en
ningún entorno, genera el error "Nombre local indefin."
Direcc. Nombre Descripción
078F5 (NTH@LAM) ( lam #n ob T )
( lam #n F )
Intenta llamar al contenido del lam desde cualquier entorno.
#n es el número del entorno temporal. #1 para el entorno más
reciente, #2 para el entorno creado antes del primero, etc.
Si el lam existe en el entorno especificado, entonces retorna su
valor y TRUE.
De lo contrario, sólo retorna FALSE.
Por ejemplo, el siguiente programa retorna: %31 TRUE
::
31. 32. 33. { LAM A LAM B LAM C } BIND
21. 22. { LAM D LAM E } BIND
11. 12. 13. { LAM A LAM X LAM Y } BIND
ABND
ABND
;
07D1B STOLAM ( ob lam )
Guarda el objeto en el lam.
Si el lam no existe, genera el error “Nombre local indefinido”
075A5 GETLAM ( #n ob )
Retorna el contenido del lam de posición n.
34616 1GETLAM ( ob )
34620 2GETLAM ( ob )
3462A 3GETLAM ( ob )
34634 4GETLAM ( ob )
3463E 5GETLAM ( ob )
34648 6GETLAM ( ob )
34652 7GETLAM ( ob )
3465C 8GETLAM ( ob )
34666 9GETLAM ( ob )
34670 10GETLAM ( ob )
3467A 11GETLAM ( ob )
34684 12GETLAM ( ob )
3468E 13GETLAM ( ob )
34698 14GETLAM ( ob )
Direcc. Nombre Descripción
346A2 15GETLAM ( ob )
346AC 16GETLAM ( ob )
346B6 17GETLAM ( ob )
346C0 18GETLAM ( ob )
346CA 19GETLAM ( ob )
346D4 20GETLAM ( ob )
346DE 21GETLAM ( ob )
346E8 22GETLAM ( ob )
346F2 (23GETLAM) ( ob )
346FC (24GETLAM) ( ob )
34706 (25GETLAM) ( ob )
34710 (26GETLAM) ( ob )
3471A (27GETLAM) ( ob )
075E9 PUTLAM ( ob #n )
Guarda un nuevo contenido en el lam de orden n.
34611 1PUTLAM ( ob )
3461B 2PUTLAM ( ob )
34625 3PUTLAM ( ob )
3462F 4PUTLAM ( ob )
34639 5PUTLAM ( ob )
34643 6PUTLAM ( ob )
3464D 7PUTLAM ( ob )
34657 8PUTLAM ( ob )
34661 9PUTLAM ( ob )
3466B 10PUTLAM ( ob )
34675 11PUTLAM ( ob )
3467F 12PUTLAM ( ob )
34689 13PUTLAM ( ob )
34693 14PUTLAM ( ob )
3469D 15PUTLAM ( ob )
346A7 16PUTLAM ( ob )
346B1 17PUTLAM ( ob )
346BB 18PUTLAM ( ob )
346C5 19PUTLAM ( ob )
346CF 20PUTLAM ( ob )
346D9 21PUTLAM ( ob )
346E3 22PUTLAM ( ob )
346ED (23PUTLAM) ( ob )
346F7 (24PUTLAM) ( ob )
34701 (25PUTLAM) ( ob )
3470B (26PUTLAM) ( ob )
34715 (27PUTLAM) ( ob )
3471F (DUP1PUTLAM) ( ob ob )
Hace DUP luego 1PUTLAM.
34729 (DUP2PUTLAM) ( ob ob )
Hace DUP luego 2PUTLAM.
34797 DUP4PUTLAM ( ob ob )
Hace DUP luego 4PUTLAM.
364FF 1GETABND ( 1lamob )
Hace 1GETLAM luego ABND.
35DEE 1ABNDSWAP ( ob 1lamob ob )
Hace 1GETABND luego SWAP.
Direcc. Nombre Descripción
35F42 1GETSWAP ( ob 1lamob ob )
Hace 1GETLAM luego SWAP.
2F318 1GETLAMSWP1+ ( # 1lamob #+1 )
Hace 1GETLAM luego SWAP#1+.
3632E 2GETEVAL (? )
Hace 2GETLAM luego EVAL.
3483E GETLAMPAIR ( #n #n ob lam F )
( #n #n T )
Consigue el contenido y el nombre de un lam del entorno
temporal más reciente (10 = 1lam, 20 = 2lam, etc.).
347AB DUPTEMPENV ()
Duplica el entorno temporal más reciente (pero siempre pone 0
al “protection word” de este nuevo entorno temporal)
2B3A6 1NULLLAM{} ( {} )
Pone una lista con un NULLLAM en la pila.
271F4 (2NULLLAM{}) ( {} )
Pone una lista con dos NULLLAM en la pila.
27208 (3NULLLAM{}) ( {} )
Pone una lista con tres NULLLAM en la pila.
2B3B7 4NULLLAM{} ( {} )
Pone una lista con cuatro NULLLAM en la pila.
Capítulo 20
Control del Runstream
Hasta aquí, tu has visto sólamente comandos que no afectan el normal flujo de un
programa. Todos los programas presentados hasta ahora funcionan de manera secuencial,
desde el primer comando hasta el último, sin ningún tipo de cambio en su orden. Sin
embargo, en casi todos los programas, incluso los más simples, es necesario algún tipo de
interrupción en el orden normal del programa.
A veces, necesitarás tener alguna parte del programa repetida varias veces, o alguna
acción debe ser ejecutada sólo bajo ciertas condiciones.
Este capítulo describirá algunas entradas de bajo nivel que afectan el normal orden de
ejecución. Los problemas planteados en el párrafo anterior pueden ser resueltos también
con entradas de alto nivel (bucles del capítulo 22 y condicionales del capítulo 21). Lo más
probable es que tu uses esas entradas de alto nivel, en vez de los comandos de este
capítulo.
Sin embargo, este capítulo también describe algunos conceptos que ayudan a
comprender como funciona un programa de System RPL, y como cambiar el flujo normal de
un programa.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME fact
::
CK1 ( % ) ( verifica por 1 objeto en la pila )
CKREAL ( % ) ( verifica por objeto real o entero )
DUP %0> ( % flag )
NcaseSIZEERR ( si no es positivo, genera error )
( % )
%CEIL ( % ) ( si tiene parte decimal, redondea hacia arriba )
{ LAM x } BIND ( ) ( crea entorno temporal )
NULLNAME %3=case
:: %3 %= case ;
Sin embargo, esto no funcionará. Esto es porque case toma su argumento desde el
runstream, esto es, desde el programa que está siendo ejecutado, y no desde el compuesto
que llama a ese programa. Esto significa que el argumento para case en dicho programa
es ;, el cual no es el argumento deseable. Pero hay una solución: usa COLA antes de case.
NULLNAME %3=case
:: %3 %= COLA case ;
Esto borrará el resto del runstream que se encuentra después de case, y ejecuta
case en el programa de arriba. Por lo tanto, si agregamos COLA antes de case, e
insertamos este nuevo subprograma en otro, como aquí:
:: ... :: %3 %= COLA case ; <accion_T> <accion_F> ... ;
O también:
:: ... %3=case <accion_T> <accion_F> ... ;
Esto funcionará como si el código hubiera sido:
:: ... %3 %= case <act_T> <act_F> ... ;
Lo cual es lo que nosotros queríamos. Por consiguiente, la manera correcta de definir
nuestro subprograma es con COLA antes de case. Esto es una frecuente combinación, de
manera que existe el comando atajo, COLAcase, el cual es equivalente a COLA seguido por
case. Existen otros comandos como este que puedes verlos en la referencia de abajo.
20.4 Viendo la Pila de Retornos con Debug4x
En Debug4x, puedes ver el contenido de los primeros objetos de cada nivel de la pila de
retornos (return stack) en cualquier momento en el Panel “Return Stack” que se encuentra
en la ventana RPL Debugging.
Por ejemplo, si escribimos el código de la izquierda en el editor de Debug4x, fijamos un
breakpoint (círculo rojo) en la posición indicada y ejecutamos el comando EjReturnStack
desde el emulador, podremos ver en el Panel Return Stack, todos los niveles de la pila de
retornos.
Además de los niveles en la pila de retornos generados por nuestro programa, hay más
niveles de pila de retornos que permiten que todo funcione correctamente y no debemos
alterar esos niveles de la pila de retornos.
xNAME EjReturnStack
:: CK0
11.
:: 12.
:: 13.
:: 14.
15.
16.
;
71.
72.
;
:: 81. 82. ;
82.
;
91.
93.
;
20.5 Referencia
Direcc. Nombre Descripción
06E8E NOP ()
No hace nada.
06EEB 'R ( ob )
Trae el siguiente objeto de la pila de retornos (es decir, el
siguiente objeto del compuesto que está arriba del actual) en la
pila (borrándolo de donde estaba). Si la pila de retornos está
vacía (contiene SEMI), un programa nulo es puesto y el
puntero no es avanzado.
06F66 'REVAL (? )
Hace 'R luego EVAL.
36A27 'R'R ( ob1 ob2 )
Hace 'R dos veces.
34BEF ticR ( ob T )
(F )
Trae el siguiente objeto de la pila de retornos hacia la pila y
pone TRUE.
Si este primer nivel de la pila de retornos está vacío, lo borra y
pone FALSE en la pila.
36A4A 'RRDROP ( ob )
Hace 'R, luego RDROP.
06F9F >R ( prog )
( {} )
Pone el compuesto como el primer nivel de la pila de retornos.
0701F R> ( :: )
Trae todos los objetos del nivel 1 de la pila de retornos
(quitando este nivel de la pila de retornos) y los pone en la pila
en un objeto programa.
07012 R@ ( :: )
Como R>, pero el nivel 1 de la pila de retornos no se quita.
0716B IDUP ()
Crea un nuevo nivel de la pila de retornos que va a contener a
los objetos restantes del actual runstream.
06F8E EVAL ( ob ? )
Evalúa objeto.
262FB COMPEVAL ( comp ? )
Parecido a EVAL, pero en el caso de listas evalúa sus
elementos como si fuera un objeto programa (en cambio,
EVAL no hace nada cuando en la pila hay una lista).
34BAB 2@REVAL (? )
Hace EVAL sobre el siguiente objeto del programa de arriba
de arriba del actual.
34BBB 3@REVAL (? )
Hace EVAL sobre el siguiente objeto del programa de arriba
de arriba de arriba del actual.
26111 RDUP ()
Duplica el primer nivel de la pila de retornos.
06FB7 RDROP ()
Quita el primer nivel de la pila de retornos.
Direcc. Nombre Descripción
343E1 2RDROP ()
Quita dos niveles de la pila de retornos.
343F3 3RDROP ()
Quita tres niveles de la pila de retornos.
36342 DROPRDROP ( ob )
Hace DROP luego RDROP.
3597F RDROPCOLA ()
Hace RDROP luego COLA.
34144 RSWAP ()
Cambia los niveles 1 y 2 de la pila de retornos.
368C9 RSKIP ()
Pasa por alto el primer objeto del nivel 1 de la pila de retornos.
Equivale a hacer 'R DROP.
2644A (RROLL) (# )
Mueve niveles en la pila de retornos: Al nivel n de la pila de
retornos lo mueve hacia el nivel 1 de la pila de retornos.
2B8BE (OBJ>R) ( ob )
Pone en el primer nivel de la pila de retornos a ob seguido de
los demás elementos del runstream. Puede usarse para un
guardado temporal. Si ob es una lista, la lista es puesta
entera en la pila, no los elementos individuales.
2B8E6 (R>OBJ) ( ob )
Retorna el primer objeto del nivel 1 de la pila de retornos y
quita ese nivel 1 de la pila de retornos.
0312B SEMI ()
Quita el resto del runstream.
En este ejemplo se ilustra el uso del comando 'R, el cual trae un objeto desde el primer nivel
de la pila de retornos.
Ejemplo 2.
Uso del comando 'R.
Otro ejemplo con el comando 'R. Aquí podemos ver que cuando en el primer nivel de la
pila de retornos hay un objeto programa, el comando 'R trae a ese objeto programa hacia
la pila sin evaluarlo.
Ejemplo 3.
Uso del comando >R para guardar objetos.
Aquí usamos la pila de retornos como un lugar donde podemos guardar objetos. El comando
>R pone los objetos de la pila en el primer nivel de la pila de retornos y el comando 'R los
trae desde la pila de retornos ahí hacia la pila RPN.
Aquí usamos un bucle DO/LOOP (ver sección 22.2) para sumar los elementos de dos listas.
Por ejemplo: {100. 200. 300. } {5. 6. 7. } retornará { 105. 206. 307. }
Se usa el comando >R para poner los elementos de la lista de la pila RPN en la pila de
retornos, para que sean llamados más adelante.
Como veremos en otro capítulo, el comando ZERO_DO crea un nuevo nivel en la pila de
retornos (además hace otras cosas).
Por lo tanto, los números reales que queremos llamar ya no están en el nivel 1 de la pila de
retornos. Ahora están en el nivel 2 de la pila de retornos.
Si deseamos llamar a estos números reales del nivel 2 de la pila de retornos, antes
debemos usar el comando RSWAP. Este comando cambia los niveles 1 y 2 de la pila de
retornos. Ahora los números reales están en el nivel 1 de la pila de retornos y ya podemos
usar el comando 'R para traer a un número real. Luego volvemos a usar RSWAP para
cambiar nuevamente los niveles 1 y 2 de la pila de retornos, lo que permite que el entorno
DO/LOOP funcione adecuadamente.
Ejemplo 5.
Uso del comando RROLL para cambiar dos niveles de la pila de retornos.
Ejemplo 7.
Uso del comando 3@REVAL.
En System RPL, los condicionales son un poco diferentes a los de User RPL.
La primera diferencia, es que en User RPL, “falso” es representado por el número real
cero; y otro valor representa “verdadero”. En System RPL, “falso” es representado por la
palabra FALSE, y “verdadero” es representado por la palabra TRUE. Al ejecutar TRUE o
FALSE, estas palabras se colocan en la pila. Todos los comandos que hacen un test,
retornan una de estas dos palabras. Comandos como IT or case toman TRUE o FALSE
como argumento.
Se puede convertir TRUE o FALSE a los números reales 0 o 1 con COERCEFLAG. Para
hacer la transformación opuesta puedes usar el comando %0<>.
Hay muchos comandos que ponen TRUE, FALSE, o alguna combinación de ellos en
la pila. Véalos en la lista de abajo.
Los operadores booleanos también están presentes. Son: NOT, AND, OR y XOR. Hay
algunas combinaciones. Véalos en la lista de abajo.
21.1 Tests
Los comandos tests son comandos que toman uno o más argumentos y retornan TRUE
o FALSE, después de hacer alguna clase de comparación o prueba entre los argumentos.
Los tests que toman como argumento a un determinado tipo de objeto son listados en el
capítulo correspondiente a ese tipo de objeto. Los tests para saber si un objeto es de un
deteminado tipo son listados en el capítulo 29. Otras clases de tests son listadas en la
referencia de este capítulo. Los más importantes de estos tests son EQ y EQUAL. Ambos
toman dos objetos y retornan un flag.
El comando EQ verifica si los dos objetos son el mismo objeto, es decir, verifica si
ambos objetos ocupan la misma dirección en la memoria.
El comando EQUAL verifica si los objetos son iguales en terminos del contenido de los
objetos.
La diferencia es que :: BINT2 # 2 EQUAL ; retorna TRUE, pero si EQUAL es
reemplazada por EQ, entonces el programa retorna FALSE, porque un objeto es el bint2 (ya
incorporado en ROM), cuya dirección es #3311B, y el otro es un bint cuya dirección no se
puede predecir, pero de hecho no está en la ROM.
Otro ejemplo: si pones una cadena en el nivel 1 y presionas ENTER (o ejecutas el
comando DUP), EQ y EQUAL retornarán TRUE. Sin embargo, si tu ingresas una cadena, y
luego escribes nuevamente la misma cadena en la pila, sólo EQUAL retornará TRUE. Esto
sucede porque los contenidos de las cadenas son los mismos, pero son diferentes objetos
en la memoria, pues ocupan diferentes direcciones en la memoria.
Cuando sea posible debes usar EQ en tus programas debido a que es más rápido que
EQUAL.
21.2 If. . . Then. . . Else
La mayoría de las veces los condicionales TRUE y FALSE serán argumentos de los
comandos IT y ITE.
Con el siguiente código: si en la pila se encuentra el número real cero, entonces se cambia a
uno, pero si en la pila se encuentra otro número, entonces no hace nada.
... DUP %0= IT %1+ ...
El siguiente código pone en la pila la cadena "Iguales" si los dos objetos son iguales, y
"Diferentes" si no los son.
... EQUAL ITE "Iguales" "Diferentes" ...
21.3 Case
Los comandos CASE son útiles para tomar decisiones. El comando básico es case,
pero hay combinaciones de este con tests y otros comandos.
El comando case toma un flag en el nivel uno.
Si el flag es TRUE, el siguiente objeto es ejecutado, pero sólo este, y el resto del programa
es pasado por alto. Por lo tanto, TRUE case es equivalente a COLA.
Si el flag es FALSE, el siguiente objeto del programa es pasado por alto y la ejecución
continua después de ese objeto. Por lo tanto, FALSE case es equivalente a SKIP.
El ejemplo mostrado abajo muestra como hacer una estructura case similar a las
encontradas en otros lenguajes (incluso User RPL). Este pone una cadena que representa el
bint que se encuentra en el nivel uno.
::
DUP #0= case "Cero"
DUP BINT1 #= case "Uno"
DUP BINT2 #= case "Dos"
...
;
Hay muchos comandos que combinan case con otros comandos. Uno de ellos es el
comando OVER#=case. No es dificil suponer lo que hace este comando. Primero hace
OVER. Luego, #= compara dos bints. Finalmente, el case funciona como se explico
arriba. Usando este comando el código mostrado arriba podría reescribirse asi:
::
BINT0 OVER#=case "Cero"
BINT1 OVER#=case "Uno"
BINT2 OVER#=case "Dos"
...
;
En la sección de referencia de abajo, encontrarás una lista de los comandos que
ejecutan un case además de alguna otra acción. Los nombres de estos comandos se
componen de una parte inicial, luego el case mismo y una parte final. Algunos comandos
tienen sólo la parte inicial o la parte final, algunos tienen ambas partes. La parte inicial
representa los comandos que son ejecutados antes del case, y deberián representar
fielmente lo que hace el comando para comprender su acción. Por ejemplo, el comando
NOTcase es equivalente a NOT seguido por case. Para la parte final, las cosas se vuelven
más complicadas, pues hay dos clases de parte final.
El primer tipo tiene la parte final escrita en letras mayúsculas. Para estos comandos,
esa parte final es ejecutada si el flag es TRUE. Tú solamente debes colocar la acción para
el caso que el flag sea FALSE. Por ejemplo, este código:
... caseDROP <FalseAction> ...
es equivalente a
... case DROP <FalseAction> ...
El segundo tipo tiene la parte final en letras minúsculas. En este caso, los comandos
en la parte final son ejecutados junto con el objeto siguiente del programa. Por ejemplo, este
código:
... casedrop <TrueAction> <FalseAction> ...
es equivalente a
... case :: DROP <TrueAction> ; <FalseAction> ...
21.4.8 Miscelánea
Direcc. Nombre Descripción
36F65 UserITE ( #set :: <ob1> <ob3> <rest> ; )
( #clr :: <ob2> <rest> ; )
Equivale a usar TestUserFlag ITE
36F79 SysITE ( #set :: <ob1> <ob3> <rest> ; )
( #clr :: <ob2> <rest> ; )
Equivale a usar TestSysFlag ITE
Direcc. Nombre Descripción
36C4F caseDoBadKey ( T :: DoBadKey ; )
( F :: <ob1> <rest> ; )
Si el flag es TRUE, pasa por alto el resto del programa y
emite un sonido.
Equivale a usar case DoBadKey
aka: caseDEADKEY
36C36 caseDrpBadKy ( ob T :: DoBadKey ; )
( ob F :: ob <ob1> <rest> ; )
Si el flag es TRUE, borra ob, pasa por alto el resto del
programa y emite un sonido.
Equivale a usar case DropBadKey
Equivale a usar casedrop DoBadKey
361B2 caseERRJMP ( T :: ERRJMP ; )
( F :: <ob1> <rest> ; )
Si el flag es TRUE, hace ERRJMP.
Equivale a usar case ERRJMP
36B53 caseSIZEERR ( T :: SETSIZEERR ; )
( F :: <ob1> <rest> ; )
Si el flag es TRUE, hace SETSIZEERR.
Equivale a usar case SETSIZEERR
36B67 NcaseSIZEERR ( T :: <ob1> <rest> ; )
( F :: SETSIZEERR; )
Si el flag es FALSE, hace SETSIZEERR.
Equivale a usar NOT case SETSIZEERR
36BAA NcaseTYPEERR ( T :: <ob1> <rest> ; )
( F :: SETTYPEERR ; )
Si el flag es FALSE, hace SETTYPEERR.
Equivale a usar NOT case SETTYPEERR
25EEE NoEdit?case ( :: <ob1> ; )
( :: <ob2> <rest> ; )
La condición para que el test sea TRUE es que no exista una
línea de edición activa.
Parecido a usar EditLExistS? NOT case
36E57 EditExstCase ( :: <ob1> ; )
( :: <ob2> <rest> ; )
La condición para que el test sea TRUE es que exista una
línea de edición activa.
Equivale a usar EditLExistS? case
2BE36 (AlgebraicModecase) ( :: <ob1> ; )
( :: <ob2> <rest> )
La condición para que el test sea TRUE es que la calculadora
esté en modo algebraico.
Equivale a usar BINT95 TestSysFlag case
Capítulo 22
Bucles (Loops)
Como en User RPL, en System RPL también hay dos tipos de bucles: bucles indefinidos
y bucles definidos.
Un bucle indefinido es aquel para el cual no se sabe con anterioridad, cuantas veces
será ejecutado. Será repetido hasta que se cumpla una condición específica.
Un bucle definido, por otra parte, es ejecutado un número de veces ya especificadas
antes de su inicio. Sin embargo, en System RPL puedes cambiar el número de veces que se
repite el bucle mientras se está ejecutando.
En las descripciones de abajo, los elementos entre < > pueden consistir de varios
objetos, a menos que se indique lo contrario.
BEGIN
<test>
WHILE
<objetos_bucle>
REPEAT
Esta clase de bucle ejecuta <test>, y si el test es TRUE, entonces <objetos_bucle>
es ejecutado, y el proceso empieza nuevamente. Si el test retorna FALSE, entonces la
ejecución pasa a estar después de REPEAT. Si la primera vez que se evalúa al test, este
retorna FALSE, el bucle nunca será ejecutado. Este bucle requiere que <objetos_bucle>
sea un objeto único. La mayoría de las veces este es un objeto programa. Sin embargo,
Debug4x siempre adiciona al código que escribes los delimitadores :: y ;.
B) El segundo tipo de bucle indefinido es el bucle UNTIL. El cual es creado de esta manera:
BEGIN
<obj_bucle&test>
UNTIL
Este bucle siempre es ejecutado por lo menos una vez. El comando UNTIL espera un
flag. Si este es FALSE, entonces <obj_bucle&test> es ejecutado nuevamente. Si el flag es
TRUE, la ejecución pasa a estar después de UNTIL.
C) También hay un tercer tipo de bucle indefinido, el bucle AGAIN:
BEGIN
<obj_bucle>
AGAIN
Este bucle no tiene un test. Para terminarlo, debe ocurrir un error, o la pila de retornos
debe ser directamente manipulada. Esto es útil si el código del bucle contiene varios lugares
diferentes en los cuales decisiones sobre repetir el bucle o salir de el tienen que ser hechas.
22.1.1 Como Funcionan los Bucles Indefinidos
Los bucles indefinidos están formados por combinaciones de los comandos BEGIN,
WHILE, REPEAT, UNTIL y AGAIN. Estos comandos no tienen nada especial, pues son
como cualquier otro comando, pero cuando se combinan permiten hacer bucles. Estos
funcionan manipulando el runstream y la pila de retornos, por lo cual asegurate de
comprender esos conceptos (ver sección 20.1 si tienes dudas) para entender esta sección.
Gracias a esta explicación, ahora podemos comprender como funcionan los bucles
indefinidos, y también el porque el bucle BEGIN...WHILE...REPEAT requiere un objeto
único entre WHILE y REPEAT.
22.2 Bucles Definidos
Los bucles definidos son creados con los comandos DO y LOOP (u otros comandos
equivalentes). El comando DO toma dos bints de la pila, que representan el valor de parada
y el valor inicial. El valor inicial es guardado como el índice actual, el cual puede ser llamado
con el comando INDEX@. El valor de parada puede ser llamado con el comando ISTOP@.
Puedes fijar un nuevo valor para cada uno de ellos con los comandos INDEXSTO e
ISTOPSTO, respectivamente.
La contraparte del comando DO es el comando LOOP o también +LOOP. El comando
LOOP incrementa el valor del índice en uno, y verifica si el nuevo valor es mayor o igual que
el valor de parada, finalizando el bucle si esto se cumple. De lo contrario, el bucle es
ejecutado nuevamente. El comando +LOOP funciona de maner similar, pero incrementa el
índice en una cantidad igual al bint que está en el nivel 1 de la pila.
La forma estándar de un bucle DO/LOOP es:
#parada #inicio DO
<objetos_bucle>
LOOP
En este caso, <objetos_bucle> es ejecutado para cada valor del índice desde
#inicio hasta #parada-1. Nota que el valor de parada es mayor que el valor que sería
usado en User RPL. Debes prestar atención a eso. También, el valor de parada viene antes
del valor inicial.
La forma estándar de un bucle DO/+LOOP es:
#parada #inicio DO
<objetos_bucle>
#incremento +LOOP
Puedes usar varios comandos que producen bucles DO, tal como ONE_DO. Estos son
listados en la sección de referencia de abajo.
Aquí un ejemplo de un bucle simple, el cual retorna los bints #1h, #2h, #3h y #4h a la
pila.
::
BINT5 BINT1
DO
INDEX@
LOOP
;
::
BINT5 ONE_DO
INDEX@
LOOP
;
22.2.1 Como Funciona un Bucle Definido
Ejemplo 2.
Usando un bucle DO/LOOP tantas veces como elementos tiene una lista.
En este ejemplo se usa el comando toLEN_DO para repetir un bucle tantas veces como
elemetos tiene el compuesto ubicado en el nivel 1.
En este ejemplo se usa el comando ExitAtLOOP para hacer que el bucle DO/LOOP no se
vuelva a repetir cuando encuentra un objeto no real en una lista.
En este ejemplo se reinicia el bucle DO/LOOP, asignando un nuevo valor al índice (una
unidad menos que #inicial) con el comando INDEXSTO.
En la última repetición del bucle (cuando #indice=#parada-1) se fija a # indice como cero
(una unidad menos que #inicial=#1) usando ZERO INDEXSTO.
Si el #inicial hubiera sido #0, para reiniciar el bucle, debemos hacer MINUSONE INDEXSTO.
Ejemplo 5.
Finalizando INMEDIATAMENTE un bucle DO/LOOP.
* No se requieren argumentos.
* Edita un arreglo real con el ESCRITOR DE MATRICES.
* Si uno se retira de la edición, retorna FALSE.
* Si uno acepta con ENTER, retorna el anuevo arreglo real y TRUE
* El arreglo real debe tener 2 columnas y por lo menos 2 filas,
* si no es así se muestra un mensaje y el bucle se repite otra
* vez, regresandote al escritor de matrices con el arreglo real
* que escribiste.
* Este programa llama al NULLNAME SaleBucleAGAIN_AHORA, que
* permite salir de un bucle AGAIN, inmediatamente y en
* cualquier momento
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME EditaMatriz ( -> [[%]] T // F )
::
CK0 ( ) ( No se requieren argumentos )
ARRY [ 13. 15. ] ( [%] )
BEGIN
RunSafeFlags
:: BINT91 ClrSysFlag
FLASHPTR DoOldMatrixReal
; ( RealArry T // F )
NOT_IT
:: FALSE ( F )
SaleBucleAGAIN_AHORA ( F ) ( BUCLE TERMINA AHORA )
;
( RealArry )
DUP
FLASHPTR MDIMS ( RealArry #f #c T // RealArry #elem F )
ITE
:: ( RealArry #f #c )
#2= ( RealArry #f flag )
SWAP ( RealArry flag #f )
BINT1 #> ( RealArry flag flag' )
AND ( RealArry flag'' )
ITE
:: ( RealArry )
TRUE ( RealArry T )
SaleBucleAGAIN_AHORA ( RealArry T ) ( BUCLE TERMINA AHORA )
;
:: ( RealArry )
"INGRESA ARREGLO REAL\0ANºcolumn = 2\0ANºfilas > 1"
FlashWarning ( RealArry )
;
;
:: ( RealArry #elem )
DROP ( RealArry )
"No ingreses vector\0AINGRESA ARREGLO REAL\0ANºcolumn = 2\0ANºfilas > 1"
FlashWarning ( RealArry )
;
AGAIN
::
...
ERRSET
:: <objetos sospechosos> ;
ERRTRAP
:: <código a ejecutarse si error ocurre> ;
...
;
Cada entorno temporal (ver capítulo 19), entorno DO/LOOP (capítulo 22) y nivel de pila
virtual (capítulo 24) tiene un “protection word”.
El propósito de esto es permitir que el subsitema de manejo de errores pueda distinguir
cuales entornos fueron creados antes del proceso de buscar atrapar al error, y cuales
después. De esta manera, todos los entornos que fueron creados después de iniciado el
intento de atrapar el error, serán borrados si sucede un error. Por ejemplo, considerar el
siguiente código:
::
...
1LAMBIND
...
TEN ZERO_DO
ERRSET
::
...
1LAMBIND
...
BINT5 ONE_DO
<objeto sospechoso está aquí>
LOOP
ABND
...
;
ERRTRAP
:: <manejador de errores> ;
LOOP
...
ABND
;
Si un error es generado en el objeto sospechoso, entonces el error es atrapado. El bucle
DO/LOOP más interno y el entorno temporal más interno serán borrados, gracias al
“protection word”.
Cuando alguno de estos entornos es creado, su “protection word” es fijado como cero. El
comando ERRSET incrementa el protection word de los entornos (uno de cada uno de los
tres tipos) creados anteriormente. De esta manera, esos entornos tienen ahora su “protection
word” mayor a cero (el protection Word fue inicializado como cero cuando fue creado).
Los comandos ERRTRAP y ERRJMP borran todos los entornos que tengan su
“protection word” igual a cero (desde el más reciente hasta el más antiguo) hasta que
encuentren un entorno (de cualquiera de los tres tipos) con un “protection word” distinto a
cero. Estos entornos eran aquellos que ya existían antes de que se inicie el proceso de
buscar capturar un error, porque ellos tienen sus valores incrementado por el comando
ERRSET. De esta manera, todos los entornos creados después de iniciada la busqueda de
errores (entornos con con su “protection word” igual a cero) serán borrados. Otro efecto de
los comandos ERRTRAP y ERRJMP es que ellos decrementan el “protection word” de los
entornos creados anteriormente (entornos con “protection word” mayor a cero), de tal forma
que el proceso funcionará correctamente si hay varios niveles de anidamiento.
Otras conclusiones:
Si dentro del código que se encuentra entre los comandos ERRSET y ERRTRAP, abres
un entorno de cualquiera de los tres tipos, entonces también debes poner un comando
para cerrar dicho entorno (por ejemplo LOOP, DropVStack y ABND) dentro de ese código.
Dentro del código que se encuentra entre los comandos ERRSET y ERRTRAP no puedes
cerrar algún entorno (de cualquiera de los tres tipos) creado antes de ese ERRSET.
23.2 Generando Errores
El subsistema de manejo de errores es invocado por el comando ERRJMP. Si un error es
atrapado, entonces el manejador de errores es ejecutado. Pero si un error ocurres sin ser
atrapado, entonces se ejecuta el manejador de errores por defecto.
En la mayoría de los casos, cuando se genera un error, permites que el manejador de
errores por defecto trate con este. Esta acción por defecto hace un beep (si está desactivado
el flag 56), y muestra una descripción del error dentro de un rectángulo.
El mensaje de error mostrado depende de dos cosas: el número del error, el cual define
el texto del mensaje de error (como “Argumento incorrecto” o “Muy pocos argumentos”), y el
nombre del último comando guardado.
Este nombre del ultimo comando es automáticamente guardado por los comandos de la
forma CK<n> descritos en el capítulo 30. Como se menciona ahí, si estás estás escribiendo
un programa que no es parte de una biblioteca, ningún nombre de comando se guarda,
entonces no deberás usar un comando de la forma CK<n> porque un nombre feo sería
mostrado.
Para definir al número de error, usa el comando ERRORSTO. Este comando espera un
bint como argumento: el número del error. Los errores son listados en el apéndice E.
Hay algunos comandos que hacen este proceso de forma automática. Por ejemplo, el
comando SETTYPEERROR genera el error “Argumento incorrecto”, que también se pudo
generar haciendo # 202 ERRORSTO ERRJMP. Estos comandos son listados en la sección
de referencia de abajo. También hay comandos como estos pero que generan errores del
CAS y se describen en el capítulo 53.
Sin embargo, a veces es deseable generar un mensaje de error con cualquier texto que
no esté en la lista de mensajes de error ya incorporada en la calculadora. Para hacer esto,
primero necesitas guardar la cadena de texto con el comando EXITMSGSTO. Luego, guarda
#70000 como el número del error (nota que este bint está ya incorporado en ROM con la
palabra #EXITERR) con ERRORSTO. Finalmente, solo llama a ERRJMP.
Los procesos descritos arriba pueden ser simplificados usando los comandos DO#EXIT
y DO$EXIT. El primero toma un bint como argumento, guarda ese número y llama a
ERRJMP. El ultimo es usado con cadenas, este comando toma una cadena como argumento
y hace las acciones descritas en el párrafo anterior. Sin embargo, ambas entradas también
llaman al comando AtUserStack, el cual le dice al sistema de manejo de errores que
mantenga la pila como está en ese momento (sin borrar ningún objeto). Por lo tanto, no
debes usar estos comandos (DO#EXIT y DO$EXIT) si hay objetos en la pila (puestos por tu
programa) que deberían ser borrados cuando un error ocurre. El borrado automático de
objetos de la pila no ingresados por el usuario cuando un error ocurre será descrito con más
detalle en la sección 30.1.
23.3 Referencia
23.3.1 Comandos Generales
Direcc. Nombre Descripción
26067 ERRBEEP ()
Solo hace un beep. Un sonido similar al que se escucha
cuando se genera un error.
04D0E ERRORSTO (# )
Guarda un nuevo número de error.
04D33 ERRORCLR ()
Guarda cero como el núevo número del error.
04ED1 ERRJMP ()
Invoca al subsistema de manejo de errores.
04EA4 ABORT ()
Hace ERRORCLR y luego ERRJMP.
Se muestra el mensaje de error “Interrupted” y no se muestra el
nombre del último comando guardado.
04CE6 ERROR@ (# )
Retorna el número del error actual.
26431 PTR 26431 (# )
Retorna el número del último error generado.
36883 ERROROUT (# )
Guarda un nuevo número de error y genera el error.
Hace :: ERRORSTO ERRJMP ;
25EAE DO#EXIT (# )
Guarda un nuevo número de error, llama a AtUserStack y
genera el error.
Hace :: ERRORSTO AtUserStack ERRJMP ;
25EB0 DO%EXIT (% )
Similar a DO#EXIT, pero un número real es su argumento.
Equivale al comando DOERR de User RPL cuando en la pila
hay un número real.
La calculadora HP tiene una “Pila Virtual”. De hecho existe una pila de pilas (o metapila).
La pila de la parte más alta (y en condiciones normales, la única) es la pila RPN, en la cual el
usuario ingresa objetos y desde la cual los comandos toman y retornan sus argumentos.
Esta pila será llamada “pila RPN”. El conjunto (o más específicamente, la pila) de pilas será
llamada “Pila Virtual”, con las primeras letras en mayúscula.
Puedes poner toda la pila RPN (o parte de esta) en un nuevo nivel de la “Pila Virtual”. Un
nivel de la Pila Virtual será llamado “pila virtual”, con las letras iniciales en minúscula.
Después de poner la pila RPN en ese nuevo nivel de la Pila Virtual, puedes manipular este
de cualquier manera, y puedes en cualquier momento restaurar el contenido previamente
puesto en esa pila virtual. O también puedes crear un nuevo nivel en la Pila Virtual, teniendo
de esta manera dos pilas virtuales, en adición a la pila RPN, la cual puede ser usada
independientemente.
Cada una de estas pilas virtuales contiene una cantidad fija de objetos y también un
contador del número de objetos de esa pila virtual. El número de objetos es determinado
cuando la pila virtual es creada, y no es posible agregar más objetos después. Los
comandos que retornan la pila virtual como un meta retornan este contador, los otros
comandos no devuelven el contador. Cuando creas una nueva pila virtual puedes poner en
esa, algunos objetos de la pila RPN (con los comandos cuyo argumento es un meta) o todos
los objetos de la pila RPN. Puedes destruir el nivel más bajo de la pila virtual, ya sea
desapareciendo su contenido, o retornando su contenido en la pila RPN como un meta o no
(es decir, con el contador al final de los objetos o sin el), sin importar si ese nivel de la pila
virtual fue creado a partir de un meta o a partir de todos lo objetos de la pila RPN.
La Pila virtual es usada en casi todas las aplicaciones de la calculadora HP. Es
extremadamente útil (y realmente rápida) cuando quieres guardar inmediatamente una pila
completa sin usar mucha memoria.
Por ejemplo, en los formularios de entrada se aplica la Pila Virtual en el uso de la línea
de comandos: te permite escribir comandos en dicha línea y conseguir sus resultados. Si
escribes allí DROP, conseguirás el error: “Muy pocos argumentos” aún si la pila no está
vacía. Esto funciona así: antes de que la calculadora ejecute el comando, esta guarda la
totalidad de la pila RPN en la Pila Virtual, luego ejecuta el comando. Una vez que el
comando ha terminado de ser ejecutado, se restaura la pila virtual copiada.
La Pila Virtual está ubicada dentro de una cadena, la cual es el primer objeto en
TEMPOB. Tiene una estructura similar a la pila de Variables Locales, y es protegida
exactamente igual que las variables locales. Si atrapas un error, las pilas virtuales creadas
entre ERRSET y ERRTRAP serán borradas automáticamente, igual como sucede con los
bloques de variables locales (Ver sección 23.1.1 para más información). Puedes ver
ejemplos de aplicación de la Pila Virtual al final de este capítulo y en la sección 35.9.
En Debug4x, puedes ver el contenido de todos los niveles de la Pila Virtual en el Panel
Virtual Stack que se encuentra en la ventana RPL Debugging.
Por ejemplo, si escribimos el código de la izquierda en el editor de Debug4x, fijamos un
breakpoint (círculo rojo) en la posición indicada y ejecutamos el comando EjemploVStack
desde el emulador, podremos ver en el Panel Virtual Stack, todos los niveles de la Pila Virtual
y sus respectivos “protection word”.
En la sección de referencia de comandos de abajo, nos referimos a la pila virtual más
reciente como “la del nivel más alto”.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME EjemploVStack
::
CK0
ERRSET
:: { %31_ %32_ }
"HON"
2
PushMetaVStack&Drop
%5 %0 %/
DropVStack
;
ERRTRAP
:: "División entre cero" FlashWarning ;
DropVStack
DropVStack
;
24.1 Referencia
24.1.1 Comandos Generales
Direcc. Nombre Descripción
26265 PushMetaVStack ( obn..ob1 #n obn..ob1 #n )
Pila Virtual:
( [obn..ob1] )
Pone los objetos del meta como una nueva pila virtual.
La pila RPN permanece sin cambios.
25F1D PushMetaVStack&Drop ( obn..ob1 #n )
Pila Virtual:
( [obn..ob1] )
Hace PushMetaVStack y luego borra el meta de la pila RPN.
25F19 PopMetaVStack ( obn..ob1 #n )
Pila Virtual:
( [obn..ob1] )
Traslada el contenido de la pila virtual del nivel más alto hacia
la pila RPN, seguido por el contador.
25F1A PopMetaVStackDROP ( obn..ob1 )
Pila Virtual:
( [obn..ob1] )
Hace PopMetaVStack y luego borra el contador.
2624C GetMetaVStack ( obn..ob1 #n )
Pila Virtual:
( [obn..ob1] [obn..ob1] )
Copia los objetos de la pila virtual del nivel más alto hacia la
pila RPN, seguidos por el contador.
La Pila Virtual permanece sin cambios.
25F17 GetMetaVStackDROP ( obn..ob1 )
Pila Virtual:
( [obn..ob1] [obn..ob1] )
Hace GetMetaVStack y luego borra el contador.
25F20 PushVStack&Keep ( obn..ob1 obm'..ob1' #m obm'..ob1' #m )
Pila Virtual:
( [obn..ob1] )
Traslada todos los objetos de pila RPN que estén por encima
del meta hacia una nueva pila virtual, removiendo estos
elementos de la pila RPN, pero dejando intacto al meta.
25F21 PushVStack&KeepDROP ( obn..ob1 obm'..ob1' #m obm'..ob1' )
Pila Virtual:
( [obn..ob1] )
Hace PushVStack&Keep y luego DROP.
25F1C PopVStackAbove ( obm'..ob1' obn..ob1 obm'..ob1' )
Pila Virtual:
( [obn..ob1] )
Traslada el contenido de la pila virtual más reciente (como el
comando PopMetaVStackDROP) hacia la pila RPN, pero sobre
el actual contenido de la pila RPN.
Esto deshace la acción del comando PushVStack&Keep (o la
del comando PushVStack&KeepDROP).
26215 DropVStack ()
Pila Virtual:
( [obn..ob1] )
Borra la pila virtual del nivel más alto de la Pila Virtual.
Direcc. Nombre Descripción
265D5 (SetMetaVStack) ( obn'..ob1' #n )
Pila Virtual:
( [obn..ob1] [obn'..ob1'] )
Reemplaza los objetos del meta en la pila virtual.
En la pila virtual deben haber “n” objetos.
Ejemplo 1.
25.1.2 Guardando
Direcc. Nombre Descripción
07D27 STO ( ob id/lam )
En el caso del id, STO lo busca en el directorio actual, y sube a
los directorios padre si es necesario. Si lo encuentra, entonces
guarda ob en el id. Si no lo encuentra, entonces crea la
variable en el directorio actual y le asigna ob.
Si reemplaza algún objeto, ese objeto es copiado a TEMPOB y
los punteros son actualizados.
En el caso del LAM, STO lo busca en el entorno temporal más
recientemente creado, y sube si es necesario. Si lo encuentra,
entonces guarda ob en el lam. Un error ocurre si el lam no
está definido.
2F380 SysSTO ( ob ID )
Cambia temporalmente al directorio HOME y ejecuta STO ahí.
35A29 SAFESTO ( ob id/lam )
Para lams sólo hace STO.
Para ids también hace ?>ROMPTR a ob antes de guardarlo
con STO.
25E79 XEQSTOID ( ob id/lam )
Para lams, sólo hace STO.
Para ids también hace SAFESTO, pero funciona sólo en el
directorio actual y no sobreescribe un directorio.
aka: ?STO_HERE
3E823 xSTO> ( ob id ob )
( ob symb ob )
Como xSTO, pero si el argumento del nivel 1 es un simbólico,
usa el primer elemento de este como la variable para escribir.
Es el comando ► de User RPL.
Direcc. Nombre Descripción
011002 FLASHPTR 002 011 ( library/bak %n )
( library/bak tag )
( ob tag ob T )
Guarda un objeto en un puerto o en la tarjeta SD.
Si se va a guardar una biblioteca o un backup en el puerto 0,1
ó 2, en el nivel 1 de la pila puede estar sólo el número del
puerto como real o entero (si estuviera un etiquetado, su
contenido es ignorado).
Para guardar una biblioteca o un backup en la tarjeta SD si se
debe especificar un nombre dentro del etiquetado.
Ejemplos:
Para guardar un objeto en un puerto (0, 1 ó 2):
Objeto TAG 2 ID NOMBRE FLASHPTR 002 011
Para guardar un objeto en la tarjeta SD:
Objeto TAG 3 ID NOMBRE FLASHPTR 002 011
Objeto TAG 3 { ID NOMBRE } FLASHPTR 002 011
Objeto TAG 3 "NOMBRE" FLASHPTR 002 011
Objeto TAG 3 { "NOMBRE" } FLASHPTR 002 011
Objeto TAG 3 "CARP1/CARP2/NOMBRE" FLASHPTR 002 011
Objeto TAG 3 { "CARP1/CARP2/NOMBRE" } FLASHPTR 002 011
0BD007 ˆPROMPTSTO1 ( id/lam )
Suspende las operaciones de pila y pide al usuario la entrada
de uno o más datos. Lo ingresado por el usuario es guardado
en la variable especificada.
El entorno de entrada de datos es similar al que se obtiene con
el comando INPUT de User RPL.
Al presionar CANCL una vez, la línea de edición es limpiada. Si
ahora se presiona CANCL de nuevo, la entrada de datos es
interrumpida generando un mensaje de error.
Al confirmar la línea de edición con ENTER, se guarda en la
variable el objeto ingresado con ?STO_HERE.
Si se ingresa más de un objeto, en la variable será guardado
un objeto programa que contenga a los objetos ingresados (sin
los delimitadores « y »).
Si se ingresa un único objeto algebraico, este es evaluado y el
resultado es guardado en la variable.
Si se ingresa algo incorrecto, se genera el error: "Sintaxis
incorrecta".
Equivale al comando PROMPTSTO de User RPL.
085D3 REPLACE ( newob oldob newob )
El objeto del nivel 1 debe ser el contenido de alguna variable
del directorio actual o de sus subdirectorios.
El objeto del nivel 2 pasará a ser el contenido de esa variable.
069004 ˆRENAME ( id ob )
Renombra un nombre global.
id es el nuevo nombre.
ob es el contenido de un nombre global que ya existe.
08696 CREATE ( ob id )
Crea una variable con el nombre id y contenido ob.
Siempre es creada en el directorio actual.
Un error ocurre si ob es o contiene al directorio actual
(“Directorio recursivo”).
Este comando no verifica si ya existe una variable con el
mismo nombre en el directorio actual. Si es así, es creada otra
variable con el mismo nombre.
25.1.3 Borrando
Direcc. Nombre Descripción
08C27 PURGE ( id )
Borra una variable.
Busca borrar en el directorio actual y si no encuentra, busca en
los directorios padre hasta borrar una variable con ese nombre.
25E78 ?PURGE_HERE ( id )
Borra una variable sólo en el directorio actual.
Si id corresponde a un directorio, sólo será borrado si es un
directorio vacío o con todas sus variables ocultas.
Equivale al comando PURGE de User RPL cuando en la pila
hay un id.
012002 FLASHPTR 002 012 ( library/bak %n )
( library/bak tag )
( ob tag ob T )
Guarda un objeto en un puerto o en la tarjeta SD.
Si se va a guardar una biblioteca o un backup en el puerto 0,1
ó 2, en el nivel 1 de la pila puede estar sólo el número del
puerto como real o entero (si estuviera un etiquetado, su
contenido es ignorado).
Para guardar una biblioteca o un backup en la tarjeta SD si se
debe especificar un nombre dentro del etiquetado.
Ejemplos:
Para borrar un objeto de un puerto (0, 1 ó 2):
TAG 2 ID NOMBRE FLASHPTR 002 012
Para borrar un objeto en la tarjeta SD:
TAG 3 ID NOMBRE FLASHPTR 002 012
TAG 3 { ID NOMBRE } FLASHPTR 002 012
TAG 3 "NOMBRE" FLASHPTR 002 012
TAG 3 { "NOMBRE" } FLASHPTR 002 012
TAG 3 "CARP1/CARP2/NOMBRE" FLASHPTR 002 012
TAG 3 { "CARP1/CARP2/NOMBRE" } FLASHPTR 002 012
1D3006 ˆSAFEPURGE ( id )
Si la variable existe y:
- Si el flag 120 está activado (silent mode on), la variable es
borrada inmediatamente con PURGE.
- Si el flag 120 está desactivado (silent mode off), se hace la
pregunta “Purge current variable?” al usuario. Si el usuario
escoge YES, la variable es borrada con PURGE.
Si se intenta borrar un lam que ya existe, se genera el error
“Purge current variable ”.
Si se intenta borrar un lam que no existe, no hace nada.
43F001 FLASHPTR 001 43F ( {id/tag/xPICT} )
Ejecuta ?PURGE_HERE a cada id de la lista.
Ejecuta FLASHPTR 002 012 a cada etiquetado de la lista.
Ejecuta XEQPURGEPICT a la palabra xPICT.
25.1.2 Directorios
Direcc. Nombre Descripción
25EA1 CREATEDIR ( id )
Comando que crea un directorio vacío dentro del actual.
Si id no contiene objeto alguno, crea un directorio vacío.
Si id contiene un directorio vacío o un objeto que no es
directorio , entonces lo borra con ?PURGE_HERE y luego crea
el directorio vacío.
Si id ya contiene un directorio no vacío, entonces manda el
mensaje de error “Directorio no vacío”.
Equivale al comando CRDIR de User RPL
25EA1 (CREATERRP) ( id )
Comando que crea que un directorio vacío dentro del actual.
Este comando no verifica si ya existe una variable con el
mismo nombre en el directorio actual. Si es así, se crea el
directorio vacío con el mismo nombre de todas maneras.
08326 LASTRAM-WORD ( rrp ob T )
( rrp F )
Llama al primer objeto del directorio.
Si el directorio está vacío retorna FALSE.
25EE7 LastNonNull ( rrp ob T )
( rrp F )
Llama al primer objeto del directorio, si no tiene nombre nulo.
Si el primer objeto del directorio tiene nombre nulo (nullid) o el
directorio está vacío retorna sólo FALSE.
08376 PREVRAM-WORD ( ob ob' T )
( ob F )
ob debe encuentrarse en algún lugar del directorio HOME o
uno de sus subdirectorios.
Retorna el siguiente objeto del directorio en el que se
encuentra ob y TRUE.
Si ob es el último objeto en su directorio, retorna sólo FALSE.
25EF2 PrevNonNull ( ob ob' T )
( ob F )
ob debe encuentrarse en algún lugar del directorio HOME o
uno de sus subdirectorios.
Retorna el siguiente objeto (si no tiene nombre nulo) del
directorio en el que se encuentra y TRUE.
Si el siguiente objeto del directorio tiene nombre nulo, entonces
retorna sólo FALSE.
Si ob es el último objeto en su directorio, retorna sólo FALSE.
082E3 RAM-WORDNAME ( ob id )
Llama al nombre del objeto de la pila, si este está guardado en
la memoria en HOME o en el puerto 0.
Si tiene nombre nulo o no está en lla memoria, retorna NULLID
Si ob es el directorio HOME, también pone NULLID en la pila.
25F14 XEQPGDIR ( id )
Borra un directorio del directorio actual.
Si en el directorio actual, id contiene a un objeto de otro tipo,
entonces manda el mensaje error: “Argumento: valor incorr”
Equivale al comando PGDIR de User RPL.
25EC4 DoHere: ()
El siguiente objeto del runstream es evaluado solamente para
el directorio actual.
Direcc. Nombre Descripción
2F296 XEQORDER ( { id1 id2.. } )
( id )
Ordena las variables en el directorio actual moviendo las
variables dadas al comienzo del directorio.
No admite un id nulo como argumento.
Equivale al comando ORDER de User RPL.
25EB9 DOVARS ( {id1 id2..} )
Retorna una lista con todas las variables del directorio actual.
Si en el directorio actual hay una variable nula, retorna una lista
con los objetos que estén antes de dicha variable.
Equivale al comando VARS de User RPL.
25EB8 DOTVARS% ( % {} )
Retorna una lista de variables en el directorio actual que
contienen un objeto del tipo dado por el número real (y que
además están antes de la variable nula).
Equivale al comando TVARS de User RPL cuando en la pila
hay un número real.
2C3FA (DOTVARS) ( {# #' ...} {} )
( TRUE {} )
Retorna una lista de las variables en el directorio actual que
contengan un objeto de cualquiera de los tipos dados por los
bints de la lista (y que además están antes de la variable nula).
Si el argumento es TRUE, retorna todas las variables del
directorio actual.
Este comando es el núcleo de los comandos TVARS y VARS
de User RPL.
25EF1 PATHDIR ( { xHOME ID DIR1 ID DIR2 … } )
Retorna la ruta actual.
Equivale al comando PATH de User RPL.
2F265 UPDIR ()
Va al directorio padre.
Equivale al comando UPDIR de User RPL.
08309 (MYRAMROMPAIR) ( rrp rrp' T )
( rrp F )
Si rrp es HOME, pone FALSE.
De lo contrario, pone el directorio padre de rrp y TRUE.
08D92 HOMEDIR ()
Establece a HOME como el directorio actual.
Equivale al comando HOME de User RPL.
aka: SYSCONTEXT
08DC4 (SYSSTOPSIGN) ()
Establece a HOME como el directorio STOPSIGN.
Equivale al comando HOME de User RPL.
08DD4 SYSRRP? ( rrp flag )
Retorna TRUE si rrp es el directorio HOME.
08D5A CONTEXT@ ( rrp )
Llama al directorio actual.
08D08 CONTEXT! ( rrp )
Fija el directorio como el nuevo directorio actual.
08D82 (STOPSIGN@) ( rrp )
Llama al directorio STOPSIGN.
08D4A (STOPSIGN!) ( rrp )
Fija el directorio como el nuevo directorio STOPSIGN.
Direcc. Nombre Descripción
3712C SaveVarRes ()
Crea dos variables locales sin nombre que contienen al
directorio actual y al directorio STOPSIGN.
Equivale a
:: CONTEXT@ STOPSIGN@_ 2NULLLAM{}_ BIND ;
37186 RestVarRes ()
Primero, establece HOME como el directorio actual y el
directorio STOPSIGN (por si un error ocurre luego).
Luego, restaura el directorio actual y el directorio STOPSIGN
desde LAM2 y LAM1 respectivamente.
Equivale a
:: HOMEDIR SYSSTOPSIGN_ 1GETLAM 2GETLAM ABND
CONTEXT! STOPSIGN_ ;
¿Si en la pila hay una lista, cómo puedo saber si esa lista es la ruta
de algún directorio existente en HOME?
Puedes usar la siguiente subrutina.
En el nivel 1 de la pila debe haber una lista.
Si esa lista representa a una ruta de algún directorio existente en la forma
{ xHOME ID DIR1 … ID DIRn }, entonces retorna el directorio seguido de TRUE.
De lo contrario, sólo retorna FALSE.
NULLNAME {}_EsRuta? ( {} -> rrp T // F )
::
DUPNULL{}? ( {} flag )
case DROPFALSE ( Sale con: FALSE )
( {} )
DUP CARCOMP ( {} ob1 )
' xHOME EQUALNOT ( {} flag )
case DROPFALSE ( Sale con: FALSE )
( {} )
DUPLENCOMP #1= ( {} flag )
casedrop :: CONTEXT@ HOMEDIR CONTEXT@ SWAP CONTEXT! TRUE ;
( {} )
FLASHPTR 002 00C ( ob T // {} F )
NOTcase DROPFALSE
( ob )
DUPTYPERRP? ( rrp T // ob F )
NOTcsdrpfls ( Sale con: FALSE )
( rrp )
TRUE ( rrp T )
;
Sin embargo, en dicho código no se toma en cuenta al directorio oculto, o a subdirectorios
dentro del directorio oculto, o a otros directorios que tengan un nombre nulo. Para incluir a
estos puedes cambiar ese código por este otro:
Para salir del directorio oculto correctamente, debemos devolver el directorio STOPSIGN a la
normalidad, es decir, que este sea el directorio HOME. Por lo tanto, puedes salir del
directorio oculto usando alguna de estas maneras:
HOMEDIR SYSSTOPSIGN_
UPDIR SYSSTOPSIGN_
{ xHOME ID DIR1 ID DIR2 ... ID DIRn } COMPEVAL SYSSTOPSIGN_
{ HOMEDIR ID DIR1 ID DIR2 ... ID DIRn } COMPEVAL SYSSTOPSIGN_
CONTEXT! SYSSTOPSIGN_ (cuando en la pila se encuentre un directorio)
¿Por qué al entrar al directorio oculto, no puedo usar los comandos User RPL
al escribirlos con las teclas?
26.1 Referencia
Direcc. Nombre Descripción
26120 SLOW ()
Retraso de 15 milisegundos.
26125 VERYSLOW ()
Retraso de 300 milisegundos.
2F37E SORTASLOW ()
Retraso de 1.2 segundos (4 x VERYSLOW).
2612A VERYVERYSLOW ()
Retraso de 3 segundos.
2F2D4 dowait ( %segundos )
Espera un número determinado de segundos.
3005E %>HMS ( % %hms )
Convierte de formato decimal a formato H.MMSS
Equivale al comando →HMS de User RPL.
30912 %%H>HMS ( %% %%hms )
Similar a %>HMS, pero para reales extendidos.
30077 %HMS> ( %hms % )
Convierte de formato H.MMSS a formato decimal.
Equivale al comando HMS→ de User RPL.
3008B %HMS+ ( %hms1 %hms2 %hms )
Suma dos horas en formato hms.
Equivale al comando HMS+ de User RPL.
300B3 %HMS- ( %hms1 %hms2 %hms )
Resta dos horas en formato hms.
Equivale al comando HMS- de User RPL.
2EECF TOD ( %hora )
Retorna la hora actual.
Equivale al comando TIME de User RPL.
2F388 VerifyTOD ( %hora %hora )
Verifica que %hora que sea una hora correcta.
Si no lo es, manda el mensaje de error: “Hora incorrecta”
2EED0 DATE ( %date )
Retorna la fecha actual.
Equivale al comando DATE de User RPL.
2F03B (>DATE) ( %date )
Establece la fecha indicada como la fecha actual.
Equivale al comando →TIME de User RPL.
2EED2 DATE+DAYS ( %fecha %días %fecha' )
Suma a la fecha indicada el número de días.
Equivale al comando DATE+ de User RPL.
Direcc. Nombre Descripción
2EED1 DDAYS ( %fecha1 %fecha2 %días )
Retorna el número de días entre dos fechas.
Equivale al comando DDAYS de User RPL.
2EED7 CLKTICKS ( hxs )
Retorna la hora del sistema como el número de ticks en hxs
(de 13 nibbles). Un tick = 1/8192 segundos.
aka: SysTime
Equivale al comando TICKS de User RPL.
2F153 CLKADJ* ( %ticks )
Ajusta la hora del sistema sumandole o restandole el número
de ticks indicado. Suma si %ticks es positivo, de lo contrario,
resta). Recuerda: un tick = 1/8192 segundos.
Equivale al comando CLKADJ de User RPL.
2EED3 TIMESTR ( %fecha %hora "dia_sem fecha hora" )
Retorna una cadena que representa el tiempo, usando el
formato actual de hora y el formato actual de fecha.
Por ejemplo, para la fecha 24 de agosto de 2009 y la hora
00:00:45 am puede retornar alguna de estas cadenas:
"WED 08/24/09 12:00:45A"
"WED 24.08.09 00:00:45"
Equivale al comando TSTR de User RPL.
2F329 Date>d$ ( %fecha $ )
Retorna la fecha indicada como una cadena, usando el formato
actual de fecha.
2F381 TOD>t$ ( %hora $ )
Retorna la hora indicada como una cadena, usando el formato
actual de hora.
2F1AB Date>hxs13 ( %date hxs )
Convierte una fecha a ticks en hxs (de 13 nibbles).
Es igual al número de ticks a la hora 0 de la fecha indicada.
26.1.1 Alarmas
La lista interna de las alarmas se almacena en el directorio oculto y tiene este formato:
{ { hxs1 acción1 } { hxs2 acción2 } ... }
La longitud de cada hxs es 24 nibbles. Los 13 nibbles menos significativos representan el
tick para la fecha y la hora. Los siguientes 10 nibbles representan el intervalo de repetición,
si hay alguno. El nibble más significativo representa el estado de la alarma (pendiente,
reconocida, etc.).
27.1 Referencia
27.1.1 Banderas de Usuario y de Sistema
28.1 Referencia
Direcc. Nombre Descripción
2EEBB SENDLIST ( {} )
Equivale al comando SEND de User RPL cuando en la pila
hay una lista.
2EEBC GETNAME ( $/id/lam )
Equivale al comando KGET de User RPL cuando en la pila
hay un nombre global o local o una cadena.
2EEBD DOFINISH ()
Equivale al comando FINISH de User RPL.
2EEBE DOPKT ( $ $' )
Equivale al comando PKT de User RPL.
2EEC1 DOBAUD (% )
Especifica velocidad de transferencia de bits. Lo guarda como
primer parámetro de IOPAR.
Llama a GetIOPAR y a StoIOPAR
Equivale al comando BAUD de User RPL.
2EEC2 DOPARITY (% )
Establece el valor de paridad. Lo guarda como segundo
parámetro de IOPAR.
Llama a GetIOPAR y a StoIOPAR
Equivale al comando PARITY de User RPL.
2EEC3 DOTRANSIO (% )
Especifica una opción de traducción de caracteres en la
transferencia de datos. Lo guarda como sexto parámetro de
IOPAR.
Llama a GetIOPAR y a StoIOPAR
Equivale al comando TRANSIO de User RPL.
2EEC4 DOKERRM ($ )
Equivale al comando KERRM de User RPL.
2EEC5 DOBUFLEN ( % 0/1 )
Equivale al comando BUFLEN de User RPL.
2EEC6 DOSBRK ()
Equivale al comando SBRK de User RPL.
2EEC7 DOSRECV (% )
Equivale al comando SRECV de User RPL.
2EEC9 CLOSEUART ()
Equivale al comando CLOSEIO de User RPL.
2F130 (DOXMIT) ( $ %1 )
( $ $’ %0 )
Equivale al comando XMIT de User RPL.
Direcc. Nombre Descripción
2EECB DOCR ()
Equivale al comando CR de User RPL.
2EECC DOPRLCD ()
Imprime una imagen en pixeles por pixeles de la pantalla actual
(excluyendo los anunciadores).
Equivale al comando PRLCD de User RPL.
2EECD DODELAY (% )
Especifica cuántos segundos espera la calculadora entre
envíos de líneas de información a la impresora.
Equivale al comando DELAY de User RPL.
2F31A APNDCRLF ( $ "$\0D\0A" )
Agrega retorno de carro y salto de línea a la cadena.
27A3A StdPRTPAR ( {} )
PRTPAR por defecto: { 0. "" 80. "\0D\0A" }
281001 FLASHPTR 001 281 ( %0 "" %80 "\0D\0A" )
Guarda en el directorio HOME una lista por defecto para la
variable PRTPAR y pone sus elementos en la pila.
2F063 StoPRTPAR ( {} )
Guarda la lista en el directorio HOME en la variable PRTPAR.
2716D StdIOPAR ( {} )
IOPAR por defecto: { 9600. 0. 0. 0. 3. 1. }
0B1003 FLASHPTR 003 0B1 ( {} )
IOPAR por defecto. En HP50G: { 115200. 0. 0. 0. 3. 1. }
280001 FLASHPTR 001 280 ( %115200/%9600 %0 %0 %0 %3 %1 )
Guarda en el directorio HOME una lista por defecto para la
variable IOPAR y pone sus elementos en la pila.
2EEBF GetIOPAR ( %baud % % % % % )
Llama al IOPAR de HOME y pone sus elementos en la pila.
IOPAR debe ser una lista con seis elementos. De lo contrario,
generará el error "IOPAR inválido".
Si IOPAR aun no existe, llama a FLASHPTR 001 280.
2F062 StoIOPAR ( {} )
Guarda la lista de los parámetros IO en el directorio HOME en
la variable IOPAR.
2F37B SetIOPARErr ()
Genera el error "IOPAR inválido".
2F34E KVIS ( $ $' )
Traduce algunos caracteres especiales a digraphs para su
posterior transferencia ASCII a una PC.
El comportamiento de este comando depende del sexto
parámetro de IOPAR de la siguiente manera:
0 ó 1: ningún cambio es hecho.
2: Traduce caracteres con números del 128 al 159 (80-9F hex)
3: Traduce caracteres con números del 128 al 255.
Por ejemplo, si el sexto término de IOPAR es el real 3 y en la
pila se encuentra la cadena:
"Σ(Ai) = n * ñ * ß"
Entonces el resultado será:
"\GS(Ai) = n * \241 * \Gb"
2F34F KVISLF ( $ $' )
Como KVIS, pero además cambia el salto de línea de la HP
(carácter 10d o 0Ah) a salto de línea de la PC, poniendo el
carácter 13d (0Dh) delante de el.
Direcc. Nombre Descripción
2F34D KINVISLF ( $ $' $'' )
Traduce digraphs en la cadena a caracteres de la HP.
También remueve los caracteres 13d (0Dh) que se encuentren
al final de cada línea.
El comportamiento de este comando depende del sexto
parámetro de IOPAR.
2F389 VERSTRING ($ )
Retorna una cadena con la versión. Por ejemplo “HPHP49-C”
Capítulo 29
EL FILER
Este argumento permite seleccionar los tipos de objetos que se mostrarán en el filer.
Esta es una lista que contiene los prólogos de los objetos permitidos. Los prólogos son bints
diferentes para cada tipo de objeto. En la siguiente página se muestran los prólogos de los
objetos de la calculadora HP.
Por ejemplo, si quieres que se muestren números reales, números complejos y nombres
globales la lista que debes escribir es { # 2933 # 2977 # 2E48 }
Si quieres que se muestren objetos de todos los tipos en el filer, entonces este
argumento deberá ser una lista que contenga al bint cero, es decir: { BINT0 }. Como
hacer esto es muy común, existe un comando que abrirá el filer mostrando todos los objetos.
Este comando es ˆFILER_MANAGER. Usando este comando, solo debes ingresar los otros
dos argumentos.
Código Tipo Abrev.
Tipo de objeto Filer Prólogo
Dispatch User Prólogo
BINT1=# 1 0. Números reales REAL #2933 TYPEREAL
BINT2=# 2 1. Números complejos CPLX #2977 TYPECMP_
BINT3=# 3 2. Cadena STRNG #2A2C
BINT4=# 4 3. Arreglos reales ARRAY #29E8
4. Arreglos no reales ARRAY #29E8
29. Matrices simbólicas MATRX #2686 TYPEMATRIX_
BINT5=# 5 5. Lista LIST #2A74 TYPELIST_
BINT6=# 6 6. Nombre global GNAME #2E48 TYPEIDNT
BINT7=# 7 7. Nomble Local LNAME #2E6D TYPELAM_
BINT8=# 8 8. Programa PROG #2D9D TYPECOL_
Pointer comando de User RPL
XLIB #2D9D TYPECOL_
18. permitido en algebraicos
Pointer comando de User RPL no
XLIB #2D9D TYPECOL_
19. permitido en algebraicos
BINT9=# 9 9. Simbólico ALG #2AB8 TYPESYMB_
Clase simbólica: id, lam, symb,
BINT10=# A enteros.
BINT11=# B 10. Cadenas hexadecimales (hxs) BIN #2A4E
BINT12=# C 11. Gráfico (grob) GROB #2B1E
BINT13=# D 12. Etiquetado (tagged) TAG #2AFC
BINT14=# E 13. Unidades UNIT #2ADA TYPEEXT_
BINT15=# F 14. Rompointer XLIB #2E92
BINT31=#1F 20. Entero binario (bint) SB #2911
BINT47=#2F 15. Directorio DIR #2A96 TYPERRP_
#3F 21. Número real extendido LREAL #2955 TYPEEREL_
#4F 22. Número complejo extendido LCPLX #299D
#5F 23. Arreglo vinculado LARRY #2A0A
#6F 24. Carácter CHAR #29BF
#7F 25. Code CODE #2DCC
#8F 16. Biblioteca L···· #2B40
#9F 17. BACKUP BCKUP #2B62
#AF 26. Library Data LBDAT #2B88
#BF 27. Access pointer (Extended Ptr) EXPTR #2BAA
#CF 30. Fuente normal FONT #2BCC
#DF 27. Minifuente MFONT #26FE
#EF 27. External object 4 (Extended 3) EXT1 #2C10
BINT255d=#FF 28. Entero INTG #2614 TYPEINT_
BINT0=# 0 27. Flashpointer FLSHP #26AC
BINT0=# 0 27. Pointer EXTER
BINT0=# 0 27. Aplet EXTER #26D5
BINT0=# 0 27. External object 3 (Extended 2) AUNIT #2BEE
Este argumento es una lista y especifica las asignaciones que daremos a las teclas del
menú y a los demás botones de la calculadora mientras dura la exploración con el filer. Cada
asignación está representada por una lista que contiene entre tres y cinco elementos. La
estructura general del argumento Filer_Comportamiento es la siguiente:
{
* Asignación 1
{ "Nombre"
Localización
Acción
[ Programa_Extra (es necesario si 16 <= Acción <= 23) ]
[ Tecla_Atajo ]
}
* Asignación 2
{ "Nombre"
Localización
Acción
[ Programa_Extra (es necesario si 16 <= Acción <= 23) ]
[ Tecla_Atajo ]
}
* Posiblemente más asignaciones
}
El argumento Filer_Comportamiento también puede ser una lista etiquetada de la
forma: TAG n { { … } { … } … } donde n es un número: 1, 2, etc y representa al número
de filas del menú. De esta manera, al presionar la tecla PREV cuando estamos en la primera
fila, pasamos a estar en la última fila. Además las listas que estén más allá del número de
filas indicado con la etiqueta, sólo serán asignaciones de teclas que no sean del menú.
Cada uno de los elementos de las sublistas sera descrito a continuación:
29.1.3.1 Nombre
Especifica lo que será mostrado en el menu. Puede ser una cadena, un grob o un bint. Si
es un bint, entonces se mostrará el mensaje de error (ver Apéndice E) correspondiente a ese
bint. También puede ser un programa que devuelva un objeto de alguno de los tres tipos
mencionados. Además, este programa siempre debe tener al comando TakeOver como su
primer elemento.
Si una lista tiene como argumento Nombre a una cadena vacía, entonces sólo podrá ser
asignacion de una tecla que es del menú.
29.1.3.2 Localización
Indica las circunstancias en las cuales la acción correspondiente a este menu puede ser
ejecutada. Puede ser un bint o un programa que retorne un bint al ser evaluado. Hay cinco
valores posibles, los cuales están listados en la tabla de abajo.
Valor Descripción
BINT16 Llama sólo a la ruta actualmente explorada.
1: Ruta
BINT17 Llama también al nombre y al contenido del objeto actualmente seleccionado.
3: Ruta
2: Objeto
1: Nombre
BINT18 Llama al nombre y al contenido de todos los objetos marcados.
Si ningún objeto está marcado, entonces llama al nombre y al contenido del objeto
actualmente seleccionado como si este fuera el único marcado.
2n + 2: Ruta
...
5: Objeto 2
4: Nombre 2
3: Objeto 1
2: Nombre 1
1: Número de objetos (bint)
BINT19 Este programa es llamado varias veces, una vez por cada objeto marcado.
Para cada objeto, llama a los mismos tres que obtenemos al usar el BINT17.
Si no hay ningún objeto marcado, es llamado una vez para el objeto seleccionado.
BINT20 Llama al nombre del objeto actualmente seleccionado.
2: Ruta
1: Nombre
BINT21 Llama a los nombres de todos los objetos marcados.
Si ningún objeto está marcado, entonces llama al nombre del objeto actualmente
seleccionado como si este fuera el único marcado.
n + 2: Ruta
...
3: Nombre 2
2: Nombre 1
1: Número de objetos (bint)
BINT22 Llama al objeto seleccionado solo en una cadena de direcciones.
2: Ruta
1: Cadena
BINT23 Llama a los objetos marcados en un cadena de direcciones.
2: Ruta
1: Cadena
Cuando usas una función ya definida del filer y no le vas a asignar ninguna tecla de
atajo, entonces los argumentos Programa_Extra y Tecla_Atajo no son necesarios.
Cuando usas una función ya definida del filer y le vas a asignar una tecla de atajo,
entonces el argumentos Programa_Extra debe ser sólo TakeOver y el argumento
Tecla_Atajo debe ser un bint (explicado en la siguiente página).
Pero si vas a usar una función personalizada, entonces el argumento Programa_Extra
debe ser un programa que será llamado al presionar la tecla correspondiente.
Existen algunas características adicionales que pueden ser útiles:
• Si estás explorando el directorio HOME o uno de sus subdirectorios, entonces tu programa
empezará a ejecutarse en ese directorio que está siendo explorado.
• Por defecto, luego de la ejecución del programa, el directorio explorado será analizado
nuevamente, la pantalla se actualizará y si habían objetos marcados estos quedarán
desmarcados. Para evitar esto, tu puedes dejar FALSE en la pila (excepto para la llamada
número 19). Por ejemplo:
{ "INFO" ( Nombre )
BINT0 ( Localización: BINT0=DondeSea )
BINT20 ( Acción: BINT20= Prog Pers que pone Ruta y Nombre )
:: ( Ruta Nombre )
SWAPDROP ( Nombre )
"Nombre seleccionado es:\0A" ( Nombre $ )
SWAP DO>STR &$ ( $ )
FlashWarning ( )
FALSE ( FALSE )
;
}
• Si deseas salir del filer después de la ejecución del programa, debes dejar “TakeOver” en
la pila (al salir de esta manera el filer retornará TRUE en la pila). Por ejemplo:
{ "OK" ( Nombre )
BINT0 ( Localización: BINT0=DondeSea )
BINT16 ( Acción: BINT16= Prog Pers que pone sólo la Ruta )
:: ( Ruta )
DROP ' TakeOver ( TakeOver )
;
}
El cual es parecido a la función ya definida BINT37 (pero que retorna FALSE en la pila):
{ "CANCL" ( Nombre )
BINT0 ( Localización: BINT0=DondeSea )
BINT37 ( Acción: BINT37= Sale del filer dejando FALSE en la pila )
}
29.1.3.5 Tecla_Atajo
Usar este argumento para asignar una función ya definida o programa personalizado a
una tecla. Este argumento es un bint en la forma # axx, donde a es 0 o 1, lo cual significa
sin ALPHA y con ALPHA (sin soltar) respectivamente. xx es el código de la tecla, al cual
podemos sumar de manera opcional #40 para el cambio izquierdo o #C0 para el cambio
derecho.
Por ejemplo, si deseas asignar a tu programa las teclas cambio izquierdo
+ TOOL, entonces el número debe ser #049 el cual es la suma #40 + #9
(cambio izquierdo y tecla TOOL).
Otro ejemplo: si deseas asignar a tu programa las teclas
cambio derecho + SPC, entonces el número debe ser #0F2 el cual
es la suma #C0 + #32 (cambio derecho y tecla SPC).
Otro ejemplo: si deseas asignar a tu programa las teclas
ALPHA + EEX, entonces el número debe ser #11B el cual es la
suma de los números #100 + #1B (ALPHA y tecla EEX).
En este caso, es necesario mantener presionada ALPHA.
Otro ejemplo: si deseas asignar a tu programa las
teclas ALPHA + cambio izquierdo + TOOL, entonces el
número debe ser #149 el cual es la suma de los números
#100 + #40 + #9. No es necesario mantener las
teclas presionadas.
Otro ejemplo: si deseas asignar a tu programa las
teclas ALPHA + cambio derecho + TOOL, entonces el
número debe ser #1F2 el cual es la suma de los números
#100 + #C0 + #32. No es necesario mantener las
teclas presionadas.
NOTA: Este argumento debe ser el quinto de la lista. De manera que si estás usando una
función ya definida y deseas ponerle un argumento Tecla_Atajo , tendrás que ingresar
algo como esto:
{ "EDIT" ( Nombre )
BINT0 ( Localización: BINT0= En cualquier lugar )
BINT3 ( Acción: BINT3= Ver el objeto seleccionado )
TakeOver ( Programa_Extra: TakeOver para función ya definida )
# 11B ( Tecla_Atajo: #100= alpha + #1B= tecla EEX )
}
Esto le asignará a la función ya definida la tecla ALPHA-EEX.
Recuerda que debes mantener presionado ALPHA y luego, sin soltar,
presionar EEX.
29.1.4 Atajos de tecla predefinidos
Existen atajos de tecla predefinidos en el filer y los mostramos abajo.
Recuerda que cuando haces un programa que llame al filer, estos atajos de tecla
predefinidos siempre estarán presentes a menos que les asignes otra acción a estas teclas.
Si quieres que no se exploren ciertos directorios o quieres que sólo se explore el
directorio actual, cambiá las acciones de las teclas de atajo predefinidas que cambian el
directorio actual.
Si no quieres que exista la marcación de objetos, cambiá las acciones de las teclas de
atajo predefinidas que marcan o desmarcan a un objeto.
"DOWNDIR"
Para entrar en el directorio
# 10
seleccionado.
"DOWNDIR"
Para entrar en el directorio
# 110
seleccionado.
Atajos de tecla predefinidos para ordenar los objetos del directorio explorado
Teclas Tecla_Atajo Acción
Clasifica
# 12 Nombre Ordena en orden alfabético.
Clasifica
# 52 Nombre Ordena en orden alfabético inverso.
Inverso
Clasifica
# D2 Nombre Ordena en orden alfabético.
Clasifica
Tipo
Ordena de acuerdo al tipo de objeto,
# 59
Inverso pero inverso al anterior.
Clasifica
# D9 Tipo Ordena de acuerdo al tipo de objeto.
Atajos de tecla predefinidos para marcar o desmarcar un objeto seleccionado
Teclas Tecla_Atajo Acción
"CHECK"
Marca o desmarca el objeto
# 1C
seleccionado.
"CHECK"
Marca o desmarca el objeto
# 33
seleccionado.
"CLEAR"
Desmarca todos los objetos que están
#D5
marcados.
"CHECK"
Marca o desmarca el objeto
# 133
seleccionado.
Atajos de tecla predefinidos para desplazarse entre las variables del directorio explorado
Teclas Tecla_Atajo Acción
"PageUP"
Mueve la selección hacia arriba, una
# 4A
página.
"MaxUP"
Mueve la selección hacia arriba, hasta
# CA
el primer elemento.
"PageDOWN"
Mueve la selección hacia abajo, una
# 4F
página.
"MaxDOWN"
Mueve la selección hacia abajo, hasta
# CF
el último elemento.
Para hacer esto escoger la Ruta_Inicial que es el directorio o puerto inicial que
queremos. Ahora también será el único que podemos explorar.
En el código de abajo se escogió el directorio HOME como RutaInicial por medio de
una lista vacía, pero también puedes poner cualquier otro directorio o puerto.
A las 6 teclas predefinidas que cambian de directorio explorado, se les asignó otra acción, la
de hacer BEEP.
Con este comando podemos explorar el filer y mandar a la pila el contenido o el nombre
de todos los objetos marcados (o sólo del objeto seleccionado, si no hay ningún objeto
marcado) al presionar OK o ENTER. Los argumentos para este comando son cinco:
Ob1
Ob2
flag_Tecla_Check
Tipos_Permitidos
flag_Objeto_Nombre
TRUE para que se devuelvan los contenidos de los objetos. Al presionar OK termina el
filer dejando en la pila:
FALSE para que se devuelvan los nombres de los objetos. Al presionar OK termina el
filer dejando en la pila:
Entrada y
Salida
de Datos
Capítulo 30
Verificación de Argumentos
En System RPL, es muy importante verificar que todos los argumentos requeridos por un
programa se encuentren en la pila, y si esos objetos son de un tipo válido, cuando ese
programa sea accesible al usuario. En User RPL no tenemos que preocuparnos de esto,
pues es hecho de manera automática. En System RPL, muy pocos comandos hacen esto,
de tal manera que esta tarea es dejada para el programador. A primera vista, esto podría
parecer una desventaja, pero esto es en realidad una ventaja: tu sólo necesitas verificar los
argumentos sólo una vez, al inicio del programa. Esto generará un código rápido,
contrariamente al User RPL, donde los argumentos son verificados por cada comando.
3: 10.
2: 3.
1: 5.5
Esta marca no esta fija en ese nivel. En vez de eso, esta marca se mueve si unos
elementos son agregados o retirados de la pila. Aquí está la pila después de que el
programa pone el bint1:
4: 10.
3: 3.
2: 5.5
1: ¤ 1h
Ahora, si un error sucede en el programa, entonces los objetos que estaban debajo de la
marca antes de ejecutar el comando, son devueltos a sus posiciones iniciales. Pero esto no
sucederá con los objetos que estaban encima de la marca. De esta forma, si queremos que
la pila en su totalidad vuelva a su estado inicial (cuando un error sucede y estamos usando
un comando CK<n>), no debemos manipular los objetos que están por encima de la marca.
Comando que origina error y no usa CK<n> Comando que origina error y usa CK<n>
xNAME ErrorSinCKn ( %a %b -> ERROR ) xNAME ErrorConCKn ( %a %b -> ERROR )
:: ( %a %b ) :: ( %a %b )
* Verifica nº argumentos sin CK2 * Verifica nº argumentos con CK2
DEPTH BINT2 #<case SETSTACKERR CK2
* Verifica 2 números reales * Verifica 2 números reales
OVER TYPEREAL? OVER TYPEREAL?
OVER TYPEREAL? OVER TYPEREAL?
AND AND
NcaseTYPEERR NcaseTYPEERR
* Continua el programa * Continua el programa
( %a %b ) ( %a %b )
%+ ( %a+b ) %+ ( %a+b )
%10 ( %a+b %10 ) %10 ( %a+b %10 )
%* ( %10[a+b] ) %* ( %10[a+b] )
%12 ( %10[a+b] %12 ) %12 ( %10[a+b] %12 )
%0 ( %10[a+b] %12 %0 ) %0 ( %10[a+b] %12 %0 )
%/ %/
; ;
Estado de la pila antes del comando Estado de la pila antes del comando
NIVEL 3: 6. NIVEL 3: 6.
NIVEL 2: 7. NIVEL 2: 7.
NIVEL 1: 8. NIVEL 1: 8.
Estado de la pila después del comando Estado de la pila después del comando
(con flag 55 desactivado: save last args)
::
CK&DISPATCH0 ( En su lugar puede ir CK&DISPATCH1 )
#tipo1
acción1
#tipo2
acción2
#tipo3
acción3
...
...
#tipo_n
acción_n
;
Con el siguiente programa puedes saber si el objeto del nivel 1 de la pila es una lista cuyos
elementos son todos números reales.
DUPNULL{}? ( {} flag )
casedrpfls
( {} )
' :: TYPEREAL? NOT ; ( {} ProgTest_1arg )
Ejemplo 2
Lista con números reales o enteros.
Con el siguiente programa puedes saber si el objeto del nivel 1 de la pila es una lista cuyos
elementos son todos números reales o enteros. Si se cumple eso, los números enteros son
convertidos a reales y retornados junto a TRUE. De lo contrario, sólo se retorna FALSE.
Con el siguiente programa puedes saber si el objeto del nivel 1 de la pila es una lista cuyos
elementos son todos números reales o enteros positivos. Si se cumple eso, los números
enteros son convertidos a reales y retornados junto a TRUE. De lo contrario, sólo se retorna
FALSE.
DUPNULL{}? ( {} flag )
casedrpfls
TRUE ( {} T )
1LAMBIND ( {} )
INNERDUP ( ob1,...,obn #n #n )
ZERO_DO ( ... #n )
ROLL ( ... obi )
DUPTYPEZINT? ( ... obi flag )
IT
FLASHPTR Z>R
( ... obi )
DUPTYPEREAL? ( ... obi flag )
ISTOP@ ( ... obi flag #n )
SWAP ( ... obi #n flag )
ITE
:: OVER ( ... %i #n %i )
%0> ( ... %i #n flag )
NOT_IT
:: ExitAtLOOP FALSE 1PUTLAM ;
;
:: ExitAtLOOP FALSE 1PUTLAM ;
( ... obi #n )
LOOP
( ob1,...,obn #n )
1GETABND ( ob1,...,obn #n flag )
ITE
:: {}N TRUE ;
NDROPFALSE
;
Ejemplo 4
Usando el NULLNAME TodosTrueComp del capítulo 11 para hacer
verificaciones de los elementos de una lista.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME EjCKDisp0 ( %/C% -> )
::
CK1 ( Verifica si hay 1 objeto en la pila )
CLEARLCD ( Limpia toda la pantalla )
:: CK&DISPATCH0
BINT1
%ABS
BINT2
:: C>Re% %ABS ;
;
DO>STR
DISPROW1 ( Muestra cadena en la pantalla )
SetDAsTemp ( Congela toda la pantalla )
;
Capítulo 31
Control del Teclado
Hay varias formas en que un programa hecho con System RPL puede conseguir lo que
ingresa un usuario:
• Desde la pila.
• Esperando la opresión de botones en el teclado.
• Usando la versión interna del comando INPUT.
• Usando la version interna del comando INFORM.
• Creando aplicaciones con el Bucle Externo Parametrizado (llamado también POL).
• Y con otros métodos.
#plano Modificador
1 Ninguno
2 Shift izquierdo
3 Shift derecho
4 Alpha
Algunas veces, las teclas shift no son tratadas como modificadores por otras teclas, sino
como teclas propias. En etos casos, las teclas shift tienen los códigos de tecla 40h (shift
izquierdo), C0h (shift derecho), y 80h (alpha).
Existen cinco planos más además de los mostrados en la tabla anterior. Estos planos
adicionales son los planos shift-hold. En estos casos, una tecla shift es presionada primero y
se mantiene presionada (sin soltar) mientras otra tecla es presionada. En User RPL, estas
teclas son denotadas agregando 0.01 a la representación %fc.p. Por ejemplo, el código de
tecla 11.21 en System RPL significa mantener presionado shift izquierdo mientras se
presiona la tecla F1.
En System RPL, las teclas shift-hold pueden ser codificadas de dos maneras. La primera
forma (la cual llamaremos codificación A) deja el código de tecla #ct sin cambios y usa
nuevos planos #8,#9,#A,#B,#C. La segunda forma (codificación B) usa planos en el rango
#1...#6 y agrega el código de tecla de la tecla shift a #ct.
La siguiente tabla muestra las diferentes codificaciones para todas las posibles maneras
de presionar la tecla F1 en la HP 50g.
User RPL A B
Plano Shift Keys %fc.p #ct #p #ct #p
1 Unshifted 11.1 1h 1h 1h 1h
2 Shift izquierdo 11.2 1h 2h 1h 2h
3 Shift derecho 11.3 1h 3h 1h 3h
4 Alpha 11.4 1h 4h 1h 4h
5 Alpha, shift izquierdo 11.5 1h 5h 1h 5h
6 Alpha, shift derecho 11.6 1h 6h 1h 6h
7 Sin uso
8 Shift-hold izquierdo 11.21 1h 8h 41h 2h
9 Shift-hold derecho 11.31 1h 9h C1h 3h
10 Alpha-hold 11.41 1h Ah 81h 4h
11 Alpha, shift-hold izquierdo 11.51 1h Bh 41h 5h
12 Alpha, shift-hold derecho 11.61 1h Ch C1h 6h
La mayoría de veces pero no siempre, los comandos de System RPL que tratan con
teclas manejan las teclas shift-hold. La sección de referencia de abajo tiene información
sobre este asunto para algunos comandos relevantes. Los comandos de System RPL que
esperan #ct y #p como argumentos aceptan ambas formas de codificación (A y B). Los
comandos que retornan #ct o #ct y #p todas usan la codificación B.
Para convertir codificación B a codificación A, puedes usar:
Si ninguna tecla está asignada, la lista interna de teclas de usuario es una lista vacía.
Si hay una o más asignaciones, la lista contiene 52 sublistas, las primeras 51 de estas
representan una tecla. Cada una de estas listas puede ser una lista vacía (si la tecla no tiene
asignaciones), o contener 12 elementos: la representación para cada plano. Los planos son
dados en la tabla de la sección 31.1. Para planos sin asignaciones, el elemento respectivo
es una lista vacía. La séptima lista está siempre vacía.
Con el siguiente programa puedes retornar el objeto relacionado con cualquier tecla de la
calculadora. Primero debes ejecutar el programa, luego debes presionar una tecla.
El resultado es el objeto relacionado a la tecla presionada.
Este programa también funciona para teclas shift y para teclas shift hold.
Por ejemplo, si presionas Shift hold izquierdo + TOOL, devuelve el programa:
:: TakeOver BINT103 DUP SysITE ClrSysFlag SetSysFlag ;
el cual cambia la calculadora entre los modos real y complejo.
Otro ejemplo: si presionas Shift hold izquierdo + F1, devuelve el programa:
:: PTR 275DA FPTR 3 9D ;
El cual permite abrir el formulario de entrada “TABLE SETUP”.
* Retorna el objeto asociado a cualquier tecla de la calculadora.
* ( ob )
* ( … … … ) ( cuando una excepción ocurre: alarmas, errores u otros )
* OBSERVACIONES:
* Algunos códigos de tecla retornados por el comando GETKEY* son:
* Shift izquierdo: # 40
* Shift izquierdo: # C0
* ALPHA: # 80
:: CK0NOLASTWD ( ) ( ningún argumento es requerido )
AppMode? ( flag ) ( ¿Hay algún POL activo? )
?SEMI
BINT95 TestSysFlag
case
:: "Sólo funciona en modo RPN" FlashWarning ;
ABND
ClrDAsOK
;
Capítulo 32
Usando InputLine
El comando InputLine hace algo similar al comando INPUT de User RPL.
• Muestra una cabecera en la parte de arriba de la pantalla.
• Inicia el modo de entrada desde el teclado.
• Inicializa la línea de edición.
• Acepta una entrada hasta que la tecla ENTER sea presionada.
• Convierte la cadena a objeto, evalua el contenido de la cadena, o sólo devuelve la cadena
ingresada por el usuario.
• Retorna TRUE si el entorno fue terminado con ENTER o FALSE si fue abortado con
ON/CANCEL.
Nombre Descripción
$Prompt La cabecera que se mostrará en la parte superior.
$EditLine La línea de edición inicial.
CursorPos La posición inicial del cursor.
Puede ser un bint que indica la posición absoluta. El bint #0 indica que el
cursor se movera al final del texto.
Puede ser una lista con dos bints que representan el número de fila y de
columna. Si el primer bint es cero, el cursor estará en la última fila. Si el
segundo bint es cero, el cursor estará al final de la fila.
#Ins/Rep El modo inicial del cursor.
• #0 modo actual
• #1 modo insertar
• #2 modo reemplazo
#Entry El modo de entrada inicial.
• #0 modo de entrada actual (según el modo algebraico o RPN).
• #1 modo de entrada algebraico desactivado
• #2 modo de entrada algebraico activado
#Alphalock El modo ALPHA inicial.
• #0 modo actual
• #1 modo ALPHA activado
• #2 modo ALPHA desactivado
ILMenu El menú inicial, en el formato especificado abajo.
También puede ser FALSE, lo cual indica que el menu actual no será
cambiado.
#ILMenu El número de fila para el menú inicial mostrado.
#1 para la primera página, #7 para la segunda, #13 para la tercera…
AttnAbort? Un flag:
• TRUE CANCEL aborta inmediatamente la edición.
• FALSE CANCEL limpia la línea de edición y si se presiona nuevamente,
aborta la edición.
#Parse Indica como se procesará la línea de edición.
• #0 retorna la línea de edición como una cadena (sin evaluar).
• #1 retorna la línea de edición como una cadena y también convierte esa
cadena a objeto.
• #2 evalúa el contenido de la cadena.
De acuerdo al valor del argumento #Parse, diferentes valores son retornados de acuerdo a la
siguiente tabla:
El parámetro ILMenu es una lista (también puede ser un programa que retorne una lista),
en el formato descrito en la sección 38.1. También puedes fijar este parámetro como FALSE,
si no quieres que el menú actual sea cambiado al iniciarse el InputLine. Nota que cada
acción debe iniciarse con el comando TakeOver para indicar que estas acciones serán
ejecutadas con la línea de edición activa.
LAM Contenido
1LAM Un flag. Si su valor es fijado como TRUE, el POL finalizará.
Nota: el POL también termina si se finaliza el editor. Por ejemplo usando el
comando DEL_CMD.
2LAM Un bint. Es el parámetro #Parse
3LAM Un flag. Es el parámetro AttnAbort?
4LAM Una cadena. Es el parámetro $Prompt.
32.3 Referencia
Direcc. Nombre Descripción
2EF5F InputLine ( args $ T )
( args $ ob1..obn T )
( args ob1..obn T )
( args F )
args= $cabec $line Cpos #Ins/Rep #Alg #alpha
menu #fila attn #parse
2F154 (Ck&Input1) ( $cabecera $inicial $ )
Equivale al comando INPUT de User RPL cuando en la pila
hay 2 cadenas.
2F155 (Ck&Input2) ( $cabecera {} $ )
Equivale al comando INPUT de User RPL cuando en la pila hay
una cadena y una lista.
2F300 DispILPrompt ()
Redibuja la cadena $Prompt en la parte superior de la pantalla
(pero debajo del área de estado), cuando la línea de edición no
es muy grande.
Si deseas usar este comando fuera del entorno InputLine,
deberás colocar una cadena en 4LAM.
2F344 InputLAttn ()
(F)
Equivale a presionar la tecla ON.
2F345 InputLEnter ()
($ T)
( $ obs T )
( ob1...obn T )
Equivale a presionar la tecla ENTER.
32.4 Ejemplos
Ejemplo 1 InputLine
Pedir el ingreso de una cadena.
En este ejemplo se usa el comando InputLine, para pedir el ingreso de una cadena, la
cual será mostrada luego en la pantalla si el usuario no aborta el programa.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME EjempInputLine ( -> )
:: CK0
"Escribe tu nombre:" ( $ ) ( $cabec )
NULL$ ( $ $ ) ( $inicial )
BINT0 ( ... ) ( CursPos: cursor al final )
BINT1 ( ... ) ( #Ins/Rep: modo insertar )
BINT1 ( ... ) ( #ALG: modo algebraico desactivado )
BINT1 ( ... ) ( #alpha: modo alpha activado )
NULL{} ( ... ) ( no menu )
ONE ( ... ) ( fila del menu )
FALSE ( ... ) ( CANCEL limpia linea de edición )
BINT0 ( ... ) ( retorna sólo cadena sin evaluar )
InputLine
( $ T // F )
NOT?SEMI
( $ )
"Tu nombre es\0A" ( $ $' )
SWAP&$ ( $'' )
CLEARLCD ( $'' ) ( limpia la pantalla )
%1 DODISP ( ) ( muestra la cadena en la primera línea )
SetDAsTemp ( ) ( congela la pantalla )
;
Ejemplo 2 InputLine
Pedir el ingreso de una cadena con un número máximo de caracteres.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME Input$5 ( -> $ T // F )
:: CK0
"Escribe el nombre"
NULL$
* PROGRAMA DE LA FORMA ( ob -> flag )
' :: DUPNULL$? ( $ flag )
casedrop
:: "Escribe una cadena" FlashWarning FALSE ;
LEN$ ( #n )
BINT5
#> ( flag )
case
:: "Máximo 5 caracteres" FlashWarning FALSE ;
TRUE ( T )
;
GetHeader ( $cabec $inicial prog #header )
BINT0 SetHeader ( )
' NULLLAM BINT4 NDUPN DOBIND
( )
BEGIN
:: 4GETLAM ( $ ) ( $cabec )
3GETLAM ( $ $ ) ( $EditLine )
BINT0 ( ... ) ( CursPos: cursor al final )
BINT1 ( ... ) ( #Ins/Rep: modo insertar )
BINT2 ( ... ) ( #ALG: modo algebraico activado )
BINT1 ( ... ) ( #alpha: modo alpha activado )
NULL{} ( ... ) ( no menu )
ONE ( ... ) ( fila del menu )
FALSE ( ... ) ( CANCEL limpia linea de edición )
BINT0 ( ... ) ( retorna sólo cadena sin evaluar )
InputLine ( $ T // F )
NOTcase FalseTrue
( $ )
DUP ( $ $ )
2GETEVAL ( $ flag )
case
TrueTrue
( $ )
3PUTLAM ( )
FALSE ( F )
;
UNTIL
( $ T // F )
1GETABND ( $ T #header // F #header )
SetHeader ( $ T // F )
;
Ejemplo 3 InputLine
Pedir el ingreso de un nombre global.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME InputNombGlobal ( -> id T // F )
:: CK0
"Escribe el nombre\0Adel archivo:"
NULL$
* PROGRAMA DE LA FORMA ( ob -> flag )
* id -> T
* ob -> F
' :: ( ob )
TYPEIDNT? ( flag )
NOTcase
:: "Escribe un nombre global" FlashWarning FALSE ;
( )
TRUE ( T )
;
GetHeader ( $cabec $inicial prog #header )
' NULLLAM BINT4 NDUPN DOBIND
( )
BINT0 SetHeader ( )
BEGIN
:: 4GETLAM ( $ ) ( $cabec )
3GETLAM ( $ $ ) ( $inicial )
BINT0 ( ... ) ( CursPos: cursor al final )
BINT1 ( ... ) ( #Ins/Rep: modo insertar )
BINT2 ( ... ) ( #ALG: modo algebraico activado )
BINT1 ( ... ) ( #alpha: modo alpha activado )
NULL{} ( ... ) ( no menu )
BINT1 ( ... ) ( fila del menu )
FALSE ( ... ) ( CANCEL limpia linea de edición )
BINT1 ( ... ) ( retorna $ y objeto convertido )
RunSafeFlags
:: BINT72 ClrSysFlag BINT73 ClrSysFlag BINT95 ClrSysFlag
InputLine
;
( $ ob T // F )
NOTcase FalseTrue
( $ ob )
DUP ( $ ob ob )
2GETEVAL ( $ ob flag ) ( $ id/ob T/F )
case
:: SWAPDROP ( id )
TrueTrue ( id T T )
;
( $ ob )
DROP ( $ )
3PUTLAM ( ) ( guarda línea de edición inicial )
FALSE ( F )
;
UNTIL
( id T // F )
1GETABND ( id T #header // F #header )
SetHeader ( id T // F )
;
Ejemplo 4 InputLine
Pedir el ingreso de un número real de un intervalo deseado.
El siguiente programa pide escribir un número real.
Si uno escribe algo incorrecto se muestra el mensaje “sintaxis incorrecta” y se continúa en la
línea de edición.
Si uno escribe algo que que no es un número real, aparece el mensaje “Escribe un número
real” y se continúa en la línea de edición.
Si uno escribe un número real que no está en el intervalo [0;90], aparece el mensaje “El
número debe estar en el intervalo [0;90]” y se continúa en la línea de edición.
De esta forma, siempre se retorna un número del intervalo deseado y TRUE o sólo FALSE.
xNAME InputRealInterv ( -> % T // F )
:: CK0
"Escribe un número real\0Adel intervalo [0;90]"
NULL$
* PROGRAMA DE LA FORMA ( ob -> flag )
' :: DUPTYPEZINT? ( ob flag )
IT FLASHPTR Z>R
( ob )
DUPTYPEREAL? ( ob flag )
NOTcasedrop
:: "Escribe un número real" FlashWarning FALSE ;
( % )
DUP %0>= SWAP 90. %<= AND ( flag )
NOTcase
:: "El número debe estar en el intervalo [0;90]" FlashWarning FALSE ;
TRUE ( T )
;
GetHeader ( $cabec $inicial prog #header )
' NULLLAM BINT4 NDUPN DOBIND ( )
BINT0 SetHeader ( )
BEGIN
:: 4GETLAM ( $ ) ( $cabec )
3GETLAM ( $ $ ) ( $inicial )
BINT0 ( ... ) ( CursPos: cursor al final )
BINT1 ( ... ) ( #Ins/Rep: modo insertar )
BINT2 ( ... ) ( #ALG: modo algebraico activado )
BINT2 ( ... ) ( #alpha: modo alpha desactivado )
NULL{} ( ... ) ( no menu )
BINT1 ( ... ) ( fila del menu )
FALSE ( ... ) ( CANCEL limpia linea de edición )
BINT1 ( ... ) ( retorna $ y objeto convertido )
RunSafeFlags
:: BINT72 ClrSysFlag BINT73 ClrSysFlag BINT95 ClrSysFlag
InputLine
; ( $ ob T // F )
NOTcase FalseTrue
( $ ob )
DUP ( $ ob ob )
2GETEVAL ( $ ob flag )
case
:: SWAPDROP ( %/Z )
CKREAL ( % )
TrueTrue ( % T T )
;
( $ ob )
DROP ( $ )
3PUTLAM ( ) ( guarda línea de edición inicial )
FALSE ( F )
;
UNTIL
( % T // F )
1GETABND ( % T #header // F #header )
SetHeader ( % T // F )
;
Ejemplo 5 InputLine
Pedir el ingreso de dos números reales positivos.
BEGIN
:: 4GETLAM ( $ ) ( $cabec )
3GETLAM ( $ $ ) ( $inicial )
BINT0 ( ... ) ( CursPos: cursor al final )
BINT1 ( ... ) ( #Ins/Rep: modo insertar )
BINT2 ( ... ) ( #ALG: modo algebraico activado )
BINT2 ( ... ) ( #alpha: modo alpha desactivado )
NULL{} ( ... ) ( no menu )
BINT1 ( ... ) ( fila del menu )
FALSE ( ... ) ( CANCEL limpia linea de edición )
BINT1 ( ... ) ( retorna $ y objeto convertido )
RunSafeFlags
:: BINT72 ClrSysFlag BINT73 ClrSysFlag BINT95 ClrSysFlag
InputLine
;
( $ ob T // F )
NOTcase FalseTrue
( $ ob )
DUP ( $ ob ob )
2GETEVAL ( $ ob flag )
case
:: SWAPDROP ( prog )
INCOMPDROP ( ob1 ob2 )
SWAP CKREAL ( ob2 %1 )
SWAP CKREAL ( %1 %2 )
TrueTrue ( %1 %2 T T )
;
( $ ob )
DROP ( $ )
3PUTLAM ( ) ( guarda línea de edición inicial )
FALSE ( F )
;
UNTIL
( %1 %2 T // F )
1GETABND ( %1 %2 T #header // F #header )
SetHeader ( %1 %2 T // F )
;
* PROGRAMA DE LA FORMA ( ob -> flag )
NULLNAME PROG_Input2%Posit
:: ( ob )
:: DUPTYPECOL? ( ob flag )
NOTcase DROPFALSE
( prog )
DUPLENCOMP ( prog #n )
#2= ( prog flag )
NOTcase DROPFALSE
( prog )
INCOMPDROP ( ob1 ob2 )
DUPTYPEZINT? ( ob1 ob2 flag )
IT FLASHPTR Z>R
( ob1 ob2 )
SWAP ( ob2 ob1 )
DUPTYPEZINT? ( ob2 ob1 flag )
IT FLASHPTR Z>R
( ob2 ob1 )
DUPTYPEREAL? ( ob2 ob1 flag )
3PICK TYPEREAL? ( ob2 ob1 flag flag' )
ANDNOTcase
2DROPFALSE
( %1 %2 )
TRUE ( %1 %2 T // F )
;
NOTcase
:: "Escribe dos números reales" FlashWarning FALSE ;
( %1 %2 )
%0> SWAP %0> AND ( flag )
NOTcase
:: "Ambos números deben ser positivos" FlashWarning FALSE ;
TRUE ( T )
;
Capítulo 33
El Bucle Externo Parametrizado es una estructura System RPL que permite crear una
aplicación completa, la cual lee las pulsaciones de teclas y hace diferentes acciones de
acuerdo a la tecla que fue presionada. Esto es repetido tantas veces como sea necesario,
hasta que ocurre una condición de salida. La mayoría de las veces, hay una tecla que
detiene al bucle, como CANCL, OK o DROP. Generalmente, el POL es usado para hacer
programas que manipulan la pantalla. Complejos usos del POL incluyen formularios de
entrada (Capítulos 37 y 38) y los browsers (capítulos 34, 35 y 36). Nota que el POL es una
construcción muy general y por esta razón requiere argumentos elaborados.
Aplicaciones más simples pueden hacerse más fácil y compactamente usando un bucle
alrededor del comando WaitForKey (sección 31.2) en lugar de usar un POL.
Para usar un POL, nueve parámetros son necesarios:
Parámetro Descripción
AppDisplay Este objeto es evaluado antes de cada opresión de tecla.
Este objeto debería manejar aspectos de la actualización de la pantalla no
manejados por las acciones de las teclas y también debería realizar
manejos especiales de errores.
AppKeys Contiene las asignaciones de las teclas en el formato descrito abajo.
NonAppKeyOK? Un flag.
TRUE: las teclas no asignadas realizan sus acciones normales.
FALSE: las teclas no asignadas sólo hacen beep.
DoStdKeys? Un flag. Sólo tiene sentido cuando NonAppKeyOK? es TRUE.
TRUE: las teclas no asignadas realizan su acción por defecto.
FALSE: las teclas no asignadas realizan la definición del teclado de
usuario en caso de existir esta, o la acción por defecto si no existe esta.
AppMenu Contiene al menu, en cualquiera de las especificaciones descritas en la
sección 40.1, o FALSE para dejar al menú actual sin cambios.
#AppMenuPage La página inicial del menu.
Normalmente es BINT1 para mostrar la primera página.
#1 para la primera página, #7 para la segunda, #13 para la tercera…
SuspendOK? Un flag.
Si es FALSE, no se permitirá la ejecución de cualquier comando que cree
un entorno suspendido y en su lugar se generará un error.
ExitCond Este objeto es evaluado antes de cada actualización de pantalla y lectura
de tecla. Si su resultado es TRUE, el bucle es finalizado.
AppError Este objeto es un manejador de errores y es evaluado cuando un error
ocurre durante la evaluación de una tecla.
Comando Acción
POLSaveUI Guarda la actual interfaz de usuario (la anterior al POL que vamos a
programar) en la pila virtual.
POLSetUI Fija la nueva interfaz de usuario (la interfaz del POL que deseamos
programar). Pide 9 argumentos.
POLKeyUI Este comando es el centro del POL. Es un bucle que actualiza la pantalla,
espera una tecla y evalúa la asignación de dicha tecla. Si un error ocurre
durante la evaluación de esa asignación, evalúa al argumento AppError.
Estas acciones son realizadas hasta que la evaluación del argumento
ExitCond retorne FALSE.
POLRestoreUI Restaura la interfaz de usuario guardada por POLSaveUI.
POLResUI&Err Restaura la interfaz de usuario guardada por POLSaveUI y llama al
último error. Este comando es usado cuando hay un error no manejado
con AppError (es decir, un error que no ocurre durante la evaluación de
una tecla).
::
POLSaveUI ( Guarda la interfaz actual en la pila virtual )
ERRSET
::
POLSetUI ( Fija la nueva interfaz, necesita 9 argumentos )
POLKeyUI ( bucle que evalúa condición de salida, actualiza la )
( pantalla, espera una tecla y realiza su acción )
( correspondiente. Si un error ocurre en esta )
( última acción, llama a AppError y lo evalúa )
;
ERRTRAP
POLResUI&Err ( si un error ocurre, restaura la interfaz guardada )
( por POLSaveUI y luego llama al error que ocurrió )
POLRestoreUI ( restaura la interfaz guardada por POLSaveUI )
;
El siguiente programa es un ejemplo de una aplicación que usa un POL para crear un
entorno en donde el usuario puede mover un pequeño gráfico sobre la pantalla. Puedes usar
las teclas de dirección para mover el gráfico un píxel, o puedes hacerlo también con las
teclas del menú. En ambos casos puedes presionar antes el shift izquierdo para mover la
figura 10 píxeles, o el shift derecho para mover la figura a los extremos de la pantalla. El
código se asegura de que la figura no se salga de la pantalla.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME PolEjemplo1
::
CK0
* Prepara la pantalla
RECLAIMDISP ( fija a ABUFF como activa, lo limpia y lo redimensiona )
ClrDA1IsStat ( suspende la presentación del reloj temporalmente )
* Grob con el símbolo de HP. Su tamaño es de 14x14
GROB 00042 E0000E00000B10CD70EDF1ECF1F813FA537B637DA3B5A3E7C3E7F1CBF08B700B00
HARDBUFF ( grob14x14 GROB131x80 )
TOTEMPOB ( grob14x14 GROB131x80 )
BINT56 BINT18 ( grob GROB #x #y ) ( coord inic x,y para mostrar grob )
FALSE ( grob GROB #x #y F ) ( condición inicial de salida del POL )
{ LAM grobHP LAM GROB LAM x LAM y LAM exit? } BIND
* El siguiente compuesto es el argumento AppDisplay del POL
* Dibuja el símbolo de hp en la posición indicada con LAM x y LAM y
' :: LAM GROB ( GROB )
TOTEMPOB ( GROB )
LAM grobHP ( GROB grob )
OVER ( GROB grob GROB )
LAM x LAM y ( GROB grob GROB #x #y )
GROB! ( GROB )
HARDBUFF ( GROB ABUFF )
ZEROZERO ( GROB ABUFF #0 #0 )
GROB! ( ) ( dibuja en la pantalla )
DispMenu.1 ( ) ( muestra el menú )
; ( prg ) ( AppDisplay )
' AppKeys_EJEMPLO1 ( ... ) ( AppKeys )
TrueTrue ( ... ) ( NonAppKeyOK? y DoStdKeys? )
MENU_EJEMPLO1 ( ... ) ( menú )
ONEFALSE ( ... ) ( #AppMenuPage y SuspendOK? )
' LAM exit? ( ... ) ( ExitCond )
'ERRJMP ( ... ) ( AppError )
ParOuterLoop ( ) ( ejecuta el POL )
ClrDAsOK ( ) ( redibuja la pantalla )
;
* Este es el argumento AppKeys del POL
NULLNAME AppKeys_EJEMPLO1 ( #ct #p -> ob T // F )
:: ( #ct #p )
BINT1 #=casedrop
:: ( #ct ) ( PLANO 1 )
BINT10 ?CaseKeyDef
ACCION_ARRIBA
BINT15 ?CaseKeyDef
ACCION_ABAJO
BINT14 ?CaseKeyDef
ACCION_IZQUIERDA
BINT16 ?CaseKeyDef
ACCION_DERECHA
BINT47 ?CaseKeyDef
:: TRUE ' LAM exit? STO ;
DUP#<7 casedrpfls
BINT37 #=casedrpfls
BINT42 #=casedrpfls
DROP 'DoBadKeyT
;
( #ct #p )
BINT2 #=casedrop
:: ( #ct ) ( PLANO 2 )
BINT10 ?CaseKeyDef
ACCION_ShiftIzq_ARRIBA
BINT15 ?CaseKeyDef
ACCION_ShiftIzq_ABAJO
BINT14 ?CaseKeyDef
ACCION_ShiftIzq_IZQUIERDA
BINT16 ?CaseKeyDef
ACCION_ShiftIzq_DERECHA
DUP#<7 casedrpfls
BINT37 #=casedrpfls
BINT42 #=casedrpfls
DROP 'DoBadKeyT
;
( #ct #p )
BINT3 #=casedrop
:: ( #ct ) ( PLANO 3 )
BINT10 ?CaseKeyDef
ACCION_ShiftDer_ARRIBA
BINT15 ?CaseKeyDef
ACCION_ShiftDer_ABAJO
BINT14 ?CaseKeyDef
ACCION_ShiftDer_IZQUIERDA
BINT16 ?CaseKeyDef
ACCION_ShiftDer_DERECHA
DUP#<7 casedrpfls
BINT37 #=casedrpfls
BINT42 #=casedrpfls
DROP 'DoBadKeyT
;
( #ct #p ) ( PLANOS 4,5,6 )
2DROP ( )
'DoBadKeyT ( 'DoBadKey T )
;
* Este es el menú del POL
NULLNAME MENU_EJEMPLO1
{
{ "Arrib" { ACCION_ARRIBA ACCION_ShiftIzq_ARRIBA ACCION_ShiftDer_ARRIBA } }
{ "Abajo" { ACCION_ABAJO ACCION_ShiftIzq_ABAJO ACCION_ShiftDer_ABAJO } }
{ "Izqui" { ACCION_IZQUIERDA ACCION_ShiftIzq_IZQUIERDA ACCION_ShiftDer_IZQUIERDA } }
{ "Derec" { ACCION_DERECHA ACCION_ShiftIzq_DERECHA ACCION_ShiftDer_DERECHA } }
NullMenuKey
{ "Salir" :: TRUE ' LAM exit? STO ; }
}
NULLNAME ACCION_ARRIBA
:: LAM y DUP BINT1 #<ITE :: DROP ERRBEEP ; :: #1- ' LAM y STO ; ;
NULLNAME ACCION_ShiftIzq_ARRIBA
:: LAM y DUP BINT10 #<ITE :: DROPZERO ERRBEEP ; :: BINT10 #- ; ' LAM y STO
;
NULLNAME ACCION_ShiftDer_ARRIBA
:: ERRBEEP BINT0 ' LAM y STO ;
NULLNAME ACCION_ABAJO
:: LAM y DUP BINT57 #>ITE :: DROP ERRBEEP ; :: #1+ ' LAM y STO ; ;
NULLNAME ACCION_ShiftIzq_ABAJO
:: LAM y DUP BINT48 #>ITE :: DROP BINT58 ERRBEEP ; #10+ ' LAM y STO ;
NULLNAME ACCION_ShiftDer_ABAJO
:: ERRBEEP BINT58 ' LAM y STO ;
NULLNAME ACCION_IZQUIERDA
:: LAM x DUP BINT1 #<ITE :: DROP ERRBEEP ; :: #1- ' LAM x STO ; ;
NULLNAME ACCION_ShiftIzq_IZQUIERDA
:: LAM x DUP BINT10 #<ITE :: DROPZERO ERRBEEP ; :: BINT10 #- ; ' LAM x STO
;
NULLNAME ACCION_ShiftDer_IZQUIERDA
:: ERRBEEP BINT0 ' LAM x STO ;
NULLNAME ACCION_DERECHA
:: LAM x DUP BINT116 #>ITE :: DROP ERRBEEP ; :: #1+ ' LAM x STO ; ;
NULLNAME ACCION_ShiftIzq_DERECHA
:: LAM x DUP BINT107 #>ITE :: DROP BINT117 ERRBEEP ; #10+ ' LAM x STO ;
NULLNAME ACCION_ShiftDer_DERECHA
:: ERRBEEP BINT117 ' LAM x STO ;
Si en el POL del ejemplo 1 cambias el AppKeys por el mostrado en esta página, podrás
mover el grob por la pantalla varias veces si mantienes presionadas (sin soltar) las teclas de
dirección.
El browser nos permite ver varios objetos en una lista y seleccionar alguno de ellos. Las
cajas de selección creadas por el comando CHOOSE de User RPL están basadas en el
browser. Sin embargo, el browser puede hacer muchas cosas más que ese comando
CHOOSE.
En la calculadora HP 50g hay dos maneras de hacer un browser: la antigua, la cual está
presente desde los modelos HP 48, y la nueva, presente a partir de la HP 49g. Este capítulo
describirá el nuevo browser, el cual es más fácil de usar. En el próximo capítulo veremos el
browser antiguo. Las ventajas del browser antiguo son la selección de varios objetos a la vez
y también la manera más sencilla de conseguir la pantalla completa.
La principal diferencia con el comando CHOOSE de User RPL es que puedes especificar
un message handler, el cual puede ser usado para proveer un menú personalizado, para
asignarles acciones a las teclas y para algunas otras cosas.
El principal comando del browser 49 es FLASHPTR Choose3_. Este comando tiene el
siguiente diagrama de pila:
( meta $título #inicial ::message ob TRUE )
o
( meta $título #inicial ::message FALSE )
Esto depende de si el usuario selecciona algo o cancela el browser.
Como una alternativa, puedes reemplazar el comando FLASHPTR Choose3_ con el
comando FLASHPTR Choose3Index_. Las diferencias son que este último comando no
guarda una copia del meta original en la pila virtual y que en lugar del objeto seleccionado,
este comando retorna el índice.
Los message handlers 1 y 2 son llamados sólo al inicio (después de guardados los
parámetros del browser 49 y fijados los lams FSize y DispLines), uno a continuación de otro.
Además de mostrar el perímetro de la caja de selección y el título, estos message
handlers deben fijar los valores de los lams YTop (8LAM) e YHeight (4LAM) de la siguiente
manera:
YTop: Es un bint que define la posición 'Y' del primer ítem mostrado del browser.
YHeight: Es un bint y debes fijarlo a FSize*DispLines – 1 (aunque este no será su valor
definitivo, pues después será fijado por la propia calculadora a otro valor:
FSize*(DispLines-1) – 1, restando FSize al valor que tu fijaste).
Si no llamas a los mensajes 1 y 2, se realizarán sus acciones por defecto, para las
cuales mostramos un message handler que imita dichas acciones para comprender mejor lo
que hacen:
NULLNAME MH_B49_1y2_POR_DEFECTO
::
BINT1 #=casedrop
:: ( )
7GETLAM ( #DispLines )
9GETLAM ( #DispLines #FSize )
3GETLAM ( #DispLines #FSize flag ) ( TRUE si el título es no vacío )
FLASHPTR 2 63 ( grob ) ( crea un grob con un rectángulo: el contorno )
HARDBUFF ( grob GROB )
BINT16 ( grob GROB 16 )
IsBigApple_
ITE
# 49 ( grob GROB 16 73 ) ( 73 en la HP 50g )
# 39
4PICK ( grob GROB 16 79 grob )
GROBDIM ( grob GROB 16 79 #h #w )
DROP ( grob GROB 16 79 #h )
DUP ( grob GROB 16 79 #h #h )
#7-_ ( grob GROB 16 79 #h #h-7 )
4PUTLAM ( grob GROB 16 79 #h )
#- ( grob GROB 16 79-h )
#2/ ( grob GROB 16 [79-h]/2 )
DUP ( grob GROB 16 [79-h]/2 [79-h]/2 )
#3+ ( grob GROB 16 [79-h]/2 [79-h]/2+3 )
8PUTLAM ( grob GROB 16 [79-h]/2 )
GROB! ( )
TRUE ( T )
;
BINT2 #=casedrop
:: ( )
3GETLAM ( flag )
case
:: HARDBUFF ( GROB )
BINT19 ( GROB 19 )
8GETLAM ( GROB 19 #YTop )
2GETLAM ( GROB 19 #YTop $título )
BINT90 ( GROB 19 #YTop $título 90 )
LEFT$3x5 ( GROB' )
BINT19 ( GROB' 19 )
8GETLAM ( GROB' 19 #YTop )
#6+ ( GROB' 19 #YTop+6 )
BINT109 ( GROB' 19 #YTop+6 109 )
OVER ( GROB' 19 #YTop+6 109 #YTop+6 )
LineB ( GROB'' )
DROP ( )
8GETLAM ( #YTop )
#9+ ( #YTop+9 )
8PUTLAM ( )
4GETLAM ( #YHeight )
#9-_ ( #YHeight-9 )
4PUTLAM ( )
TRUE ( T )
;
8GETLAM ( #YTop )
#1+ ( #YTop+1 )
8PUTLAM ( )
4GETLAM ( #YHeight )
#1- ( #YHeight-1 )
4PUTLAM ( )
TRUE ( T )
;
DROPFALSE
;
34.4.3 Message Handler número 3: MsgEndInit
Este mensaje es ejecutado después de asignados los valores de los lams del browser 49
y dibujados el contorno de la caja y el título, pero antes del dibujado de los ítems y del inicio
del POL.
Su diagrama de pila es:
( #3 TRUE )
( #3 FALSE )
La misión de este es asignar alguna acción a las teclas. Cuando el usuario presiona una
tecla, el message handler es llamado con el código de tecla y el plano (ver sección 31.1), y el
bint 4 en la pila. Este debe retornar una asignación para esa tecla (comando o programa),
TRUE y nuevamente TRUE.
Si no se dará ninguna asignación a la tecla, debes poner FALSE en la pila.
Su diagrama de pila es:
( #ct #pl #4 AcciónTecla TRUE TRUE ) (¡Recuerdalo, dos veces TRUE!)
( #ct #pl #4 #ct #pl FALSE )
Este debe retornar el menu que sera mostrado al usuario durante la selección. El valor
retornado por este mensaje es evaluado para conseguir el menú. El menu no es actualizado
automáticamente cuando mueves la selección, pero el mensaje #6 puede ser usado para
forzar una actualización. Si el menu tiene más de una página, debes dar asignaciones a las
teclas NEXT y PREV en el message handler #4 (pues NEXT y PREV no tienen una
asignación predefinida en el browser 49).
Su diagrama de pila es:
( #5 { menu list } TRUE )
( #5 ::prog_que_retorna_lista TRUE )
( #5 FALSE )
Este mensaje es llamado inmediatamente antes del inicio del POL. También es llamado
después del redibujado del browser 49 cuando cambias al ítem seleccionado. Puedes usar
este mensaje para forzar una actualización del menú cada vez que cambias el ítem
seleccionado. Para esto debes fijar a 24LAM como FALSE.
Su diagrama de pila es:
( #6 TRUE )
( #6 FALSE )
34.5 Los LAMs del Browser 49
El browser 49 usa internamente 24 lams, de tal manera que si tu quieres llamar a otros
lams que tu hayas creado anteriormente, es preferible que los hayas creado como lams con
nombre. Los LAMs del browser 49 son los siguientes:
:: 2GETLAM 3GETLAM #+ ;
El índice empieza en cero.
Para conseguir una cadena que representa al ítem actual (desde el nivel 1 de la Pila
Virtual), puedes usar el siguiente código:
:: 2GETLAM 3GETLAM #+ GetElemBotVStack ;
Para conseguir el ítem actual original (desde el nivel 3 de la Pila Virtual), puedes usar el
siguiente código:
::
GetVStackProtectWord ( #pw1 )
PopMetaVStack ( #pw1 meta1 )
GetVStackProtectWord ( #pw1 meta1 #pw2 )
PopMetaVStack ( #pw1 meta1 #pw2 meta2 )
2GETLAM 3GETLAM #+ ( #pw1 meta1 #pw2 meta2 #índice )
GetElemTopVStack ( #pw1 meta1 #pw2 meta2 ob )
1LAMBIND ( #pw1 meta1 #pw2 meta2 )
PushMetaVStack&Drop ( #pw1 meta1 #pw2 )
SetVStackProtectWord ( #pw1 meta1 )
PushMetaVStack&Drop ( #pw1 )
SetVStackProtectWord ( )
1GETABND ( ob )
;
Para conseguir el ítem actual original, también puedes haber guardado previamente una
copia de los ítems originales en una lista, por ejemplo en un LAM MiLista. Si tu haces
esto antes de iniciar el browser, podrás conseguir el actual ítem original con el siguiente
código:
Nota que estos comandos usan un lugar específico para guardar la pantalla actual, por lo
tanto estos comandos no pueden ser usados por un browser 49 ejecutado dentro de otro
browser 49 que ya haya usado este método para guardar la pantalla antes de llamar al
nuevo browser 49. En este caso, necesitarás guardar y restaurar copias de HARDBUFF y
HARDBUFF2.
34.8 Referencia
Direcc. Nombre Descripción
072002 (ˆChoose3) ( meta $título #pos ::handler ob T )
( meta $título #pos ::handler F )
El principal comando del browser 49.
074002 (ˆChoose3Index) ( meta $título #pos ::handler #i T )
( meta $título #pos ::handler F )
Parecido a ˆChoose3, pero retorna el índice del ítem
seleccionado en lugar del ítem en sí.
06E002 (ˆChoose2) ( meta $título #pos ob T )
( meta $título #pos F )
Llama a ^Choose3 con un message handler vacío.
Hace :: 'DROPFALSE FLASHPTR Choose3_ ;
070002 (ˆChoose2Index) ( meta $título #pos #i T )
( meta $título #pos F )
Llama a ^Choose3Index con un message handler vacío.
Hace :: 'DROPFALSE FLASHPTR ˆChoose3Index ;
073002 (ˆChoose3Save) ( meta $título #pos ::handler ob T )
( meta $título #pos ::handler F )
Guarda y restaura toda la pantalla alrededor de una llamada al
comando Choose3. Hace:
::
FLASHPTR SaveHARDBUFF_
FLASHPTR Choose3_
FLASHPTR RestoreHARDBUFF_
ClrDAsOK
;
06F002 (ˆChoose2Save) ( meta $título #pos ob T )
( meta $título #pos F )
Guarda y restaura toda la pantalla alrededor de una llamada al
comando Choose2. Hace:
::
FLASHPTR SaveHARDBUFF_
FLASHPTR Choose2_
FLASHPTR RestoreHARDBUFF_
ClrDAsOK
;
005002 (ˆsysCHOOSE) ( $título {} %sel ob %1 )
( $título {} %sel %0 )
Equivale al comando CHOOSE de User RPL.
088002 (ˆSaveHARDBUFF) ( )
Guarda HARDBUFF y HARDBUFF2 en un lugar seguro.
089002 (ˆRestoreHARDBUFF) ( )
Restaura HARDBUFF y HARDBUFF2 guardados con el
comando SaveHARDBUFF.
077002 (ˆChoose3CANCL) ( )
La acción CANCL ejecutada por Choose3 si es presionada la
tecla CANCL u ON. Hace:
:: TakeOver FALSE 23PUTLAM_ TRUE 1PUTLAM ;
076002 (ˆChoose3OK) ()
La acción OK ejecutada por Choose3 si es presionada la
tecla ENTER u OK. Hace:
:: TakeOver
TRUE 1PUTLAM
' :: 2GETLAM 3GETLAM #+ TRUE ; 23PUTLAM_
;
Direcc. Nombre Descripción
075002 (ˆChooseDefHandler) ( ::handler )
Pone el message handler por defecto correspondiente a
aplicaciones que muestran ayuda de comandos del CAS.
Cada uno de los ítems deberán ser listas de la forma {$ ob}.
Si ob es un comando del CAS (bibliotecas ya incorporadas
222 y 788), se mostrará su ayuda correspondiente.
No muestra ayuda para otros comandos.
ITE
:: DROP ( ) ( borra respuesta del browser 49 )
LAM Resp ( {$} ) ( retorna lista de cadenas )
FLASHPTR COMPRIMext ( {$}' ) ( suprime elementos repetidos )
TRUE ( {$}' T )
;
FALSE ( F )
( {$} T // F )
ABND ( {$} T // F ) ( Destruye el entorno temporal creado con ABND )
;
NULLNAME MH_B49_EJEMPLO_1
:: BINT4 #=casedrop ( manejador de teclas )
:: DUP#1= 3PICK BINT23 #= AND case2drop ( SQRT key pressed )
:: ' :: LAM MiLista ( {%} )
2GETLAM 3GETLAM #+ #1+ ( {%} #i+1 )
NTHCOMPDROP ( % ) ( consigue valor )
%SQRT ( %' ) ( halla raiz )
DO>STR ( $ ) ( convierte a cadena )
FlashWarning ( ) ( Lo muestra )
;
TrueTrue ( Si, se asigna una acción a la tecla )
;
FALSE ( No se manejan otras teclas )
;
BINT5 #=casedrop ( proveer un menú )
:: ' :: NoExitAction ( No guardará el menú como LastMenu )
{
{ "->{}" ( Tecla de menú "Agregar a lista" )
:: TakeOver ( )
LAM Resp ( {$} ) ( Consigue lista actual )
2GETLAM 3GETLAM #+ ( {$} #índice )
GetElemBotVStack ( {$} $item ) ( Consigue cadena )
>TCOMP ( {$}' ) ( Agrega a la lista )
' LAM Resp STO ( ) ( Guarda en LAM Resp )
;
}
{ "?" ( Tecla de menú "Ayuda" )
:: TakeOver ( )
FLASHPTR SaveHARDBUFF_ ( ) ( Guarda pantalla actual )
CLEARLCD ( ) ( limpia pantalla )
ZEROZERO ( 0 0 )
"->{}: AGREGA A LISTA\0A?: AYUDA\0ASQRT: MUESTRA RAIZ"
$>GROBCR ( 0 0 grob )
XYGROBDISP ( ) ( lo muestra )
WaitForKey ( #ct #p ) ( espera tecla )
2DROP ( )
FLASHPTR RestoreHARDBUFF_ ( ) ( Restaura pantalla )
;
}
{ :: TakeOver ( )
LAM MiLista ( {} ) ( lista de 100 números )
2GETLAM 3GETLAM #+ #1+ ( {} #i+1 )
NTHCOMPDROP ( %i+1 ) ( elemento actual )
%2 %/ ( %[i+1]/2 )
%FP ( %ParteDecimal )
%0= ( flag ) ( Test if even )
ITE
"par"
"impar" ( $ )
; ( $ ) ( menu: par o impar )
NOP ( No realiza ninguna acción )
}
NullMenuKey ( 4º tecla de menú es vacía )
{ "CANCL" FLASHPTR Choose3CANCL_ } ( acción CANCL estand )
{ "OK" FLASHPTR Choose3OK_ } ( acción OK estandar )
}
;
TRUE ( Si, nosotros proveemos el menú )
;
BINT6 #=casedrop ( llamado al cambiar de ítem seleccionado )
:: FalseFalse 24PUTLAM_ ; ( Fuerza a una actualización del menú )
DROPFALSE ( Otros mensajes no son manejados )
;
Ejemplo 2 Browser 49
Usando la pantalla completa.
Sólo en HP 49g+ y HP 50g.
Minifuente y Título no vacío.
RunSafeFlags
:: BINT90
SetSysFlag ( meta $tít #índice MH ) ( activa flag 90 )
FLASHPTR Choose3_ ( $ T // F )
;
;
NULLNAME MH_B49_MINIFONT_TITULO
:: BINT1 #=casedrop
:: 11GETLAM ( #NbElm )
BINT9 ( #NbElm 9 )
#MIN ( #min[NbElm,9] )
7PUTLAM ( ) ( guarda en #DispLines )
TRUE ( T )
;
BINT2 #=casedrop
:: BINT9 ( #9 )
8PUTLAM ( ) ( guarda en #YTop )
9GETLAM ( #FSize )
7GETLAM ( #FSize #DispLines )
#* ( #FSize·DispLines )
#1- ( #FSize·DispLines-1 )
4PUTLAM ( ) ( guarda en #YHeight )
80 131 ( 80 131 )
MAKEGROB ( grob )
BINT66 ( grob 66 )
BINT0 ( grob 66 0 )
2GETLAM ( grob 66 0 $ )
BINT128 ( grob 66 0 $ 128 )
CENTER$3x5 ( grob' ) ( Dibuja título )
BINT0 ( grob' 0 )
BINT6 ( grob' 0 6 )
BINT130 ( grob' 0 6 109 )
BINT6 ( grob' 0 6 109 6 )
LineB ( grob'' ) ( Dibuja línea debajo de título )
HARDBUFF ( grob'' GROB )
ZEROZERO ( grob'' GROB 0 0 )
GROB! ( ) ( MUESTRA grob'' EN LA PANTALLA )
TRUE ( T )
;
BINT3 #=casedrop
:: ' ERASE&LEFT$3x5
14PUTLAM ( Guarda Display )
BINT127 20PUTLAM ( Posición #x de la barra de desplazamiento )
BINT1 21PUTLAM ( Posición #x de los ítems )
BINT0 19PUTLAM ( Posición #x para resaltar ítem seleccionado )
BINT124 18PUTLAM ( Ancho #w para actualizar ítem si Lift?=T )
13GETLAM ( Lift? )
ITE
BINT124
BINT128
12PUTLAM ( ) ( Ancho #w para dibujar ítem )
TRUE ( T )
;
DROPFALSE
;
Ejemplo 3 Browser 49
Usando la pantalla completa.
Cualquier calculadora HP 50g, HP 49g+, HP 49g o HP 48gII.
Cualquier tamaño de fuente.
Cualquier título.
En el siguiente ejemplo se muestra como debemos programar el message handler para que
el browser 49 se muestre en pantalla completa.
Se usaron los mensajes 1, 2 y 3.
En el siguiente ejemplo se muestra como debemos programar el message handler para que
al presionar las teclas NEXT y PREV, se puedan mostrar las páginas de un menú grande.
Se usó el mensaje número 4 para manejar a a esas dos teclas y se fijó al lam 24 como
FALSE cada vez que se presione las teclas para que se produzca una actualización del
menú.
NULLNAME MH_B49_VARIAS_PAG
:: BINT4 #=casedrop ( MANEJADOR DE TECLAS )
:: ( #ct #p )
OVER BINT13 #= OVER #1= AND ( #ct #p flag ) ( TECLA NEXT )
case2drop
:: ' :: DoNextRow ( ) ( Muestra siguiente página del menú )
FALSE 24PUTLAM_ ( ) ( para redibujar el menú )
;
TrueTrue ( prog T T )
;
OVER BINT13 #= OVER #2= AND ( #ct #p flag ) ( tecla PREV )
case2drop
:: ' :: DoPrevRow ( ) ( Muestra anterior página del menú )
FALSE 24PUTLAM_ ( ) ( para redibujar el menú )
;
TrueTrue ( prog T T )
;
( #ct #p )
FALSE ( #ct #p F )
;
BINT5 #=casedrop ( MENU DEL BROWSER 49 )
:: { { "F1" :: TakeOver "F1" FlashWarning ; }
{ "F2" :: TakeOver "F2" FlashWarning ; }
{ "F3" NOP }
{ "F4" NOP }
{ "CANCL" FLASHPTR Choose3CANCL_ }
{ "OK" FLASHPTR Choose3OK_ }
{ "F7" NOP }
{ "F8" NOP }
{ "F9" NOP }
{ "F10" NOP }
{ "CANCL" FLASHPTR Choose3CANCL_ }
{ "OK" FLASHPTR Choose3OK_ }
{ "F11" NOP }
{ "F12" NOP }
{ "F13" NOP }
{ "F14" NOP }
}
TRUE ( menu T )
;
DROPFALSE
;
Capítulo 35
Usando el Browser 48
El browser 48 (el cual también está presente en la HP 50g) te permite hacer muchas
cosas. El browser 48 te muestra una lista de ítems de los cuales podrás seleccionar uno de
ellos o también marcar a varios de ellos para retornar varios ítems en la pila (no como el
browser 49, el cual te permitía solamente seleccionar a un ítem). También puedes colocar un
menú personalizado al browser 48.
Con el browser 48 es muy sencillo mostrar los elementos en una pantalla completa, a
diferencia del browser 49. El browser 48 tiene muchas características, y generalmente hay
varias formas para hacer lo mismo.
El browser es llamado por el comando ˜Choose. Este comando espera cinco
parámetros en la pila. Al final retorna los resultados y TRUE, o sólo FALSE, dependiendo de
la manera en que se terminó el browser. Aquí están los diagramas de pila:
Este es un programa que permite la configuración de varios aspectos del browser. Este
funciona como otros message handlers hacen: este es llamado con un bint en la pila, que
representa el código del mensaje. Si este mensaje es manejado, el programa debe retornar
cualquier dato requerido por el mensaje y TRUE, de lo contrario este retorna sólo FALSE.
Esto significa que DROPFALSE (el cual puede ser puesto en la pila con el comando
'DROPFALSE) es un valor válido para este parámetro, el cual significa que ningún mensaje
es manejado y las características por defecto del browser 48 son usadas todas las veces.
Aquí está la descripción de algunos de estos mensajes con sus diagramas de pila, en
donde se ha omitido el bint correspondiente al código del mensaje.
Código
(Decimal) Descripción y Pila
57 Número de líneas que el browser mostrará en la pantalla.
El valor mínimo es 2 y el valor máximo es igual al número de elementos.
El valor por defecto depende del estado del flag 90, de la altura de la fuente, de si
se mostrará el título o no y de si el browser es de pantalla completa o no.
Este mensaje es llamado una sóla vez, antes de empezar el browser 48.
(# T )
(F )
58 Altura de una línea en el browser.
El valor por defecto depende del estado del flag 90 y de la altura de la fuente.
Este valor por defecto es igual al tamaño de la fuente utilizada para mostrar los
elementos, más uno (o sea 7, 8 ó 9).
Este mensaje es llamado una sóla vez, antes de empezar el browser 48.
(# T )
(F )
59 Ancho de una línea en el browser. Este ancho corresponde sólo al espacio donde
se muestra a cada elemento (y al espacio para la marca check, si se permite la
selección múltiple). Este ancho no incluye al espacio donde se muestran las
flechas de arriba y abajo, cuando el número total de elementos es mayor al
número de elementos mostrados (tamaño de la página).
El valor por defecto depende de si el browser es de pantalla completa o no, y de
si el número total de elementos es mayor al número de elementos mostrados.
Este mensaje es llamado una sóla vez, antes de empezar el browser 48.
(# T )
(F )
60 Debe retornar TRUE si el browser será de pantalla completa, o FALSE si es una
ventana. El valor por defecto es mostrar una ventana.
( flag T )
(F )
61 Debe retornar TRUE si las marcas de verificación son permitidas, es decir cuando
se permita la selección múltiple, o FALSE si no son permitidas.
El valor por defecto es no permitir marcas de verificación.
( flag T )
(F )
62 Returna el número de elementos del browser. Si inicialmente quieres mostrar no
todos los elementos puedes llamar a este mensaje.
La acción por defecto es hallar el número de elementos de la lista {}ítems.
Puedes usar este mensaje cuando el número de elementos cambia.
Normalmente este mensaje es llamado una sóla vez, antes de empezar el
browser 48. Pero también será llamado si usas el comando ~BBReReadNElems_
(# T )
(F )
63 Con este mensaje podrás fijar las coordenadas x e y del primer ítem mostrado en
la pantalla.
( #x #y T )
(F )
64 Con este mensaje podrás fijar el offset inicial. El offset es el lugar que ocupa el
elemento seleccionado respecto a los elementos que se están mostrando ahora
en la pantalla.
Debes cerciorarte de que sea un número válido para que no suceda un crash.
( #offset T )
(F )
Código
(Decimal) Descripción y Pila
65 Este mensaje debe dibujar el fondo de la pantalla.
Puedes usar este mensaje para dibujar algo en el
fondo.
Si está en modo pantalla completa, la acción por
defecto es limpiar la pantalla.
Si está en modo ventana, la acción por defecto es
dibujar un rectángulo que es el marco de toda la
ventana del browser.
Este mensaje es llamado cuando se va a actualizar la pantalla.
Este es el primer mensaje en ser llamado luego de iniciado el POL del browser 48
y puede ser usado también para modificar algunos parámetros del POL como se
ve en uno de los ejemplos al final de este capítulo.
(T )
(F )
66 Este mensaje debe dibujar el título en HARDBUFF. La acción por defecto es
dibujar el título a partir del parámetro $Título (y una línea debajo del título
cuando el browser está en modo ventana).
Este mensaje es llamado cuando se va a mostrar el título en la pantalla.
Si este mensaje es manejado, ya no se llaman a los mensajes 67, 68 y 69 cuando
se va a mostrar el título en la pantalla.
(T )
(F )
67 Este mensaje debe retornar el título como un grob.
La acción por defecto es conseguir el grob a partir del parámetro $Título.
Este mensaje es llamado cuando se va a mostrar el título en la pantalla.
Si el mensaje 66 es manejado, este mensaje no será llamado.
Si este mensaje es manejado, ya no se llaman a los mensajes 67 y 68 cuando se
va a mostrar el título en la pantalla.
( grob T )
(F )
68 Este mensaje debe retornar el título como un grob, cuando el browser está en
modo pantalla completa.
La acción por defecto es conseguir el grob a partir del parámetro $Título.
Este mensaje es llamado cuando se va a mostrar el título en la pantalla.
Si el mensaje 66 o el 67 es manejado, este mensaje no será llamado.
( grob T )
(F )
69 Este mensaje debe retornar el título como un grob, cuando el browser está en
modo ventana.
La acción por defecto es conseguir el grob a partir del parámetro $Título.
Este mensaje es llamado cuando se va a mostrar el título en la pantalla.
Si el mensaje 66 o el 67 es manejado, este mensaje no será llamado.
( grob T )
(F )
70 Este mensaje debería retornar la cadena que represente al título. Este mensaje
puede modificar al parámetro $Title o también ignorarlo.
La acción por defecto es retornar el parámetro $Title si es una cadena o su
mensaje de error correspondiente si es un bint.
Este mensaje es llamado cuando no se llama a ninguno de los mensajes 66, 67,
68 o 69.
Este mensaje es llamado cuando se va a mostrar el título en la pantalla y el
parámetro $Título no es una cadena vacía.
($ T )
(F )
Código Descripción y Pila
74 Este mensaje debería mostrar los elementos de la lista {}items en la pantalla.
También debería mostrar la flecha arriba y/o la flecha abajo que se muestran a la
derecha si es necesario.
Este mensaje es llamado cuando se van a mostrar los elementos en la pantalla.
Si este mensaje es manejado, ya no se llaman a los mensajes 79, 81, 82 y 80
cuando se van a mostrar los elementos en la pantalla. Pero si se va a mostrar un
solo elemento con el comando ˆLEDispItem, este mensaje no es llamado y si
es llamado el mensaje 79, 81, 82 y/o 80.
(T )
(F )
79 Este mensaje debería mostrar un elemento del browser. Si este es el elemento
actualmente seleccionado, este mensaje debe mostrar este elemento en fondo
invertido o mostrar de alguna otra forma que este es el elemento seleccionado.
Este mensaje es llamado cuando se va a mostrar un elemento en la pantalla.
Si este mensaje es manejado, entonces el parámetro ::Converter no será
tomado en cuenta para mostrar el objeto en la pantalla.
Si este mensaje es manejado, ya no se llaman a los mensajes 81, 82 y 80 cuando
se va a mostrar un elemento en la pantalla.
( #índice #offset T )
( #índice #offset #índice #offset F )
80 Este mensaje debe retornar un objeto de acuerdo al índice proporcionado, que
corresponde a un elemento. Este mensaje puede retornar el elemento
correspondiente o cualquier otro objeto, pues ::Converter se encargará
después de convertirlo a cadena.
Si deseas cambiar dinámicamente los items mostrados en pantalla este mensaje
te permite hacer eso, aunque el 82 es probablemente mejor para este fin.
Este mensaje es llamado cuando se va a mostrar un elemento en la pantalla,
cuando se hace una búsqueda alfabética y cuando se presiona ENTER u OK.
Si el mensaje 79, 81 o el 82 es manejado, este mensaje no será llamado para
mostrar objetos en la pantalla.
Sin embargo, este mensaje es siempre llamado para retornar el objeto que será
colocado en la pila al finalizar el browser con la tecla ENTER u OK.
( # ob T )
(# # F )
81 Este mensaje debe convertir un elemento a grob. Este grob debe ser de
dimensiones 7NULLLAMx8NULLLAM. Si está permitida la marcación de objetos,
debes incorporar la marca de verificación en el grob si el elemento está marcado.
Si este mensaje es manejado, entonces el parámetro ::Converter no será
tomado en cuenta para mostrar el objeto en la pantalla.
Este mensaje es llamado cuando se va a mostrar un elemento en la pantalla.
Si el mensaje 79 es manejado, este mensaje no será llamado.
Si este mensaje es manejado, ya no se llaman a los mensajes 82 y 80 cuando se
va a mostrar un elemento en la pantalla.
( # grob T )
(# # F )
82 Este mensaje debe convertir un elemento a cadena.
Este mensaje es llamado cuando se va a mostrar un elemento en la pantalla.
Si este mensaje es manejado, entonces el parámetro ::Converter no será
tomado en cuenta para mostrar el objeto en la pantalla.
Si el mensaje 79 o el 81 es manejado, este mensaje no será llamado para
mostrar objetos en la pantalla.
Si este mensaje es manejado, ya no se llama al mensaje 80 cuando se va a
mostrar un elemento en la pantalla.
(# $ T )
(# # F )
Código
(Decimal) Descripción y Pila
83 Debe proporcionar una lista que describa al menu. También puede ser un
programa que retorne una lista. El formato de la lista es el mismo que todo menú
y se explica en la sección 38.1.
( {} T )
( prog T )
(F )
84 Este mensaje es llamado antes de que el browser se inicie y debe guardar los
grobs correspondientes a HARDBUFF y al menú (en LAM5 y LAM4).
(T)
(F)
85 Este mensaje es llamado antes de que el browser se inicie (antes de iniciarse el
POL), pero despúes de que todas las variables locales han sido fijadas.
En este mensaje, si se retorna TRUE o FALSE no hay ninguna diferencia.
(T)
(F)
86 Este es llamado cuando un elemento es marcado o desmarcado. Este mensaje
debe guardar en LAM15 la lista de los elementos marcados. Este mensaje no
dibuja nada en la pantalla.
(# T )
(# # F )
87 Este mensaje es llamado justo antes de que el browser finalice (pero después de
finalizado el POL). La acción por defecto es devolver los grob de la pantalla y del
menú a su estado anterior a la ejecución del browser (usando los grobs
contenidos en LAM4 y LAM5).
En la pila se encuentran los objetos que retorna el browser al finalizar. Si deseas
puedes cambiar estos objetos (ob es una lista de elementos o un solo elemento,
esto depende de si estaba permitida la marcación de objetos).
( ob T ob T T ) ( ob T ??? T )
( ob T ob T F ) ( ob T ??? F )
(FF T ) ( F ??? T )
(FF F ) ( F ??? F )
91 Este es llamado cuando el usuario presiona la tecla ON o la tecla de menú
CANCL. Si el flag es TRUE, el browser finaliza. Si es FALSE, el browser continua.
( flag T )
(F )
96 Este es llamado cuando el usuario presiona la tecla ENTER o la tecla de menú
OK. Si el flag es TRUE, el browser finaliza. Si es FALSE, el browser continua.
( flag T )
(F )
1) Puedes proveer los elementos del browser usando el parámetro {}Items, y proveer un
::Converter que convertirá cada uno de estos elementos en cadena. No necesitarás
preocuparte de los mensajes 80, 81 ó 82.
Este método es bueno si los elementos no cambian mientras se ejecuta el programa.
2) Puedes dejar el parámetro {}Items como una lista vacía, y guardar la lista de
elementos en algún otro lugar (por ejemplo en un lam).
Luego, usar los mensajes 80, 81 ó 82 para retornar los elementos.
a) Si usas los mensajes 81 o 82, retornarás los elementos como un grob o como una
cadena, y ::Converter no será llamado para mostrar los elementos en la
pantalla. Sin embargo, ::Converter siempre será llamado al hacer la búqueda
alfabética y debes asegurarte que siempre retorne una cadena. También deberás
llamar al mensaje 80 para retornar el elemento actual que será usado en la búsqueda
alfabética y al finalizar el browser con ENTER u OK.
b) O también puedes usar el mensaje 80 (y no llamar al 81 o al 82) para retornar un
elemento que será mostrado en la pantalla, el cual será convertido luego a cadena
con el parámetro ::Converter.
Este método es bueno si los elementos cambian mientras se ejecuta el programa. Si
usas este método, deberás manejar el mensaje 62.
Cuando el número de elementos cambia, debes ejecutar este código para adaptar el browser
a los cambios:
::
ROMPTR 0B3 03A ( ) ( RESTAURA LA PANTALLA A SU ESTADO ANTERIOR AL B48 )
ROMPTR BBReReadNElems_ ( ) ( Relee el nº total de elementos )
ROMPTR BBReReadPageSize_ ( ) ( Relee el nº de elementos mostrados )
ROMPTR BBReReadWidth_ ( ) ( Relee ancho de elementos en píxeles )
ROMPTR BBReReadCoords_ ( ) ( Relee coord. esquina superior izq. )
ROMPTR 0B3 039 ( ) ( GUARDA PANTALLA DEL ESTADO ANTERIOR AL B48 )
18GETLAM ( #Indice )
12GETLAM ( #Indice #NumElementos )
DUP#0=IT
DROPONE
( #Indice #NumElementos' )
#MIN ( min[#Indice,#NumElementos] )
18PUTLAM ( )
FALSE ( F )
ROMPTR BBRecalOff&Disp_ ( ) ( Recalcula offset )
;
35.7 NULLLAMs Usados por el Browser 48
El Browser 48 usa 22 nombres locales sin nombre para guardar su información.
Aquí está la descripción de cada uno de ellos.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME B48Ejemplo1 ( -> {ecs} T // F )
:: CK0 ( )
AppMode? case xKILL
( )
NULL{} ( {} )
' LAM EQS ( {} lam )
BINT1 ( {} lam #1 )
DOBIND ( ) ( CREA ENTORNO TEMPORAL )
ROMPTR Choose ( ob T // F )
ITE
:: ( ob )
DROP ( )
LAM EQS ( {ecs} )
TRUE ( {ecs} T )
;
FALSE ( F )
( {ecs} T // F )
ABND ( {ecs} T // F ) ( destruye entorno temporal )
;
NULLNAME MH_B48_Ejemplo1
:: BINT60 #=casedrop ( Pantalla completa )
TrueTrue
BINT62 #=casedrop ( número de elementos )
:: LAM EQS LENCOMP ( #n )
DUP#0=IT #1+ ( #n' ) ( si la lista es vacía, retorna 1 )
TRUE ( #n' T )
;
BINT80 #=casedrop ( retorna el elemento actual )
:: ( #i )
LAM EQS SWAP ( #i {ecs} )
NTHELCOMP ( ecu T // F )
NOT_IT
"No hay ecuaciones, "
( ob )
TRUE ( ob T )
;
BINT82 #=casedrop ( retorna el elemento actual como una cadena )
:: ( #i )
LAM EQS SWAP ( #i {ecs} )
NTHELCOMP ( ecu T // F )
ITE
:: setStdWid ( ecu )
FLASHPTR FSTR7 ( $ )
;
"No hay ecuaciones, " ( $ )
TRUE ( $ T )
;
BINT83 #=casedrop ( el menú del browser 48 )
:: '
:: NoExitAction
{ { "EDITA" ( EDITA UNA ECUACIÓN )
:: LAM EQS ( {ecs} )
18GETLAM ( {ecs} #i )
NTHELCOMP ( ecuac T // F )
NOTcase ( saldrá si lista está vacía )
:: DoBadKey ( hace un sonido )
SetDAsNoCh ( no se cambiará nada en la pantalla )
;
( ecuac )
BINT1 ( ecuac #1 )
PushVStack&KeepDROP ( ecuac ) ( mueve pilaRPN sin meta a pv )
124. InitMenu% ( ecuac ) ( fija menú ALGEBRA )
FLASHPTR EQW3Edit ( ecuac' T // F ) ( edita en EQW )
BINT83 ( ... 83 )
22GETLAM ( ... 83 MessageHandler )
EVAL ( ... menu T )
DROPONE ( ... menu #1 )
StartMenu ( ecuac' T // F )
NOTcase ( sale si se canceló la edición )
PopVStack ( mueve pila virtual a pila RPN )
( ecuac' )
OBJ>R_ ( )
PopVStack ( ) ( mueve pila virtual a pila RPN )
R>OBJ_ ( ecuac' )
18GETLAM ( ecuac' #i )
LAM EQS ( ecuac' #i {ecs} )
PUTLIST ( {ecs}' )
' LAM EQS STO ( )
;
}
{ "AGREGA" ( CREA NUEVA ECUACIÓN )
:: PushVStack&Clear ( ) ( mueve pila RPN a pila virtual )
124. InitMenu% ( ) ( fija menú ALGEBRA )
FLASHPTR EQW3 ( ob T // F ) ( abre EQW para crear ec. )
BINT83 ( ... 83 )
22GETLAM ( ... 83 MessageHandler )
EVAL ( ... menu T )
DROPONE ( ... menu #1 )
StartMenu ( ecuac' T // F )
NOTcase ( sale si se canceló la edición )
PopVStack ( mueve pila virtual a pila RPN )
( ob )
OBJ>R_ ( )
PopVStack ( ) ( mueve pila virtual a pila RPN )
R>OBJ_ ( ob )
LAM EQS SWAP ( {ecs} ob )
OVER LENCOMP ( {ecs} ob #n )
18GETLAM ( {ecs} ob #n #i )
#MIN ( {ecs} ob #min[n;i] ) ( 0 si es NULL{} )
#1+ ( {ecs} ob #1+min[n;i] ) ( 1 si es NULL{} )
DUP ( {ecs} ob #1+min[n;i] #1+min[n;i] )
18PUTLAM ( {ecs} ob #1+min[n;i] )
FLASHPTR INSERT{}N ( {ecs}' ) ( fija nuevo índice )
' LAM EQS STO ( ) ( guarda nueva lista de ecuaciones )
ROMPTR BBReReadNElems_ ( ) ( Fija nuevo nº de elementos )
ROMPTR BBReReadWidth_ ( ) ( fija nuevo ancho de ítems )
6GETLAM #1+ 11GETLAM #MIN ( #min[offset+1;NElemMostr] )
12GETLAM #MIN ( #min[offset+1;NElemMostr;NElem] )
6PUTLAM ( ) ( fija nuevo offset )
;
}
{ "BORRA" ( BORRA ECUACIÓN )
:: LAM EQS ( {ecs} )
INNERDUP ( ob1...obn #n #n )
#0= ( ob1...obn #n flag )
casedrop ( saldrá si lista está vacía )
:: DoBadKey ( hace un sonido )
SetDAsNoCh ( no se cambiará nada en la pantalla )
;
( ob1...obn #n )
DUP
18GETLAM ( ob1...obn #n #n #i )
#- #2+ ( ob1...obn #n #n-i+2 )
ROLLDROP ( ... #n )
#1- ( ... #n-1 )
{}N ( {ecs}' )
' LAM EQS STO ( ) ( guarda nueva lista de ecuaciones )
ROMPTR BBReReadNElems_ ( ) ( Fija nuevo nº de elementos )
18GETLAM ( #i )
12GETLAM ( #i #NElems )
#MIN ( #min[i;NElems] )
18PUTLAM ( ) ( fija nuevo índice )
ROMPTR BBReReadWidth_ ( ) ( fija nuevo ancho de ítems )
FALSE ( F )
ROMPTR BBRecalOff&Disp_ ( ) ( fija nuevo offset )
( sin alterar pantalla )
11GETLAM 12GETLAM ( #NElemMostrados #NElems )
#> ( flag )
ITE
:: 9GETLAM ( #Yitem1 )
12GETLAM 7GETLAM #* #+ ( #Yitem1+NElems·HItem )
DUP ( #Y1 #Y1 )
11GETLAM 12GETLAM #- ( #Y1 #Y1 #NEMostr-NElems )
7GETLAM #* #+ ( #Y1 #Y2 )
BLANKIT ( ) ( limpia lineas )
FLASHPTR LEDispList ( ) ( dibuja ítems )
SetDAsNoCh ( ) ( no se cambiará pantalla )
;
SetDA12a3NCh ( ) ( solo cambiará ítems en pantalla )
;
}
NullMenuKey
{ "CANCL" FLASHPTR DoCKeyCancel }
{ "OK" FLASHPTR DoCKeyOK }
{ "•" ( FLECHA ARRIBA )
:: LAM EQS ( {ecs} )
18GETLAM ( {ecs} #i )
#1= ( {ecs} flag ) ( TRUE si el índice es 1 )
casedrop
:: DoBadKey ( hace un sonido )
SetDAsNoCh ( no se cambiará nada en la pantalla )
;
INNERCOMP ( ob1...obn #n )
18GETLAM ( ob1...obn #n #i )
ARRIBA_SUBE_UNO ( {ecs}' )
' LAM EQS STO ( )
18GETLAM #1- ( #i-1 )
18PUTLAM ( ) ( fija nuevo índice )
6GETLAM #1- ( #offset-1 )
BINT1 #MAX ( #max[offset-1;1] )
6PUTLAM ( ) ( fija nuevo #offset )
SetDA12a3NCh ( ) ( solo cambiará ítems en pantalla )
;
}
{ "•" ( FLECHA ABAJO )
:: LAM EQS ( {ecs} )
18GETLAM ( {ecs} #i )
12GETLAM ( {ecs} #i #NElems )
#= ( {ecs} flag )
casedrop
:: DoBadKey ( hace un sonido )
SetDAsNoCh ( no se cambiará nada en la pantalla )
;
( {ecs} )
INNERCOMP ( ob1...obn #n )
18GETLAM ( ob1...obn #n #i )
ARRIBA_BAJA_UNO ( {ecs}' )
' LAM EQS STO ( )
18GETLAM #1+ ( #i-1 )
18PUTLAM ( ) ( fija nuevo índice )
6GETLAM #1+ ( #offset+1 )
11GETLAM #MIN ( #min[offset-1;NElemMostrados] )
6PUTLAM ( ) ( fija nuevo #offset )
SetDA12a3NCh ( ) ( solo cambiará ítems en pantalla )
;
}
{ "LIMPIA" ( QUITA TODAS LAS ECUACIONES )
:: LAM EQS
NULLCOMP?
case
:: DoBadKey ( hace un sonido )
SetDAsNoCh ( no se cambiará nada en la pantalla )
;
NULL{}
' LAM EQS STO ( {ecs} )
ROMPTR BBReReadNElems_ ( ) ( Fija nuevo nº de elementos )
ROMPTR BBReReadWidth_ ( ) ( fija nuevo ancho de ítems )
ONEONE ( 1 1 )
18PUTLAM ( 1 ) ( Fija nuevo índice )
6PUTLAM ( 1 ) ( Fija nuevo offset )
BlankDA12 ( ) ( limpia áreas 1 y 2 )
FLASHPTR LEDispPrompt ( ) ( muestra título )
FLASHPTR LEDispList ( ) ( muestra ítem "no hay ecuac" )
SetDAsNoCh ( ) ( no se cambiará nada en la pantalla )
;
}
NullMenuKey
{ "CANCL" FLASHPTR DoCKeyCancel }
{ "OK" FLASHPTR DoCKeyOK }
}
;
TRUE
;
DROPFALSE
;
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME B48MenúChange ( -> ob T // F )
:: CK0 ( Ningún argumento es requerido )
FALSE 1LAMBIND ( )
ABND ( )
;
* El message handler 65 es para dibujar el marco de la ventana.
* No es manejado aquí, pero se usa para cambiar el parámetro
* AppKeys del POL, pues el mensaje 65 es el primero en ser llamado una vez
* que se inició el POL.
* En cambio el mensaje 85 no puede ser utilizado para cambiar el parámetro
* AppKeys, pues sería llamado antes de iniciarse el POL.
* El message handler 83 es para definir el menú.
NULLNAME MH_B48_MenuDinamico
:: BINT65 #=casedrop ( este mensaje es para el marco )
:: 24GETLAM_
caseFALSE
( )
TRUE 24PUTLAM_ ( )
' :: ( #ct_B #p_B )
OVER ( #ct_B #p_B #ct_B )
BINT10 #= ( #ct_B #p_B flag )
3PICK ( #ct_B #p_B flag #ct_B )
BINT15 #= ( #ct_B #p_B flag flag' )
ORcase
:: ( #ct_B #p_B )
ROMPTR 0B3 008 ( prog T )
DROP ( prog )
' ROMPTR BReReadMenus_ ( prog romptr )
' DispMenu.1 ( prog romptr DispMenu.1 )
BINT3 ( prog romptr DispMenu.1 #3 )
::N ( prog' )
TRUE ( prog' T )
;
( #ct #p ) ( para AppKeys )
;
' ROMPTR 0B3 008 ( prog romptr )
ROMPTR@ ( prog prog' T )
DROP ( prog prog' )
&COMP ( prog'' )
AppKeys! ( )
FALSE ( F )
;
BINT83 #=casedrop ( es el menú )
:: ' :: NoExitAction
{ NullMenuKey
NullMenuKey
{ :: TakeOver 18GETLAM #>$ ;
:: TakeOver
"El menú tambien puede cambiar en el browser 48"
FlashWarning
;
}
NullMenuKey
{ "CANCL" FLASHPTR DoCKeyCancel }
{ "OK" FLASHPTR DoCKeyOK }
}
;
TRUE
;
DROPFALSE
;
Ejemplo 3 Browser 48
Cuando los elementos del browser 48 cambian
En este ejemplo los elementos del browser cambian cuando se presionan alguna teclas
de menú. Los elementos actuales del browser se guardan en el lam ITEMS, el cual puede
contener los elementos guardados en los lams L1, L2 o L3. El NULLNAME REFRES_B48 se
encarga de actualizar el browser 48 cada vez que se decide cambiar los elementos.
Este programa maneja los mensajes 62, 80 y 83.
Mensaje 62: Debe retornar el número de ítems del browser. Es llamado al inicio del
browser y también cada vez que se usa el comando ROMPTR BBReReadNElems_ para
actualizar el número de ítems. En este programa obtiene el número de ítems a partir de los
elementos de la lista guardada en el lam ITEMS.
Mensaje 80: Debe retornar el ítem actual. En este programa es llamado cuando se hace
una búsqueda alfabética y cuando se finaliza el browser con ENTER u OK. También es
llamado para mostrar los ítems en la pantalla porque no se manejan los mensaje 81 ni 82.
Mensaje 82: Debe retornar el ítem actual como una cadena. En este programa es llamado
para mostrar los ítems en la pantalla. En este programa obtiene el ítem actual a partir de los
elementos de la lista guardada en el lam ITEMS.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME B48Grupos ( -> ob T // F )
::
CK0 ( ) ( Ningún argumento es requerido )
{ "Argentina" "Bolivia" "Brasil" "Chile" "Colombia"
"Ecuador" "Paraguay" "Perú" "Uruguay" "Venezuela" }
{ "Canadá" "Estados Unidos" "México" }
{ "Panamá" "Costa Rica" "Nicaragua" "El Salvador" "Honduras" "Guatemala" }
{ "Sudamérica" "Norteamérica" "Centroamérica" }
BINT1 ( ... {$} #1 )
5PICK ( ... {$} #1 {$} )
{ LAM L1 LAM L2 LAM L3 LAM LTITULOS
LAM #G LAM ITEMS }
BIND ( )
' MH_B48_Ejemplo3 ( MH )
LAM LTITULOS LAM #G NTHCOMPDROP ( MH $título )
'NOP ( MH $título converter )
NULL{} ( MH $título converter items )
BINT1 ( MH $título converter items #índice )
ROMPTR Choose ( ob T // F )
ABND ( )
;
NULLNAME MH_B48_Ejemplo3
:: BINT62 #=casedrop ( proporciona el número de elementos )
:: ( )
LAM ITEMS ( {} )
LENCOMP ( #n )
TRUE ( # T )
;
BINT80 #=casedrop ( retorna el elemento correspondiente al índice )
:: ( # )
LAM ITEMS ( # lam )
SWAP ( {} # )
NTHCOMPDROP ( $ )
TRUE ( $ T )
;
BINT83 #=casedrop ( retorna el menú )
:: { { :: TakeOver LAM #G #1=case NULL$ "SUDAM" ;
:: TakeOver LAM #G #1=case DoBadKey 1 ' LAM #G STO REFRES_B48 ;
{ :: TakeOver LAM #G #2= case NULL$ "NORTE" ;
:: TakeOver LAM #G #2= case DoBadKey 2 ' LAM #G STO REFRES_B48 ;
}
{ :: TakeOver LAM #G #3= case NULL$ "CENTRO" ;
:: TakeOver LAM #G #3= case DoBadKey 3 ' LAM #G STO REFRES_B48 ;
}
NullMenuKey
{ "CANCL" FLASHPTR DoCKeyCancel }
{ "OK" FLASHPTR DoCKeyOK }
}
TRUE
;
DROPFALSE
;
18GETLAM ( #Indice )
12GETLAM ( #Indice #NumElementos )
DUP#0=IT
DROPONE
( #Indice #NumElementos' )
#MIN ( min[#Indice,#NumElementos] )
18PUTLAM ( )
FALSE ( F )
ROMPTR BBRecalOff&Disp_ ( ) ( Recalcula offset )
;
Capítulo 36
Usando el Browser 224
El browser 224 es un browser que siempre se ejecuta a pantalla completa y con la fuente
de sistema. La altura de cada ítem siempre será de 8 píxeles. No es posible la selección
múltiple ni usarlo como visor.
Este browser es usado por la calculadora para mostrar los resultados en el entorno
MSOLVR (Multiple Solver Equation) y también en la biblioteca de ecuaciones.
El comando que llama al browser 224 es ROMPTR Brbrowse. Este comando requiere
de ocho argumentos:
Menú
$Título
{ AcciónENTER AcciónON }
#IndiceSuperior
#IndiceInicial
Items
::Converter
{#letras}
El comando ROMPTR Brbrowse puede
retornar cualquier objeto en la pila (o nada) de
acuerdo a la acción que le asignemos a las
teclas ENTER, OK o a las teclas de menú.
El comando ROMPTR Brbrowse llama
internamente a un POL (como los otros
browsers), pero no guarda ni restaura el entorno
anterior al POL. Por eso debemos llamar al
browser 224 de la siguiente manera:
::
POLSaveUI ( Guarda la interfaz actual)
ERRSET
::
Menú
$Título
{ AcciónENTER AcciónON }
#IndiceSuperior
#IndiceInicial
Items
::Converter
{#}
ROMPTR BRbrowse
;
ERRTRAP
POLResUI&Err ( si un error ocurre, restaura la interfaz guardada )
( por POLSaveUI y luego llama al error que ocurrió )
POLRestoreUI ( restaura la interfaz guardada por POLSaveUI )
;
36.1 El Parámetro Menú
Este es una lista o programa que retorna una lista.
Este menú puede tener varias páginas pero no se pueden asignar acciones a las
combinaciones shift izquierdo/derecho + tecla de menú.
Este debe ser un programa que convierta un ítem a cadena para que pueda ser
mostrado en la pantalla.
El diagrama de pila de este programa debe ser:
Items #índice $item
Items #0 #NElementos
Observa que si este programa es llamado con el bint cero en la pila, el converter debe
devolver el número de ítems del browser.
Por ejemplo, si el parámetro Items es una lista de cadenas de la forma:
{ $item1 $item2 … $itemn }
El parámetro ::Converter puede ser:
:: DUP ( {$ITEMS} #i/#0 #i/#0 )
#0=case
:: ( {$ITEMS} #0 )
DROP ( {$ITEMS} )
LENCOMP ( #n )
;
( {$ITEMS} #i )
NTHCOMPDROP ( $itemi )
;
Si el parámetro Items es una lista de listas de la forma:
{ {$item1 ob1} {$item2 ob2}... {$itemn obn} }
El parámetro ::Converter puede ser:
:: DUP ( {ITEMS} #i/#0 #i/#0 )
#0=case
:: ( {ITEMS} #0 )
DROP ( {ITEMS} )
LENCOMP ( #n )
;
( {ITEMS} #i )
NTHCOMPDROP ( {$ ob} )
CARCOMP ( $ )
;
Si el parámetro Items es un arreglo de cadenas de la forma:
[ $item1 $item2 ... $itemn ]
El parámetro ::Converter puede ser:
:: DUP ( [$] #i/#0 #i/#0 )
#0=case
:: ( [$] #0 )
DROP ( [$] )
ARSIZE_ ( #n )
;
( [$] #i )
SWAP ( #i [$] )
GETATELN ( $ítemi T )
DROP ( $itemi )
;
Este parámetro es una lista con 26 bints o una lista vacía. Actualmente no está muy bien
comprendido. Si usas una lista vacía el browser funcionará correctamente.
36.9 Los LAMs del Browser 224
El browser 224 usa internamente 16 lams, de tal manera que si tu quieres llamar a otros
lams que tu hayas creado anteriormente, es preferible que los hayas creado como lams con
nombre. Los LAMs del browser 224 son los siguientes:
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME B224Ej1 ( -> $ T // F )
:: CK0 ( ) ( ningún argumento es requerido )
POLSaveUI
ERRSET
::
{ NullMenuKey
NullMenuKey
NullMenuKey
NullMenuKey
{ "CANCL" ROMPTR 0E0 03A }
{ "OK" ROMPTR 0E0 039 }
} ( menú )
"TITULO" ( menú $título )
{ :: ROMPTR BRRclCurRow ( #i ) ( llama al índice actual )
ROMPTR BRRclC1 ( #i [$] ) ( llama a arreglo de cadenas )
GETATELN ( $ítem T ) ( obtiene elemento del arreglo )
FLASHPTR BRdone ( $ítem T ) ( el browser finalizará )
;
:: FLASHPTR BRdone ( ) ( el browser finalizará )
FALSE ( F )
;
}
BINT3 ( ... #sup )
BINT7 ( ... #inicial )
ARRY [ "Panamá" "Costa Rica" "Nicaragua" "El Salvador" "Honduras"
"Guatemala" "Cuba" "Haití" "República Dominicana" "Puerto Rico"
"Jamaica" "Bahamas" ]
' :: ( [$] #i/#0 )
DUP#0=csedrp
ARSIZE_ ( #n ) ( sale con #n )
( [$] #i )
SWAP ( #i [$] )
GETATELN ( $ítemi T )
DROP ( $itemi )
;
{ } ( ... ::Converter {} )
ROMPTR BRbrowse ( ob T // F )
;
ERRTRAP
POLResUI&Err
POLRestoreUI
;
Ejemplo 2 Browser 224
Cuando los ítems están en una lista de cadenas
En este ejemplo los elementos del browser están
en una lista de cadenas.
La acción de la tecla ENTER será retornar el ítem
actual en la pila seguido de TRUE y finalizar el
browser.
La acción de la tecla ON será finalizar el browser
dejando FALSE en la pila.
Las teclas de menú F5 y F6 realizarán las mismas
acciones que ON y ENTER respectivamente.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME B224Ej2 ( -> $ T // F )
::
CK0 ( ) ( ningún argumento es requerido )
POLSaveUI
ERRSET
::
{ NullMenuKey
NullMenuKey
NullMenuKey
NullMenuKey
{ "CANCL" ROMPTR 0E0 03A }
{ "OK" ROMPTR 0E0 039 }
} ( menú )
"TITULO" ( menú $título )
{ :: ROMPTR BRRclC1 ( {$} ) ( llama a lista de cadenas )
ROMPTR BRRclCurRow ( {$} #i ) ( llama al índice actual )
NTHELCOMP ( $ítem T ) ( obtiene elemento de la lista )
FLASHPTR BRdone ( $ítem T ) ( el browser finalizará )
;
:: FLASHPTR BRdone ( ) ( el browser finalizará )
FALSE ( F )
;
}
BINT3 ( ... #sup )
BINT7 ( ... #inicial )
{ "Panamá" "Costa Rica" "Nicaragua" "El Salvador" "Honduras" "Guatemala"
"Cuba" "Haití" "República Dominicana" "Puerto Rico" "Jamaica" "Bahamas" }
' :: ( [$] #i/#0 )
DUP#0=csedrp
LENCOMP ( #n ) ( sale con #n )
( [$] #i )
NTHCOMPDROP ( $ítemi )
;
{ } ( ... ::Converter {} )
ROMPTR BRbrowse ( ob T // F )
;
ERRTRAP
POLResUI&Err
POLRestoreUI
;
Ejemplo 3 Browser 224
Cuando los ítems están en una lista de listas de la forma {$ ob}
Si el parámetro Items ges una lista de listas de
la forma:
{ {$item1 ob1} {$item2 ob2}... {$itemn obn} }
Los formularios de entrada proveen una interfaz gráfica para ingresar datos que sean
requeridos por un programa. Los datos son ingresados por medio de varios campos, los
cuales son “espacios” que el usuario puede llenar con los datos apropiados. Los formularios
de entrada son usados en muchos lugares en las calculadoras HP. Puedes ver uno de estos
presionando la tecla MODE. Es posible crear formularios de entrada en User RPL con el
comando INFORM, pero esta no es una de las tareas más fáciles. En System RPL es
todavía más dificil. Pero hay varias ventajas: en User RPL, sólo puedes tener campos de
texto, en System RPL puedes también tener cuadros de selección y casillas de verificación.
También puedes restringir las entradas válidas, y hacer aparecer o desaparecer los campos
durante la ejecución. Finalmente, en System RPL, los formularios de entrada son
considerablemente más rápidos.
Los formularios de entrada son creados con el comando ˆIfMain, el cual es un
flashpointer. Este necesita muchos argumentos. Estos son divididos en tres categorías:
definición de etiquetas, definición de campos e información general. Cada definición de
etiqueta y cada definición de campo está compuesta de varios argumentos.
El comando ˆIfMain es el generador de formularios de entrada presente a partir de la
HP49. La tabla de abajo muestra la estructura general de los argumentos a ingresar para el
comando ˆIfMain:
Parámetro Descripción
etiqueta_1
... Definiciones de las etiquetas
etiqueta_n
campo_1
... Definiciones de los campos
campo_n
Parametro Descripcción
cuerpo_etiqueta Cadena o grob a ser mostrado.
#x_posición Coordenada X
#y_posición Coordenada Y
cuerpo_etiqueta es una cadena o un grob. Si pones una cadena, esta sera convertida a
grob usando la minifuente. También puede ser un bint, en este caso se mostrará el mensaje
de error (ver Apéndice E) correspondiente a ese bint.
La etiqueta sera mostrada en las coordenadas especificadas. Estas coordenadas son dos
bints que representan las posiciones x e y de la etiqueta en la pantalla. La esquina superior
izquierda tiene coordenadas (0, 0) y las coordenadas x e y se incrementan hacia la derecha
y hacia abajo respectivamente.
Parametro Descripcción
MessageHandlerCampo Ver sección 37.4 abajo.
#x_posición Coordenada X
#y_posición Coordenada Y (normalmente coord Y de etiqueta menos 1)
#w_ancho Ancho del campo.
#h_altura Altura del campo (usualmente 8 ó 6).
#TipoDeCampo Tipo de campo, ver abajo los valores válidos.
TiposPermitidos Lista con los tipos de objetos válidos para este campo.
Decompile Ver abajo.
"Ayuda" Cadena de ayuda para este campo.
ChooseData Ver abajo.
ChooseDecompile Ver abajo.
ValorReset Valor reset de este campo.
ValorInicial Valor inicial de este campo.
Como otras aplicaciones de la calculadora HP, los formularios de entrada también usan
message handlers para permitir al programador un mayor control. Hay un message handler
para cada campo, y también un message handler para el formulario de entrada. Los
message handler son llamados cuando algo “interesante” ocurre en el campo o en el
formulario, y durante el inicio del formulario de entrada. Como sucede con otros message
handlers, el programa proporcionado es llamado con un número (un bint) en el nivel uno, y a
veces otros parámetros.
Si el programa message handler maneja al mensaje correspondiente al bint
proporcionado, entonces debería retornar lo que sea que pida ese mensaje (a veces nada).
Si el programa message handler no maneja al mensaje que corresponde al bint
proporcionado, entonces el programa debe borrar ese bint de la pila y poner FALSE,
dejando los argumentos restantes (si los hubiera) en su lugar.
Por lo tanto un programa message handler que no maneja ningún mensaje es
simplemente DROPFALSE, el cual, como sabemos, puede ser puesto en la pila con el
comando 'DROPFALSE.
En el cuerpo de un message handler, los comandos listados en la sección de referencia
de abajo pueden ser usados para conseguir información desde el formulario de entrada o
para modificar este. La sección 37.8.2 describirá cada uno de los message handler
disponibles en ˆIfMain.
Esta es una plantilla para un programa message handler con tres mensajes:
Si CANCEL fue usado para salir del formulario de entrada, entonces sólo FALSE es
retornado en la pila.
Si un campo está vacío, entonces xNOVAL es retornado como el valor de este campo.
37.7 Los LAMs del IfMain
El generador de formularios de entrada ^IfMain usa internamente 8 lams, de tal manera
que si tu quieres llamar a otros lams que tu hayas creado anteriormente, es preferible que
los hayas creado como lams con nombre. Los LAMs del ^IfMain son los siguientes:
Este mensaje es llamado cuando se presiona alguna tecla. Este mensaje es enviado
primero al message handler del campo actual y luego al message handler del formulario.
Por lo tanto, si el mensaje es llamado por ambos, solamente tendrá efecto el message
handler del campo.
Si uno escoge la salida con efecto, entonces luego se ejecutará el programa colocado en
la pila.
Si uno escoge la salida sin efecto, entonces luego se ejecutará el código normal
correspondiente a la tecla presionada.
Entrada 2: #CódigoDeTecla
1: #PlanoDeTecla
Salida (con efecto) 2: ::Programa
1: TRUE
Salida (sin efecto) 3: #CódigoDeTecla
2: #PlanoDeTecla
1: FALSE
Este mensaje es llamado cuando el campo está a punto de perder el enfoque. Puedes hacer
cualquier cosa aquí, incluso hacer que el campo actual no pierda el enfoque. Si haces eso,
entonces no serán llamados los mensajes 2 y 3.
Entrada Nada
Salida 1: TRUE o FALSE
Entrada Nada
Salida 1: TRUE o FALSE
Este mensaje es llamado cada vez que se quiere conseguir el valor externo de un campo (el
cual será mostrado posteriormente en la pantalla).
Es llamado al inicio para cada campo y cuando cambia el valor de un campo (no es llamado
para un campo check).
Si te decides por la salida con efecto, deberás mostrar el grob correspondiente a este campo
en la pantalla (usando el comando ˆIfSetGrob).
Si te decides por la salida sin efecto, entonces luego será llamado el código estándar para
mostrar el valor de ese campo.
Entrada 2: #Campo
1: Valor Externo
Salida (con efecto) 2: TRUE o FALSE
1: TRUE
Salida (sin efecto) 3: #Campo
2: Valor Externo
1: FALSE
Este mensaje es enviado durante el inicio del formulario de entrada para fijar el número del
campo que primero tendrá el enfoque. Sólo debes borrar el bint de la pila con DROP y luego
escribir el bint correspondiente al campo que desees, seguido por TRUE o FALSE.
Entrada 1: #0
Salida 2: #Campo
1: TRUE o FALSE
37.9.9 Mensaje 11 (formulario)
Este mensaje es llamado antes del inicio del formulario de entrada, y puede ser usado para
proveer un menú. El menu debe estar en el formato descrito en la sección 39.1.
El menú original es una lista con 13 elementos. Los últimos 12 corresponden a las teclas.
Por ejemplo: EDIT es el segundo elemento, CHOOS es el tercero, RESET es el séptimo.
Este mensaje es llamado antes del inicio del formulario de entrada, y puede ser usado para
cambiar las 3 últimas teclas de la primera fila del menú. Si este mensaje es manejado, se
debe de retornar una lista con tres sublistas, cada una de estas será la definición de la tecla.
Si los mensajes 11 y 12 son llamados para decidir sobre la definición de una de estas tres
teclas, la definición del mensaje 11 será la definitiva.
Entrada Nada
Salida (con efecto) 2: { } (lista con tres elementos)
1: TRUE
Salida (sin efecto) 1: FALSE
37.9.11 Mensaje 13 (formulario)
Permite al usuario reemplazar la accion por defecto para cancelar el formulario de entrada.
Este mensaje es llamado cuando es presionada la tecla CANCL o la tecla ON.
Si este mensaje es llamado, entonces ya no se ejecutará el código por defecto.
La acción por defecto es fijar el valor del LAM 'Quit cómo TRUE para finalizar el POL y
dejar FALSE en la pila.
Si este mensaje es llamado, ya no se llamará al mensaje 14.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Entrada Nada
Salida (con efecto) 2: TRUE o FALSE (TRUE finalizará el POL, FALSE no)
1: TRUE
Salida (sin efecto) 1: FALSE
Permite al usuario reemplazar la accion por defecto para aceptar el formulario de entrada.
Este mensaje es llamado cuando es presionada la tecla ENTER o la tecla OK.
Si este mensaje es llamado, entonces ya no se ejecutará el código por defecto.
La acción por defecto es fijar el valor del LAM 'Quit cómo TRUE para finalizar el POL y
dejar en la pila los valores externos de los campos seguidos por TRUE.
Si este mensaje es llamado, ya no se llamará al mensaje 16.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Entrada Nada
Salida (con efecto) 2: TRUE o FALSE (TRUE finalizará el POL, FALSE no)
1: TRUE
Salida (sin efecto) 1: FALSE
37.9.15 Mensaje 17 (campo y formulario)
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cuando una nueva línea de edición es creada. Si se maneja el
mensaje para el campo, ya no se llama al mensaje del formulario.
Campo:
Entrada Nada
Salida (con efecto) 1: TRUE (ya no se llama al mensaje del formulario)
Salida (sin efecto) 1: FALSE
Formulario:
Entrada Nada
Salida 1: TRUE o FALSE (no hay diferencia)
Campo:
Entrada Nada
Salida (con efecto) 1: TRUE (ya no se llama al mensaje del formulario)
Salida (sin efecto) 1: FALSE
Formulario:
Entrada Nada
Salida 1: TRUE o FALSE (no hay diferencia)
37.9.19 Mensaje 22 (campo)
Entrada Nada. Hay una línea de comandos activa. No hay nada en la pila.
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
NOTA: El comando ^IfMain guarda 8 parámetros (excepto la ayuda y los cuatro bints que
indican la posición y el tamaño) de cada uno de los campos en el nivel más alto de la pila
virtual. De esta forma, comandos como ˆIfGetFieldResetValue, ^IfGetFieldValue o
^IfSetFieldValue que obtienen valores del nivel más alto de la Pila Virtual o la modifican, no
funcionarán adecuadamente al ser ejecutados mientras se está llamando al mensaje 22.
Para poder usar estos comandos aquí, puedes usar el NULLNAME SWAP_VSTACK que se
encuentra al final del capítulo 24 para intercambiar los dos niveles más altos de la Pila
Virtual. Por ejemplo así:
SWAP_VSTACK
FLASHPTR IfSetCurrentFieldValue
SWAP_VSTACK
Este mensaje es llamado para descompilar un objeto para que se pueda editar. Si este
mensaje no es llamado, la descompilación es hecha con el comando DecompEdit.
Este mensaje es llamado cuando se presiona la tecla EDIT. Este mensaje no sera llamado
cuando se manejen los mensajes 25 del formulario o 25 del campo.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
37.9.22 Mensaje 25 (campo y formulario)
a) Si deseas editar en la línea de edición (objetos de cualquier tipo), puedes usar el siguiente
message handler:
ITE
:: DUPTYPELIST? ( ob' flag )
ITE
FALSE ( ob' F )
TrueTrue ( ob' T T )
;
FalseTrue
UNTIL
( RealArry/CArry/MATRIX T // F )
;
;
f) Si deseas editar en el escritor de matrices a arreglos reales, puedes usar el siguiente
message handler.
Válido cuando el parámetro TiposPermitidos del campo es { BINT3 }
El mensaje del campo actual es llamado cuando el valor de algún campo cambia, sea de
forma manual o con el comando ^IfSetFieldValue.
El mensaje del formulario es llamado al inicio para cada campo y cuando el valor de
cualquier campo cambia, sea de forma manual o con el comando ^IfSetFieldValue.
Puedes hacer cualquier cosa aquí.
Primero es llamado el mensaje del campo, luego el del formulario.
Entrada Nada
Salida 1: TRUE o FALSE
37.9 Ejemplos
Ejemplo 1 IfMain
Imitando la apariencia del formulario TRANSFER.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME IfMaEmuTransfer ( -> ob1...obn T // F )
:: CK0 ( No se requieren argumentos )
'DROPFALSE
92 9 36 8
BINT12
MINUSONE
BINT0
"Choose type of transfer"
{ "Kermit" "XModem" }
BINT0
"Kermit" DUP
'DROPFALSE
74 27 24 8
BINT12
MINUSONE
BINT0
"Choose character translations"
{ "None" "Newline (Ch 10)" "Chr 128-159" "Chr 128-255" }
BINT0
"Newline (Ch 10)" DUP
'DROPFALSE
122 27 7 8
BINT12
MINUSONE
BINT0
"Choose checksum type"
{ "1" "2" "3" }
BINT0
"3" DUP
'DROPFALSE
20 36 24 8
BINT12
MINUSONE
BINT0
"Choose baud rate"
{ "2400" "4800" "9600" "14400" "19200" "38400" "57600" "115200" }
BINT0
"115200" DUP
'DROPFALSE
74 36 24 8
BINT12
MINUSONE
BINT0
"Choose parity"
{ "None" "Odd" "Even" "Mark" "Space" }
BINT0
"None" DUP
'DROPFALSE
104 36 ZEROZERO
BINT32
MINUSONE
DUP
"Overwrite existing variables?"
MINUSONE
DUP
TrueTrue
9 9 ( Número de etiquetas y de campos )
* Message handler del formulario
' :: BINT7 #=casedrop ( IfMsgSetFirstField: # -> # flag )
:: ( #0 )
DROP ( )
TWO ( #2 )
TRUE ( #2 T )
;
BINT12 #=casedrop ( IfMsgGet3KeysMenu: -> {} T // F )
:: ( )
{ { "RECV" DoBadKey }
{ "KGET" DoBadKey }
{ "SEND" DoBadKey }
}
TRUE ( {} T )
;
DROPFALSE
;
"TRANSFER" ( Título del formulario )
FLASHPTR IfMain
;
Ejemplo 2 IfMain
Un formulario de entrada con los 4 tipos de campos
en ^IfMain
En este ejemplo se muestra un formulario de entrada con los
cuatro tipos de campos: texto, combochoose, choose y
check. Para que pueda funcionar el campo combochoose, se
altera el código que debe ejecutarse (correspondiente al
parámetro AppKeys del POL) cada vez que se presiona una
tecla.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME IfMain4Tipos ( -> ob1 ob2 ob3 ob4 T // F )
:: CK0 ( ) ( No se requieren argumentos )
" Texto:" 0 16
" Combo:" 0 26
"Choose:" 0 36
"Check" 10 46
'DROPFALSE
30 15 80 8 BINT1 { BINT0 } BINT4
"Ayuda del campo Texto"
MINUSONE MINUSONE
32.15 20.14
'DROPFALSE
30 25 80 8 BINT2 { BINT0 } BINT4
"Ayuda del campo Combo"
{ 12. 13. 14. 15. } MINUSONE
18. 19.
'DROPFALSE
30 35 80 8 BINT12 MINUSONE BINT0
"Ayuda del campo Choose"
{ "OPCION A" "OPCION B" "OPCION C" } MINUSONE
"OPCION A" DUP
'DROPFALSE
1 45 MINUSONE MINUSONE BINT32 MINUSONE MINUSONE
"Ayuda del campo Check"
MINUSONE MINUSONE
FalseFalse
BINT4 BINT4
' :: BINT0 #=casedrop ( IfMsgKeyPress ) ( #ct #p -> Acción T // #ct #p F )
:: ( #ct #p )
FALSE ( #ct #p F )
LAM 'CurrentField ( #ct #p F #c )
FLASHPTR IfGetFieldType ( #ct #p F #TipoCampo )
#2= ( #ct #p F flag )
NOT?SEMI
( #ct #p F )
R> ( #ct #p F prog )
FLASHPTR 002 0A5 ( #ct #p F $ )
"52133" ( #ct #p F $ "52133" ) ( dirección del BINT3 )
"B1133" ( #ct #p F $ "52133" "B1133" ) ( dirección de BINT2 )
FLASHPTR 00F 01A ( #ct #p F $' %3 ) ( Equivale al comando xSREPL )
DROP ( #ct #p F $' )
FLASHPTR 002 0A4 ( #ct #p F prog' )
>R ( #ct #p F )
;
DROPFALSE
;
"TITULO"
FLASHPTR IfMain ( ob1 ob2 ob3 ob4 T // F )
;
Ejemplo 3 IfMain
Un campo combochoose que muestre los ítems con una breve explicación.
En este ejemplo se muestra un campo combochoose.
En este campo puedes escribir un valor directamente con el teclado o también escoger un
valor desde una lista accesible mediante la tecla de menú CHOOS.
El parámetro ChooseData del campo combochoose tiene como elementos a listas de la
forma:
{ $ ob }
Donde ob es un número real que se fijará como el valor del campo actual, si uno escoge esa
opción.
Se llama al mensaje 17 para mostrar cada una de las opciones del parámetro ChooseData y
al mensaje 0 para que el campo combochoose funcione correctamente.
En el primer programa se usa el browser 49. En el segundo se usa el browser 48.
* Aquí se usa el browser 49
xNAME IfMaComboItems ( -> % T // F )
:: CK0 ( ) ( No se requieren argumentos )
" Coef:" 0 26
ONEONE
'DROPFALSE
"TITULO"
FLASHPTR IfMain ( % T // F )
;
* Aquí se usa el browser 48
xNAME IfMaComboItems ( -> % T // F )
:: CK0 ( ) ( No se requieren argumentos )
" Coef:" 0 26
ONEONE
'DROPFALSE
"TITULO"
FLASHPTR IfMain ( % T // F )
;
Ejemplo 4 Ifmain
Actualizar el valor de un campo al cambiar el valor de otro campo.
Para hacer esto debes usar el mensaje número 5 en el message handler de un campo.
Este mensaje es llamado cuando el valor del campo cambia y también al inicio del
formulario.
Además debes usar el comando FLASHPTR IfSetFieldValue que permite cambiar el valor de
cualquier campo. Entonces:
1) Poner el mensaje nº 5 en el campo cuyos cambios afectarán el valor de otros campos.
2) En este debemos obtener el valor(es) que queremos asignar al otro(s) campo(s) y luego
usar el comando FLASHPTR IfSetFieldValue.
A continuación un ejemplo sencillo con dos campos y dos etiquetas con su respectiva
explicación que puedes copiar y pegar en el editor de Debug4x.
* ETIQUETA Nº #0
"A:" BINT1 BINT10
* ETIQUETA Nº #1
"B:" BINT1 BINT31
* CAMPO Nº #0
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
* CUANDO EL VALOR DE ESTE CAMPO CAMBIA, EL VALOR DEL OTRO CAMPO
* TAMBIÉN CAMBIARÁ.
' :: BINT5 #=casedrop ( Vext -> Vint flag )
:: ( valor )
DUP ( valor valor )
%10 %/ ( valor valor/10 )
BINT1 ( valor valor/10 #1 )
FLASHPTR IfSetFieldValue ( valor )
TRUE ( valor TRUE )
;
DROPFALSE
;
25 9 103 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT2 ( #Decompile: #2=Formato actual y Fuente Normal )
"Escribe un número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
BINT2 ( #ChooseDecompile: Igual que #Decompile: )
%25 DUP ( Valor Reset y Valor Inicial )
* CAMPO Nº #1
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
* CUANDO EL VALOR DEL OTRO CAMPO CAMBIE, EL
* VALOR DE ESTE CAMBIA SE ACTUALIZA A LA DÉCIMA PARTE DEL OTRO
'DROPFALSE ( Message Handler del campo )
25 30 103 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT2 ( #Decompile: #2=Formato actual y Fuente Normal )
"Escribe otro número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
BINT2 ( #ChooseDecompile: Igual que #Decompile: )
%17 DUP ( Valor Reset y Valor Inicial )
FLASHPTR IfMain
;
Ejemplo 5 IfMain
Bloquear un campo.
Para hacer que un campo esté bloqueado en un formulario de entrada puedes usar el
mensaje número 1 el cual es llamado cuando un campo está a punto de perder el enfoque
para cambiar al índice del campo que recibirá el enfoque.
En este ejemplo hay tres campos (0, 1 y 2). Vamos a bloquear el campo 1. Para esto
usamos el message handler número 1 en todos los campos desde los cuales se le podría
dar el enfoque al campo 1 (en este ejemplo pondremos el MH en los campos 0 y 2 porque
desde estos se le puede dar el enfoque al campo 1).
En el campo cero usamos el MH número 1. Si el siguiente campo que recibirá el enfoque es
el campo 1, lo cambiamos por el campo 2.
En el campo dos también usamos el MH número 1. Si el siguiente campo que recibirá el
enfoque es el campo 1, lo cambiamos por el campo 0.
xNAME IfMaBlockField ( -> ob1 ob2 ob3 T // F )
:: CK0 ( No se requieren argumentos )
"A:" BINT1 BINT11
"B:" BINT1 BINT21
"C:" BINT1 BINT31
NULL{}
{ LAM LastKeyC&P } BIND ( crea un nuevo entorno temporal )
* ETIQUETAS
"A:" BINT1 BINT11
"B:" BINT1 BINT21
"C:" BINT1 BINT31
ABND
;
Este programa es parecido al anterior (también se usa el mensaje 3 en el campo que se
quiere bloquear). Pero aquí se bloqueará el último campo y no un campo intermedio.
NULL{}
{ LAM LastKeyC&P } BIND
* ETIQUETAS
"A:" BINT1 BINT11
"B:" BINT1 BINT21
"C:" BINT1 BINT31
ABND
;
Ejemplo 6 IfMain
Bloquear campos con una condición.
Actualizar el valor de un campo al cambiar el valor de otro campo.
En este ejemplo se verá como bloquear campos sólo si se cumple una condición.
Aquí hay 4 campos (0, 1, 2 y 3)
El campo 0 contiene a un campo texto y no es bloqueado.
El campo 1 es un campo choose.
Los campos 2 y 3 son campos texto y serán bloqueados cuando en el campo 1 la opción
escogida no sea la opción “ESCRIBE PARÁMETROS”. Para esto se usa el mensaje 3 en los
campos que serán bloqueados (campos 2 y 3). Además se usa el mensaje 0 en el message
handler del formulario para guardar en una variable local el código y el plano de la última
tecla presionada, lo cual servirá para decidir a que campo se le dará el enfoque, en lugar de
los campos que se bloquearán. El NULLNAME BloqueaCampos? decide si se bloquerán o
no estos campos.
Además, cada vez que se escoge en el campo CHOOSE a una opción que no sea
“ESCRIBE PARÁMETROS”, los campos 2 y 3 se actualizarán con los valores
correspondientes al elipsoide escogido.
NULL{}
{ LAM LastKeyC&P } BIND
* ETIQUETAS
"X:" BINT1 BINT11
"Elip" BINT1 BINT21
"a:" BINT1 BINT31
"1/f:" BINT1 BINT41
ABND
;
Para hacer aparecer o desaparecer (volver visible o invisible) a un campo o a una etiqueta
debes usar el mensaje número 5 en el message handler de un campo.
Este mensaje es llamado cuando el valor del campo cambia y también al inicio del
formulario.
Además debes usar el comando FLASHPTR IfSetFieldVisible que permite volver visible o
invisible a una etiqueta o a un campo.
A continuación un ejemplo sencillo con dos campos y dos etiquetas con su respectiva
explicación que puedes copiar y pegar en el editor de Debug4x.
Si en el primer campo hay un número positivo, entonces el segundo campo es invisible.
Si en el primer campo hay un número no positivo, entonces el segundo campo será visible.
xNAME IfMaVisibleONo ( -> ob1 ob2 T // F )
:: CK0 ( No se requieren argumentos )
* ETIQUETA Nº #0
"A:" BINT1 BINT10
* ETIQUETA Nº #1
"B:" BINT1 BINT31
* CAMPO Nº #0.
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
* SI EL VALOR DE ESTE CAMPO ES MAYOR QUE CERO, DESAPARECE LA ETIQUETA Y EL
* CAMPO #1
* DE LO CONTRARIO, LA ETIQUETA Y EL CAMPO #1 SE VERÁN
' :: BINT5 #=casedrop ( IfMsgSetFieldValue ) ( Vext -> Vint flag )
:: ( valor )
DUP %0> ( valor flag )
ITE
:: BINT1 FALSE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #1 invisible )
BINT1 TRUE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #1 invisible )
;
:: BINT1 FALSE TRUE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #1 invisible )
BINT1 TRUE TRUE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #1 invisible )
;
TRUE ( valor TRUE )
;
DROPFALSE
;
25 9 103 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT2 ( #Decompile: #2=Formato actual y Fuente Normal )
"Escribe un número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
BINT2 ( #ChooseDecompile: Igual que #Decompile: )
%5 DUP ( Valor Reset y Valor Inicial )
* CAMPO Nº #1.
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
* PARA QUE PUEDA SER VISIBLE ESTE CAMPO, EL CAMPO #0 DEBE CONTENER UN
* NÚMERO NEGATIVO
'DROPFALSE
25 30 103 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT2 ( #Decompile: #2=Formato actual y Fuente Normal )
"Escribe otro número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
BINT2 ( #ChooseDecompile: Igual que #Decompile: )
%17 DUP ( Valor Reset y Valor Inicial )
FLASHPTR IfMain
;
Ejemplo 8 Ifmain
Desaparecer y hacer aparecer campos y etiquetas en el mismo lugar en que
estaban otros campos y etiquetas.
Problema:
Si tengo una etiqueta con su campo CHOOSE, dentro de CHOOSE tengo tres opciones
{ {"cero"} {"uno"} {"dos"} }
Cuando escoja “cero”, no aparezca ninguna ETIQUETA/CAMPO.
Cuando escoja “uno”, aparezca la etiqueta_1 y campo_1.
Cuando escoja “dos”, aparezca la etiqueta_2 y campo_2 (en el mismo lugar que
etiqueta_1/campo_1).
Solución:
Para hacer aparecer o desaparecer (volver visible o invisible) a un campo o a una etiqueta
debes usar el mensaje número 5 en el message handler de un campo.
Este mensaje es llamado cuando el valor del campo cambia y también al inicio del formulario.
Además debes usar el comando FLASHPTR IfSetFieldVisible que permite volver visible o
invisible a una etiqueta o a un campo.
Entonces:
1) Poner el mensaje nº 5 en el campo CHOOSE cuyo cambio afecta la visibilidad de los otros
campos o etiquetas.
2) Según el contenido actual del campo CHOOSE, decidiremos si algún campo o etiqueta debe
ser visible o invisible.
A continuación el código en System RPL con su respectiva explicación que puedes copiar y
pegar en el editor de Debug4x
xNAME VisibleEncima ( -> ob1 ob2 ob3 T // F )
:: CK0 ( No se requieren argumentos )
* ETIQUETAS
"Escoge:" BINT1 BINT10
"Dato 1:" BINT1 BINT31
"Dato 2:" BINT1 BINT31
* CAMPO Nº #0
* ES UN CAMPO CHOOSE.
* CON LA OPCION CERO, SE HACEN INVISIBLES LAS ETIQUETAS Y LOS CAMPOS #1 Y #2
* CON LA OPCION UNO, SE HACE VISIBLES LA ETIQUETA Y EL CAMPO #1
* CON LA OPCION DOS, SE HACE VISIBLES LA ETIQUETA Y EL CAMPO #2
' :: BINT5 #=casedrop ( IfMsgSetFieldValue ) ( VExt -> VInt flag )
:: ( {} )
DUP ( {} {} )
TWONTHCOMPDROP_ ( {} # )
:: BINT0 #=casedrop
:: BINT1 FALSE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #1 invisible )
BINT1 TRUE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #1 invisible )
BINT2 FALSE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #2 invisible )
BINT2 TRUE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #2 invisible )
;
BINT1 #=casedrop
:: BINT1 FALSE TRUE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #1 visible )
BINT1 TRUE TRUE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #1 visible )
BINT2 FALSE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #2 invisible )
BINT2 TRUE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #2 invisible )
;
BINT2 #=casedrop
:: BINT1 FALSE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #1 invisible )
BINT1 TRUE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #1 invisible )
BINT2 FALSE TRUE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #2 visible )
BINT2 TRUE TRUE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #2 visible )
;
;
TRUE ( {} TRUE )
;
DROPFALSE
; ( Message Handler del campo )
35 9 93 8 ( Posición y tamaño: #x #y #b #h )
BINT12 ( #TipoDeCampo: #12=Choose )
MINUSONE ( TiposPermitidos: MINUSONE=No se aplica a Choose )
BINT16 ( #Decompile: #16=16+0 1º elem de lista y sin descompilación )
"Ayuda del Choose de abajo" ( "Ayuda": se mostrará abajo )
{ { "OPCION 0" BINT0 }
{ "OPCION 1" BINT1 }
{ "OPCION 2" BINT2 } } ( ChooseData )
BINT16 ( #ChooseDecompile: cualquier valor )
{ "OPCION 0" BINT0 } DUP ( Valor Reset y Valor Inicial )
* CAMPO Nº #1
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
* PARA QUE PUEDA SER VISIBLE ESTE CAMPO, EL CAMPO #0 DEBE CONTENER LA OPCION 1
'DROPFALSE ( Message Handler del campo )
35 30 92 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT2 ( #Decompile: #2=Formato actual y Fuente Normal )
"Campo 1: número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
BINT2 ( #ChooseDecompile: cualquier valor )
%17 DUP ( Valor Reset y Valor Inicial )
* CAMPO Nº #2
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
* PARA QUE PUEDA SER VISIBLE ESTE CAMPO, EL CAMPO #0 DEBE CONTENER LA OPCION 2
'DROPFALSE ( Message Handler del campo )
35 30 92 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT2 ( #Decompile: #2=Formato actual y Fuente Normal )
"Campo 2: número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
BINT2 ( #ChooseDecompile: cualquier valor )
%35_ DUP ( Valor Reset y Valor Inicial )
FLASHPTR IfMain
;
Ejemplo 9 Ifmain
Insertar un grob en un formulario de entrada
A continuación un ejemplo sencillo con dos etiquetas y un campo que puedes copiar y pegar
en el editor de Debug4x.
* CAMPO Nº #0
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
'DROPFALSE
25 9 103 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT2 ( #Decompile: #2=Formato actual y Fuente Normal )
"Escribe un número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
BINT2 ( #ChooseDecompile: Igual que #Decompile: )
%25 DUP ( Valor Reset y Valor Inicial )
FLASHPTR IfMain
;
Ejemplo 10 Ifmain
Dar formato a las etiquetas en IfMain
* ETIQUETAS
"Negrita:" $->NEGRITA $>GROB BINT1 BINT10
"Cursiva:" $->CURSIVA $>GROB BINT1 BINT21
"Subrayado:" $->SUBRAYADA $>GROB BINT1 BINT32
"Inversa:" $->INVERSA $>GROB BINT1 BINT43
* CAMPO TEXTO
'DROPFALSE ( Message handler )
70 10 60 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Text )
{ BINT0 } ( TiposPermitidos: números reales )
BINT2 ( #Decompile: #2=Formato actual y Fuente Normal )
"Ayuda" ( "Ayuda" )
MINUSONE ( ChooseData )
MINUSONE ( #ChooseDecompile: cualquier bint )
%25 DUP ( Valor reset y Valor inicial )
FLASHPTR IfMain
;
* ETIQUETAS
"Negrita:" BINT1 BINT11
"Cursiva:" BINT1 BINT22
"Subrayado:" BINT1 BINT33
"Inversa:" BINT1 BINT44
FLASHPTR IfMain
;
En este ejemplo el parámetro Titulo del formulario de entrada es un grob (debe ser del
tamaño exacto de 131x7).
* ETIQUETA
"Etiqueta:" BINT1 BINT12
* CAMPO TEXTO
'DROPFALSE ( Message handler )
42 11 60 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Text )
{ BINT0 } ( TiposPermitidos: números reales )
BINT2 ( #Decompile: #2=Formato actual y Fuente Normal )
"Ayuda" ( "Ayuda" )
MINUSONE ( ChooseData )
MINUSONE ( #ChooseDecompile: cualquier bint )
%25 DUP ( Valor reset y Valor inicial )
FLASHPTR IfMain
;
*** Dada una cadena o bint la pone en un grob de
*** tamaño 131 x 7 con fondo oscuro en la pila
NULLNAME TITULO->GROB131x7_INVERSA ( $/# -> grob131x7 )
:: ( $/# )
DUPTYPEBINT?
IT JstGETTHEMSG
( $ )
BINT1 BINT32 SUB$ ( $ ) ( corta la cadena si es mayor a 32 caract )
BINT7 BINT131 ( $ 7 131 )
MAKEGROB ( $ grob131x7_blanco )
BINT33 ( $ grob131x7_blanco 33 )
3PICK LEN$ ( $ grob131x7_blanco 33 #w )
#-#2/ ( $ grob131x7_blanco #[33-w]/2 )
Blank$ ( $ grob131x7_blanco $' )
ROT ( grob131x7_blanco $' $ )
&$ ( grob131x7_blanco $'' )
$>grob ( grob131x7_blanco grob' )
ONEONE ( grob131x7_blanco grob' #1 #1 )
Repl ( grob131x7 )
INVGROB ( grob131x7_inversa )
* Lo siguiente es sólo para redondear las esquinas del grob
ZEROZERO PixonW ( grob131x7_inversa )
BINT130 BINT0 PixonW ( grob131x7_inversa )
BINT0 BINT6 PixonW ( grob131x7_inversa )
BINT130 BINT6 PixonW ( grob131x7_inversa )
;
Ejemplo 13 Ifmain
Verificar que todos los campos estén llenos al terminar el formulario con OK.
En este ejemplo, al presionar OK o ENTER se verifica que todos los campos estén llenos.
Si hay algún campo vacío, se evita la finalización del formulario (y se muestra el mensaje
“escribe todos los datos”).
* ETIQUETAS
"Dato 1:" BINT1 BINT21
"Dato 2:" BINT1 BINT31
En este ejemplo, al presionar OK o ENTER se verifica que los valores de los campos
cumplan alguna condición.
Si algún campo no cumple una condición, entonces se muestra un mensaje de advertencia y
no se termina el formulario. Además, el enfoque va hacia ese campo.
* ETIQUETAS
"A:" BINT1 BINT21
"B:" BINT1 BINT31
FLASHPTR IfMain
;
Ejemplo 15 Ifmain. Mostrar el valor de un campo como grob.
Este es un message handler para un campo (texto, choose o combochoose). Este tiene el
mismo efecto que el código por defecto para mostrar el valor del campo en la pantalla.
Lo presentamos para que hagas los cambios que creas conveniente para tu programa.
NULLNAME MH6_AccionesPorDefecto
:: BINT6 #=casedrop ( IfMsgGetFieldGrob ) ( #c val -> flag T // #c val F )
:: ( #campo valor )
OVER ( #campo valor #campo )
FLASHPTR IfGetFieldDecompObject ( #campo valor #Decompile )
OVER ( #campo valor #Decompile valor )
' xNOVAL
EQUAL ( #campo valor #Decompile flag )
IT
:: ( #campo valor #Decompile )
SWAPDROP ( #campo #Decompile )
MINUSONE ( #campo #Decompile MINUSONE )
SWAP ( #campo MINUSONE #Decompile )
;
OVER ( #campo valor #Decompile valor )
MINUSONE
#=case
:: ( #campo valor #Decompile )
FLASHPTR 2DROPTRUE ( #campo T )
GROB 0000A 0000000000 ( #campo T grob )
FLASHPTR IfSetGrob ( )
TrueTrue ( T T )
;
( #campo valor #Decompile )
SWAP ( #campo #Decompile valor )
OVER BINT32 #AND #0<> ( #campo #Decompile valor flag )
IT
:: BINT2
NTHELCOMP
?SEMI
NULL$
;
( #campo #Decompile valor )
OVER BINT16 #AND #0<> ( #campo #Decompile valor flag )
IT
:: BINT1 NTHELCOMP
?SEMI
NULL$
;
( #campo #Decompile valor )
?GetMsg_ ( #campo #Decompile valor )
OVER BINT4 #AND #0<> ( #campo #Decompile valor flag )
IT
DecompEdit
( #campo #Decompile valor )
OVER BINT2 #AND #0<> ( #campo #Decompile valor flag )
IT
DecompStd1Line
( #campo #Decompile $ )
OVER BINT8 #AND #0<> ( #campo #Decompile $ flag )
IT
:: ONEONE
SUB$
;
( #campo #Decompile $ )
SWAP BINT1 #AND #0<> ( #campo $ flag )
ITE
$>grob
$>GROB
( #campo grob )
TRUESWAP_ ( #campo T grob )
FLASHPTR IfSetGrob ( )
TrueTrue ( T T )
;
DROPFALSE
;
Ejemplo 16 Ifmain
Alinear campos a la derecha. Caso General.
NULLNAME MH6_AlinearCamposDerecha
:: BINT6 #=casedrop ( IfMsgGetFieldGrob ) ( #c val -> flag T // #c val F )
:: ( #campo valor )
OVER ( #campo valor #campo )
FLASHPTR IfGetFieldDecompObject ( #campo valor #Decompile )
OVER ( #campo valor #Decompile valor )
' xNOVAL
EQUAL ( #campo valor #Decompile flag )
IT
:: ( #campo valor #Decompile )
SWAPDROP ( #campo #Decompile )
MINUSONE ( #campo #Decompile MINUSONE )
SWAP ( #campo MINUSONE #Decompile )
;
OVER ( #campo valor #Decompile valor )
MINUSONE
#=case
:: ( #campo valor #Decompile )
FLASHPTR 2DROPTRUE ( #campo T )
GROB 0000A 0000000000 ( #campo T grob )
FLASHPTR IfSetGrob ( )
TrueTrue ( T T )
;
( #campo valor #Decompile )
SWAP ( #campo #Decompile valor )
OVER BINT32 #AND #0<> ( #campo #Decompile valor flag )
IT
:: BINT2
NTHELCOMP
?SEMI
NULL$
;
( #campo #Decompile valor )
OVER BINT16 #AND #0<> ( #campo #Decompile valor flag )
IT
:: BINT1 NTHELCOMP
?SEMI
NULL$
;
( #campo #Decompile valor )
?GetMsg_ ( #campo #Decompile valor ) ( # -> $ )
OVER BINT4 #AND #0<> ( #campo #Decompile valor flag )
IT
DecompEdit
( #campo #Decompile valor )
OVER BINT2 #AND #0<> ( #campo #Decompile valor flag )
IT
DecompStd1Line
( #campo #Decompile $ )
OVER BINT8 #AND #0<> ( #campo #Decompile $ flag )
IT
:: ONEONE
SUB$
;
( #campo #Decompile $ )
SWAP BINT1 #AND #0<> ( #campo $ flag )
ITE
:: ( #campo $ )
OVER
TRUE ( #campo $ #campo T )
FLASHPTR IfGetFieldPos ( #campo $ #x #y #w #h )
DROP ( #campo $ #x #y #w )
UNROT2DROP ( #campo $ #w )
BINT4 ( #campo $ #w #4 )
#/ ( #campo $ #r #q )
SWAPDROP ( #campo $ #q )
FUERZA$ ( #campo $' )
$>grob ( #campo $' grob )
;
:: ( #campo $ )
OVER
TRUE ( #campo $ #campo T )
FLASHPTR IfGetFieldPos ( #campo $ #x #y #w #h )
DROP ( #campo $ #x #y #w )
UNROT2DROP ( #campo $ #w )
BINT6 ( #campo $ #w #4 )
#/ ( #campo $ #r #q )
SWAPDROP ( #campo $ #q )
FUERZA$ ( #campo $' )
$>GROB ( #campo $' grob )
;
( #campo grob )
TRUESWAP_ ( #campo T grob )
FLASHPTR IfSetGrob ( )
TrueTrue ( T T )
;
DROPFALSE
;
* Este subprograma retorna siempre una cadena que tenga #max caracteres
* Si $ tiene pocos caracteres, le agrega caract en blanco a la izquierda
* Si $ tiene muchos caracteres, lo corta y agrega "..." al final
NULLNAME FUERZA$ ( $ #max -> $ )
:: ( $ #max )
OVERLEN$ ( $ #max #len )
2DUP#= ( $ #max #len flag )
case2DROP
( $ #max #len )
2DUP#< ( $ #max #len flag )
casedrop
:: 1_#1-SUB$ "\1E" &$ ;
( $ #max #len )
#- ( $ #adicionales )
Blank$ ( $ $' )
SWAP&$ ( $'' )
;
Ejemplo 17 Ifmain
Alinear campos a la derecha.
Caso especial. Formato numérico estándar y minifuente.
Usando este message handler, el valor del campo (texto, choose o combochoose) será
mostrado a la derecha, siempre en formato numérico estándar y con minifuente.
Para verlo en formato númerico actual cambia DecompEdit por DecompStd1Line.
Para verlo en fuente normal cambia BINT4 por BINT6 y $>grob por $>GROB.
Puedes poner este NULLNAME como el message handler en cada campo donde desees
que su contenido se muestre pegado a la derecha.
En este ejemplo veremos como usar el mensaje 22 para validar un campo que acepte a
números reales.
Si el valor de la línea de edición es del tipo correcto (número real), decidiremos si su valor es
válido o no para el campo.
En este caso hay dos campos que contienen a números reales. La validación se hará
solamente en el primer campo. Por ejemplo, para este campo el número real será válido si
es positivo. De esta manera, si el objeto es de un tipo correcto, pero de un valor inválido,
deberemos de retornar TRUE. En otro caso, se deberá retornar FALSE, para que se realice
la acción por defecto.
Por ejemplo, si el usuario ingresa -19.26 (como se muestra en la figura), en el campo no se
guardará el número y se mostrará la alerta “Escribe número positivo”.
Sin embargo la validación con el mensaje 22 tiene muchas desventajas respecto a la
validación con el mensaje 5 (ejemplo siguiente). Por ejemplo, al ingresar objetos para varios
campos en una sóla línea de comandos, la validación sólo es hecha en el campo actual.
También la validación no es hecha al calcular un valor en la pila con la tecla de menú CALC
Por esto, para asegurar que al salir del formulario con ENTER u OK, siempre sea retornado
un valor válido, deberás usar el mensaje 16 en el message handler del formulario como en el
ejemplo 14.
xNAME ValidEntPosit22 ( -> ob1 ob2 T // F )
:: CK0 ( No se requieren argumentos )
* ETIQUETAS
"A:" BINT1 BINT11
"B:" BINT1 BINT21
* CAMPO Nº #0
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
' :: BINT22 #=casedrop ( -> TRUE/FALSE )
:: ( )
RCL_CMD ( $ )
palparse ( ob T // $ #pos $' F )
NOTcase2drop DROPFALSE ( NOTA: SALE CON FALSE )
( ob )
EVAL ( ??? )
DEPTH #1- NDROP ( ob/MINUSONE )
DUPTYPEZINT?
IT
FLASHPTR Z>R
DUPTYPEREAL? ( % T // ob F )
NOTcase
DROPFALSE
( % )
%0 %<= ( flag )
DUP ( flag flag )
IT :: "Escribe número positivo" FlashWarning ;
( flag )
;
DROPFALSE
; ( Message Handler del campo )
20 10 96 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT4 ( #Decompile: #2=Formato estándar y Fuente Normal )
"A: número positivo" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
MINUSONE ( #ChooseDecompile: cualquier bint )
%15 DUP ( Valor Reset y Valor Inicial )
* CAMPO Nº #1
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
'DROPFALSE ( Message Handler del campo )
20 20 96 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT4 ( #Decompile: #2=Formato estándar y Fuente Normal )
"B: número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
MINUSONE ( #ChooseDecompile: cualquier bint )
%16 DUP ( Valor Reset y Valor Inicial )
FLASHPTR IfMain
;
Ejemplo 19 Ifmain
Validación de datos con el mensaje número 5.
Número real y positivo.
En este ejemplo veremos como usar el mensaje 5 para validar un campo que acepte a
números reales.
Decidiremos si su valor es válido o no para el campo.
En este caso hay dos campos que contienen a números reales. La validación se hará
solamente en el primer campo. Por ejemplo, para este campo el número real será válido si
es positivo. De esta manera, si el objeto es de un valor inválido, deberemos de generar un
error (por ejemplo, usando los comandos ERRJMP o ERROROUT).
Por ejemplo, si el usuario ingresa -19.26 (como se muestra en la figura), en el campo no se
guardará el número y se mostrará una alerta con el texto correspondiente al mensaje de
error generado.
Esta validación con el mensaje 5 tiene muchas ventajas respecto a la validación con el
mensaje 22 (ejemplo anterior). Por ejemplo, al ingresar objetos para varios campos en una
sóla línea de comandos, la validación es hecha en todos los campos. También la validación
es hecha al calcular un valor en la pila con la tecla de menú CALC
Por esto, cuando usamos validación con el mensaje 5, está asegurado que al salir del
formulario con ENTER u OK, siempre será retornado un valor válido; y ya no será necesario
usar el mensaje 16 en el message handler del formulario.
xNAME ValidEntPosit5 ( -> ob1 ob2 T // F )
:: CK0 ( No se requieren argumentos )
* ETIQUETAS
"A:" BINT1 BINT11
"B:" BINT1 BINT21
* CAMPO Nº #0
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
' :: BINT5 #=casedrop ( Vext -> Vint flag )
:: ( valor )
DUP ( valor valor )
' xNOVAL ( valor valor NOVAL )
EQUAL ( valor flag )
caseTRUE ( sale con TRUE )
( % )
DUP ( % % )
%0 %<= ( % flag )
IT
:: # 203 ERROROUT ; ( genera error: argumento valor incorr )
TRUE ( % T )
;
DROPFALSE
; ( Message Handler del campo )
20 10 96 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT4 ( #Decompile: #2=Formato estándar y Fuente Normal )
"A: número positivo" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
MINUSONE ( #ChooseDecompile: cualquier bint )
%15 DUP ( Valor Reset y Valor Inicial )
* CAMPO Nº #1
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
'DROPFALSE ( Message Handler del campo )
20 20 96 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT4 ( #Decompile: #2=Formato estándar y Fuente Normal )
"B: número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
MINUSONE ( #ChooseDecompile: cualquier bint )
%16 DUP ( Valor Reset y Valor Inicial )
FLASHPTR IfMain
;
Ejemplo 20 Ifmain
Cambiando automáticamente una entrada inválida.
Número real entero y positivo.
En este ejemplo hay un campo texto que acepta sólo números reales.
Sólo se aceptan números reales que sean enteros y positivos.
Si el usuario escribe un número negativo, la calculadora automáticamente le cambia de
signo. También, si el número tiene parte decimal, automáticamente el número es
redondeado de manera que el valor guardado en el campo (valor interno) sea siempre un
número real entero y positivo.
Por ejemplo, si el usuario ingresa -3.74 (como se muestra en la figura), en el campo se
guardará el número 4 en lugar del número ingresado.
Por lo tanto, el valor del campo devuelto al finalizar con OK o ENTER será siempre un
número real que sea entero y positivo.
* ETIQUETAS
"A:" BINT1 BINT11
* CAMPO Nº #0
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
' :: BINT5 #=casedrop ( IfMsgSetFieldValue ) ( Vext -> Vint flag )
:: DUP ( %/xNOVAL %/xNOVAL )
' xNOVAL ( %/xNOVAL %/xNOVAL xNOVAL )
EQUAL ( %/xNOVAL flag )
caseTRUE
( % )
%ABS %0 RNDXY ( %' )
DUP%0= ( %' flag )
IT %1+
TRUE ( %'' T )
;
DROPFALSE
; ( Message Handler del campo )
20 10 96 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT2 ( #Decompile: #2=Formato Actual y Fuente Normal )
"A: número real entero positivo" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
BINT2 ( #ChooseDecompile: cualquier valor )
%15 DUP ( Valor Reset y Valor Inicial )
FLASHPTR IfMain
;
Ejemplo 21 Ifmain
Campo texto con una formación.
Manejando los mensajes 6, 25 y 11.
En este ejemplo hay un campo texto que contiene una formación (matriz o arreglo).
Con el mensaje 6, podemos ver la formación como un grob.
Con el mensaje 25, podemos editar la formación en el MTRW al presionar EDIT.
Con el mensaje 11, podemos tener disponible la tecla de menú CHOOS en el campo texto,
lo que nos permitirá escoger una formación desde el filer.
;
NULLNAME MH6&25_Ejemplo21
:: BINT6 #=casedrop ( IfMsgGetFieldGrob ) ( #c val -> flag T // #c val F )
:: ( #c val )
DUP ( #c val val )
' xNOVAL ( #c val val xNOVAL )
EQUAL ( #c val flag )
caseFALSE
( #c val )
TRUESWAP_ ( #c T val )
ob>grobmini ( #c T grob )
3PICK3PICK ( #c T grob #c T )
NULLPAINT_ ( #c T grob #c T grob )
FLASHPTR IfSetGrob ( #c T grob )
FLASHPTR IfSetGrob ( )
TrueTrue ( T T )
;
BINT25 #=casedrop ( IfMsgEdit ) ( Vext -> T // VExt F )
:: ( ob )
EditaFormacionEnMTRW ( RealArry/CArry/MATRIX T // F )
DROPTRUE ( RealArry/CArry/MATRIX T // T )
;
DROPFALSE
;
NULLNAME MH_Form_ejemplo21
:: BINT11 #=casedrop ( IfMsgGetMenu ) ( {} -> {} {}' T // {} F )
:: ( {}menú )
DUP ( {}menú {}menú )
{ :: TakeOver MostrarMenuCHOOSE? ITE "CHOOS" NULL$ ;
:: TakeOver 4GETLAM #0= case BrowMem3&4 FLASHPTR IfKeyChoose ;
}
BINT3 ROT PUTLIST ( {} {}' )
TRUE ( {} {}' T )
;
DROPFALSE
;
* CONVIERTE ob A GROB PEQUEÑO USANDO MINIFUENTE
* Intenta convertir a grob con FLASHPTR EQW3GROBmini
* Si no es posible hace lo siguiente:
* Si ob es un grob, no hace nada.
* Si ob es una cadena, hace $>grobCR
* Si ob es de otro tipo, hace FLASHPTR FSTR11 $>grobCR
NULLNAME ob>grobmini ( ob -> grob )
:: ( ob )
BEGIN
:: DUP ( ob ob )
FLASHPTR EQW3GROBmini ( ob ext grob #0 // ob ob #1/2 )
BINT0 #=casedrop
:: UNROT2DROP TRUE ; ( OBS: SALE CON grob T ) ( SALE DE BUCLE )
( ob ob #1/2 )
BINT1 #=case
:: GARBAGE DROPFALSE ; ( OBS: SALE CON ob F ) ( REPITE BUCLE )
( ob ob )
TYPEGROB? ( ob flag )
caseTRUE
( ob )
DUPTYPECSTR? ( ob flag )
?SKIP
FLASHPTR FSTR11
( $ )
$>grobCR ( grob )
TRUE ( grob T ) ( SALE DE BUCLE )
;
UNTIL ( OBS: NECESITA TRUE PARA SALIR DE BUCLE BEGIN UNTIL )
( grob )
;
ITE
:: DUPTYPELIST? ( ob' flag )
ITE
FALSE ( ob' F )
TrueTrue ( ob' T T )
;
FalseTrue
UNTIL
( RealArry/CArry/MATRIX T // F )
;
;
NULLNAME MostrarMenuCHOOSE? ( -> flag )
:: ( )
EditLExists? ( flag )
caseFALSE
LAM 'CurrentField ( #c )
FLASHPTR IfGetFieldType ( #TipoCampo ) ( 1,2,12,32 )
BINT2 OVER#= ( #TipoCampo flag )
SWAP BINT12 #= ( flag flag' )
OR ( flag' )
caseTRUE
( )
LAM 'CurrentField ( #c )
BINT0 #= ( flag )
;
NULLNAME BrowMem3&4
:: ( )
EditLExists? ( flag )
case
:: # 46 # 151 setbeep ;
( )
ZEROZERO ( 0 0 )
FALSE ( 0 0 F )
LAM 'CurrentField ( 0 0 F #c )
FLASHPTR IfGetFieldObjectsType ( 0 0 F {#tipos} )
TRUE ( 0 0 F {#tipos} T )
FLASHPTR BrowseMem.1 ( ob T // F // tag )
TRUE
EQUAL ( ob T // F )
NOT?SEMI
( ob )
DUPTYPEARRY? ( ob flag )
OVER TYPEMATRIX?_ ( ob flag flag' )
OR ( ob flag'' )
?SEMI ( sale con ob en la pila )
( {} )
DROP ( )
CLEARVDISP
"Escoge sÓlo una formaciÓn" ( $ )
FlashWarning ( )
COLA
BrowMem3&4
;
Ejemplo 22 Ifmain
Campo texto con un arreglo real.
Manejando los mensajes 6, 22, 25, 11 y 16.
En este ejemplo hay un campo texto que debe contener a un arreglo real.
Con el mensaje 6, podemos ver la formación como un grob.
Con el mensaje 25, podemos editar la formación en el MTRW al presionar EDIT.
Con el mensaje 22, podemos validar o no la entrada escrita en la línea de comandos.
Con el mensaje 16, podemos evitar la finalización del formulario (al presionar ENTER u OK),
si en el campo 1 hay un objeto que no sea un arreglo real.
Con el mensaje 11, podemos tener disponible la tecla de menú CHOOS en el campo texto,
lo que nos permitirá escoger una formación desde el filer.
NULLNAME MH_Form_ejemplo22
:: BINT11 #=casedrop ( IfMsgGetMenu ) ( {} -> {} {}' T // {} F )
:: ( {}menú )
DUP ( {}menú {}menú )
{ :: TakeOver MostrarMenuCHOOSE? ITE "CHOOS" NULL$ ;
:: TakeOver 4GETLAM #0= case BrowMem3RA FLASHPTR IfKeyChoose ;
}
BINT3 ROT PUTLIST ( {} {}' )
TRUE ( {} {}' T )
;
BINT16 #=casedrop ( IfMsgKeyOK ) ( -> flag TRUE // F )
:: ( )
BINT0 ( #0 )
FLASHPTR IfGetFieldValue ( val )
TYPERARRY? ( flag )
NOTcase
:: BINT0 FLASHPTR IfSetField
"ESCRIBE ARREGLO REAL"
FlashWarning ( )
FalseTrue ( F T )
;
TrueTrue ( T T )
;
DROPFALSE
;
* CONVIERTE ob A GROB PEQUEÑO USANDO MINIFUENTE
* Intenta convertir a grob con FLASHPTR EQW3GROBmini
* Si no es posible hace lo siguiente:
* Si ob es un grob, no hace nada.
* Si ob es una cadena, hace $>grobCR
* Si ob es de otro tipo, hace FLASHPTR FSTR11 $>grobCR
NULLNAME ob>grobmini ( ob -> grob )
:: ( ob )
BEGIN
:: DUP ( ob ob )
FLASHPTR EQW3GROBmini ( ob ext grob #0 // ob ob #1/2 )
BINT0 #=casedrop
:: UNROT2DROP TRUE ; ( OBS: SALE CON grob T ) ( SALE DE BUCLE )
( ob ob #1/2 )
BINT1 #=case
:: GARBAGE DROPFALSE ; ( OBS: SALE CON ob F ) ( REPITE BUCLE )
( ob ob )
TYPEGROB? ( ob flag )
caseTRUE
( ob )
DUPTYPECSTR? ( ob flag )
?SKIP
FLASHPTR FSTR11
( $ )
$>grobCR ( grob )
TRUE ( grob T ) ( SALE DE BUCLE )
;
UNTIL ( OBS: NECESITA TRUE PARA SALIR DE BUCLE BEGIN UNTIL )
( grob )
;
LAM 'CurrentField ( #c )
FLASHPTR IfGetFieldType ( #TipoCampo ) ( 1,2,12,32 )
BINT2 OVER#= ( #TipoCampo flag )
SWAP BINT12 #= ( flag flag' )
OR ( flag' )
caseTRUE
( )
LAM 'CurrentField ( #c )
BINT0 #= ( flag )
;
NULLNAME BrowMem3RA
:: ( )
EditLExists? ( flag )
case
:: # 46 # 151 setbeep ;
( )
ZEROZERO ( 0 0 )
FALSE ( 0 0 F )
LAM 'CurrentField ( 0 0 F #c )
FLASHPTR IfGetFieldObjectsType ( 0 0 F {#tipos} )
TRUE ( 0 0 F {#tipos} T )
FLASHPTR BrowseMem.1 ( ob T // F // tag )
TRUE
EQUAL ( ob T // F )
NOT?SEMI
( ob )
DUP ( ob ob )
TYPERARRY? ( ob flag )
?SEMI ( sale con ob en la pila )
( {} )
DROP ( )
CLEARVDISP
"Escoge sÓlo un arreglo real" ( $ )
FlashWarning ( )
COLA
BrowMem3RA
;
Ejemplo 23 Ifmain
Campo texto con un arreglo real que cumpla una condición.
Manejando los mensajes 6, 22, 25, 11 y 16.
Aquí hay un campo texto que contendrá un arreglo real que cumpla una condición.
Con el mensaje 6, podemos ver la formación como un grob.
Con el mensaje 25, podemos editar la formación en el MTRW al presionar EDIT.
Con el mensaje 22, podemos validar o no la entrada escrita en la línea de comandos.
Con el mensaje 16, podemos evitar que la finalización del formulario (al presionar ENTER u
OK), si en el campo 1 no se encuentra un arreglo real que cumpla la condición.
Con el mensaje 11, podemos tener disponible la tecla de menú CHOOS en el campo texto,
lo que nos permitirá escoger una formación desde el filer.
LAM 'CurrentField ( #c )
FLASHPTR IfGetFieldType ( #TipoCampo ) ( 1,2,12,32 )
BINT2 OVER#= ( #TipoCampo flag )
SWAP BINT12 #= ( flag flag' )
OR ( flag' )
caseTRUE
( )
LAM 'CurrentField ( #c )
BINT0 #= ( flag )
;
NULLNAME BrowMem3RACond
:: ( )
EditLExists? ( flag )
case
:: # 46 # 151 setbeep ;
( )
ZEROZERO ( 0 0 )
FALSE ( 0 0 F )
LAM 'CurrentField ( 0 0 F #c )
FLASHPTR IfGetFieldObjectsType ( 0 0 F {#tipos} )
TRUE ( 0 0 F {#tipos} T )
FLASHPTR BrowseMem.1 ( ob T // F // tag )
TRUE
EQUAL ( ob T // F )
NOT?SEMI
( ob )
DUP ( ob ob )
TestRealArry ( ob flag )
?SEMI ( sale con ob en la pila )
( {} )
DROP ( )
CLEARVDISP ( )
AlertaEjemplo23 ( )
COLA
BrowMem3RACond
;
Parámetro Descripción
etiqueta_1
... Definiciones de las etiquetas
etiqueta_n
campo_1
... Definiciones de los campos
campo_n
Parametro Descripcción
cuerpo_etiqueta Cadena o grob a ser mostrado.
#x_posición Coordenada X
#y_posición Coordenada Y
cuerpo_etiqueta es una cadena o un bint (no grob). Si pones una cadena, esta sera
convertida a grob usando la minifuente. También puede ser un bint, en este caso se
mostrará el mensaje de error (ver Apéndice E) correspondiente a ese bint.
La etiqueta sera mostrada en las coordenadas especificadas. Estas coordenadas son dos
bints que representan las posiciones x e y de la etiqueta en la pantalla. La esquina superior
izquierda tiene coordenadas (0, 0) y las coordenadas x e y se incrementan hacia la derecha
y hacia abajo respectivamente.
38.2 Definiciones de Campos
Cada definición de un campo consiste de trece argumentos:
Parametro Descripcción
MessageHandlerCampo Ver sección 38.4 abajo.
#x_posición Coordenada X
#y_posición Coordenada Y (normalmente coord Y de etiqueta menos 1)
#w_ancho Ancho del campo.
#h_altura Altura del campo (usualmente 8 ó 6).
#TipoDeCampo Tipo de campo, ver abajo los valores válidos.
TiposPermitidos Lista con los tipos de objetos válidos para este campo.
Decompile Ver abajo.
"Ayuda" Cadena de ayuda para este campo.
ChooseData Ver abajo.
ChooseDecompile Ver abajo.
ValorReset Valor reset de este campo.
ValorInicial Valor inicial de este campo.
Los Message Handler de los campos serán descritos abajo.
Las posiciones #x e #y especifican donde aparecerán los campos. El contenido del
campo será mostrado 1 píxel a la derecha de X y píxel debajo de Y.
Las dimensiones #w y #h son también dos bints, los cuales especifican el tamaño del
campo. Por ejemplo, campos que muestran objetos con la minifuente pueden tener una
altura de 7. Campos que muestran objetos con fuente de tamaño 8 pueden tener altura 9.
El parámetro #TipoDeCampo es un bint que define el tipo del campo. En DoInputForm
hay 6 tipos de campos.
Valor decimal Tipo de campo
BINT1 BINT3 TEXTO: el usuario puede ingresar cualquier cosa.
BINT12 CHOOSE: el usuario debe seleccionar de una lista de valores válidos.
BINT20 FILER: el usuario puede escoger un objeto desde el filer.
BINT32 CHECKBOX: es una casilla de verificación que el usuario puede marcar
o desmarcar.
BINT13 BINT15 COMBOCHOOSE: el usuario puede seleccionar de una lista de valores
o ingresar otro. Combinación de CHOOSE+TEXTO.
BINT21 BINT23 COMBOFILER: el usuario puede ingresar cualquier cosa o
seleccionar un objeto a partir del filer. Combinación de FILER+TEXTO.
Los valores BINT3, BINT15 y BINT23 del parámetro #TipoDeCampo, corresponden a
los campos texto algebraico, combochoose algebraico y combofiler algebraico
respectivamente. En estos campos, al iniciar una línea de edición nueva, se activa
automáticamente el modo algebraico y al texto ingresado se le adicionarán comillas simples
de manera automática en los extremos (esto se cumplirá cuando la línea de edición no se
inicie con algo que contenga a [, «, ", #, : o {).
El parámetro TiposPermitidos es usado en los campos TEXTO, FILER,
COMBOCHOOSE y COMBOFILER. Es una lista de bints, que representan los tipos
permitidos de los objetos que pueden ser ingresados en ese campo. Sólo son permitidos
objetos de los tipos mostrados en la siguiente tabla. Son los mismos tipos que acepta el
comando xINFORM de User RPL (excepto BINT255d), pero en lugar de números reales
estos tipos se indican con bints.
Por ejemplo, si queremos que un campo acepte reales o complejos, su parámetro
TiposPermitidos debe ser { BINT0 BINT1 }. Debemos tener presente que el
comando DoInputForm no aceptaría la siguiente lista: { # 0 # 1 }.
BINT TIPOS DE OBJETOS
BINT0 Reales
BINT1 Complejos
BINT2 Cadenas
BINT3 Arreglos reales (no matrices simbólicas)
BINT4 Arreglos no reales
BINT5 Listas
BINT6 Nombres globales
BINT8 Programas
BINT9 Simbólicos
BINT10 Cadenas hexadecimales
BINT13 Unidades
OBSERVACIONES:
También puedes especificar el parámetro Decompile como BINT1. En este caso,
ninguna descompilación es hecha y sólo puedes usar cadenas y bints (se mostrará la
cadena correspondiente al mensaje de error de dicho bint). En ambos casos, la cadena se
mostrará sin las comillas dobles.
El parámetro #Decompile debe contener necesariamente como uno de sus sumandos a
BINT2 o a BINT4, excepto cuando el objeto que se mostrará es una cadena o un bint.
El valor del parámetro Decompile no tiene ningun significado en un campo check.
No hay ningún valor para el parámetro Decompile que permita mostrar un objeto con la
minifuente. Para mostrar el contenido de un campo con minifuente, puedes usar el message
handler 7 o el 9.
Si usas el message handler 7. 9 o 10, puedes pasar por alto al parámetro Decompile.
En campos choose, el parámetro Decompile. es usado en la búsqueda alfabética.
El parámetro "Ayuda" especifica la cadena que sera mostrada en la parte inferior de la
pantalla cuando ese campo tenga el enfoque. Este parámetro también puede ser un bint (a
diferencia del comando ^Ifmain que sólo acepta una cadena).
El parámetro ChooseData es usado solamente en campos CHOOSE,
COMBOCHOOSE, FILER, y COMBOFILER. Para otros campos puedes poner MINUSONE
como el valor de este parámetro.
a) En campos choose y combochoose, ChooseData es la lista de valores que serán
presentados al usuario para que este seleccione (DoInputForm usa el browser 48).
a.1) Cuando usas un Decompile igual a 1, puedes usar un ChooseData como este:
{ "cadena1" "cadena2" ... }
a.2) En cambio, si usas un Decompile igual a 17, puedes usar un ChooseData como
este:
{ { "cadena1" <cuerpo1> } { "cadena2" <cuerpo2> } {...} ... }
De esta manera, solo el primer objeto de cada lista sera mostrado, pero la lista
completa sera retornada (como al usar el comando CHOOSE de User RPL).
b) En campos filer y combofiler, ChooseData contiene a los parámetros que usará el
comando ^BrowseMem.1 (ver la seccion 29.2) para mostrar objetos desde el filer.
Puede ser:
b.1) Una lista con 4 de los 5 argumentos de ^BrowseMem.1:
{Ob2 flagTeclaCheck TiposPermitidos flagObjetoNombre}
b.2) Una lista con 2 de los 5 argumentos de ^BrowseMem.1:
{Ob2 flagTeclaCheck}
TiposPermitidos en el filer será igual a TiposPermitidos del campo.
flagObjetoNombre será TRUE (se retornarán objetos y no nombres).
b.3) MINUSONE
flagTeclaCheck será FALSE (no estará disponible la tecla CHECK en el filer).
TiposPermitidos en el filer será igual a TiposPermitidos del campo.
flagObjetoNombre será TRUE (se retornarán objetos y no nombres).
El parámetro ChooseDecompile es requerido solamente en campos CHOOSE y
COMBOCHOOSE. Puede ser un programa o un bint. Para otros campos puedes poner
MINUSONE como el valor de este parámetro. La misión de este parámetro es convertir cada
valor de la lista Choosedata a cadena para que sea mostrado en la lista de valores que
serán presentados al usuario para que este seleccione (DoInputForm usa el browser 48).
Es decir, ChooseDecompile es el parámetro Converter del browser 48 (ver la
seccion 35.3) que se abrirá al presionar la tecla CHOOS. Puede ser:
a) Un PROGRAMA. Si el parámetro es un programa, su diagrama de pila debe ser
( ob $ )
b) Un BINT. Si el parámetro es un bint, puede ser cualquiera de estos:
#1: No se hará ninguna descompilación al elemento.
Usar este bint cuando todos los elementos son cadenas.
Las cadenas se mostrarán sin comillas dobles.
#2: Los números se mostrarán en el formato numérico actual.
Los ids se mostrarán sin comillas.
Las cadenas se mostrarán con comillas dobles.
#4: Los números se mostrarán en el formato numérico estándar.
Los ids se mostrarán sin comillas.
Las cadenas se mostrarán con comillas dobles.
También puedes agregar (sumando al anterior) uno de estos bints:
#16: Cuando el ítem es una lista y quieres mostrar el primer elemento de esta lista.
#32: Cuando el ítem es una lista y quieres mostrar el segundo elemento de esta lista.
#8: Se mostrará sólo el primer carácter.
Por ejemplo, si cada uno de los ítems son listas de esta forma {$ ob}, puedes fijar el
parámetro Choosedecompile como 17 (16+1), lo cual significa que se tomará el
primer elemento de la lista y esta cadena se mostrará directamente.
Los parámetros valorReset y ValorInicial se refieren al valor del campo
cuando es mostrado inicialmente y cuando es reseteado. Ambos deben ser objetos de algún
tipo permitido para este campo. Para un campo CHOOSE deben ser alguno de los
elementos de la lista ChooseData. Para un campo CHECKBOX, usa TRUE o FALSE.
Puedes dejar un campo TEXTO, FILER, COMBOCHOOSE o COMBOFILER en blanco,
especificando MINUSONE como uno o ambos de estos parámetros.
N+1: Valor_Campo_1
N: Valor_Campo_2
.....
2: Valor_Campo_n
1: TRUE
Si CANCEL fue usado para salir del formulario de entrada, entonces sólo FALSE es
retornado en la pila.
Si un campo está vacío, entonces MINUSONE es retornado como el valor de este campo.
Este mensaje es llamado durante el inicio del formulario de entrada para dibujar el título en la
pantalla.
La acción por defecto es dibujar un grob de tamaño 131x7 en HARDBUFF, sólo cuando la
línea de edición no ocupe toda la pantalla.
Recuerda que para llamar al título del formulario debes usar el comando 12GETLAM.
Si este mensaje es manejado, ya no se llamarán a los mensaje 2 y 3.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado durante el inicio del formulario de entrada para fijar el grob que
será mostrado como título del formulario.
La acción por defecto es fijar un grob de tamaño 131x7.
Recuerda que para llamar al título del formulario debes usar el comando 12GETLAM.
Si este mensaje es manejado, ya no se llamará al mensaje 3.
Entrada Nada
Salida (con efecto) 2: grob
1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado durante el inicio del formulario de entrada para fijar la cadena que
será mostrada como título del formulario.
La acción por defecto es retornar una cadena a partir del parámetro $Título.
Recuerda que para llamar al título del formulario debes usar el comando 12GETLAM.
Entrada Nada
Salida (con efecto) 2: $
1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado para dibujar la pantalla en la región de los campos y las etiquetas.
Las dos acciones por defecto son:
a) Si hay una línea de edición con más de un renglón sólo dibuja la ayuda en la parte
superior, debajo del título.
b) De lo contrario, dibuja todos los campos y las etiquetas.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
38.9.5 Mensaje 5 (formulario)
Este mensaje es llamado durante el inicio del formulario de entrada para fijar el grob que
será mostrado para las etiquetas.
La acción por defecto es fijar un grob de tamaño 131x39.
Si en la salida con efecto se pone TRUE en el nivel 2, entonces el grob será colocado en el
lam 10 y este mensaje sólo será llamado al inicio.
Si en la salida con efecto se pone FALSE en el nivel 2, entonces el grob no será colocado en
el lam 10 y este mensaje también será llamado cada vez que se redibuja la pantalla.
Si este mensaje es llamado, ya no será llamado el mensaje 6.
Entrada Nada
Salida (con efecto) 3: grob
2: TRUE o FALSE
1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado durante el inicio del formulario de entrada (para cada etiqueta) para
modificar el grob de etiquetas (dibujando en este la etiqueta correspondiente).
Como el grob de etiquetas se colocará debajo del título, deberás poner el grob en la posición
(#x,#y-7) del grob de etiquetas.
Con este mensaje también puedes dibujar la etiqueta usando fuente normal o usando estilos
tales como negrita, cursiva, subrayado o inversa; o cualquier grob.
Si el mensaje 5 es manejado, este mensaje ya no será llamado.
Entrada 2: grob
1: #etiqueta
Salida (con efecto) 2: grob'
1: TRUE
Salida (sin efecto) 3: grob
2: #etiqueta
1: FALSE
A continuación un message handler que imita a la acción por defecto:
' :: BINT6 #=casedrop ( GROB #et -> GROB' T // GROB #et F )
:: ( GROB #et )
DUP ( GROB #et #et )
ROMPTR 0B0 0B3 ( GROB #et $etiq )
$>grob ( GROB #et grob )
3PICK ( GROB #et grob GROB )
ROT ( GROB grob GROB #et )
ROMPTR 0B0 0B6 ( GROB grob GROB #X #Y )
#7-_ ( GROB grob GROB #X #Y-7 )
GROB! ( GROB' )
TRUE ( GROB' T )
;
DROPFALSE
;
Con el siguiente MH, las etiquetas también podrán ser grobs (además de cadenas y bints):
' :: BINT6 #=casedrop ( GROB #et -> GROB' T // GROB #et F )
:: ( GROB #et )
DUP ( GROB #et #et )
ROMPTR 0B0 0B3 ( GROB #et $etiq/grob )
DUPTYPEGROB? ( GROB #et $etiq/grob flag )
NOT_IT
$>grob ( GROB #et grob )
3PICK ( GROB #et grob GROB )
ROT ( GROB grob GROB #et )
ROMPTR 0B0 0B6 ( GROB grob GROB #X #Y )
#7-_ ( GROB grob GROB #X #Y-7 )
GROB! ( GROB' )
TRUE ( GROB' T )
;
DROPFALSE
;
Este mensaje es llamado cuando se va a dibujar un campo y debe dibujar el valor del campo
en la pantalla.
En el lam 4 se encuentra el índice del campo que se va a dibujar.
Con este mensaje puedes pasar por alto al parámetro Decompile.
Si este mensaje es manejado, ya no serán llamados los mensaje 9 ni 10.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Entrada 2: #CódigoDeTecla
1: #PlanoDeTecla
Salida (con efecto) 3: ::Programa
2: TRUE
1: TRUE
Salida (sin efecto) 3: #CódigoDeTecla
2: #PlanoDeTecla
1: FALSE
Cuando se usa un formulario de entrada hecho con DoInputForm y no hay activa una línea
de edición en un campo texto, combochoose o combofiler, la tecla STO realiza operaciones
con la pila que a veces no son deseadas. Para quitar esta asignación de tecla puedes usar
el siguiente message handler en cada campo texto, combochoose o combofiler.
Este mensaje es llamado cuando se va a dibujar un campo y debe retornar el valor del
campo convertido en grob.
En el nivel 1 de la pila se encuentra el índice del campo que se va a dibujar.
Con este mensaje puedes pasar por alto al parámetro Decompile.
Con este mensaje puedes retornar un campo en minifuente, estilos negrita, cursiva,
subrayado, inversa, etc.
Si este mensaje es manejado, ya no será llamado el mensaje 10.
Entrada 1: #Campo
Salida (con efecto) 3: #Campo
2: grob
1: TRUE
Salida (sin efecto) 2: #Campo
1: FALSE
Aquí presentamos una plantilla que usa el mensaje 9 para retornar un grob correspondiente
a un campo (que no sea check) que respete su base y su altura y coloque el contenido del
campo en un lugar correcto del grob. En este ejemplo se muestra el campo con minifuente.
Este mensaje es llamado cuando se va a dibujar un campo y debe retornar el valor del
campo convertido en cadena.
Este mensaje no es llamado para campos check.
En el nivel 1 de la pila se encuentra el índice del campo que se va a dibujar.
Con este mensaje puedes pasar por alto al parámetro Decompile.
Con este mensaje puedes retornar un campo negrita, cursiva, subrayado o inversa.
Entrada 1: #Campo
Salida (con efecto) 3: #Campo
2: $
1: TRUE
Salida (sin efecto) 2: #Campo
1: FALSE
A continuación un message handler que imita a la acción por defecto:
Entrada 1: flag
Salida (con efecto) 1: TRUE
Salida (sin efecto) 2: flag
1: FALSE
Entrada Nada
Salida (con efecto) 2: grob
1: TRUE
Salida (sin efecto) 1: FALSE
Entrada Nada
Salida (con efecto) 2: $
1: TRUE
Salida (sin efecto) 1: FALSE
38.9.14 Mensaje 14 (formulario)
Este mensaje es llamado durante el inicio del formulario de entrada para fijar el número del
campo que primero tendrá el enfoque.
También es llamado cuando se resetean todos los campos, y se decide que el campo actual
ya no debe seguir con el enfoque; para fijar el índice del nuevo campo.
El valor por defecto para el campo inicial es #1.
Entrada Nada
Salida (con efecto) 2: #Campo
1: TRUE
Salida (sin efecto) 1: FALSE
Entrada Nada
Salida (con efecto) 2: { } o programa (menú)
1: TRUE
Salida (sin efecto) 1: FALSE
Si el message handler del formulario de entrada es el siguiente, entonces será disponible
una tecla de menú para ver un texto de ayuda.
Este mensaje es llamado al inicio del formulario de entrada. Cuando ya estan fijados los
valores de los lams, pero antes de que se inicie el POL.
Puedes hacer cualquier cosa aquí. No hay diferencia si retornas TRUE o FALSE.
Entrada Nada
Salida 1: TRUE o FALSE
Este mensaje es llamado cuando se presiona una tecla capaz de iniciar una línea de edición
en un campo texto, combochoose o combofiler.
Generalmente este mensaje es llamado en campos algebraicos (texto algebraico,
combochoose algebraico o combofiler algebraico).
Su acción por defecto es agregarle comillas simples a una línea de edición nueva e iniciar el
modo de entrada algebraica (esto se realizará cuando la línea de edición no se inicie con
algo que contenga a [, «, ", #, : o {)
Entrada 2: #CódigoDeTecla
1: #PlanoDeTecla
Salida (con efecto) 3: ::Programa
2: TRUE
1: TRUE
Salida (sin efecto) 3: #CódigoDeTecla
2: #PlanoDeTecla
1: FALSE
Entrada Nada
Salida 1: TRUE o FALSE
38.9.20 Mensaje 20 (campo)
Entrada Nada
Salida 1: TRUE o FALSE
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado justo después de que el campo ha recibido el enfoque y su misión
es invertir los píxeles del campo.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado al presionar la tecla EDIT y su misión es editar el valor del campo.
La acción por defecto es iniciar la línea de edición con el valor actual del campo.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
38.9.24 Mensaje 24 (campo)
Este mensaje es llamado cuando se quiere confirmar la línea de edición con ENTER u OK.
Cuando es llamado, todavía existe una línea de edición, la cual puedes llamar con el
comando RCL_CMD o con RCL_CMD2.
Puedes hacer cualquier cosa aquí. No hay diferencia si retornas TRUE o FALSE.
Entrada Nada
Salida 1: TRUE o FALSE
Este mensaje es llamado cuando se quiere confirmar la línea de edición con ENTER u OK.
Cuando es llamado, ya no existe línea de edición y la cadena de la línea de edición está
descompilada en la pila (si son varios objetos, se encuentran agrupados en una lista). Este
mensaje es llamado antes de verificar si el objeto que se quiere asiganar al campo es de un
tipo correcto y de un valor válido (mensajes 45 y 46).
Puedes hacer cualquier cosa aquí. No hay diferencia si retornas TRUE o FALSE.
Entrada Nada
Salida 1: TRUE o FALSE
Este mensaje es llamado cuando es presionada la tecla CHOOSE en un campo choose, filer
combochoose o combofiler.
Su misión es presentar las opciones al usuario y si una opción es escogida, guardar el nuevo
valor del campo y mostrarlo en la pantalla.
Si manejas este mensaje, podrías pasar por alto al mensaje 37.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cuando es presionada la tecla CHECK o la tecla +/- en un campo
check. Su misión es cambiar el valor del campo check.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Entrada Nada
Salida (con efecto) 2: TRUE o FALSE (TRUE finalizará el POL, FALSE no)
1: TRUE
Salida (sin efecto) 1: FALSE
Entrada Nada
Salida (con efecto) 2: TRUE o FALSE (TRUE finalizará el POL, FALSE no)
1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cuando es presionada la tecla de menú CALC en campos texto,
combochoose o combofiler.
La acción por defecto es abrir un entorno donde podremos manipular la pila y colocar un
objeto en el nivel 1 para que sea el nuevo valor del campo. Si este objeto es de un tipo
válido y de un valor válido, entonces es guardado como el nuevo valor del campo. De lo
contario, muestra una alerta en la pantalla.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
38.9.31 Mensaje 31 (campo)
Este mensaje es llamado cuando se presiona la tecla de menú RESET o la tecla DEL
(ShiftIzq+DROP).
Su acción por defecto es mostrar un browser con dos opciones "Reset value" (o "Delete
value" cuando el valor reset del campo es MINUSONE) y "Reset value". Luego procede de
acuerdo a la opción escogida.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cuando se presiona la tecla de menú RESET o la tecla DEL
(ShiftIzq+DROP).
Su acción por defecto es retornar una lista de ítems que serán mostrados al usuario con el
browser.
Este mensaje debe retornar una lista de listas.
Cada una de las sublistas debe tener la siguiente forma: { #/$ ob }
#/$ Es lo que se mostrará en el browser
ob Es el objeto que será evaluado, si uno escoge esa opción.
Entrada Nada
Salida (con efecto) 1: {{}}
1: TRUE
Salida (sin efecto) 1: FALSE
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cuando todos los campos se van a resetear, debido a la elección
de la opción "Reset All".
Su acción por defecto es resetear cada uno de los campos, y luego preguntar al mensaje 55
si el campo actual merece seguir con el enfoque. Si no lo merece, pregunta al mensaje 14,
cual será el nuevo campo.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cuando es presionada la tecla de menú TYPES (F3) en campos
texto, combochoose o combofiler.
Este mensaje también es llamado cuando después de ingresar un valor de tipo incorrecto en
un campo, aparece una alerta y el usuario presiona la tecla de menú TYPES (F1).
La acción por defecto es mostrar en un browser los tipos permitidos para este campo y abrir
una línea de edición nueva si uno escoge una de estas opciones con la tecla NEW.
Si manejas este mensaje puedes pasar por alto al mensaje 36.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
38.9.36 Mensaje 36 (campo)
Este mensaje es llamado cuando es presionada la tecla de menú TYPES (F3) en campos
texto, combochoose o combofiler.
Este mensaje también es llamado cuando después de ingresar un valor de tipo incorrecto en
un campo, aparece una alerta y el usuario presiona la tecla de menú TYPES (F1).
Este mensaje debe retornar una lista de listas.
Cada una de las sublistas debe tener la forma: { #/$ :: #pos FlagALG $EditLine ; }
#/$ Es lo que se mostrará en el browser
#pos Es la posición del cursor en la nueva línea de edición.
FlagALG Si es TRUE, se activará el modo algebraico.
$EditLine Es la cadena de la nueva línea de edición que se abrirá.
Con este mensaje puedes tener más TiposPermitidos en el formulario DoInputForm.
Entrada Nada
Salida (con efecto) 2: {{}}
1: TRUE
Salida (sin efecto) 1: FALSE
A continuación un message handler que te permite poner objetos de otros tipos en un campo
(tipos diferentes a los de la tabla de la sección 38.2).
Por ejemplo, si quieres que en un campo texto, el unico objeto permitido sea una fuente
normal, entonces el parámetro TiposPermitidos debe ser { BINT30 } y el message
handler del campo debe ser:
Este mensaje es llamado cuando es presionada la tecla CHOOSE en un campo choose, filer
combochoose o combofiler. Su misión es presentar las opciones al usuario y si una opción
es escogida, retornarla en la pila seguida de TRUE y TRUE. Si el usuario no escoge ninguna
opción, en la pila debe retornarse FALSE y TRUE.
Entrada Nada
Salida (con efecto) 3: objeto
2: TRUE
1: TRUE
Salida (con efecto) 2: FALSE
1: TRUE
Salida (sin efecto) 1: FALSE
A continuación un message handler que imita a la acción por defecto y que puede servir
como plantilla.
' :: BINT37 #=casedrop ( -> ob T T // F T // F )
:: ( )
4GETLAM ( #c )
DUP ( #c #c )
ROMPTR 0B0 08D ( #c flag ) ( TRUE si es filer o combofiler )
case
:: ( #c )
FALSE ( #c F )
SWAP ( F #c )
* Retorna los parámetros de ^BrowseMem.1 a partir de ChooseData
* Puedes cambiar este comando por otro código
ROMPTR 0B0 078 ( F ob2 flagCheck {}tipos flagObjNomb )
SWAP
TOTEMPOB
SWAP ( F ob2 flagCheck {}tipos flagObjNomb )
FLASHPTR BrowseMem.1 ( ob T // F // tag )
SetDAsNoCh ( ob T // F // tag )
TRUE ( ob T T // F T // tag T )
;
( #c )
* Retorna lista de ítems e índice inicial para browser 48 a partir de
* ChooseData. Puedes cambiar este comando por otro código
ROMPTR 0B0 02B ( {}items #índice )
OVER ( {}items #índice {}items )
NULL{} ( {}items #índice {}items {} )
EQUAL ( {}items #índice flag )
case2drop
:: ( )
DoBadKey ( )
FalseTrue ( F T )
;
( {}items #índice )
DUP#0= ( {}items #índice flag )
IT
DROPONE
( {}items #índice' )
4GETLAM ( {}items #índice' #c )
ROMPTR 0B0 0BC ( {}items #índice' MH ) ( MH del campo )
NULL$ ( {}items #índice' MH $ ) ( Título del Browser 48 )
4GETLAM ( {}items #índice' MH $ #c )
ROMPTR 0B0 0C6 ( {}items #índice' MH $ ChooseDecomp ) ( Converter )
5ROLL
5ROLL ( MH $ ChooseDecomp {}items #índice' )
ROMPTR Choose ( ob T // F )
SetDAsNoCh ( ob T // F )
TRUE ( ob T T // F T )
;
DROPFALSE
;
A continuación un message handler plantilla que puede usarse sólo en campos filer y
combofiler.
' :: BINT37 #=casedrop ( -> ob T T // F T // F )
:: ( )
FALSE ( F )
4GETLAM ( F #c )
* Retorna los parámetros de ^BrowseMem.1 a partir de ChooseData
* Puedes cambiar este comando por otro código
ROMPTR 0B0 078 ( F ob2 flagCheck {}tipos flagObjNomb )
SWAP
TOTEMPOB
SWAP ( F ob2 flagCheck {}tipos flagObjNomb )
FLASHPTR BrowseMem.1 ( ob T // F // tag )
SetDAsNoCh ( ob T // F // tag )
TRUE ( ob T T // F T // tag T )
;
DROPFALSE
;
A continuación un message handler plantilla que puede usarse sólo en campos choose y
combochoose.
Este mensaje es llamado cuando es presionada la tecla la tecla +/- en un campo choose o
combochoose. Su misión es cambiar el valor del campo y mostrar el nuevo valor del campo
en la pantalla.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
A continuación un message handler que imita a la acción por defecto y se puede usar como
plantilla.
Este mensaje es llamado cuando son presionadas algunas teclas (capaces de producir
búsqueda alfabética) sólo en un campo choose.
Su misión es buscar un elemento de ChooseData cuyo primer carácter coincida con el
carácter correspondiente a la tecla que se ha presionado.
En caso de encontrar un elemento, se deberá fijar este elemento como el nuevo valor del
campo, y mostrarlo en la pantalla.
Entrada 1: chr
Salida (con efecto) 1: TRUE
Salida (sin efecto) 2: chr
1: FALSE
38.9.40 Mensaje 40 (campo)
Este mensaje es llamado cuando es presionada la tecla CHOOSE o la tecla +/- en un campo
choose o combochoose. Su misión es retornar en la pila la lista de ítems y el índice inicial
que usará el browser 48 para presentar las opciones al usuario.
Las acciones por defecto son:
a) Retornar el parámetro ChooseData del campo y el índice será la posición en la lista del
objeto del campo.
b) Si el objeto del campo no se encuentra en la lista, entonces este objeto es agregado al
inicio de la lista y debes retornar como índice a cero.
Entrada Nada
Salida (con efecto) 3: {}Items
2: #índice
1: TRUE
Salida (sin efecto) 1: FALSE
A continuación un message handler que imita a la acción por defecto y se puede usar como
plantilla.
Este mensaje es llamado cuando es presionada la tecla EDIT o la tecla CALC en un campo
texto, combochoose o combofiler. Su misión es retornar el objeto que será editado o
computado.
Si escoges la primera salida con efecto (valor T T), ese valor será editado o computado.
Si escoges la segunda salida con efecto (F T), la línea de edición se iniciará vacía al
presionar EDIT, o el valor del campo no estará en el nivel 1 de la pila al presionar CALC.
Las acciones por defecto son:
a) Si el valor actual del campo no es MINUSONE, retornar el valor del campo, TRUE y
TRUE.
b) Si el valor actual del campo es MINUSONE, retornar FALSE y TRUE.
Entrada Nada
Salida (con efecto) 3: valor
2: TRUE
1: TRUE
Salida (con efecto) 2: FALSE
1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cada vez que se inicia una línea de edición. Su misión es retornar
un menú que esté presente mientras la línea de edición esté activa.
Si este mensaje es manejado, ya no se llamará al mensaje 43.
La acción por defecto es retornar un menú con 12 elementos (ROMPTR 0B0 007) con las
teclas:
" " " " " " " " "CANCL" " OK "
"←SKIP" "SKIP→" "←DEL " " DEL→" " INS " "↑STK"
Entrada Nada
Salida (con efecto) 2: { } o programa (menú)
1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cada vez que se inicia una línea de edición. Su misión es retornar
una lista con las primeras cuatro teclas de menú que estarán disponibles mientras la línea de
edición esté activa.
Si este mensaje es manejado, se debe de retornar una lista con cuatro sublistas, cada una
de estas será la definición de la tecla.
Si el mensaje 42 es manejado, este mensaje ya no será llamado.
Entrada Nada
Salida (con efecto) 3: { } (lista con cuatro elementos)
2: TRUE
1: TRUE
Salida (sin efecto) 1: FALSE
38.9.44 Mensaje 44 (campo)
Este mensaje es llamado cuando se quiere confirmar la línea de edición con ENTER u OK.
Su misión es verificar que haya una línea de edición válida, convertir reales a enteros,
matrices a arreglos, verificar que el objeto de la línea de edición sea de tipo válido y de valor
válido, asignar valor al campo, mostrar los cambios, decidir cual será el nuevo campo con el
enfoque, cambiar el enfoque, etc.
Entrada Nada
Salida (con efecto) 1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cuando se quiere confirmar la línea de edición con ENTER u OK o
cuando se quiere asignar un valor al campo desde la pila (luego de presionar la tecla CALC).
Su misión es verificar que el objeto sea de un tipo válido.
Si retornas TRUE ob TRUE, el objeto será considerado de un tipo válido.
Si retornas FALSE ob TRUE, el objeto no se asignará al campo y se mostrará el mensaje
“Invalid object type”.
Si retornas la salida sin efecto, se ejecutará el código por defecto para decidir si valor es
de un tipo correcto.
valor es lo que se trata de introducir como valor del campo.
ob' es un objeto cualquiera.
Entrada 2: valor
1: valor
Salida (con efecto) 3: TRUE o FALSE
2: ob'
1: TRUE
Salida (sin efecto) 3: valor
2: valor
1: FALSE
Este mensaje es llamado cuando se quiere confirmar la línea de edición con ENTER u OK o
cuando se quiere asignar un valor al campo desde la pila (luego de presionar la tecla CALC).
Su misión es verificar que el objeto tenga un valor válido.
Por ejemplo, puedes verificar que un número real sea entero y positivo y/o se encuentre en
un intervalo especificado.
Este mensaje es llamado después del mensaje 45.
Si retornas TRUE TRUE, el objeto será asignado al campo (similar a la salida sin efecto).
Si retornas FALSE TRUE, el objeto no se asignará al campo y se mostrará el mensaje
“Invalid object value”.
Entrada 1: valor
Salida (con efecto) 2: TRUE o FALSE
1: TRUE
Salida (sin efecto) 2: valor
1: FALSE
38.9.47 Mensaje 47 (campo)
Entrada Nada
Salida 1: TRUE o FALSE
Este mensaje es llamado cuando se presiona la tecla ABAJO y su misión es decidir cual
será el campo que recibirá el enfoque (no cambia el enfoque).
Entrada Nada
Salida (con efecto) 2: #campo
1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cuando se presiona la tecla ARRIBA y su misión es decidir cual
será el campo que recibirá el enfoque (no cambia el enfoque).
Entrada Nada
Salida (con efecto) 2: #campo
1: TRUE
Salida (sin efecto) 1: FALSE
Entrada Nada
Salida (con efecto) 2: #campo
1: TRUE
Salida (sin efecto) 1: FALSE
Entrada Nada
Salida (con efecto) 2: #campo
1: TRUE
Salida (sin efecto) 1: FALSE
38.9.52 Mensaje 52 (campo)
Este mensaje es llamado cuando se presiona la tecla DERECHA y su misión es decidir cual
será el campo que recibirá el enfoque (no cambia el enfoque).
Entrada Nada
Salida (con efecto) 2: #campo
1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cuando se presiona la tecla IZQUIERDA y su misión es decidir cual
será el campo que recibirá el enfoque (no cambia el enfoque).
Entrada Nada
Salida (con efecto) 2: #campo
1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cuando se presiona la tecla ON o ENTER cuando hay una línea de
edición activa y el objeto que se estaba editando (de tipo y valor válido) ha pasado a ser el
nuevo valor del campo. Su misión es decidir cual será el campo que a continuación recibirá
el enfoque (no cambia el enfoque).
Entrada Nada
Salida (con efecto) 2: #campo
1: TRUE
Salida (sin efecto) 1: FALSE
Entrada Nada
Salida (con efecto) 2: flag
1: TRUE
Salida (sin efecto) 1: FALSE
Este mensaje es llamado cuando el formulario está a punto de finalizar debido a la opresión
de la tecla ENTER o la tecla OK. Es llamado antes de que el POL haya finalizado.
Puedes hacer cualquier cosa aquí. No hay diferencia si retornas TRUE o FALSE.
Entrada Nada
Salida 1: TRUE o FALSE
A continuación algunos messages handlers de ^IfMain y su equivalente en DoInputForm.
Ejemplo 1b DoInputForm
Un NULLNAME para cambiar el enfoque a otro campo.
Cuando se crean formularios de entrada con ^IfMain, podemos usar el comando
FLASHPTR IfSetField ( #c )
el cual permite cambiar el enfoque hacia cualquier campo.
" Texto:" 0 10
"Choose:" 0 19
" Filer:" 0 28
"ComboC:" 0 37
"ComboF:" 0 46
"Check" 13 55
* Etiqueta
" Coef:" 0 26
* Campo
' :: BINT26 #=casedrop ( -> T // F )
:: ( )
5GETLAM ( #campo )
ROMPTR 0B0 0C5 ( {}ChooseDATA )
INNERCOMP ( meta )
dup_ ( meta meta )
DUP ZERO_DO
ROLL TWONTHCOMPDROP_ ISTOP@
LOOP
{}N ( meta {} )
5GETLAM
ROMPTR gFldVal ( meta {} % )
EQUALPOSCOMP ( meta #pos/#0 )
DUP#0=IT
DROPONE
#1- ( meta #i )
" ACCESORIOS K" ( meta $ )
SWAP ( meta $ #i )
FLASHPTR Choose2_ ( {$ %} T // F )
IT
:: ( {$ %} )
TWONTHCOMPDROP_ ( % )
5GETLAM ( #c )
ROMPTR sFldVal ( )
;
TRUE ( T )
;
DROPFALSE
;
30 25 80 9 ( posición y tamaño: #x #y #b #h )
BINT13 ( TipoDeCampo: 13= combochoose )
{ BINT0 } ( TiposPermitidos: #0= reales )
BINT4 ( Decompile: #4= formato numérico estándar )
"Coef de pérdidas locales"
{ { "Entrada b agud 0.50" %.5 }
{ "Entr b acampan 0.04" % .04 }
{ "Entr b entrant 1.00" %1 }
{ "Salida a depÓs 1.00" %1 }
{ "Codo a 90° 0.90" % .9 }
{ "Codo a 45° 0.42" % .42 }
{ "Codo curv fuerte 0.75" % .75 }
{ "Codo curv suave 0.60" % .6 }
{ "V glob abierta 10.00" %10 }
{ "V comp abierta 0.19" % .19 }
{ "V check abierta 2.50" % 2.5 } }
MINUSONE ( ChooseDecompile: ignorado en mensaje 26 )
12. 13. ( valor reset y valor inicial )
DoInputForm ( % T // F )
;
* Aquí se usa el browser 48
xNAME DoInComboItems ( -> % T // F )
:: CK0 ( ) ( No se requieren argumentos )
* Etiqueta
" Coef:" 0 26
* Campo
' :: BINT26 #=casedrop ( -> T // F )
:: ( )
'DROPFALSE ( MH )
" ACCESORIOS K" ( MH $ )
BINT17 ( MH $ conv )
5GETLAM ( MH $ conv #campo )
ROMPTR 0B0 0C5 ( MH $ conv {}ChooseDATA )
DUPINCOMP ( MH $ conv {}ChooseDATA meta )
DUP ZERO_DO
ROLL TWONTHCOMPDROP_ ISTOP@
LOOP
{}N ( MH $ conv {}ChooseDATA {ob} )
5GETLAM ( MH $ conv {}ChooseDATA {ob} #camp )
ROMPTR gFldVal ( MH $ conv {}ChooseDATA {ob} % )
EQUALPOSCOMP ( MH $ conv {}ChooseDATA #pos/#0 )
DUP#0=IT
DROPONE
ROMPTR Choose ( {$ %} T // F )
IT
:: ( {$ %} )
TWONTHCOMPDROP_ ( % )
5GETLAM ( #campo )
ROMPTR sFldVal ( )
;
TRUE ( T )
;
DROPFALSE
;
30 25 80 9 ( posición y tamaño: #x #y #b #h )
BINT13 ( TipoDeCampo: 13= combochoose )
{ BINT0 } ( TiposPermitidos: #0= reales )
BINT4 ( Decompile: #4= formato numérico estándar )
"Coef de pérdidas locales"
{ { "Entrada b agud 0.50" %.5 }
{ "Entr b acampan 0.04" % .04 }
{ "Entr b entrant 1.00" %1 }
{ "Salida a depÓs 1.00" %1 }
{ "Codo a 90° 0.90" % .9 }
{ "Codo a 45° 0.42" % .42 }
{ "Codo curv fuerte 0.75" % .75 }
{ "Codo curv suave 0.60" % .6 }
{ "V glob abierta 10.00" %10 }
{ "V comp abierta 0.19" % .19 }
{ "V check abierta 2.50" % 2.5 } }
MINUSONE ( ChooseDecompile: ignorado en mensaje 26 )
12. 13. ( valor reset y valor inicial )
DoInputForm ( % T // F )
;
Ejemplo 4 DoInputForm
Actualizar el valor de un campo al cambiar el valor de otro campo.
Para hacer esto debes usar el mensaje número 47 en el message handler de un campo.
Este mensaje es llamado cuando el valor del campo cambia.
A continuación un ejemplo sencillo con dos campos y dos etiquetas con su respectiva
explicación que puedes copiar y pegar en el editor de Debug4x.
* ETIQUETA Nº #1
"A:" BINT1 BINT10
* ETIQUETA Nº #2
"B:" BINT1 BINT31
* CAMPO Nº #1
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
* CUANDO EL VALOR DE ESTE CAMPO CAMBIA, EL VALOR DEL OTRO CAMPO
* TAMBIÉN CAMBIARÁ.
' :: BINT47 #=casedrop ( -> flag )
:: ( )
5GETLAM ( #c )
ROMPTR gFldVal ( valor )
%10 %/ ( valor/10 )
BINT2 ( valor/10 #2 )
DoSetFieldValue ( )
TRUE ( T )
;
DROPFALSE
;
25 9 103 9 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT4 ( #Decompile: #4=Formato estándar )
"Escribe un número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
MINUSONE ( ChooseDecompile: MINUSONE para campo texto )
%25 DUP ( Valor Reset y Valor Inicial )
* CAMPO Nº #2
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
* CUANDO EL VALOR DEL OTRO CAMPO CAMBIE, EL
* VALOR DE ESTE CAMBIA. SE ACTUALIZA A LA DÉCIMA PARTE DEL OTRO
'DROPFALSE ( Message Handler del campo )
25 30 103 9 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT4 ( #Decompile: #4=Formato estándar )
"Escribe número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
MINUSONE ( ChooseDecompile: MINUSONE para campo texto )
%17 DUP ( Valor Reset y Valor Inicial )
DoInputForm
;
* ETIQUETAS
"A:" BINT1 BINT11
"B:" BINT1 BINT21
"C:" BINT1 BINT31
DoInputForm
;
Ejemplo 6 DoInputForm
Bloquear campos con una condición.
Actualizar el valor de un campo al cambiar el valor de otro campo.
En este ejemplo se verá como bloquear campos sólo si se cumple una condición.
Aquí hay 4 campos (1, 2, 3 y 4)
El campo 1 contiene a un campo texto y no es bloqueado.
El campo 2 es un campo choose.
Los campos 3 y 4 son campos texto y serán bloqueados cuando en el campo 2 la opción
escogida no sea la opción “ESCRIBE PARÁMETROS”. Para esto se usa el mensaje 55 en
los campos que serán bloqueados (campos 3 y 4). El NULLNAME BloqueaCampos? decide
si se bloquerán o no estos campos.
Además, cada vez que se escoge en el campo CHOOSE a una opción que no sea
“ESCRIBE PARÁMETROS”, los campos 3 y 4 se actualizarán con los valores
correspondientes al elipsoide escogido. Además se usa el mensaje 17 (el cual es llamado al
inicio) en el message handler del formulario para que dicha actualización también ocurra al
inicio del formulario.
* ETIQUETAS
"X:" BINT1 BINT11
"Elip" BINT1 BINT21
"a:" BINT1 BINT31
"1/f:" BINT1 BINT41
Para hacer aparecer o desaparecer (volver visible o invisible) a un campo debes usar los
mensajes 55 (bloquear) y 10 (cadena que se mostrará) en el message handler del campo
que deseas volver visible o invisible.
Para hacer aparecer o desaparecer (volver visible o invisible) a una etiqueta debes usar los
mensajes 5 (para que se redibujen las etiquetas cada vez que se redibuja la pantalla) y 6
(que dibuja una etiqueta en el grob de etiquetas) en el message handler del formulario.
Además se debe llamar al mensaje 47 en el campo cuyos cambios afectarán la visibilidad o
no de otros campos. Ahí se debe usar el comando ROMPTR 0B0 00C el cual redibuja toda
la zona de etiquetas y de campos.
A continuación un ejemplo sencillo con dos campos y dos etiquetas con su respectiva
explicación que puedes copiar y pegar en el editor de Debug4x.
Si en el primer campo hay un número positivo, entonces el segundo campo es invisible.
Si en el primer campo hay un número no positivo, entonces el segundo campo será visible.
* ETIQUETA Nº #1
"A:" BINT1 BINT11
* ETIQUETA Nº #2
"B:" BINT1 BINT32
Problema:
Si tengo una etiqueta con su campo CHOOSE, dentro de CHOOSE tengo tres opciones
{ {"cero"} {"uno"} {"dos"} }
Cuando escoja “cero”, no aparezca ninguna ETIQUETA/CAMPO.
Cuando escoja “uno”, aparezca la etiqueta_1 y campo_1.
Cuando escoja “dos”, aparezca la etiqueta_2 y campo_2 (en el mismo lugar que
etiqueta_1/campo_1).
Solución:
Para hacer aparecer o desaparecer (volver visible o invisible) a un campo o a una etiqueta
debes usar el mensaje número 5 en el message handler de un campo.
Este mensaje es llamado cuando el valor del campo cambia y también al inicio del formulario.
Además debes usar el comando FLASHPTR IfSetFieldVisible que permite volver visible o
invisible a una etiqueta o a un campo.
Entonces:
1) Poner el mensaje nº 5 en el campo CHOOSE cuyo cambio afecta la visibilidad de los otros
campos o etiquetas.
2) Según el contenido actual del campo CHOOSE, decidiremos si algún campo o etiqueta debe
ser visible o invisible.
A continuación el código con su respectiva explicación que puedes copiar y pegar en el editor
de Debug4x
xNAME VisibleEncima ( -> ob1 ob2 ob3 T // F )
:: CK0 ( No se requieren argumentos )
* ETIQUETAS
"Escoge:" BINT1 BINT10
"Dato 1:" BINT1 BINT31
"Dato 2:" BINT1 BINT31
* CAMPO Nº #0
* ES UN CAMPO CHOOSE.
* CON LA OPCION CERO, SE HACEN INVISIBLES LAS ETIQUETAS Y LOS CAMPOS #1 Y #2
* CON LA OPCION UNO, SE HACE VISIBLES LA ETIQUETA Y EL CAMPO #1
* CON LA OPCION DOS, SE HACE VISIBLES LA ETIQUETA Y EL CAMPO #2
' :: BINT5 #=casedrop ( IfMsgSetFieldValue ) ( VExt -> VInt flag )
:: ( {} )
DUP ( {} {} )
TWONTHCOMPDROP_ ( {} # )
:: BINT0 #=casedrop
:: BINT1 FALSE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #1 invisible )
BINT1 TRUE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #1 invisible )
BINT2 FALSE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #2 invisible )
BINT2 TRUE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #2 invisible )
;
BINT1 #=casedrop
:: BINT1 FALSE TRUE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #1 visible )
BINT1 TRUE TRUE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #1 visible )
BINT2 FALSE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #2 invisible )
BINT2 TRUE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #2 invisible )
;
BINT2 #=casedrop
:: BINT1 FALSE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #1 invisible )
BINT1 TRUE FALSE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #1 invisible )
BINT2 FALSE TRUE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve etiqueta #2 visible )
BINT2 TRUE TRUE
FLASHPTR IfSetFieldVisible ( OBS: Vuelve campo #2 visible )
;
;
TRUE ( {} TRUE )
;
DROPFALSE
; ( Message Handler del campo )
35 9 93 8 ( Posición y tamaño: #x #y #b #h )
BINT12 ( #TipoDeCampo: #12=Choose )
MINUSONE ( TiposPermitidos: MINUSONE=No se aplica a Choose )
BINT16 ( #Decompile: #16=16+0 1º elem de lista y sin descompilación )
"Ayuda del Choose de abajo" ( "Ayuda": se mostrará abajo )
{ { "OPCION 0" BINT0 }
{ "OPCION 1" BINT1 }
{ "OPCION 2" BINT2 } } ( ChooseData )
BINT16 ( #ChooseDecompile: cualquier valor )
{ "OPCION 0" BINT0 } DUP ( Valor Reset y Valor Inicial )
* CAMPO Nº #1
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
* PARA QUE PUEDA SER VISIBLE ESTE CAMPO, EL CAMPO #0 DEBE CONTENER LA OPCION 1
'DROPFALSE ( Message Handler del campo )
35 30 92 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT2 ( #Decompile: #2=Formato actual y Fuente Normal )
"Campo 1: número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
BINT2 ( #ChooseDecompile: cualquier valor )
%17 DUP ( Valor Reset y Valor Inicial )
* CAMPO Nº #2
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
* PARA QUE PUEDA SER VISIBLE ESTE CAMPO, EL CAMPO #0 DEBE CONTENER LA OPCION 2
'DROPFALSE ( Message Handler del campo )
35 30 92 8 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT2 ( #Decompile: #2=Formato actual y Fuente Normal )
"Campo 2: número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
BINT2 ( #ChooseDecompile: cualquier valor )
%35_ DUP ( Valor Reset y Valor Inicial )
FLASHPTR IfMain
;
Ejemplo 9 DoInputForm
Insertar un grob en un formulario de entrada
* CAMPO Nº #1
* ES UN CAMPO TEXTO. CONTIENE A UN NÚMERO REAL.
'DROPFALSE ( Message Handler del campo )
25 9 103 9 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT4 ( #Decompile: #4=Formato estándar )
"Escribe un número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
MINUSONE ( ChooseDecompile: MINUSONE para campo texto )
%25 DUP ( Valor Reset y Valor Inicial )
* ETIQUETAS
"Negrita:" $->NEGRITA $>GROB BINT1 BINT9
"Cursiva:" $->CURSIVA $>GROB BINT1 BINT18
"Subrayado:" $->SUBRAYADA $>GROB BINT1 BINT27
"Inversa:" $->INVERSA $>GROB BINT1 BINT36
* CAMPO TEXTO
'DROPFALSE ( Message handler )
65 8 60 9 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT4 ( #Decompile: #4=Formato estándar )
"Escribe un número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
MINUSONE ( ChooseDecompile: MINUSONE para campo texto )
%25 DUP ( Valor reset y Valor inicial )
DoInputForm
;
* ETIQUETAS
"Negrita:" BINT1 BINT10
"Cursiva:" BINT1 BINT19
"Subrayado:" BINT1 BINT28
"Inversa:" BINT1 BINT37
DoInputForm
;
* ETIQUETAS
"Negrita:" BINT1 BINT10
"Cursiva:" BINT1 BINT19
"Subrayado:" BINT1 BINT28
"Inversa:" BINT1 BINT37
* ETIQUETA
"Etiqueta:" BINT1 BINT12
* CAMPO TEXTO
'DROPFALSE ( Message handler )
42 11 61 9 ( Posición y tamaño: #x #y #b #h )
BINT1 ( #TipoDeCampo: #1=Texto )
{ BINT0 } ( TiposPermitidos: #0=Reales )
BINT4 ( Decompile: #4=Formato estándar )
"Escribe un número real" ( "Ayuda" )
MINUSONE ( ChooseData: MINUSONE para campo texto )
MINUSONE ( ChooseDecompile: MINUSONE para campo texto )
%25 DUP ( Valor reset y Valor inicial )
DoInputForm
;
*** Dada una cadena o bint la pone en un grob de
*** tamaño 131 x 7 con fondo oscuro en la pila
NULLNAME TITULO->GROB131x7_INVERSA ( $/# -> grob131x7 )
:: ( $/# )
DUPTYPEBINT?
IT JstGETTHEMSG
( $ )
BINT1 BINT32 SUB$ ( $ ) ( corta la cadena si es mayor a 32 caract )
BINT7 BINT131 ( $ 7 131 )
MAKEGROB ( $ grob131x7_blanco )
BINT33 ( $ grob131x7_blanco 33 )
3PICK LEN$ ( $ grob131x7_blanco 33 #w )
#-#2/ ( $ grob131x7_blanco #[33-w]/2 )
Blank$ ( $ grob131x7_blanco $' )
ROT ( grob131x7_blanco $' $ )
&$ ( grob131x7_blanco $'' )
$>grob ( grob131x7_blanco grob' )
ONEONE ( grob131x7_blanco grob' #1 #1 )
Repl ( grob131x7 )
INVGROB ( grob131x7_inversa )
* Lo siguiente es sólo para redondear las esquinas del grob
ZEROZERO PixonW ( grob131x7_inversa )
BINT130 BINT0 PixonW ( grob131x7_inversa )
BINT0 BINT6 PixonW ( grob131x7_inversa )
BINT130 BINT6 PixonW ( grob131x7_inversa )
;
Ejemplo 13 DoInputForm
Verificar que todos los campos estén llenos al terminar el formulario con OK.
En este ejemplo, al presionar OK o ENTER se verifica que todos los campos estén llenos.
Si hay algún campo vacío, se evita la finalización del formulario (y se muestra el mensaje
“escribe todos los datos”).
* ETIQUETAS
"Dato 1:" BINT1 BINT21
"Dato 2:" BINT1 BINT31
DoInputForm
;
Ejemplo 14 DoInputForm
Verificar que los valores de los campos cumplan alguna condición antes de
confirmar la salida con OK o ENTER.
En este ejemplo, al presionar OK o ENTER se verifica que los valores de los campos
cumplan alguna condición.
Si algún campo no cumple una condición, entonces se muestra un mensaje de advertencia y
no se termina el formulario. Además, el enfoque va hacia ese campo.
* ETIQUETAS
"A:" BINT1 BINT21
"B:" BINT1 BINT31
DoInputForm
;
Ejemplo 15 DoInputForm.
Retornar el valor de un campo como grob.
NULLNAME DoMH9_MiniFuente
:: BINT9 #=casedrop ( #c -> #c grob T // #c F )
:: ( #c )
DUP ( #c #c )
ROMPTR 0B0 045 ( #c $ )
OVER ( #c $ #c )
ROMPTR 0B0 0CA ( #c $ #b #h )
ROTDUP ( #c #b #h $ $ )
LEN$ ( #c #b #h $ #car )
BINT4 ( #c #b #h $ #car #6 )
#* ( #c #b #h $ #6·car )
4PICK ( #c #b #h $ #6·car #b )
DUPUNROT ( #c #b #h $ #b #6·car #b )
#< ( #c #b #h $ #b flag )
ITE
DROP ( #c #b #h $ )
:: ( #c #b #h $ #b )
BINT4 ( #c #b #h $ #b #6 )
#/ ( #c #b #h $ #residuo #b/6 )
SWAPDROP ( #c #b #h $ #b/6 )
1_#1-SUB$ ( #c #b #h $' )
CHR_... ( #c #b #h $' chr )
>T$ ( #c #b #h $'' )
;
$>grob ( #c #b #h grob )
3UNROLL ( #c grob #b #h )
SWAP ( #c grob #h #b )
MAKEGROB ( #c grob grobbxh )
DUPUNROT ( #c grobbxh grob grobbxh )
ONEONE ( #c grobbxh grob grobbxh #1 #1 )
GROB! ( #c grobbxh' )
TRUE ( #c grobbxh' T )
;
DROPFALSE
;
Ejemplo 17 DoInputForm
Alinear campos a la derecha respetando el parámetro Decompile.
Usando este message handler, el valor del campo (que no sea campo check) será mostrado
a la derecha respetando el parámetro Decompile del campo y con fuente normal.
Para verlo en minifuente cambia BINT6 por BINT4 y $>GROB por $>grob.
Puedes poner este NULLNAME como el message handler en cada campo donde desees
que su contenido se muestre pegado a la derecha.
En este ejemplo veremos como usar el mensaje 46 para validar un campo que acepte a
números reales.
En este caso hay dos campos que contienen a números reales. La validación se hará
solamente en el primer campo. Por ejemplo, para este campo el número real será válido si
es positivo. De esta manera, si el objeto es de un valor inválido, deberemos de retornar
FALSE TRUE. En otro caso, sólo se deberá agregar FALSE, para que se realice la acción por
defecto, es decir, aceptar el valor ingresado.
Por ejemplo, si el usuario ingresa -12.29 (como se muestra en la figura), en el campo no se
guardará el número y se mostrará la alerta “Invalid Object Value”.
De esta manera, está asegurado que al salir del formulario con ENTER u OK, siempre será
retornado un valor válido; y ya no será necesario usar el mensaje 29 en el message handler
del formulario.
xNAME DoValidReal ( -> ob1 ob2 T // F )
:: CK0 ( No se requieren argumentos )
* ETIQUETAS
"A:" BINT1 BINT21
"B:" BINT1 BINT31
DoInputForm
;
Ejemplo 19 DoInputForm
Validación de datos con mensaje personalizado.
Número real y positivo.
Este ejemplo es similar al anterior. La diferencia es que ahora puedes colocar un mensaje
personalizado cuando hay un objeto inválido.
Aquí se manipula la pila de retornos. A continuación mostramos el código sin explicación.
xNAME DoValidRealPers ( -> ob1 ob2 T // F )
:: CK0 ( No se requieren argumentos )
* ETIQUETAS
"A:" BINT1 BINT21
"B:" BINT1 BINT31
DoInputForm
;
Ejemplo 20 DoInputForm
Cambiando automáticamente una entrada inválida.
Número real entero y positivo.
En este ejemplo hay un campo texto que acepta sólo números reales.
Sólo se aceptan números reales que sean enteros y positivos.
Si el usuario escribe un número negativo, la calculadora automáticamente le cambia de
signo. También, si el número tiene parte decimal, automáticamente el número es
redondeado de manera que el valor guardado en el campo (valor interno) sea siempre un
número real entero y positivo.
Por ejemplo, si el usuario ingresa -3.74 (como se muestra en la figura), en el campo se
guardará el número 4 en lugar del número ingresado.
Por lo tanto, el valor del campo devuelto al finalizar con OK o ENTER será siempre un
número real que sea entero y positivo.
En este ejemplo hay un campo combofiler que contiene una formación (matriz o arreglo).
Con el mensaje 9, podemos ver la formación como un grob.
Con el mensaje 23, podemos editar la formación en el MTRW al presionar EDIT.
Con el mensaje 36, el campo también aceptará a matrices simbólicas (tipo 29).
Con el mensaje 37, evitaremos que en el filer sean escogidas varias formaciones a la vez
(selección múltiple).
ITE
:: DUPTYPELIST? ( ob' flag )
ITE
FALSE ( ob' F )
TrueTrue ( ob' T T )
;
FalseTrue
UNTIL
( RealArry/CArry/MATRIX T // F )
;
;
Ejemplo 22 DoInputForm
Campo combofiler con un arreglo real.
Manejando los mensajes 9, 23, 37 y 29.
En este ejemplo hay un campo combofiler que debe contener a un arreglo real.
Con el mensaje 9, podemos ver la formación como un grob.
Con el mensaje 23, podemos editar la formación en el MTRW al presionar EDIT.
Con el mensaje 37, evitaremos que en el filer sean escogidas varias formaciones a la vez
(selección múltiple). También evitaremos que sean escogidas matrices simbólicas.
Con el mensaje 29, podemos evitar la finalización del formulario (al presionar ENTER u OK),
si el campo 2 está vacío.
NULLNAME MH_Form_DoEjemplo22
:: BINT29 #=casedrop ( -> T/F T // F )
:: ( )
BINT2 ( #2 )
ROMPTR gFldVal ( ob )
TYPERARRY? ( flag )
NOTcase
:: ( )
BINT2 ( #2 )
ChangeFocus3 ( )
"ESCRIBE ARREGLO REAL" FlashWarning
FalseTrue ( F T )
;
TrueTrue ( T T )
;
DROPFALSE
;
* CONVIERTE ob A GROB PEQUEÑO USANDO MINIFUENTE
* Intenta convertir a grob con FLASHPTR EQW3GROBmini
* Si no es posible hace lo siguiente:
* Si ob es un grob, no hace nada.
* Si ob es una cadena, hace $>grobCR
* Si ob es de otro tipo, hace FLASHPTR FSTR11 $>grobCR
NULLNAME ob>grobmini ( ob -> grob )
:: ( ob )
BEGIN
:: DUP ( ob ob )
FLASHPTR EQW3GROBmini ( ob ext grob #0 // ob ob #1/2 )
BINT0 #=casedrop
:: UNROT2DROP TRUE ; ( OBS: SALE CON grob T ) ( SALE DE BUCLE )
( ob ob #1/2 )
BINT1 #=case
:: GARBAGE DROPFALSE ; ( OBS: SALE CON ob F ) ( REPITE BUCLE )
( ob ob )
TYPEGROB? ( ob flag )
caseTRUE
( ob )
DUPTYPECSTR? ( ob flag )
?SKIP
FLASHPTR FSTR11
( $ )
$>grobCR ( grob )
TRUE ( grob T ) ( SALE DE BUCLE )
;
UNTIL ( OBS: NECESITA TRUE PARA SALIR DE BUCLE BEGIN UNTIL )
( grob )
;
Comando Grob
ABUFF Grob pantalla de texto (mostrar pila).
GBUFF Grob pantalla gráfica (PICT).
HARDBUFF Cualquiera de las dos anteriores (la que se encuentre activa).
HARDBUFF2 Etiquetas de menú (su tamaño es de 131x8)
Algo que debemos observer es que los comandos de arriba retornan solo punteros a los
grobs, de tal forma que si alteras el grob, la pantalla también será alterada automáticamente.
La mayoría de veces este comportamiento es deseado, pero si no quieres eso, llama a
TOTEMPOB después de usar cualquiera de los comandos de arriba para hacer una copia en
la memoria temporal. Ver la sección 25.1.4 para más información sobre la memoria temporal
y las referencias a objetos.
Las pantallas ABUFF y GBUFF pueden ampliarse y se puede observar a través de estas.
En cambio, la pantalla que muestra las etiquetas de menú tiene un tamaño fijo de 131x8
píxeles.
El comando TOADISP activa la pantalla de texto (la vuelve visible), y el comando
TOGDISP activa a la pantalla gráfica.
La pantalla de texto es dividida en tres regiones. Las áreas de la pantalla son numeradas
como uno, dos y tres. En muchos comandos encontrarás la parte “DA”, la cual significa
“Display Area”. La siguiente figura muestra cada una de estas tres áreas en la HP 50g.
Filas 72-79
DA 3 Altura 8
(56-63 en hp49g)
El area 2 ocupa las filas 16 a 71 (altura 56) y está dividida en dos areas: 2a y 2b.
El área 2a corresponde a la zona donde se muestra la pila.
El área 2b corresponde a la zona donde se muestra la línea de edición.
39.2 Preparando la Pantalla
Dos comandos establecen control sobre la pantalla de texto: RECLAIMDISP y
ClrDA1IsStat.
El primero hace lo siguiente:
• Establece a ABUFF como la pantalla activa.
• Limpia toda la pantalla ABUFF.
• Redimensiona ABUFF a su tamaño por defecto (131x80 píxeles en la HP 50g)
Este comando puede parecerse al comando CLLCD de User RPL, aunque este último
sólo limpia ABUFF sin cambiar su tamaño.
El comando ClrDA1IsStat es opcional, pero la mayoría de las veces debería ser
usado. Este comando suspende la presentación del reloj temporalmente. La mayoría de los
programas que usan la pantalla para mostrar algo no desean tener un reloj mostrado en la
pantalla.
Cuando no es necesario mostrar las etiquetas de menú, usa el comando TURNMENUOFF
para esconder HARDBUFF2 y observar en toda la pantalla a ABUFF o GBUFF.
Para volver visibles nuevamente a las etiquetas de menú usa el comando TURNMENUON.
Para más detalles del menu, lee el capítulo 40.
La plantilla sugerida para una aplicación que usa la pantalla de texto es:
::
ClrDA1IsStat ( suspende reloj temporalmente )
RECLAIMDISP ( fija como actual, limpia y redimensiona a ABUFF )
TURNMENUOFF ( oculta el menú ) ( opcional )
* aplicación aquí
* aplicación aquí
* aplicación aquí
ClrDAsOK ( redibuja la pantalla )
* O también puedes usar:
SetDAsTemp ( congela toda la pantalla )
;
Comando Acción
SetDA1Temp Congela DA1.
SetDA2OKTemp Congela DA2.
SetDA3Temp Congela DA3.
SetDA12Temp Congela DA1 y DA2.
SetDAsTemp Congela toda la pantalla.
ClrDA1OK Redibuja DA1.
ClrDA2OK Redibuja DA2.
ClrDA3OK Redibuja DA3.
ClrDAsOK Redibuja toda la pantalla.
39.4 Limpiando la Pantalla
Los siguientes comandos limpian HARDBUFF, todo el grob o una parte. Recuerda que
HARDBUFF se refiere al grob actualmente mostrado (ABUFF o GBUFF). Estos commandos
no toman argumentos, excepto por el comando BLANKIT. En la sección de referencia de
abajo puedes ver más detalles del uso de estos comandos y también otros relacionados a
limpiar la pantalla.
Comando Acción
CLEARVDISP Limpia HARDBUFF sin cambiar su tamaño.
BlankDA1 Limpia DA1.
BlankDA2 Limpia DA1.
BlankDA12 Limpia DA1 y DA2.
Clr16 Limpia DA1 (limpia filas 0-15 de la ventana actual).
Clr8 Limpia primera parte de DA1 (limpia filas 0-7 de la ventana actual).
Clr8-15 Limpia segunda parte de DA1 (limpia filas 8-15 de la ventana actual).
CLCD10 Limpia DA1 y DA2.
HARDBUFF debe tener un ancho exacto de 131.
CLEARLCD Limpia HARDBUFF sin cambiar su tamaño y también quita las etiquetas de
menu de la pantalla.
HARDBUFF debe tener un ancho exacto de 131.
BLANKIT ( #FilaInic #Filas )
Limpia #Filas de HARDBUFF, empezando por #FilaInic.
Para mostrar texto en la pantalla puedes usar los comandos de la sección 39.6.11.
Si el flag 72 está activado (Stack:mini font), el texto se mostrará en minifuente.
Si el flag 72 está desactivado (Stack:current fnt), el texto se mostrará con fuente de sistema.
En la HP 50g siempre se podrá ver por lo menos a nueve líneas.
Para mostrar texto en la pantalla también puedes usar los comandos del capítulo 15, tales
como: $>grob, GROB! o XYGROBDISP. Para más información sobre estos comandos y
otros relacionados a grobs, puedes revisar el capítulo 15.
25FEA DISPLASTROWBUT1 ( $ )
Muestra la cadena casi al final (una línea más abajo que al
usar DISPLASTROW).
Muestra la cadena con fuente de sistema o minifuente de
acuerdo al estado del flag 72.
Si el flag 72 está activado (Stack:mini font), la muestra en la
línea 12.
Si el flag 72 está desactivado (Stack:current fnt), la muestra en
la línea 12, 11 ó 10, según la altura de la fuente (6, 7 u 8
respectivamente).
Cuando la altura de la fuente sea 7 u 8, la cadena se verá, sólo
si el menú es invisible.
Direcc. Nombre Descripción
2EEFF DispCoord1 ($ )
Muestra la cadena en HARDBUFF2 usando la minifuente.
Observa que es puesta en HARDBUFF2. Por lo tanto, esta
cadena no se verá cuando el menú se ha hecho invisible (por
ejemplo, al usar TURNMENUOFF).
Puedes usar este comando cuando la pantalla activa sea
ABUFF o GBUFF.
2F32B DISPCOORD2 ($ )
Llama a DispCoord1 para mostrar la cadena.
Luego espera a que el usuario presione una tecla.
Cuando el usuario presiona cualquier tecla, se vuelve a mostrar
el menú.
Finalmente, llama a InitEdModes.
0C8002 ^DISPROW1_plus_ ( $ )
Primero, limpia las filas 0-7 de la ventana actual con Clr8.
Luego, muestra la cadena en una línea con su esquina superior
izquierda en la posición (#x1,#y1) (esquina superior izquierda
de la ventana actual).
Muestra la cadena con fuente de sistema o minifuente de
acuerdo al estado del flag 72.
Puede mostrar en ABUFF y también en GBUFF (con ancho
mayor o igual a 131).
25EAB DISPROW1* ($ )
Hace lo mismo que ^DISPROW1_plus_, pues sólo llama a este.
0C9002 ^DISPROW2_plus_ ( $ )
Primero, limpia las filas 0-7 de la ventana actual con Clr8-15.
Luego, muestra la cadena en una línea con su esquina superior
izquierda en la posición (#x1,#y1+8).
Muestra la cadena con fuente de sistema o minifuente de
acuerdo al estado del flag 72.
Puede mostrar en ABUFF y también en GBUFF (con ancho
mayor o igual a 131).
25EAC DISPROW2* ($ )
Hace lo mismo que ^DISPROW2_plus_, pues sólo llama a este.
25EAD DISPSTATUS2 ($ )
Muestra el mensaje en el área de estado (en la ventana actual)
usando las 2 líneas.
Para esto separa la cadena en dos partes.
La primera línea es mostrada con ^DISPROW1_plus_
El resto de la cadena es mostrada con ^DISPROW2_plus_
Puede mostrar en ABUFF y también en GBUFF.
38C00 (DoPrompt) ($ )
Hace DISPSTATUS2 y luego congela el area de estado (sólo
congela cuando la pantalla actual es ABUFF).
Por ejemplo, si la pantalla actual es ABUFF y la cadena es:
"HonradosHP\0AEl mejor foro\0Ade HP", se mostrará:
Direcc. Nombre Descripción
25F12 sstDISP ($ )
( romptr )
Muestra el objeto en las dos primeras filas con DISPSTATUS2
y luego congela la línea de estado.
25ED4 FlashMsg ($ )
Muestra el mensaje en el área de estado (de la ventana actual)
usando DISPSTATUS2, durante casi 1 segundo. Luego
devuelve el área de estado a su valor anterior.
Ni siquiera congelando la pantalla después, es posible seguir
viendo el mensaje.
02E002 ˆDoAlert ($ )
(# )
Similar al comando FlashWarning, pero congela la pantalla.
Con el comando FlashWarning, la pantalla era redibujada
luego de que el usuario decidía continuar.
2EE60 DoWarning ($ )
Establece a ABUFF como la pantalla activa y luego llama al
comando ˆDoAlert.
007002 ˆCk&DoMsgBox ($ )
(# )
Parecido al comando FlashWarning, pero no muestra el grob
de alerta y no hace beep.
Al igual que el comando FlashWarning, la pantalla es
redibujada luego de que el usuario decide continuar.
Direcc. Nombre Descripción
0000B1 ˜DoMsgBox ( $/# ob ob' grob menu T )
( $/# ob ob' MINUSONE menu T )
Con este comando puedes mostrar un mensaje como al usar
FlashWarning, pero de manera personalizada. Puedes
colocar el menú y el grob que desees. Si no deseas ningún
grob, pon MINUSONE, (como al usar ˆCk&DoMsgBox).
ob y ob’ son dos objetos cualesquiera.
El menu es un objeto tal como se describe en el capítulo 40.
Este comando es llamado por FlashWarning, ˆDoAlert y
ˆCk&DoMsgBox.
0040B1 ˜MsgBoxMenu ( menu )
Retorna el menu por defecto que se puede usar al llamar al
comando ˆCk&DoMsgBox para mostrar mensajes
personalizados. Por ejemplo, el siguiente código hace lo mismo
que el comando FlashWarning sobre la cadena:
:: "HonradosHP\0AEl mejor foro" ( $ )
ZEROZERO ( $ #0 #0 )
ROMPTR grobAlertIcon ( $ #0 #0 grob )
' ROMPTR MsgBoxMenu ( $ #0 #0 grob menu )
ERRBEEP ( $ #0 #0 grob menu ) ( beep )
ROMPTR DoMsgBox ( T )
DROP ( )
;
Ejemplo 1 DoMsgBox
El siguiente programa muestra un mensaje
personalizado con el comando
ROMPTR DoMsgBox.
Puedes poner el grob que desees y
también cualquier menú.
En las figuras de la derecha se muestra el
resultado.
BEGIN
:: FALSE ( F )
WaitForKey ( F #ct #p )
BINT1 #=casedrop
:: ( F #ct )
BINT10 #=casedrop
SCROLLUP ( sale con F )
BINT15 #=casedrop
SCROLLDOWN ( sale con F )
BINT14 #=casedrop
SCROLLLEFT ( sale con F )
BINT16 #=casedrop
SCROLLRIGHT ( sale con F )
BINT47 #=casedrop
DROPTRUE ( sale con T )
BINT51 #=casedrop
DROPTRUE ( sale con T )
DropBadKey ( F )
;
BINT2 #=casedrop
:: ( F #ct )
BINT10 #=casedrop
:: ( F )
REPEATER
10
:: ( F F )
WINDOWCORNER ( F F #y #x )
SWAP ( F F #x #y )
FLASHPTR 001 578 ( F F #x #y 80 )
DIFF_OR_ZERO_ ( F F #x #u[y-80] )
SWAP ( F F #u[y-80] #x )
WINDOWXY ( F F )
;
( F )
;
BINT15 #=casedrop
:: ( F )
REPEATER
15
:: ( F F )
WINDOWCORNER ( F F #y #x )
SWAP ( F F #x #y )
FLASHPTR 001 578 ( F F #x #y 80 )
#+ ( F F #x #y+80 )
HARDHEIGHT ( F F #x #y+80 #h )
FLASHPTR 001 578 ( F F #x #y+80 #h 80 )
#- ( F F #x #y+80 #h-80 )
#MIN ( F F #x #min[y+80,h-80] )
SWAP ( F F #min[y+80,h-80] #x )
WINDOWXY ( F F )
;
( F )
;
BINT14 #=casedrop
:: ( F )
REPEATER
14
:: ( F F )
WINDOWCORNER ( F F #y #x )
BINT131 ( F F #y #x 131 )
DIFF_OR_ZERO_ ( F F #y #u[x-131] )
WINDOWXY ( F F )
;
( F )
;
BINT16 #=casedrop
:: ( F )
REPEATER
16
:: ( F F )
WINDOWCORNER ( F F #y #x )
BINT131 ( F F #y #x 131 )
#+ ( F F #y #x+131 )
HARDBUFF ( F F #y #x+131 GROB )
GROBDIMw ( F F #y #x+131 #w )
BINT131 ( F F #y #x+131 #w 131 )
#- ( F F #y #x+131 #w-131 )
#MIN ( F F #y #min[#x+131,w-131] )
WINDOWXY ( F F )
;
( F )
;
DropBadKey ( F )
;
BINT3 #=casedrop
:: ( F #ct )
BINT10 #=casedrop
JUMPTOP ( sale con F )
BINT15 #=casedrop
JUMPBOT ( sale con F )
BINT14 #=casedrop
JUMPLEFT ( sale con F )
BINT16 #=casedrop
JUMPRIGHT ( sale con F )
BINT47 #=casedrop
TurnOff ( sale con F )
DropBadKey ( F )
;
2DropBadKey ( F )
; ( T/F )
UNTIL
( )
TOADISP ( ) ( vuelve a ABUFF como la pantalla activa )
1GETABND ( grob ) ( retorna el contenido de 1LAM y abandona entorno temporal )
GROB>GDISP ( ) ( restaura el valor guardado de GBUFF )
;
Ejemplo 3 ScrollGrobDelta
Este programa es similar al anterior. De esta manera, podrás ver un grob usando toda la
pantalla y sin el menú.
Las diferencias son:
- Al presionar una tecla de dirección puedes desplazarte de 7 píxeles en 7 píxeles (más
rápido que en el programa anterior donde el desplazamiento era de 1 píxel en 1 píxel).
- Sólo funciona en HP 50g y HP 49g+ (pantalla de 131x80).
- El gráfico es mostrado en la pantalla de texto (el otro se mostraba en la pantalla gráfica).
' NULLLAM BINT7 NDUPN DOBIND ( Crea entorno temporal con 7 LAMS )
* 7LAM=GROB 6LAM=#h 5LAM=#w 4LAM=#x 3LAM=#y 2LAM=programa 1LAM=#d
Los siguientes comandos convierten varios tipos de objetos a etiquetas de menú y las
muestran en la columna especificada.
Los siguientes comandos convierten cadenas a los cuatro tipos diferentes de grobs de
etiquetas de menú.
Si LabelObj es un grob, deberá tener un tamaño exacto de 21x8 para que se muestre
directamente como etiqueta de menú.
Si LabelObj es un id que corresponde a una variable del directorio actual o de más arriba
y este id corresponde a un directorio, la etiqueta será de tipo directorio. De lo contrario, será
de tipo estándar.
KeyProcLS indica la acción al presionar shift izquierdo + tecla de menú (LS = Left Shift).
KeyProcRS indica la acción al presionar shift derecho + tecla de menú (RS = Right Shift).
Al presionar una tecla de menú, KeyProc será ejecutado por un ejecutor especial que
tomará las acciones apropiadas de acuerdo al tipo de objeto que sea KeyProc.
Si KeyProc es un programa con TakeOver como su primer comando, se hará caso
omiso al ejecutor normal.
40.2 Propiedades de un Menú
El sistema de menus de la HP 50g tiene una flexibilidad impresionante. Más allá de las
acciones normales, un menu tiene muchas propiedades las cuales definen la apariencia de
las etiquetas, las acciones que se tomarán cuando se presionen las teclas, las acciones que
se tomarán cuando el directorio actual cambie, las acciones a ejecutarse cuando un nuevo
menú es instalado, etc.
Las propiedades que tiene todo menú son:
Shift izquierdo +
Activa el flag de sistema
tecla de menú
Shift derecho +
Desactiva el flag de sistema
tecla de menú
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME MenuFlags
:: CK0 ( ) ( No se requieren argumentos )
{
{ :: TakeOver "REL" BINT40 TestSysFlag Box/StdLabel ; BINT40 }
{ :: TakeOver BINT41 SysITE "24H" "AMPM" MakeBoxLabel ; BINT41 }
{ :: TakeOver BINT103 SysITE "COMP" "REAL" MakeBoxLabel ; BINT103 }
{ :: TakeOver BINT105 SysITE "APRO" "EXAC" MakeBoxLabel ; BINT105 }
}
BINT1 ( menu #mrow )
StartMenu ( )
;
Ejemplo 2 Menú
Modificando las propiedades del menú VAR, para prevenir un cambio en el
contenido de las variables.
En este ejemplo se instala el menu VAR y luego se modifican las propiedades LabelDef y
MenuKeyLS.
- La propiedad LabelDef es modificada para que las etiquetas de menú sean mostradas en
modo inverso.
- La propiedad MenuKeyLS de manera que no se pueda cambiar el contenido de la
variable al usar Shift derecho + tecla de menú. En lugar de eso, se mostrará un mensaje
de alerta.
Nota que se protégé el contenido de las variables de un cambio al presionar shift izquierdo +
tecla de menú. No se protege la variable del uso del comando STO ni del cambio de su
contenido a través del filer.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME MenuVarProt ( -> )
:: ( )
MenuMaker
:: ( )
ROMPTR 0A9 002 ( ) ( El menú VAR por defecto, menú tipo D )
' :: ( #col id/$ )
DUPTYPECSTR? ( #col id/$ flag )
NOT_IT DECOMP$
( #col $ )
MakeInvLabel ( #col grob ) ( crea etiqueta de menú inversa )
Grob>Menu ( ) ( muestra etiqueta de menú )
;
LabelDef! ( ) ( fija la propiedad LabelDef )
' :: ( id/prog )
DUPTYPEIDNT? ( id/prog flag )
NOTcase
EVAL
( id )
DECOMP$ ( $ ) ( convierte a cadena sin comillas )
"\0A is protected" &$ ( $ )
FlashWarning ( )
;
MenuKeyLS! ( ) ( fija la propiedad MenuKeyLS )
;
( prog ) ( menú tipo D )
DoMenuKey
;
Ejemplo 3 Menú
Modificando las propiedades del menú VAR, para prevenir un cambio en el
contenido de una variable que cumpla una condición.
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME MenuVarProt2 ( -> )
:: ( )
MenuMaker
:: ( )
ROMPTR 0A9 002 ( ) ( El menú VAR por defecto, menú tipo D )
' :: ( #col id/$ )
DUPTYPECSTR? ( #col id/$ flag )
case
Str>Menu ( sale con: )
( #col id )
DUP ( #col id id )
PROTECTED? ( #col id flag )
ITE
:: ID>$ ( #col $ )
MakeInvLabel ( #col grob ) ( crea etiqueta de menú inversa )
Grob>Menu ( ) ( muestra etiqueta de menú )
;
Id>Menu ( )
;
LabelDef! ( ) ( fija la propiedad LabelDef )
' :: ( id/prog )
DUPTYPEIDNT? ( id/prog flag )
NOTcase
EVAL
( id )
DUP
PROTECTED?
NOTcase
StdMenuKeyLS
En este ejemplo se fija la propiedad Rebuild como TRUE para actualizar el menú
inmediatamente al producirse cambios en el número de elementos de la pila.
41.1 Terminología
Los siguientes términos aparecerán con frecuencia en este capítulo.
Término Significado
Linea de Edición La cadena que está siendo editada actualmente. También es llamada
“Buffer” y “Línea de comandos”. En los diagramas de pila, usaremos
$buf para mencionar a esta cadena.
Posición del Cursor La posición del cursor en la línea de edición. Representada por un
bint. En los diagramas de pila, nos referimos a este bint como #cpos.
Línea Actual La línea actual en el editor. Es una subcadena comprendida desde
después del SALTO DE LINEA antes del cursor hasta el siguiente
SALTO DE LINEA.
Ventana del Editor Cuando el texto que se está editando es muy largo y/o muy ancho, la
pantalla de la HP 50g muestra sólo una parte del texto: la ventana.
Cuando el cursor es movido, a veces la ventana debe moverse
también para mostrar la nueva posición del cursor.
Selección Una region en el buffer puede ser seleccionada cuando el marcador
inicial y el marcador final están activos. La subcadena seleccionada es
llamada $sel en los diagramas de pila.
Inicio de Palabra El comienzo de una palabra, una posición en una cadena donde el
carácter anterior es ESPACIO o SALTO DE LINEA, y el carácter que
se encuentra después no es un carácter en blanco. Varios comandos
tratan con la posición del inicio de palabra. Esta posición es llamada
#ws en los diagramas de pila de abajo.
Caracteres Invisibles La HP 50g puede mostrar texto en diferentes fuentes y estilos. Para
alternar entre diferentes fuentes y estilos, marcadores especiales son
insertados dentro del texto para indicar un cambio en la fuente o en el
estilo. Estos marcadores son secuencias de tres caracteres los cuales
no son visibles, pero si cuentan en la longitud de la cadena o para
definir la posición del cursor. Algunos comandos que manejan al editor
son concientes de estas cadenas y hacen cálculos complicados para
cortar y pegar texto con estos atributos especiales. Esta es la razón
por la cual estos comandos son más lentos de lo que podrían ser. Si tu
no usas fuentes y estilos, no deberías preocuparte sobre esto.
41.2 Referencia
41.2.1 Estado
Direcc. Nombre Descripción
257A2 EditLExists? ( flag )
Retorna TRUE si existe una línea de edición.
2EEED NoEditLine? ( flag )
Retorna TRUE si no existe una línea de edición.
2F196 RCL_CMD ( $buf )
Retorna una copia de la línea de edición actual a la pila.
2EEEB EDITLINE$ ( $buf )
Retorna una copia de la línea de edición actual a la pila.
Hace lo mismo que RCL_CMD, pues sólo llama a este.
2F197 RCL_CMD2 ( $buf )
Similar a RCL_CMD, pero si no hay suficiente memoria para
copiar la línea de edición a la pila, este comando moverá la
línea de edición actual a TEMPOB, mientras muestra en la
línea de estado el mensaje “Low Memory Condition
Please Wait…”. De hecho, esto borrará la actual linea de
edición.
2EF87 RCL_CMD_POS (# )
Retorna la posición actual del cursor.
26585 CURSOR@ (# )
Retorna la posición actual del cursor.
26594 (CURSOR_PART) (# )
Retorna la fila (línea) donde se encuentra el cursor.
2F158 (ChrAtCur) ( chr )
Retorna el carácter que está detrás del cursor.
Si el cursor está al final de la cadena, retorna el carácter
número cero.
2EEEA CURSOR_END? ( flag )
Retorna TRUE, si el cursor está al final de una línea o al final
de la cadena, o si debajo del cursor está el carácter cero.
264CC FIRSTC@ (# )
Retorna la columna del extremo izquierdo de la ventana.
26030 CURSOR_OFF (# )
Retorna la posición actual del cursor relativa al extremo
izquierdo de la ventana. Es decir, el número de caracteres de
la línea actual entre el cursor y el extremo izquierdo de la línea
actual (columna relativa al extremo izquierdo, menos uno).
2EF91 CAL_CURS_POS ( #línea #col #c )
Calcula la posición en la actual línea de edición a partir de la
línea y el número de columna especificadas. El resultado
puede ser usado por el comando STO_CURS_POS para mover
el cursor a esa ubicación. Si #line es mayor que el número de
líneas en la línea de edición, halla la posición en la última línea.
2EF90 CAL_CURS_POS_VIS ( #c'+1 #c )
#c' es la posición del cursor ignorando los caracteres
invisibles.
#c es la posición del cursor al tomar en cuenta los caracteres
invisibles.
Este comando es usado por el comando STO_CURS_POS_VIS
para mover el cursor a esa localización.
Direcc. Nombre Descripción
2F199 RCL_CMD_MODE ( $data $buf )
Llama a una cadena $data la cual contiene el estado actual del
editor (como la posición del cursor y la posición de la ventana).
El resultado puede ser usado por el comando STO_CMD_MODE
para restaurar el estado de la línea de edición cuando se salió
temporalmente del editor con HALT o cuando se llama a un
programa que debe temporalmente cambiar el estado actual
del editor.
2F198 STO_CMD_MODE ( $data $buf )
Reinicia el editor en el estado en el que se dejó al llamar a
RCL_CMD_MODE.
2EF8C STO_CURS_POS2 (# )
Similar a STO_CURS_POS, pero pone el cursor casi en el
extremo derecho de la ventana como se indica en la figura.
2EF8D STO_CURS_POS3 (# )
Este comando es parecido a STO_CURS_POS, pero no verifica
las secuencias de cambios de estilo o de fuente.
Mientras que al usar STO_CURS_POS la posición del cursor es
corregida de tal manera que a la izquierda del cursor no hay
caracteres invisibles, con este comando puedes posicionar el
cursor en cualquier lugar, incluso entre caracteres invisibles.
2EF8E STO_CURS_POS4 ( # )
Con respecto al posicionamiento de la ventana del editor se
comporta como STO_CURS_POS2, pero con respecto a los
caracteres invisibles se comporta como STO_CURS_POS3.
2EF8F STO_CURS_POS_VIS ( #c'+1 )
Mueve el cursor a la posición especificada.
#c' es la posición del cursor ignorando los caracteres
invisibles.
Equivale a hacer :: CAL_CURS_POS_VIS STO_CURS_POS ;
2F378 SetCursor ( #posición )
( {#fila #col} )
Mueve el cursor a la posición indicada. Usado por el comando
InputLine para fijar la posición inicial del cursor.
Direcc. Nombre Descripción
2EF7C CMD_NXT ()
Mueve el cursor al carácter siguiente.
El cursor no debe estar al final de la cadena.
Equivale a apretar la tecla FLECHA DERECHA en el editor.
2EF7B CMD_BAK ()
Mueve el cursor al carácter anterior.
El cursor no debe estar al inicio de la cadena.
Equivale a apretar la tecla FLECHA IZQUIERDA en el editor.
2EF80 CMD_DOWN ()
Mueve el cursor a la siguiente línea.
El cursor no debe estar en la última línea.
Equivale a apretar la tecla FLECHA ABAJO en el editor.
2EF7F CMD_UP ()
Mueve el cursor a la anterior línea.
El cursor no debe estar en la primera línea.
Equivale a apretar la tecla FLECHA ARRIBA en el editor.
2EF7D CMD_DEB_LINE ()
Mueve el cursor al inicio de la línea actual.
Equivale a apretar la tecla RS+IZQUIERDA en el editor.
2EF7E CMD_END_LINE ()
Mueve el cursor al final de la línea actual.
Equivale a apretar la tecla RS+DERECHA en el editor.
2EF7A CMD_PAGED ()
Mueve el cursor una página hacia abajo.
Equivale a apretar la tecla LS+ABAJO en el editor.
2EF77 CMD_PAGEL ()
Mueve el cursor una página hacia la izquierda.
Equivale a apretar la tecla LS+IZQUIERDA en el editor.
2EF78 CMD_PAGER ()
Mueve el cursor una página hacia la derecha.
Equivale a apretar la tecla LS+DERECHA en el editor.
2EF79 CMD_PAGEU ()
Mueve el cursor una página hacia arriba.
Equivale a apretar la tecla LS+ARRIBA en el editor.
2F2EE DO<Skip ()
Mueve el cursor al inicio de la palabra.
Llama a STO_CURS_POS2.
Equivale a apretar SKIP en el menú EDIT.
2F2EF DO>Skip ()
Mueve el cursor al inicio de la siguiente palabra.
Llama a STO_CURS_POS.
Equivale a apretar SKIP en el menú EDIT.
2F2E4 DO>BEG ()
Mueve el cursor al inicio de la selección (si está activa) o al
inicio de la línea de edición (si la selección no está activa).
Equivale a apretar BEG en el menú EDIT.
2F2E5 DO>END ()
Mueve el cursor al final de la selección (si está activa).
Si no hay selección activa, entonces el cursor no se mueve.
Equivale a apretar END en el menú EDIT.
2F2E6 GOTOLABEL ()
Abre un cuadro de selección CHOOSE con las etiquetas en la
actual línea de edición (las etiquetas son líneas cuyo primer
carácter es *).
Equivale a apretar LABEL en el menú EDIT/GOTO.
41.2.5 Seleccionar, Cortar y Pegar, el Portapapeles
Direcc. Nombre Descripción
2EF83 CMD_STO_DEBUT (# )
Establece la posición del marcador inicial.
Equivale a apretar RS+BEGIN.
2EF84 CMD_STO_FIN (# )
Establece la posición del marcador final.
Equivale a apretar RS+END.
2EF85 RCL_CMD_DEB (# )
( #0 )
Llama a la posición del marcador inicial.
Si no hay selección, retorna ZERO.
2EF86 RCL_CMD_FIN (# )
( #0 )
Llama a la posición del marcador final.
Si no hay selección, retorna ZERO.
2F2DC ClearSelection ( )
Deselecciona el texto seleccionado sin cambiar el contenido
del editor. Para esto, establece ambos marcadores a ZERO.
2EF93 VERIF_SELECTION ( flag )
Retorna TRUE cuando el marcador final no es ZERO, lo cual
indica que la selección está activa.
Debes usar este comando como una verificación antes de
hacer algo con la selección.
2EF8A CMD_COPY ()
Si hay selección activa, copia la cadena seleccionada.
Si no hay selección activa, sólo hace beep.
Equivale a apretar RS+COPY cuando hay una selección activa.
2EF88 CMD_CUT ()
En realidad este comando no corta una cadena.
Este comando quita del texto la cadena que es la selección
actual, establece los marcadores inicial y final a cero y
posiciona el cursor en el lugar donde estaba la selección.
Si no hay una selección activa, este comando no hace nada.
Una verdadera acción de cortar debería ser:
:: CMD_COPY CMD_CUT ;
2F2FA CMD_COPY.SBR ($ )
Pone la selección como una cadena en la pila.
Este comando respeta las fuentes y estilos.
Si no usas fuentes y estilos, lo siguiente hace algo similar:
:: RCL_CMD
RCL_CMD_DEB #1+ RCL_CMD_FIN
SUB$
;
2EF94 PASTE.EXT ($ )
Si está activo el modo INSERT, inserta la cadena en la
posición actual del cursor en la línea de edición.
Si está activo el modo REPLACE, reemplaza la cadena a partir
de la posición actual del cursor y sobrescribiendo los
caracteres antiguos.
El cursor se moverá al final de esta cadena puesta.
Si no había línea de edición, se abre el editor y el cursor se
posicionará al final de esta cadena.
Este comando respeta las fuentes y estilos.
Si no usas fuentes y estilos, es más rápido usar el comando
CMD_PLUS.
Direcc. Nombre Descripción
2F2E1 SELECT.LINE ()
Selecciona toda la línea actual.
También mueve el cursor al inicio de la línea actual.
La selección no incluye al carácter SALTO DE LINEA que está
al final de la línea.
2F2E2 SELECT.LINEEND ()
Selecciona toda la línea actual.
También mueve el cursor al final de la línea actual.
La selección no incluye al carácter SALTO DE LINEA que está
al final de la línea.
2A085 (Clipboard!) ($ )
Guarda la cadena en el portapapeles.
2A095 (Clipboard@) ($ )
Retorna el contenido del portapapeles en la pila.
2A0A5 (Clipboard0) ()
Limpia el portapapeles.
2A0B5 (Clipboard?) ( flag )
Retorna TRUE si hay algo en el portapapeles.
41.2.9 Miscelánea
Direcc. Nombre Descripción
2F2F3 GET.W-> (# )
Retorna la posición del siguiente inicio de palabra que esté a la
derecha del cursor. Una palabra es una subcadena que no
tiene caracteres ESPACIO ni SALTO DE LINEA.
2F2F4 GET.W<- ( #1 #' )
Retorna la posición del siguiente inicio de palabra que esté a la
izquierda del cursor.
25ED2 EditMenu ( prog )
Retorna el menú del editor. Este es un programa de dos
elementos, el primero es un programa y el segundo una lista.
El resultado depende del estado del flag 95 (rpn o algebraico).
Direcc. Nombre Descripción
2EF73 ?Space/Go> ()
Inserta un carácter ESPACIO cuando no lo hay a la izquierda ni
a la derecha del cursor.
Si es necesario mueve el cursor una posición a la derecha para
que a la izquierda del cursor haya un carácter ESPACIO.
Pero si el cursor está al inicio de una línea, no hace nada.
Puedes usar este comando si quieres asegurarte que alguna
palabra que vayas a insertar, esté separada de la palabra que
la precede por al menos un espacio.
2EF76 AddLeadingSpace ( $ $' )
Agrega un carácter ESPACIO al inicio de la cadena del nivel 1
de la pila, sólo si esta cadena no empieza con espacio y si el
cursor en el editor está después de un carácter que no es
espacio. Por ejemplo:
:: FALSE ( F )
"DUP" ( F $ )
AddLeadingSpace ( F $' )
AddTrailingSpace ( F $'' )
SWAPDROP ( $'' )
InsertEcho ( )
;
Inserta DUP en el editor y se asegura que esta cadena
insertada esté rodeada de espacios.
2EF75 AddTrailingSpace ( flag $ flag $' )
Si flag es TRUE, no hace nada.
Si flag es FALSE, agrega una carácter ESPACIO al final de la
cadena, sólo si el carácter final de esta cadena no era espacio.
26238 GetFontCmdHeight ( # )
Retorna la altura de la fuente usada al editar.
Si el flag 73 está activado (Edit:mini font), retorna la altura de la
minifuente (6).
Si el flag 73 está desactivado (Edit:current fnt), retorna la altura
de la fuente del sistema (6, 7 u 8).
2EF9A CommandLineHeight ( #pix )
Retorna el número de píxeles de alto ocupado por la parte
visible de la línea de edición.
Si quieres hallar el número de líneas visibles en la actual línea
de edición puedes usar:
:: CommandLineHeight GetFontCmdHeight #/ SWAPDROP ;
2F2DB DOTEXTINFO ()
Muestra una pantalla con información sobre la línea de edición
actual.
Equivale a apretar INFO en el menú EDIT del editor.
2F2F7 PUT_STYLE (# )
Cambia el estilo, cuando hay una línea de edición activa.
Si hay una selección activa, cambia el estilo de texto en la
selección.
Si no hay selección activa, cambia el estilo del texto tipeado a
continuación.
Si el bint es 1, alterna a negrita.
Si el bint es 2, alterna a cursiva.
Si el bint es 3, alterna a subrayada.
Si el bint es 4, alterna a inversa.
Cuando hay una selección activa, PUT_STYLE no hace ABND
para su entorno temporal de manera que se debería de corregir
ese bug.
Direcc. Nombre Descripción
2F2F5 PUT_FONTE (# )
Cambia la fuente en un punto. Funciona de manera similar al
comando PUT_STYLE.
2F2E7 SELECT.FONT ()
Muestra una caja de selección para escoger una fuente.
Equivale a apretar FONT en el menú EDIT/STYLE.
2F2F6 GET_CUR_FONT.EXT (# )
Retorna un bint que representa a la fuente usada por el
caracter que se encuentra debajo del cursor.
2EF96 NO_AFFCMD ()
Hace que la próxima vez que se sea llamado el comando
CMD_PLUS no se actualice la pantalla.
Puedes usarlo por velocidad, si quieres hacer más inserciones
antes de que el usuario necesite verlas.
2EF92 XLINE_SIZE? ( ob flag )
Retorna TRUE si se cumplen las dos condiciones.
El cursor se encuentra en una línea que no sea la última.
El cursor se encuentra al final de la línea o más a la derecha.
Nota que este comando toma un objeto arbitrario de la pila. Por
lo tanto, debes poner algo antes de llamar al comando.
27F47 <DelKey ( {} )
Retorna el menukey correspondiente a DEL del menu EDIT.
27F9A >DelKey ( {} )
Retorna el menukey correspondiente a DEL del menu EDIT.
27EAF <SkipKey ( {} )
Retorna el menukey correspondiente a SKIP del menu EDIT.
27EFB >SkipKey ( {} )
Retorna el menukey correspondiente a SKIP del menu EDIT.
2F19B OngoingText? ( flag )
Si no existe línea de edición, retorna TRUE.
Si existe una línea de edición pequeña o una en la que se han
hecho pocas modificaciones, retona TRUE.
Si existe una línea de edición grande y en la que se han hecho
no pocas modificaciones, pregunta al usuario SI o NO. Retorna
TRUE o FALSE respectivamente.
2EEE8 InitEdModes ()
Restablece algunos modos de la calculadora a su valor por
defecto. Son los siguientes:
Pone la calculadora en modo inmediato (para esto desactiva
los modos de entrada algebraica y programación).
Pone la calculadora en modo mayúsculas.
Remueve el teclado alfabético.
Activa el modo INSERT. En este modo, los nuevos caracteres
escritos no se sobrescriben sobre los antiguos.
2EEE6 InitEd&Modes ()
:: InitEdLine InitEdModes ;
25636 HISTON? ( flag )
Retorna TRUE si está activado el modo CMD (si se muestran
las 4 últimas entradas confirmadas al apretar la tecla CMD).
2563B PTR 2563B ()
Activa el modo CMD.
0BCB2 PTR 0BCB2 ()
Desactiva el modo CMD.
2F326 CMDSTO ($ )
Agrega la cadena a la lista de las 4 últimas entradas
confirmadas, accessibles por medio de la tecla CMD.
Direcc. Nombre Descripción
2F05E SaveLastEdit ($ )
Si el modo CMD está activado, llama a CMDSTO.
Si el modo CMD está desactivado, sólo borra la cadena.
41.3 Ejemplos Editor
Ejemplo 1. Editor
Selecciona la línea actual y la copia al portapapeles.
::
TakeOver ( )
CMD_END_LINE ( ) ( Posiciona cursor al final de línea )
RCL_CMD_POS ( # ) ( Llama posición del cursor )
CMD_STO_FIN ( ) ( Fija posición de marcador final )
CMD_DEB_LINE ( ) ( Posiciona cursor al inicio de línea )
RCL_CMD_POS ( # ) ( Llama posición del cursor )
CMD_STO_DEBUT ( ) ( Fija posición de marcador inicial )
CMD_COPY ( ) ( Copia al portapapeles )
;
Esto podría hacerse más corto usando el comando SELECT.LINE
El siguiente código es equivalente al de arriba.
::
TakeOver ( )
SELECT.LINE ( ) ( Selecciona la línea actual )
CMD_COPY ( ) ( Copia al portapapeles )
;
Ejemplo 2. Editor
Inserta una plantilla ":: ;" en una línea única y posiciona el cursor entre "::" y ";".
::
TakeOver ( )
":: ;" ( $ )
CMD_PLUS ( ) ( Inserta o reemplaza en la posición actual del cursor )
( Además coloca el cursor al final de esa cadena )
CMD_BAK ( ) ( Mueve el cursor al carácter anterior )
CMD_BAK ( ) ( Mueve el cursor al carácter anterior )
;
Ejemplo 3. Editor
Inserta una plantilla ":: ;" en tres líneas y posiciona el cursor en la segunda línea y en la
segunda columna de dicha línea.
::
TakeOver ( )
"::\0A\0A;" ( $ )
CMD_PLUS ( ) ( Inserta o reemplaza en la posición actual del cursor )
( Además coloca el cursor al final de esa cadena )
CMD_UP ( ) ( Mueve el cursor a la anterior línea )
SPACE$ ( $ ) ( espacio )
CMD_PLUS ( ) ( Coloca espacio y pone cursor al final de este espacio )
;
Ejemplo 4. Editor
Busca la siguiente etiqueta y va ahí. Las etiquetas son líneas que empiezan con "*".
::
TakeOver ( )
"\0A*" ( $find ) ( newline followed by star)
FindStrInCmd ( $find #inic #final T \\ $find F )
IT
:: ( $find #inic #final )
DROP ( $find #inic )
#1+ ( $find #inic+1 )
STO_CURS_POS ( $find ) ( Fija posición del cursor )
;
( $find )
DROP ( )
;
Ejemplo 5. Editor
Si deseas crear un editor que autocomplete palabras, será necesario conseguir el fragmento
de palabra entre el inicio de la palabra y el cursor.
El siguiente programa retorna en el nivel 1 de la pila al fragmento entre el inicio de la palabra
y el cursor.
::
TakeOver
RCL_CMD ( $ ) ( Llama a la línea de edición )
RCL_CMD_POS ( $ #c ) ( Llama posición del cursor )
DUP ( $ #c #c )
GET.W<- ( $ #c #InicPalab ) ( Inicio de palabra a izq de cursor )
#1+SWAP ( $ #InicPalab+1 #c )
SUB$ ( $' ) ( Consigue una subcadena )
;
Ejemplo 6. Editor
Cambia la sangría de la línea actual a 4 espacios.
Las líneas que sólo tienen caracteres espacio no son modificadas.
Las líneas que empiezan con "*" no son modificadas.
::
TakeOver ( )
BINT4 ( # )
Blank$ ( "_" ) ( Crea una cadena con espacios )
CMD_DEB_LINE ( "_" ) ( Mueve el cursor al inicio de la línea actual )
RCL_CMD ( "_" $ ) ( Retorna copia de la línea de edición )
RCL_CMD_POS ( "_" $ #c ) ( Retorna la posición actual del cursor )
#1+ ( "_" $ #c+1 )
SUB$1# ( "_" #ASCII ) ( Retorna su código ASCII )
BINT42 ( "_" #ASCII 42 ) ( código ASCII para * )
OVER#=case
:: ( "_" #ASCII ) ( línea empieza con * )
2DROP ( )
CMD_DOWN ( ) ( Mueve el cursor a la siguiente línea )
;
( "_" #ASCII )
BINT32 ( "_" #ASCII 32 )
#= ( "_" flag )
IT
:: ( "_" ) ( línea empieza con ESPACIO )
CMD_END_LINE ( "_" ) ( Posiciona cursor al final de línea )
RCL_CMD_POS ( "_" #fin ) ( Llama posición del cursor )
CMD_DEB_LINE ( "_" #fin ) ( Posiciona cursor al inicio de línea )
DO>Skip ( "_" #fin ) ( Mueve el cursor al inicio de la sgte palabra )
RCL_CMD_POS ( "_" #fin #InicPalabra ) ( Llama posición del cursor )
#>ITE
DoFarBS ( "_" ) ( Borra desde el comienzo de la línea actual )
( hasta la posición actual del cursor )
DROPRDROP ( ) ( Si el cursor ya está en la sgte línea, finaliza )
;
( "_" )
CMD_PLUS ( ) ( Inserta espacios )
CMD_DEB_LINE ( ) ( Posiciona cursor al inicio de línea )
CMD_DOWN ( ) ( Mueve el cursor a la siguiente línea )
;
Ejemplo 7. Editor en InputLine
Para usar los programas que manejan el editor, debes asignarlos a una tecla o ponerlas en
un menú. Nota que cada comando que escribes necesita un TakeOver como su primer
elemento o de lo contrario, el programa no se ejecutará en el editor.
Aquí hay un ejemplo simple para el entorno InputLine el cual define un menú inicial con
dos teclas de menú.
Con F1 se seleccionará toda la línea actual.
Con F2 se borra toda la línea de edición.
Con Shift Derecho más F1 o F2, puedes ver una ayuda sobre lo que hace la tecla de menú
correspondiente.
Para más información sobre el comando InputLine, ver el capítulo 32.
xNAME MenúInputL
:: CK0 ( ) ( No se requieren argumentos )
"Edita esto:" ( $ ) ( $cabec )
"Linea 1\0ALínea 2" ( $ $ ) ( $inicial )
BINT0 ( ... ) ( CursPos: cursor al final )
BINT0 ( ... ) ( #Ins/Rep: modo actual )
BINT0 ( ... ) ( #ALG: modo actual )
BINT0 ( ... ) ( #alpha: modo actual )
{ { "SLINE"
{ :: TakeOver ( )
SELECT.LINE ( ) ( Selecciona toda la línea actual )
;
Modifier
:: TakeOver ( )
"Selecciona la línea actual" ( $ )
FlashWarning ( )
;
}
}
{ "LIMPI"
{ :: TakeOver ( )
DEL_CMD ( ) ( Quita la línea de edición y finaliza editor )
NULL$ ( $ )
EditString ( ) ( Empieza la edición de la cadena )
;
Modifier
:: TakeOver ( )
"Límpia toda la línea de edición" ( $ )
FlashWarning ( )
;
}
}
}
( ... ) ( menú )
ONE ( ... ) ( fila inicial del menu )
TRUE ( ... ) ( CANCEL aborta inmediatamente la edición )
BINT0 ( ... ) ( retorna sólo cadena sin evaluar )
InputLine ( $ T // F )
;
Capítulo 42
Trazado de Gráficos
Los comandos de este capítulo tratan con aspectos relacionados al trazado de gráficos. Hay
varios comandos que tratan con la variable reservada PPAR, que contiene los parámetros
usados en el trazado de gráficos. Esta variable es una lista con los siguientes parámetros:
{ (xmin, ymin) (xmax, ymax) indepiente resolucion ejes tipo dependiente}
39.1.3 Resolución
Direcc. Nombre Descripción
2F10D GETRES (% )
( hxs )
Retorna la resolución del trazado (cuarto elemento de PPAR).
Primero, llama a CHECKPVARS
2EEF4 PUTRES (% )
( hxs )
Fija una nueva resolución del trazado.
El número real debe ser positivo, cero o menos uno.
Llama a FLASHPTR 1 265
Equivale al comando RES de User RPL.
39.1.3 Ejes y sus Etiquetas
Direcc. Nombre Descripción
2A4001 FLASHPTR 1 2A4 ( C% )
( {C% atick} )
( {C% “xlabel” “ylabel”} )
( {C% atick “xlabel” “ylabel”} )
Retorna el quinto elemento de PPAR.
Primero llama a CHECKPVARS
2A8001 FLASHPTR 1 2A8 ( “xlabel” “ylabel” T )
(F )
Llama a las etiquetas de los ejes, si estas existen en el quinto
elemento de PPAR.
Primero llama a CHECKPVARS
254001 FLASHPTR 1 254 ( C% )
( {C% atick} )
( {C% “xlabel” “ylabel”} )
( {C% atick “xlabel” “ylabel”} )
Si en la pila está C%, lo fija como el punto de intersección de
los ejes (guarda como quinto elemento de PPAR). Si existía
atick y/o etiquetas de ejes, estas serán borradas.
Llama a FLASHPTR 1 265
Equivale al comando AXES de User RPL cuando en la pila
hay un número complejo.
255001 FLASHPTR 1 255 ( {C%} )
( {C% atick} )
( {C% “xlabel” “ylabel”} )
( {C% atick “xlabel” “ylabel”} )
Si en la pila está C%, lo fija como el punto de intersección de
los ejes. Pero no se cambiarán atick ni las etiquetas.
En los otros casos, cuando en la pila hay una lista, guarda esta
lista como el quinto elemento de PPAR.
Llama a FLASHPTR 1 265
Equivale al comando AXES de User RPL cuando en la pila
hay una lista.
0780AB ROMPTR 0AB 078 ( Z/%/hxs )
( {Z/% Z'/%'} )
( {hxs hxs'} )
Guarda atick en el quinto elemento de PPAR.
Llama a FLASHPTR 1 265
Equivale al comando ATICK de User RPL.
2CA001 FLASHPTR 1 2CA ( )
Dibuja los ejes horizontal y vertical. El punto de intersección de
los ejes es un número complejo (quinto elemento de PPAR, y si
este es una lista, su primer elemento).
La distancia entre las marcas de los ejes está dada por atick
Primero llama a CHECKPICT y CHECKPVARS
Equivale al comando DRAX de User RPL.
0A7001 FLASHPTR 1 A7 ( )
Dibuja las etiquetas y sus valores extremos en ambos ejes.
Si en el quinto elemento de PPAR, no hay cadenas, entonces
las etiquetas serán las variables independiente y dependiente.
Primero llama a CHECKPICT y CHECKPVARS
Equivale al comando LABEL de User RPL.
39.1.3 Tipo de Gráfico
Direcc. Nombre Descripción
2EEF5 GETPTYPE ( name )
Retorna el tipo de gráfico (sexto elemento de PPAR).
Primero, llama a CHECKPVARS
2EEF6 PUTPTYPE ( name )
Fija el nuevo tipo de gráfico (sexto elemento de PPAR).
Llama a FLASHPTR 1 265
2C37D PTYPE>PINFO ( name # ob T )
( name # F )
39.1.3 Escala
Direcc. Nombre Descripción
2F33E GETSCALE ( %Xscale %Yscale )
Llama a ambos parámetros de escala.
%Xscale es la distancia en unidades de usuario de dos
puntos separados 10 píxeles en una recta horizontal.
Xscale=10·(Xmax-Xmin)/(ancho-1)
%Yscale es la distancia en unidades de usuario de dos
puntos separados 10 píxeles en una recta vertical.
Yscale=10·(Ymax-Ymin)/(altura-1)
Llama a CHECKPVARS
2EEF1 PUTSCALE ( %Xscale %Yscale )
Fija nuevos parámetros de escala (el centro no cambia).
Para esto cambia los dos primeros elementos de PPAR:
(xmin, ymin) y (xmax, ymax).
Primero, llama a GETPMIN&MAX
Los dos números reales deben ser positivos. De lo contrario,
genera el error “Argumento: valor incorr”
Equivale al comando SCALE de User RPL.
Direcc. Nombre Descripción
2EEF8 HSCALE ( %Xfactor )
Multiplica %Xscale por %Xfactor (el centro no cambia).
Para esto cambia los elementos xmin y xmax de PPAR.
Primero, llama a GETPMIN&MAX
El número real debe ser positivo. De lo contrario, genera el
error “Argumento: valor incorr”
Equivale al comando SCALEW de User RPL.
2EEF7 VSCALE ( %Yfactor )
Multiplica %Yscale por %Yfactor (el centro no cambia).
Para esto cambia los elementos ymin y ymax de PPAR.
Primero, llama a GETPMIN&MAX
El número real debe ser positivo. De lo contrario, genera el
error “Argumento: valor incorr”
Equivale al comando SCALEH de User RPL.
2EEEF AUTOSCALE ()
Cambia los dos primeros eIementos de PPAR según el tipo de
gráfico que se va a trazar.
Llama a CHECKPVARS
Equivale al comando AUTO de User RPL.
39.1.3 Variable EQ
Direcc. Nombre Descripción
25ECF EQUATION ( ob T )
(F )
Si EQ existe en el directorio actual, pone en la pila su
contenido y TRUE.
Si no existe sólo pone FALSE.
2F339 GetEqN ( #i ob T )
( #i F )
Si EQ es un lista, cuyos elementos son objetos simbólicos:
Si #i es válido, retorna la ecuación de lugar #i y TRUE.
Si #i no es válido, retorna FALSE
Si EQ no es una lista:
Si #i es 1, retorna el contenido de EQ y TRUE.
Si #i es diferente de 1, retorna FALSE
25EB5 DORCLE ( ob )
Llama al contenido de la variable EQ del directorio actual.
Si no existe, genera el error “Ecuación inexistente”.
Equivale al comando RCEQ de User RPL.
25EB6 DOSTOE ( ob )
Guarda ob en la variable EQ en el directorio actual.
Equivale al comando STEQ de User RPL.
39.1.3 Coordenadas Relativas y Absolutas
Direcc. Nombre Descripción
2EF01 DOPX>C ( { hxs hxs' } C% )
Convierte una lista de dos hxs a número complejo que
representa sus coordenadas en el gráfico.
Llama a GETPMIN&MAX
Equivale al comando PXC de User RPL.
2EF02 DOC>PX ( C% { hxs hxs' } )
Convierte un número complejo a una lista con dos hxs.
Es la operación inversa de DOPX>C.
Llama a GETPMIN&MAX
Equivale al comando CPX de User RPL.
2F31F C%># ( C% # #' )
Parecido al comando DOC>PX, pero retorna 2 bints.
Llama a GETPMIN&MAX
2CB001 FLASHPTR 1 2CB ( )
Dibuja el gráfico correspondiente a la ecuación de EQ o a la
formación en SDAT con los parámetros de PPAR (o VPAR o
SPAR) EN GBUFF.
No dibuja ejes ni etiquetas, tampoco borra gráficos anteriores.
Se ve afectado por el flag 28 (gráficos secuenciales o
simultáneos) y el flag 31 (puntos conectados o sólo puntos)
Primero llama a CHECKPICT, GDISPCENTER,
TURNMENUOFF y CHECKPVARS
Equivale al comando DRAW de User RPL.
Parte IV
El CAS de
la HP 50g
Capítulo 43
Representación Escritura
User Objeto simbólico único:
SYMBOL Z2 ID X x* ;
Meta El objeto simbólico descompuesto en la pila como
un meta. Por ejemplo, '2*X', se representa como
cuatro objetos en los niveles 4 a 1 en la pila:
Z2 ID X x* BINT3
Coeficientes del polinomio como una lista.
Interna
En el ejemplo, será: { 2 0 }
con respecto a la lista de variables: { X }
Donde num y deno son polinomios que son primos entre sí (en modo exacto).
El principal comando que convierte al formato interno es VXXLext. El principal
comando que hace la operación inversa es R2SYM. Hay muchos otros comandos
especializados para convertir entre las diferentes representaciones. Estas rutinas
especializadas son más eficientes pero de más difícil uso.
Hay comandos que operan incluso sobre listas que representan a objetos racionales
(QAdd, QSub, QDiv, QMul, QNeg, RPext), así como divisiones euclidianas con
especializaciones, por ejemplo, para enteros o enteros gaussianos.
43.3 Ejemplos
La simplificación racional de un objeto simbólico puede ser codificado como
:: ( symb )
FLASHPTR LVARext ( symb lvar ) ( Retorna lista de variables )
FLASHPTR VXXLext ( lvar n/d ) ( Convierte a representación interna )
FLASHPTR R2SYM ( symb ) ( Convierte a simbólico )
;
44.1 Referencia
Direcc. Nombre Descripción
157006 ˆSYMBINCOMP ( symb ob1 .. obN #n )
( ob ob #1 )
( {} {} #1 )
Descompone un objeto simbólico en un meta. Otros objetos
son convertidos en metas de un objeto agregando #1 en la pila.
12A006 ˆ2SYMBINCOMP ( ob1 ob2 meta1 meta2 )
Hace ˆSYMBINCOMP para 2 objetos.
4D7006 ˆVXXLext ( ob Lvar Lvar Q )
( ob nombre Lvar Q )
Convierte ob a su representación interna.
ob puede ser de clase simbólica o matriz simbólica e incluso
una lista con varios objetos.
Ejemplos:
‘X^2+5*X+7’ { X } { X } { Z1 Z5 Z7 }
‘13+14*i’ { X } { X } :: Z14 Z13 ;
‘7+5*√11’ { X } { X } :: Z7 Z5 Z11 ;
‘(3*X+2)/(5*X+7)’ { X } { X } {Z3 Z2}/{Z5 Z7}
400006 ˆR2SYM ( lvar Q ob )
Realiza la operación inversa al comando ˆVXXLext.
Ejemplo:
{Z1 Z5 Z7} {X} ‘X^2+5*X+7’
4DB006 ˆVXXL0 ( ob Q )
Conversion del objeto a su forma interna con respecto a Lvar
(Lvar en LAM1).
4DD006 ˆVXXL2 ( Meta Q )
Conversion del meta a su forma interna con respecto a Lvar
(Lvar en LAM1).
4D8006 ˆMETALISTVXXL ( Meta Meta )
Conversión de cada uno de los elementos del meta a su forma
interna con respecto a Lvar
(Lvar en LAM1).
4DC006 ˆVXXL2NR ( Meta Q )
Conversion del meta a su forma interna con respecto a Lvar
Este comando sólo llama a ˆVXXL2 pero antes activa
temporalmente el flag 119 (Modo No riguroso) para permitir
problemas con las raíces cuadradas
(Lvar en LAM1).
Direcc. Nombre Descripción
4DA006 ˆVXXL1ext (n Z )
Conversión de un objeto a su representación interna.
Para objetos que no dependen de ninguna variable.
4D9006 ˆVXXLFext ( n/d Z1/Z2 )
Hace ˆVXXL1ext por separado al numerador y al
denominador de una fracción.
167006 ˆTYPEIRRQ? ( ob flag )
¿Es ob un irrquad?
Retorna TRUE si ob es un programa que tiene como primer
elemento a x<<
168006 ˆDTYPEIRRQ? ( ob ob flag )
Hace DUP, luego ˆTYPEIRRQ?
177006 ˆCKMATRIXELEM ( ob ob )
Verifica que ob sea un elemento válido de una matriz interna.
Es decir, verifica que sea de clase simbólica (id, lam ,symb o
entero), real, complejo, real extendido, complejo extendido,
unidad, lista o programa.
De lo contario, genera el error “Argumento incorrecto”
Para verificar que un objeto sea un elemento válido de una
matriz simbólica en User RPL, debes usar otro comando, el
comando ˆCKSYMREALCMP
18F006 ˆCKFPOLYext ( prog ERROR )
( {} {} )
( {} ERROR )
( ob ob )
Verifica que en la pila, no haya un programa. También verifica
que en la pila no haya una lista que contenga algún programa o
lista vacía (busca incluso dentro de listas interiores).
El error generado sería: “Argumento: valor incorr”
190006 ˆCK2FPOLY ( ob ob ob ob )
Hace CKFPOLYext a dos objetos de la pila.
19E006 ˆCLEANIDLAM ( symb id )
( symb lam )
( symb Z )
( symb symb )
( ob ob )
Si symb tiene un único objeto y ese objeto es un id, lam o
entero, entonces retorna ese único elemento en la pila.
De lo contrario, no hace nada.
Capítulo 45
Enteros
Este capítulo muestra los comandos que tratan con números enteros de precisión
arbitraria, que son un nuevo tipo de objetos proporcionados por el CAS a partir de la HP 49g.
Para una descripción breve de estos objetos, ve al capítulo 5.
Puedes observar que en este capítulo no hay comandos que realicen operaciones
aritméticas básicas con enteros. Esto se debe a que un número entero también es una
representación interna de objetos del CAS, por lo cual puedes usar los comandos que
manipulan esta clase de objetos (tales como ˆQAdd, ˆQMul, etc). Estos comandos son
listados en el capítulo 49 (polinomios).
45.1 Referencia
45.1.1 Enteros Ya Incorporados en ROM
Direcc. Nombre Descripción
2733F Z-9_ ( z-9 )
2734B Z-8_ ( z-8 )
27357 Z-7_ ( z-7 )
27363 Z-6_ ( z-6 )
2736F Z-5_ ( z-5 )
2737B Z-4_ ( z-4 )
27387 Z-3_ ( z-3 )
27393 Z-2_ ( z-2 )
2739F Z-1_ ( z-1 )
273AB Z0_ ( z0 )
273B6 Z1_ ( z1 )
273C2 Z2_ ( z2 )
273CE Z3_ ( z3 )
273DA Z4_ ( z4 )
273E6 Z5_ ( z5 )
273F2 Z6_ ( z6 )
273FE Z7_ ( z7 )
2740A Z8_ ( z8 )
27416 Z9_ ( z9 )
27422 Z10_ ( z10 )
2742F Z12_ ( z12 )
2743C Z24_ ( z24 )
27449 Z100_ ( z100 )
27516 Z0Z1_ ( z0 Z1 )
274A9 Z1Z0_ ( z1 Z0 )
aka: ZINT1_0_
2756C Z1Z1_ ( z1 Z1 )
2754B Z-1Z0_ ( z-1 Z0 )
27C70 Z0ONE_ ( z0 #1 )
45.1.2 Enteros Ya Incorporados con Manipulación de Pila
Direcc. Nombre Descripción
2E0006 ˆDROPZ0 ( ob z0 )
2DF006 ˆDROPZ1 ( ob z1 )
392006 ˆ2DROPZ0 ( 2 1 z0 )
3B3006 ˆNDROPZ0 ( obn...ob1 #n z0 )
Reemplaza a un meta con Z0.
3B4006 ˆNDROPZ1 ( obn...ob1 #n z1 )
Reemplaza a un meta con Z1.
45.1.3 Conversión
Direcc. Nombre Descripción
0EE006 ˆ#>Z (# Z )
Convierte un bint a entero zint.
0F5006 ˆR>Z (% Z )
Convierte un real a entero zint.
No usar este comando si el número real tiene parte decimal.
18D006 ˆR2Zext (% Z )
( % %% )
Si el número real no tiene parte decimal, lo convierte a entero.
Si el número real tiene parte decimal y la calculadora está en
modo aproximado (flag 105 activado), entonces lo convierte a
real extendido y activa el flag 102 (no GCD).
Si el número real tiene parte decimal y la calculadora está en
modo exacto (flag 105 desactivado), entonces
a) Si el flag 123 está activado (modo switch prohibido), genera
el error "Mode switch not allowed here"
b) Si el flag 123 está desactivado, (modo switch permitido),
entonces:
Si el flag 120 está activado (modo silencioso encendido),
activa los flags 105 y 102 sin preguntar y convierte el
real a real extendido.
Si el flag 120 está desactivado (modo silencioso
apagado), pregunta al usuario si desea activar el modo
aproximado (activar flag 105).
Si el usuario no quiere encenderlo, entonces genera el
error “Mode switch cancelled”. Si el usuario acepta,
activa los flags 105 y 102 y convierte el real a real
extendido.
0ED006 ˆH>Z ( HXS Z // Error )
Convierte un HXS a entero, si el hxs en base 16 no tiene como
dígitos a letras.
En otro caso, genera el error “Argumento incorrecto”
Por ejemplo:
# 123456h 123456
# 123C56h ERROR
0F2006 ˆS>Z ($ Z )
Convierte una cadena a entero. La cadena no debe tener punto
decimal. Por ejemplo:
“-12345” -12345
Direcc. Nombre Descripción
0F3006 ˆS>Z? ($ Z T )
($ $ F )
Si es posible, convierte cadena a entero y retorna TRUE.
De lo contrario, agrega FALSE.
Por ejemplo:
“-78” -78 TRUE
“123.” “123.” FALSE
184006 ˆCK1Z (Z Z )
(% Z )
($ Z )
Si hay un entero en la pila, no hace nada.
Convierte un real a entero con ˆR>Z
Convierte una cadena a entero con ˆS>Z
Para otros objetos genera el error “Argumento incorrecto”
185006 ˆCK2Z ( ob ob' Z Z' )
Hace ˆCK1Z, pero para dos objetos.
186006 ˆCK3Z ( ob ob' ob'' Z Z' Z'' )
Hace ˆCK1Z, pero para tres objetos.
202006 ˆCK&CONVINT (Z Z )
( symb :: Zim Zre' ; )
Convierte un zint a entero gausiano.
Por ejemplo:
'2+3*i' :: Z3 Z2 ;
Para otros objetos, genera el error “Argumento incorrecto”.
203006 ˆCK&CONV2INT ( ob ob' ob'' ob''' )
Hace ˆCK1Z, pero para dos objetos.
205006 ˆCONVBACKINT (Z Z )
( C symb )
( irrquad symb )
Hace: :: NULL{} SWAP FLASHPTR R2SYM ;
Se puede usar para convertir un entero gaussiano o un irrquad
a su representación user.
Ejemplos:
:: Z3 Z2 ; '2+3*i'
:: << Z5 Z6 Z7 >> ; '5+6*√7'
204006 ˆCONVBACK2INT ( ob ob' ob'' ob''' )
Hace ˆCONVBACKINT, pero para dos objetos.
0F4006 ˆZ>ZH ( Z Z' )
Convierte un entero de base decimal a base hexadecimal.
18E006 ˆZ2Sext ( Z '$Z' )
Convierte un entero a cadena. Luego, esta cadena es
incrustada en un objeto simbólico.
Ejemplo:
Z3 '"3"'
45.1.4 Operaciones Generales con Enteros
Direcc. Nombre Descripción
101006 ˆZTrim ( Z Z' )
Le quita a Z, nibbles sobrantes innecesarios.
Cuenta los nibbles requeridos para la representación de Z.
Si estos son iguales a los usados, sale rápidamente.
De lo contrario, asigna a un nuevo objeto, copia los nibbles
significativos de la mantisa y agrega el signo original.
Por ejemplo:
00085 85
102006 ˆZabs ( Z |Z| )
Pone el valor absoluto de Z en la pila.
Si Z es positivo, no hace nada.
De lo contrario, cambia de signo a una copia del objeto.
50B006 ˆZABS ( Z |Z| )
Pone el valor absoluto de Z en la pila.
Hace :: FLASHPTR DupZIsNeg? NOT?SEMI FLASHPTR QNeg ;
0E0006 ˆZSQRT ( Z Z' flag )
Calcula la parte entera de la raíz cuadrada de un entero
POSITIVO o CERO.
Si es cuadrado perfecto, entonces retorna TRUE para indicar
que el entero Z tiene raíz exacta.
Por ejemplo:
144 12 TRUE
145 12 FALSE
3D0006 ˆMod ( Z Zn Z' )
Retorna el residuo de dividir Z entre Zn.
Por ejemplo:
45 7 3
80 16 0
-75 -7 2
15 0 0
0DD006 ˆZmod ( Z1 Z2 Z' )
Retorna el residuo de dividir Z entre Zn.
Parecido al comando MOD de User RPL.
Por ejemplo:
45 7 3
80 16 0
-75 -7 -5
15 0 15
105006 ˆZNMax ( Z1 Z2 Z )
Retorna el entero que tenga el mayor valor absoluto.
Por ejemplo:
45 7 45
-8 -6 -8
106006 ˆZNMin ( Z1 Z2 Z )
Retorna el entero que tenga el menor valor absoluto.
Por ejemplo:
45 7 7
-8 -6 -6
10D006 ˆZBits ( Z Z #bits )
Retorna el número de bits usados en Z.
10E006 ˆZBit? ( Z #bit Z flag )
Comprueba si un bit está activado en Z.
El contador empieza desde cero, a diferencia de ZBits.
Direcc. Nombre Descripción
2B7006 ˆZGCDext ( Z Z' Z'' )
Máximo común divisor de dos enteros.
2B8006 ˆZGcd ( Z Z' Z'' )
Máximo común divisor de dos enteros.
Hace lo mismo que ZGCDext.
0DE006 ˆZDIVext ( Z1 Z2 Zcoc Zdiv )
Retorna el cociente y el divisor de dividir Z1/Z2.
20A006 ˆIEGCD (x y c a b )
Dados dos enteros x y y, retorna 3 enteros a, b, c de tal
forma que ax+by=c.
Aquí c es el máximo común divisor de x e y.
x, y son enteros o reales sin parte decimal.
Equivale al comando IEGCD de user RPL.
3D6006 ˆIEGCDext (x y c a b )
Llamado por el comando ^IEGCD.
07C007 ˆ#FACT (# Z )
Calcula el factorial de un entero.
Funciona para los números #0 - #FFFFF, aunque desde algún
número se generará el error: “Memoria insuficiente”.
576006 ˆfactzint ( Z Z! )
Factorial de un entero de 0 a 9999.
215006 ˆPA2B2 ( p a+bi )
El argumento puede ser 1, 2, o primo múltiplo de 4 más 1.
Retorna un complejo simbólico de manera que p=a²+b².
El argumento debe ser entero o real sin parte decimal.
Equivale al comando PA2B2 de user RPL.
Matrices
Las matrices simbólicas son un nuevo objeto presente a partir de la HP 49G. A diferencia
de los arreglos, las matrices simbólicas pueden contener objetos de diferentes tipos en su
interior, incluso objetos simbólicos.
Las matrices también son objetos compuestos y podemos usar muchos de los comandos
descritos en el capítulo 11 también para manipular matrices. La razón es obvia, la estructura
de las matrices simbólicas es la misma que la de una lista de listas. Sólo cambia el prólogo.
En la calculadora, puedes crear una matriz simbólica con los delimitadores MATRIX y ;
Por ejemplo:
B) Para crear una matriz de 2 dimensiones de dos filas por tres columnas.
MATRIX
MATRIX Z4_ Z5_ Z6_ ;
MATRIX Z7_ Z8_ Z9_ ;
;
En el editor de Debug 4x es diferente. Para crear una matriz puedes hacer uso de los
comandos TYPEMATRIX_ y COMPN_.
Por ejemplo:
Por ejemplo:
Para conseguir un objeto desde una posición especificada, puedes usar el comando
ˆPULLEL[S]
Los siguientes NULLNAME también funcionan para arreglos reales o complejos de dos
dimensiones.
1GETLAM ( #f )
#1+_ONE_DO (DO)
3GETLAM ( ... #c )
#1+_ONE_DO (DO)
2GETEVAL ( ... ... obi )
LOOP
3GETLAM ( ... ob1 ob2...obc #c )
TYPEMATRIX_ ( ... ob1 ob2...obc #c 9862 )
COMPN_ ( ... MATRIX )
LOOP
( MAT1 MAT2 ... MATf )
1GETABND ( MAT1 MAT2 ... MATf #f )
TYPEMATRIX_ ( MAT1 MAT2 ... MATf #f 9862 )
COMPN_ ( 2DMATRIX )
;
* Crea un arreglo real (o complejo) de 2 dimensiones cuyos elementos estén
* en función de su número de fila y de columna
* El programa es de la forma ( -> % ) o de la forma ( -> C% )
* No toma argumentos, pero debe retornar un número real (o complejo)
* Puedes llamar el número de la fila como un bint con el comando JINDEX@
* Puedes llamar el número de la columna como un bint con el comando INDEX@
* Puedes llamar el número de filas como un bint con: JSTOP@ #1-
* Puedes llamar el número de columnas como un bint con: ISTOP@ #1-
NULLNAME CREA_2DARRAY ( #f #c prog -> [[%]]/[[C%]] )
:: ( #f #c prog )
ROT ( #c prog #f )
FLASHPTR 3LAMBIND ( )
1GETLAM ( #f )
#1+_ONE_DO (DO)
3GETLAM ( ... #c )
#1+_ONE_DO (DO)
2GETEVAL ( ... ... obi )
LOOP
LOOP
( ob11...obfc )
3GETLAM ( ob11...obfc #c )
1GETABND ( ob11...obfc #c #f )
SWAP2DUP ( ob11...obfc #f #c #f #c )
TWO{}N ( ob11...obfc #f #c {#f #c} )
UNROT ( ob11...obfc {#f #c} #f #c )
#* ( ob11...obfc {#f #c} #f*c )
FLASHPTR XEQ>ARRAY1 ( [[%]]/[[C%]] )
;
46.1.7 Tests
Direcc. Nombre Descripción
004007 ˆDIMS ( 1DMATRIX 1DMATRIX #elem #0 T )
( 1DMATRIX F )
( 2DMATRIX 2DMATRIX #c #f T )
( 2DMATRIX F )
( {} {} #elem #0 T )
( {{}} {{}} #c #f T )
( {{}} F )
Una matriz (o lista) se considera de dos dimensiones, si su
primer elemento es una matriz (o lista). De los contrario se
considera como de una dimensión.
Esa matriz (o lista) de dos dimensiones, se considera válida (y
retornará TRUE), si todos sus elementos son matrices (o listas)
que tienen la misma cantidad de objetos. De lo contrario,
retorna FALSE.
Si alguno de los objetos de la matriz es una lista o matriz,
retorna FALSE.
16C006 ˆDUPNULL[]? ( ob ob flag )
Agrega TRUE, si ob es una matriz vacía ( MATRIX ; ).
359006 ˆNULLVECTOR? ( comp flag )
¿Es un vector nulo?
Si la calculadora está en modo exacto (flag 105 desactivado),
retorna TRUE, sólo cuando todos los elementos del compuesto
sean iguales al entero cero.
Si la calculadora está en modo aproximado (flag 105 activado),
retorna TRUE, cuando todos los elementos del compuesto son
enteros, reales extendidos o complejos extendidos (debe haber
por lo menos un número extendido) cuya suma de los
cuadrados de sus valores absolutos (o módulos) sea menor al
valor de la variable reservada EPS.
Direcc. Nombre Descripción
16F006 ˆCKSAMESIZE ( ARRY ARRY' ARRY ARRY' flag )
( ARRY MATRIX' ARRY MATRIX' flag )
( MATRIX MATRIX' MATRIX MATRIX' flag )
( MATRIX ARRY' MATRIX ARRY' flag )
Devuelve TRUE si tienen las mismas dimensiones.
170006 ˆDTYPENDO? ( RealArry MATRIX flag )
( CmpArry MATRIX flag )
( MATRIX MATRIX flag )
¿Matriz cuadrada?
Retorna TRUE si la formación tiene dos dimensiones y las dos
dimensiones tienen la misma longitud.
Arreglos reales o complejos son convertidos a matriz simbólica.
173006 ˆ2DMATRIX? ( ob ob flag )
Retorna TRUE si en la pila hay una matriz de dos dimensiones.
171006 ˆDTYPFMAT? ( 2DMATRIX 2DMATRIX flag )
( 1DMATRIX 1DMATRIX F )
( ob ob F )
Retorna TRUE si en la pila hay una matriz simbólica válida de
dos dimensiones.
Verifica que cada elemento de la matriz (es decir, cada fila) sea
una matriz o matriz etiquetada y que todas las filas tengan el
mismo número de elementos.
No verifica que los elementos de la matriz sean de tipo válido.
3B5001 FLASHPTR 001 3B5 ( [[]] [[]] #n )
( 2DMATRIX 2DMATRIX #n )
Agrega el número de filas de una formación cuadrada.
Si la formación es de 1 dimensión o no es cuadrada, genera el
error: “Dimensión inválida”.
3B6001 FLASHPTR 001 3B6 ( ob1 ob2 ob1 ob2 )
Verifica que los objetos tengan las mismas dimensiones.
Los objetos pueden ser arreglos, matrices o arreglos
vinculados.
Por ejemplo, si ob1 y ob2 son formaciones, ambas con 3
filas y 4 columnas, entonces no hace nada.
Si no tienen las mismas dimensiones, genera el error:
“Dimensión inválida”.
INNERDUP ( 1DMAT1...1DMATf #f #f )
ZERO_DO (DO)
( ... #n )
ROLL ( ... 1DMATi )
INNERDUP ( ... obi1...obic #c #c )
ZERO_DO (DO)
ROLL ( ... ... obij )
2GETEVAL ( ... ... obij' )
ISTOP@ ( ... ... obij' #c )
LOOP
1GETLAM ( ... obi1'...obic' #c #tipo )
COMPN_ ( ... 1DMATi' )
ISTOP@ ( ... 1DMATi' #n )
LOOP
( 1DMAT1'...1DMATf' #n )
1GETABND ( 1DMAT1'...1DMATf' #n #tipo )
COMPN_ ( 2DMAT' )
;
46.2.2 Aplicando un programa o comando a los elementos de dos
matrices de dos dimensiones
Puedes usar el siguiente NULLNAME, el cual también funciona para listas de listas:
>R ( 2DMATA )
INNERDUP ( 1DMATA1...1DMATAf #f #f )
ZERO_DO (DO)
( ... #n )
ROLL ( ... 1DMATAi )
RSWAP
'R
RSWAP ( ... 1DMATAi 1DMATBi )
>R ( ... 1DMATAi )
INNERDUP ( ... obAi1...obAic #c #c )
ZERO_DO (DO)
( ... ... )
ROLL ( ... ... obAij )
RSWAP
'R ( ... ... obAij obBij )
RSWAP
2GETEVAL ( ... ... obij' )
ISTOP@ ( ... ... obij' #c )
LOOP
( ... obi1'...obic' #c )
RDROP ( ... obi1'...obic' #c )
1GETLAM ( ... obi1'...obic' #c #tipo )
COMPN_ ( ... 1DMATi' )
ISTOP@ ( ... 1DMATi' #n )
LOOP
( 1DMAT1'...1DMATf' #n )
1GETABND ( 1DMAT1'...1DMATf' #n #tipo )
COMPN_ ( 2DMAT' )
;
46.2.3 Aplicando un programa o comando a los elementos de
varias matrices de dos dimensiones
Puedes usar el siguiente NULLNAME, el cual también funciona para listas de listas:
4GETLAM ( 2DMAT1...2DMATN #N )
ZERO_DO (DO)
( ... )
ISTOP-INDEX ( ... #N-i )
ROLL ( ... 2DMATi )
>R ( ... )
RSWAP ( ... )
LOOP
( )
3GETLAM ( #filas )
ZERO_DO (DO)
( ... )
4GETLAM ( ... #N )
ZERO_DO (DO)
( ... )
4GETLAM ( ... #N )
#2+ ( ... #N+2 )
RROLL_ ( ... )
'R ( ... 1DMATij )
RSWAP ( ... 1DMATij )
LOOP
( ... 1DMAT1j...1DMATNj )
4GETLAM ( ... 1DMAT1j...1DMATNj #N )
#1+ ( ... 1DMAT1j...1DMATNj #N+1 )
RROLL_ ( ... 1DMAT1j...1DMATNj )
4GETLAM ( ... 1DMAT1j...1DMATNj #N )
2GETLAM ( ... 1DMAT1j...1DMATNj #N progNa1 )
ProgNa1Comp ( ... 1DMATj' )
LOOP
( 1DMAT1'...1DMATN' )
3GETLAM ( 1DMAT1'...1DMATN' #N )
1GETABND ( 1DMAT1'...1DMATN' #N #tipo )
COMPN_ ( 2DMAT' )
;
46.2.4 Retornar un objeto de un compuesto.
Puedes usar el siguiente NULLNAME:
2GETLAM
#1+PICK
JINDEX@
NTHCOMPDROP
LOOP
2GETLAM
1GETLAM
COMPN_
OVER#2+UNROL
LOOP
#1-
NDROP ( fila1...filan {} )
LENCOMP ( fila1...filan #n )
1GETABND ( fila1...filan #n #tipo )
COMPN_ ( {{}} )
;
Capítulo 47
Manipulación de Expresiones
Los comandos de este capítulo son usados para manipular expresiones, cuando éstas están
en su forma de objetos simbólicos (Vea el capítulo 48 para ver los comandos que tratan con
expresiones que estén en la forma de un meta). Hay comendos relacionados a la
compresión y expansión, transformaciones trigonométricas y exponenciales y sustitución de
valores en las expresiones.
47.1 Referencia
47.1.1 Operaciones Básicas y Aplicación de Funciones
Direcc. Nombre Descripción
125006 ˆx+ext ( ob2 ob1 ob2+ob1 )
Adición simbólica, prueba por infinito.
126006 ˆx-ext ( ob2 ob1 ob2-ob1 )
Resta simbólica, prueba por infinito.
127006 ˆx*ext ( ob2 ob1 ob2*ob1 )
Multiplicación simbólica, prueba por infinito.
129006 ˆx/ext ( ob2 ob1 ob2/ob1 )
División simbólica, prueba por infinito.
12B006 ˆxˆext ( ob exponente obˆexponente )
Potenciación.
12C006 ˆEXPANDˆ ( x y xˆy=exp[y*ln[x]] )
Power with simplifications. If y is a fraction of integers, use
XROOTˆ instead.
4FB006 ˆQneg ( ob -ob )
Symbolic negation.
4FC006 ˆRNEGext ( ob -ob )
Symbolic negation.
4FA006 ˆSWAPRNEG ( ob2 ob1 ob1 -ob2 )
Does SWAP then symbolic negation.
4FE006 ˆRREext ( ob Re(ob) )
Symboloc real part.
4FD006 ˆSWAPRRE ( ob2 ob1 ob1 Re(ob2) )
SWAP, then RREext.
500006 ˆRIMext ( ob Im(ob) )
Symbolic imaginary part.
4FF006 ˆSWAPRIM ( ob1 ob2 ob2 Im(ob1) )
SWAP, then RIMext.
501006 ˆxREext ( symb symb' )
Complex real part. Expands only + - * / ˆ.
503006 ˆxIMext ( symb symb' )
Complex imaginary part. Expands only + - * / ˆ.
505006 ˆRCONJext ( ob Conj(ob) )
Symbolic complex conjugate.
Direcc. Nombre Descripción
50D006 ˆxABSext ( ob abs(ob) )
Symbolic ABS function.
50A006 ˆRABSext ( ob abs(ob) )
Internal ABS. Internal representation.
52A006 ˆxINVext ( ob 1/ob )
Symbolic inversion.
557006 ˆxSYMINV ( symb 1/symb )
Symbolic inversion.
553006 ˆxSQext ( symb sq(symb) )
Symbolic square.
555006 ˆxSYMSQ ( symb symbˆ2 )
51B006 ˆSXSQRext ( ob sqrt(ob) )
Does not take care of the sign.
51C006 ˆXSQRext ( ob sqrt(ob) )
Tries to return a positive square root if nocareflag is cleared.
52B006 ˆxvext ( ob sqrt(ob) )
Symbolic square root, tests for 0 and 1.
552006 ˆxSYMSQRT ( symb sqrt(symb) )
521006 ˆCKLN ( ob ln(ob) )
Symbolic LN with special handling for fractions.
Does not use the internal representation.
522006 ˆxLNext ( ob ln(ob) )
Symbolic LN, without fraction handling.
525006 ˆEXPANDLN ( ob ln(ob) )
Symbolic LN using internal representation. Before switching to
internal representation, test for ABS, 0 and 1 and, in real mode,
test if ob=exp(x).
528006 ˆREALLN ( ob ln(ob) )
Internal natural logarithm for a real argument.
526006 ˆCMPLXLN ( ob ln(ob) )
Internal complex natural logarithm.
527006 ˆLNATANext ( ob ln(ob) )
Internal natural logarithm for complex.
529006 ˆxEXPext ( y d n exp(y*n/d*i*_) )
Symbolic EXP, tests for 0, infinity and i*k*_/12
where k is an integer. Tests for d=1,2,3,4,6.
52C006 ˆxCOSext ( ob cos(ob) )
Symbolic COS, tests for 0 and multiples of _/12.
Also tests if ob=acos(x) or ob=asin(x).
536006 ˆxSYMCOS ( ob cos(ob) )
533006 ˆxACOSext ( ob acos(ob) )
Symbolic ACOS. Tests for 0, infinity and tables.
53F006 ˆxSYMACOS ( ob acos(ob) )
52D006 ˆxSINext ( ob sin(ob) )
Symbolic SIN, tests for 0 and multiplies of _/12.
Also tests if ob=acos(x) or ob=asin(x).
538006 ˆxSYMSIN ( ob sin(ob) )
532006 ˆxASINext ( ob asin(ob) )
Symbolic ASIN. Tests for 0, infinity and tables.
53D006 ˆxSYMASIN ( ob asin(ob) )
52E006 ˆxTANext ( ob tan(ob) )
Symbolic TAN. Tests for 0 and multiplies of _/12.
Also tests if ob=atan(x).
53A006 ˆxSYMTAN ( ob tan(ob) )
Direcc. Nombre Descripción
534006 ˆxATANext ( ob atan(ob) )
Symbolic ATAN. Tests for 0, infinity and tables.
541006 ˆxSYMATAN ( ob atan(ob) )
52F006 ˆxCOSHext ( ob cosh(ob) )
Symbolic COSH. Tests for 0, infinity and acosh(x).
545006 ˆxSYMCOSH ( ob cosh(ob) )
54E006 ˆxACOSHext ( symb acosh(symb) )
Symbolic ACOSH.
550006 ˆxSYMACOSH ( symb acosh(symb) )
530006 ˆxSINHext ( ob sinh(ob) )
Symbolic SINH. Tests for 0, infinity and asinh(x).
543006 ˆxSYMSINH ( ob sinh(ob) )
54B006 ˆxASINHext ( symb symb' )
Symbolic ASINH.
54D006 ˆxSYMASINH ( symb asinh(symb) )
531006 ˆxTANHext ( ob tanh(ob) )
Symbolic TANH. Tests for 0 and atanh(x).
547006 ˆxSYMTANH ( ob tanh(ob) )
Symbolic TANH.
548006 ˆxATANHext ( symb symb' )
Symbolic ATANH.
54A006 ˆxSYMATANH ( ob atanh(ob) )
55F006 ˆxSYMFLOOR ( symb symb' )
561006 ˆxSYMCEIL ( symb symb' )
563006 ˆxSYMIP ( symb symb' )
565006 ˆxSYMFP ( symb symb' )
567006 ˆxSYMXPON ( symb symb' )
569006 ˆxSYMMANT ( symb symb' )
56B006 ˆxSYMLNP1 ( symb symb' )
56D006 ˆxSYMLOG ( symb symb' )
56F006 ˆxSYMALOG ( symb symb' )
571006 ˆxSYMEXPM1 ( symb symb' )
572006 ˆfactorial ( symb symb )
Symbolic factorial.
573006 ˆfacts ( symb symb )
Symbolic factorial.
575006 ˆxSYMFACT ( symb symb )
578006 ˆxSYMNOT ( symb symb' )
128006 ˆx=ext ( ob2 ob1 ob2=ob1 )
48.1 Referencia
48.1.1 Comandos Básicos para Manipular Expresiones
Direcc. Nombre Descripción
157006 ˆSYMBINCOMP ( symb ob1 .. obN #n )
( ob ob #1 )
( {} {} #1 )
Descompone un objeto simbólico en un objeto meta. Otros
objetos son convertidos en metas de 1 objeto poniendo #1 en
la pila.
386006 ˆm-1&m+1 ( meta meta&1&- meta&1&+ )
Crea dos copias del meta.
A uno le agrega el entero 1 y el comando x-.
Al otro le agrega el entero 1 y el comando x+.
388006 ˆ1&meta ( Meta 1&Meta )
Agrega el entero 1 al inicio del meta.
387006 ˆmeta1/meta ( meta meta 1&meta&/ )
Duplica el meta e invierte la expression que el meta representa.
389006 ˆmeta/2 ( Meta Meta&2&/ )
Divide la expresión entre el entero 2.
38A006 ˆaddt2 ( Meta Meta&2 )
Agrega el entero 2 al final del meta.
38B006 ˆaddt/ ( Meta Meta&/ )
Agrega símbolo de división al final del meta.
103001 FLASHPTR 001 103 ( Meta Meta&* )
Agrega símbolo de multiplicación al final del meta.
38C006 ˆmeta2* ( Meta 2&Meta&* )
Multiplica la expresión por el entero 2.
390006 ˆmeta-1 ( Meta Meta&1&- )
Resta el entero 1 a la expresión.
398006 ˆaddtˆ ( Meta Meta&ˆ )
Agrega símbolo de potenciación al final del meta.
39C006 ˆtop&addt* ( meta #0 meta )
( meta1 meta2 meta1*meta2 )
Multiplica dos expresiones.
Junta los metas y agrega el comando x* al final.
39D006 ˆtop&addt/ ( meta #0 meta )
( meta1 meta2 meta1/meta2 )
Divide dos expresiones.
Junta los metas y agrega el comando x/ al final.
39E006 ˆaddti ( meta meta&i )
Agrega i (la unidad imaginaria) al final del meta.
48.1.2 Operaciones Básicas y Aplicación de Funciones
Direcc. Nombre Descripción
459006 ˆmetai* ( meta i&meta&* )
Multiplica la expresión por i.
38D006 ˆmeta1-sq ( Meta Meta' )
Cambia x hacia 1-xˆ2, donde x es la expresión original.
38E006 ˆmetasq+1 ( Meta Meta' )
Cambia x hacia xˆ2+1, donde x es la expresión original.
38F006 ˆmetasq-1 ( Meta Meta&SQ&1&- )
Cambia x hacia xˆ2-1, donde x es la expresión original.
393006 ˆmetaadd ( Meta1 Meta2 Meta1+Meta2 )
Adds 2 meta objects with trivial simplifications.
metaadd checks for Meta1/2=Z0 ONE.
3AB006 ˆMetaAdd ( Meta2 Meta1 Meta2+Meta1 )
Adds 2 meta objects with trivial simplifications.
Checks for infinities then call metaadd.
1CE006 ˆckaddt+ ( Meta1 Meta2 Meta1+Meta2 )
Adds 2 meta objects with trivial simplifications.
394006 ˆmetasub ( Meta1 Meta2 Meta1+Meta2 )
Subtracts 2 meta objects with trivial simplifications.
metasub checks for Meta1/2=Z0 ONE.
3AD006 ˆMetaSub ( Meta2 Meta1 Meta2-Meta1 )
Subtracts 2 meta objects with trivial simplifications.
Checks for infinities then call metasub.
1CF006 ˆckaddt- ( Meta1 Meta2 Meta1+Meta2 )
Subtracts 2 meta objects with trivial simplifications.
395006 ˆmetamult ( Meta1 Meta2 Meta1*Meta2 )
Multiplies 2 meta objects with trivial simplifications.
Checks for meta1, meta2= Z0 or Z1, checks for xNEG.
3AF006 ˆMetaMul ( Meta2 Meta1 Meta2*Meta1 )
Multiplies 2 meta objects with trivial simplifications.
Checks for infinities/0 then call metamult.
1CD006 ˆckaddt* ( Meta1 Meta2 Meta1*Meta2 )
Multiplies 2 meta objects with trivial simplifications.
396006 ˆmetadiv ( Meta2 Meta1 Meta2/Meta1 )
Divides 2 meta objects with trivial simplifications.
Checks for infinities and 0, meta2 =1 or Z-1, checks for xNEG.
3B1006 ˆMetaDiv ( Meta2 Meta1 Meta2/Meta1 )
Divide 2 meta objects with trivial simplifications.
Checks for infinities and 0 then call metadiv.
3F1006 ˆDIVMETAOBJ ( o1...on #n ob {o1/ob...on/ob} )
Division of all elements of a meta by ob. Tests if o=1.
397006 ˆmetaˆ ( Meta ob Meta&ob&ˆ )
Elevates expression to a power. If ob=1, just returns the
expression. Tests for present of xNEG in the end of meta for
integral powers.
399006 ˆmetapow ( Meta2 Meta1 Meta2ˆMeta1 )
Elevates expression to a power (any other expression).
If length of Meta1 is ONE, calls metaˆ.
3B5006 ˆMetaPow ( Meta2 Meta1 Meta2ˆMeta1 )
Power. Checks for infinities then calls metapow.
39B006 ˆmetaxroot ( Meta2 Meta1 Meta2&XROOT&Meta1 )
Root of expression.
Direcc. Nombre Descripción
3B9006 ˆmetaneg ( meta meta )
Checks only for meta finishing by xNEG.
3BA006 ˆmetackneg ( meta meta )
Like metaneg but checks for meta=ob ONE.
3B7006 ˆMetaNeg ( Meta Meta )
Negates meta. Only checks for metas finishing by xNEG.
502006 ˆxSYMRE ( meta meta' )
Meta complex real part. Expands only + - * / ˆ.
504006 ˆxSYMIM ( meta meta' )
Meta complex imaginary part. Expands only + - * / ˆ.
50E006 ˆaddtABS ( Meta Meta' )
Meta ABS. Does a CRUNCH first to find sign.
510006 ˆaddtABSEXACT ( Meta Meta' )
Meta ABS. No crunch, sign is only found using exact methods.
511006 ˆaddtSIGN ( Meta Meta' )
Meta SIGN.
513006 ˆaddtARG ( Meta Meta' )
Meta ARG.
12D006 ˆaddtXROOT ( Meta2 Meta1 Meta' )
Meta XROOT. XROOT(o2,o1) is o1ˆ[1/o2], compared to o2ˆo1.
12F006 ˆaddtMIN ( Meta2 Meta1 Meta' )
Meta MIN.
131006 ˆaddtMAX ( Meta2 Meta1 Meta' )
Meta MAX.
133006 ˆaddt< ( Meta2 Meta1 Meta' )
Meta <.
135006 ˆaddt<= ( Meta2 Meta1 Meta' )
Meta <=.
137006 ˆaddt> ( Meta2 Meta1 Meta' )
Meta >.
139006 ˆaddt>= ( Meta2 Meta1 Meta' )
Meta >=.
13B006 ˆaddt== ( Meta2 Meta1 Meta' )
Meta ==.
13D006 ˆaddt!= ( Meta2 Meta1 Meta' )
Meta ≠.
13F006 ˆaddt% ( Meta2 Meta1 Meta' )
Meta %.
141006 ˆaddt%CH ( Meta2 Meta1 Meta' )
Meta %CH. Meta2*(1+Meta'/100)=Meta1.
143006 ˆaddt%T ( Meta2 Meta1 Meta' )
Meta %T.
145006 ˆaddtMOD ( Meta2 Meta1 Meta' )
Meta MOD.
147006 ˆaddtTRNC ( Meta2 Meta1 Meta' )
Meta TRNC.
149006 ˆaddtRND ( Meta2 Meta1 Meta' )
Meta RND.
14B006 ˆaddtCOMB ( Meta2 Meta1 Meta' )
Meta COMB.
14D006 ˆaddtPERM ( Meta2 Meta1 Meta' )
Meta PERM.
14F006 ˆaddtOR ( Meta2 Meta1 Meta' )
Meta OR.
Direcc. Nombre Descripción
151006 ˆaddtAND ( Meta2 Meta1 Meta' )
Meta AND.
153006 ˆaddtXOR ( Meta2 Meta1 Meta' )
Meta XOR.
506006 ˆaddtCONJ ( meta meta' )
Meta complex conjugate.
523006 ˆaddtLN ( Meta Meta' )
Meta LN.
535006 ˆaddtCOS ( Meta Meta' )
Meta COS.
537006 ˆaddtSIN ( Meta Meta' )
Meta SIN.
539006 ˆaddtTAN ( Meta Meta' )
Meta TAN.
53B006 ˆaddtSINACOS ( meta meta' )
If meta stands for x, meta' stands for sqrt[1-xˆ2].
53C006 ˆaddtASIN ( Meta Meta' )
Meta ASIN.
53E006 ˆaddtACOS ( Meta Meta' )
Meta ACOS.
540006 ˆaddtATAN ( Meta Meta' )
Meta ATAN.
542006 ˆaddtSINH ( Meta Meta' )
Meta SINH.
544006 ˆaddtCOSH ( Meta Meta' )
Meta COSH.
546006 ˆaddtTANH ( Meta Meta' )
Meta TANH.
549006 ˆaddtATANH ( Meta Meta' )
Meta ATANH.
54C006 ˆaddtASINH ( Meta Meta' )
Meta ASINH.
54F006 ˆaddtACOSH ( Meta Meta' )
Meta ACOSH.
551006 ˆaddtSQRT ( Meta Meta' )
Meta SQRT.
554006 ˆaddtSQ ( Meta Meta' )
Meta SQ.
556006 ˆaddtINV ( Meta Meta' )
Meta INV.
558006 ˆaddtEXP ( Meta Meta' )
Meta EXP. Does not apply EXP[-..]=1/EXP[..].
559006 ˆxSYMEXP ( Meta Meta' )
Meta EXP. Applies EXP[-..]=1/EXP[..].
55A006 ˆaddtD->R ( Meta Meta' )
Meta DR.
55C006 ˆaddtR->D ( Meta Meta' )
Meta RD.
55E006 ˆaddtFLOOR ( Meta Meta' )
Meta FLOOR.
560006 ˆaddtCEIL ( Meta Meta' )
Meta CEIL.
562006 ˆaddtIP ( Meta Meta' )
Meta IP.
Direcc. Nombre Descripción
564006 ˆaddtFP ( Meta Meta' )
Meta FP.
566006 ˆaddtXPON ( Meta Meta' )
Meta XPON.
568006 ˆaddtMANT ( Meta Meta' )
Meta MANT.
56A006 ˆaddtLNP1 ( meta meta )
Meta LNP1.
56C006 ˆaddtLOG ( meta meta )
Meta LOG.
56E006 ˆaddtALOG ( meta meta )
Meta ALOG.
570006 ˆaddtEXPM ( meta meta )
Meta EXPM.
574006 ˆaddtFACT ( Meta Meta' )
Meta FACT.
577006 ˆaddtNOT ( Meta Meta' )
Meta NOT.
48.1.6 Tests
Direcc. Nombre Descripción
39A006 ˆmetafraction? ( Meta Meta flag )
Tests if meta is a fraction of integers.
3BC006 ˆmetapi? ( Meta Meta# )
Tests presence of _ in a meta. # is the last occurence of _ or 0.
3BD006 ˆmetaCOMPARE ( Meta2 Meta1 Meta2 Meta1 # )
Comparison of 2 meta.
# =0 if undef
# =1 if >
# =2 if <
# =3 if =
Assumes generic situation, e.g. Xˆ2> 0 in real mode. Look
below STRICTmetaCOMPARE for a more careful comparison.
3BE006 ˆSTRICTmetaCOMPARE ( Meta2 Meta1 Meta2 Meta1 # )
Comparison of 2 meta.
# =0 if undef
# =1 if >
# =2 if <
# =3 if =
Unlike metaCOMPARE it does not assume generic situation.
3C3006 ˆmetareal? ( meta meta flag )
Tests if IM[meta]==0.
Capítulo 49
Polinomios
Los comandos de este capítulo tratan sobre polinomios y operaciones con ellos.
49.1 Referencia
49.1.1 Operaciones con polinomios
Direcc. Nombre Descripción
118006 ˆQAdd ( o1 o2+o1 )
Suma dos polinomios.
Por ejemplo:
119006 ˆRADDext ( o2 o1 o2+o1 )
Internal +. This is the same entry as ˆQAdd.
117006 ˆSWAPRADD ( o2 o1 o1+o2 )
SWAP, then QAdd.
115006 ˆQSub ( o2 o1 o2-o1 )
Subtracts two polynomials.
116006 ˆRSUBext ( o2 o1 o2-o1 )
Internal -. This is the same entry as ˆQSub.
114006 ˆSWAPRSUB ( o2 o1 o1-o2 )
SWAP, then QSub.
111006 ˆQMul ( Q1 Q2 Q )
Multiplication of polynomials with extensions.
112006 ˆRMULText ( Q1 Q2 Q )
Multiplication of polynomials with extensions.
This is the same entry as ˆQMul.
110006 ˆSWAPRMULT ( Q1 Q2 Q )
SWAP, then ˆQMul.
11C006 ˆQDiv ( o2 o1 o2/o1 )
Internal /.
11B006 ˆRDIVext ( o2 o1 o2/o1 )
Internal /. This is the same entry as ˆQDiv.
Direcc. Nombre Descripción
11A006 ˆSWAPRDIV ( o2 o1 o1/o2 )
SWAP, then QDiv.
0D9006 ˆQMod ( Q, Z Q mod Z )
113006 ˆRASOP ( n1/d1 n2/d2 d1*d2 n1*d2 n2*d1 )
Used by RADDext and RSUBext for rational input.
11F006 ˆRP# ( o2 # o2ˆ# )
Internal power (not for matrices).
120006 ˆMPext ( ob #/Z/% prg* obˆ# )
General power with a specified multiplication program.
123006 ˆRPext ( o2 o1 o2ˆo1 )
Tries to convert o1 to an integer to call RP#, otherwise xˆext.
108006 ˆDISTDIVext ( P Q quo mod T )
(P Q P Q F )
Euclidean division. Assumes P and Q have integer
coefficientes. Returns FALSE if sparse short division fails.
3E5006 ˆPTAYLext ( P, r symb )
Taylor for polynomials.
15B006 ˆCARCOMPext ( Q1/Q2 Q1'/Q2' )
Extracts leading coefficients for the first variable from a rational
polynomial.
3EE006 ˆQdivRem ( ob2 ob1 quo mod )
Polynomial Euclidean division of 2 objects.
Dispatchs to DIV2LISText for list polynomials.
3EF006 ˆDIV2LISText ( Z0 l1 l2 div mod )
Euclidean division, l1 and l2 are list polynomials.
Test first if l1=l2, then tries fast division, if it fails switch to SRPL
division.
3F8006 ˆPDIV2ext (A B Q R )
Step by step Euclidean division for univar poly.
3F9006 ˆPsetSign ( P1 P2 sign[P2]*P1 )
Sets sign of P1 according to leading coeff of P2.
3C4006 ˆModExpa ( Zn Fraction Fraction modulo Zn )
3C5006 ˆModAdd ( Q1 Q2 Zn Z )
Modular addition. Z = Q1+Q2 (mod Zn).
3C6006 ˆModSub ( Q1 Q2 Zn Z )
Modular subtraction. Z = Q1-Q2 (mod Zn).
3C7006 ˆModMul ( Q1 Q2 Zn Z )
Modular multiplication. Z = Q1*Q2 (mod Zn).
3C8006 ˆModDiv ( Z1 Z2 Zn Z )
Modular division. Z = Z1/Z2 (mod Zn).
3C9006 ˆModDiv2 ( Q1 Q2 Zn quo mod mod' )
Modular division. mod' = Q1 mod Q2 mod Zn.
If Q1 and Q2 are integers, Q1 mod Q2 mod Zn is always 0.
3CA006 ˆModInv ( Z Zn Z' )
Modular inversion. Z' = INV(Z) (mod Zn).
NONINTERR if GCD[Z,Zn] 6= 1 or if Z = 0 (otherwise the results
would be unpredictable).
3CB006 ˆModGcd ( Q1 Q2 Zn Q' )
Modular GCD.
49.1.2 Factorization
Direcc. Nombre Descripción
08E006 ˆBerlekampP ( P #prime P F / P Lf #prime T )
Berlekamp's algorithm for finding modular factors of a univariate
polynomial.
08F006 ˆBerlekamp ( P P F / P Lf #prime T )
Berlekamp's algorithm for finding modular factors of a univariate
polynomial with a leading frontend for finding linear factors
faster.
The input polynomial must be square free, otherwise the
polynomial is not fully factored.
Due to memory restrictions byte sized coefficients are used and
the following restrictions were imposed: prime<128 and
degree<256. If the conditions are not met FALSE is returned.
BCD: prime≤97.
0A8006 ˆALG48FCTR? ( P [ meta cst_coeff TRUE | P FALSE ] )
Factorizes square-free polynomial in Erable format.
0A9006 ˆMfactTriv ( P meta-factor P' )
Extracts all trivial power factors of P.
0AA006 ˆCheckPNoExt ( P P flag )
Checks that P does not contain any DOCOL (i.e. extensions).
0AB006 ˆPPP ( P PP PC )
Computes primitive polynomial and content of non-const P with
respect to X1. The results are trimmed (provided P was).
0AC006 ˆPfactor ( P Lfk Z )
Does a complete factorization of P. The result is trimmed.
0AD006 ˆPSqff ( P Lfk )
Square-free and trivial factorization, including integer content,
of P taken positive. Factors of same power are not necessarily
merged or adjacent, but all Fi's are square-free.
0AE006 ˆPHFctr ( P Lf )
Heuristic factorization of polynomial taken positive. LAM
FullFact? must be bound. If LAM FullFact? is TRUE, a full
factorization is done. If it is FALSE, only square-free and trivial
factorization is done.
0AF006 ˆPHFctr1 ( P Lf )
Heuristic factorization of primitive polynomial.
LAM FullFact? must be bound. If TRUE, a full factorization is
done. When FALSE, only a square-free and trivial factorization
are done.
0B0006 ˆPHFctr0 ( P Lf )
Heuristic factorization of primitive square-free non constant
polynomial.
0D8007 ˆP2P# ( P P' # )
Extracts trivial power of poly. P must be a valid poly (if list,
begin with a non zero coeff).
0B1006 ˆDeCntMulti (R L )
Transforms list with count into simple list.
R = { {f1 #k1} ... {fn #kn} }
L = { f1 f1 .. fn fn }.
0B2006 ˆDoLS ( L S F L' )
Applies program F(Li,S) to every elem of L.
Direcc. Nombre Descripción
0B3006 ˆPNFctr ( Z Lf )
Factorization of positive integer as polynomial.
Lf = {} if Z is 1
Lf = { {Z1 #k1} ... {Zn #kn} }
o/w.
0B4006 ˆPSQFF ( P Lsqff )
Computes the square-free factorization of primitive P. The
result is trimmed (provided P was).
0B5006 ˆLiftZAdic (p z F L )
Lift n-1 z-adic factorization into n factorization.
0B6006 ˆLFCProd (C L C P )
Calculates combination product.
0B7006 ˆUfactor ( P Lf )
Factorization of a square free primitive univariate polynomial.
0B8006 ˆUFactor1 ( P Lf )
Factorization of a square free primitive univariate polynomial of
degree > 2.
0B9006 ˆMonicLf ( Lfp p Lfp' )
Converts true modular factorization to monic factorization by
dividing by the leading coefficient of factor 1.
0BA006 ˆDemonicLf ( Lfp lc p Lfp' )
Converts monic modular factorization to true modular
factorization by multiplying factor1 by lcoeff.
0BB006 ˆLiftLinear ( #root1 .. #rootn #n )
Lifts modular roots of a polynomial to find linear factors of a
univariate polynomial.
Lflin = list of found true factors
Lfplin' = remaining linear factors
P' = remaining polynomial
Assumes UFactor lambda variables available and uses them
for input and output.
0BC006 ˆLiftGeneral ()
Lifts factorization mod p to factorization mod pˆk where pˆk
exceeds the factor bound for succesful true factor extraction.
Assumes UFactor lambda variables.
0BD006 ˆUFactorDeg2 ( P Lf )
Factorization of a degree 2 polynomial. Polynomial is
univariate, square free and primitive.
0BE006 ˆCombineFac ( P Lfp p Tf Tfp )
Combines modular factors to true factors. P is the polynomial to
factor, Lfp is the list of modular factors, and p the modulo. The
entry returns the a list of found true factors (Tf) and the list of
modular factors for each true factor (Tfp)
0BF006 ˆCombProd ( lc Lfp p Cb F )
Calculates modular combination.
0C0006 ˆCombInit ( #r Cb )
Inits modular combination list to value { 1 0 0 0 .. }.
0C1006 ˆCombNext ( Cb Cb' flag )
Gets next possible modular combination. Assumes Cb is valid
and is in tempob area.
0C2006 ˆRmCombNext ( Lf Cb Lfrm Lf' Cb' flag )
Removes next possible combination after a successful
combination has been found, and remove the used factors from
the factor list.
Direcc. Nombre Descripción
0C3006 ˆPfactTriv ( P P' Lf )
Extracts all trivial power factors of P.
0C4006 ˆVarFactor ( P #var P #n )
Calculates what power of the given variable is a factor in P.
0C5006 ˆPfactPowCnt ( P P Lk flag )
Calculates trivial power factors in P. flag is TRUE if any of the
powers is nonzero.
0C6006 ˆPdivLk ( P Lk P' )
Divides polynomial by its trivial powers.
282006 ˆFEVIDENText ( P meta-fact cst coeff )
Real mode: full factorization over the integer
Complex mode: find all 1st order factors of P.
49.1.4 Tests
Direcc. Nombre Descripción
10B006 ˆUnivar? ( P P flag )
Tests if polynomial is univariate.
10C006 ˆSUnivar? ( P P flag )
Tests if polynomial is univariate and the coefficients are
bounded by register size.
0CC007 ˆPOLYPARITY ( poly Z )
Tests if a polynomial (internal rep) is even/odd/none. Z=1 if
even, -1 if odd, 0 if neither even nor odd.
0D6007 ˆPOLYSYM (P Z )
Tests symmetry of coefficients of polynomial.
Z=1 for symmetric, -1 for anti, 0 otherwise.
0D7007 ˆPOLYASYM (P Z )
Tests "antisymmetry" of coef of polynomial. Z=1 for symmetric,
-1 for anti, 0 otherwise.
Capítulo 50
50.1 Referencia
Operaciones de Cálculo
Los comandos en este capítulo están relacionados con varios aspectos del Cálculo, tales
como límites, derivadas, expansión de fracciones parciales y transformadas de Laplace.
51.1 Referencia
51.1.1 Limites y Expansión de Series
Direcc. Nombre Descripción
46F006 ˆSYMTAYLOR ( symb id %/z symb )
Taylor series expansion around point 0 (McLaurin's series) with
regard to given variable, and of the given order.
471006 ˆTRUNCDL ( DL-l reste-l truncated_DL )
Series expansion truncation.
472006 ˆLIMSERIES! ( expression X=a|X %|zint )
a lim DL-l rest-l num-l/deno-l equiv-l lvar # Series expansion.
#=1 for X=a-h or X=-1/h.
477006 ˆLIMIT! ( symb DL-l reste-l num-l/deno-l
equiv.-l lim. lvar flag )
lim. = { symf direction }
478006 ˆLIMSTEP1! ( symb { DL-l reste-l num-l/deno-l
equiv.-l } flag )
47C006 ˆLIMLIM! ( # lvar equiv-l lvar lim )
47F006 ˆLIMCMPL! ( reste-1-l reste-2-l reste-l )
480006 ˆLIMEQUFR! ( n/d # n/d-l equiv % )
481006 ˆLIMEQU! ( {} # {} / {}-equiv-l {}-equiv-l { # # # } )
483006 ˆLIM+-! ( DL1...DLn #n op DL flag )
DL = { DL-l reste-l num-l/deno-l equiv-l }.
48C006 ˆLIMDIVPC! ( #ordre num-l deno-l num-l deno-l )
48E006 ˆLIMPROFEND! ( num deno #prof num deno )
490006 ˆLIM%#! ( num-l deno-l {%...%} num-l' deno-l'
#prof {%...%} )
49E006 ˆLIM#VARX! ( lvar lvar #varx )
4A1006 ˆHORNEXP! ( lim lvar X-l reste-l lvar DL reste-l )
4B6006 ˆVARCOMP! ( var1 var2 flag )
4BA006 ˆVARCOMP32! ( var 0: )
4BD006 ˆLIMVALOBJ! ( ob lvar symb )
4BE006 ˆLIMVAL! ( ob coeff val )
4BF006 ˆEQUIV! ( {} lequiv equiv ordre )
4C0006 ˆLVARXNX2! ( ob ob lvarx lvarnx )
4C2006 ˆFindCurVar ( symb symb )
Sets a new current var if needed.
4C3006 ˆLIMVAR! ( symb symb lvar )
Direcc. Nombre Descripción
15C006 ˆRISCH13 ( {}/{}' {}'' )
Assuming {}' has length 1, divides all elements of {} by this
element. Used by RISCHext and by SERIES to have a nicer
output of series.
51.1.2 Derivadas
Direcc. Nombre Descripción
3DC006 ˆPDer ( {} der )
1A1006 ˆDERIVext ( ob id ob' )
( ob sym ob' )
( ob V V' )
Calculates the derivative of the object. For a list argument
calculates the gradient with respect to the variables in the list. If
the variable is a symbolic, the first variable in it is used. Note
that the gradient is a vector quantity, thus the result is returned
as a list.
1A3006 ˆDERIVIDNT ( ob id ob' )
Main entry point for derivative with respect to a identifier.
1A4006 ˆDERIVIDNT1 ( ob ob' )
Main entry point for derivative with respect to the identifier
stored in LAM1.
1A5006 ˆDERIV ( symb symb' )
Derivative of symb with respect to the variable stored in LAM1.
1A6006 ˆMETADERIV ( Meta Meta' )
Derivative of Meta object.
1BD006 ˆMETADER&NEG ( Meta Meta' )
Meta derivative and negate.
1A9006 ˆMETADER+ ( Meta&+ Meta' )
Meta derivative of addition.
1AA006 ˆMETADER- ( Meta&- Meta' )
Meta derivative of subtraction.
1AB006 ˆMETADER* ( Meta&* Meta' )
Meta derivative of multiplication.
1AC006 ˆMETADER/ ( Meta&/ Meta' )
Meta derivative of division.
1AD006 ˆMETADERˆ ( Meta&ˆ Meta' )
Meta derivative of power.
1AE006 ˆMETADERFCN ( Meta Meta' )
Meta derivative of a function.
1AF006 ˆMETADERDER ( symb_id_; sym_fcn_; xDER #3 Meta' )
Meta derivative of a derivative of a function.
1B0006 ˆMETADERI4 ( Meta Meta' )
Meta derivative of a defined integral.
1B1006 ˆMETADERI3 ( Meta Meta' )
Meta derivative of an undefined integral.
1B2006 ˆMETADERIFTE ( Meta Meta' )
Meta derivative of IFTE.
1B4006 ˆMETADEREXP ( Meta Meta' )
Meta derivative of EXP.
1B5006 ˆMETADERLN ( Meta Meta' )
Meta derivative of LN.
1B6006 ˆMETADERLNP1 ( Meta Meta' )
Meta derivative of LNP1.
Direcc. Nombre Descripción
1B7006 ˆMETADERLOG ( Meta Meta' )
Meta derivative of LOG.
1B8006 ˆMETADERALOG ( Meta Meta' )
Meta derivative of ALOG.
1B9006 ˆMETADERABS ( Meta Meta' )
Meta derivative of ABS.
1BA006 ˆMETADERINV ( Meta Meta' )
Meta derivative of INV.
1BB006 ˆMETADERNEG ( Meta Meta' )
Meta derivative of NEG.
1BC006 ˆMETADERSQRT ( Meta Meta' )
Meta derivative of SQRT.
1BE006 ˆMETADERSQ ( Meta Meta' )
Meta derivative of SQ.
1BF006 ˆMETADERSIN ( Meta Meta' )
Meta derivative of SIN.
1C0006 ˆMETADERCOS ( Meta Meta' )
Meta derivative of COS.
1C1006 ˆMETADERTAN ( Meta Meta' )
Meta derivative of TAN.
1C2006 ˆMETADERSINH ( Meta Meta' )
Meta derivative of SINH.
1C3006 ˆMETADERCOSH ( Meta Meta' )
Meta derivative of COSH.
1C4006 ˆMETADERTANH ( Meta Meta' )
Meta derivative of TANH.
1C5006 ˆMETADERASIN ( Meta Meta' )
Meta derivative of ASIN.
1C6006 ˆMETADERACOS ( Meta Meta' )
Meta derivative of ACOS.
1C7006 ˆMETADERATAN ( Meta Meta' )
Meta derivative of ATAN.
1C8006 ˆMETADERASH ( Meta Meta' )
Meta derivative of ASINH.
1C9006 ˆMETADERACH ( Meta Meta' )
Meta derivative of ACOSH.
1CA006 ˆMETADERATH ( Meta Meta' )
Meta derivative of ATANH.
1B3006 ˆDERARG ( meta-symb arg1 .. argk der1 .. derk #k op )
Finds derivative of arguments.
1CB006 ˆpshder* ( Meta1 Meta2 Meta2&Meta1'&* )
Meta derivative utility.
1CC006 ˆSQRTINVpshd* ( Meta1 Meta2 Meta2&SQRT&INV&Meta1'&* )
Meta derivative utility.
51.1.3 Integración
Direcc. Nombre Descripción
07F007 ˆODE_INT ( symb idnt symb )
Integration with addition of a constant.
2C5006 ˆIBP ( u'*v u u*v -u*v' )
Internal integration by parts. If u is a constant return
INTVX(u'*v)+u. If stack 2 is a list it must e of the form { olduv
u'*v } then olduv will e added to u*v at stack level 2. This
permits multiple IBP in algebraic mode, e.g.
IBP(ASIN(X)ˆ2,X)
IBP(ANS(1),sqrt(1-Xˆ2))
IBP(ANS(1),C) the last step with an integral
containing a cst C.
2D0006 ˆPREVALext ( symb inf sup x symb|x=sup - symb|x=inf )
Evaluates an antiderivative between 2 bounds
Does not check for discontinuities of symb in this interval.
2D1006 ˆWARNSING ( symb inf sup vx symb inf sup vx )
Warns user for singularity.
2D2006 ˆINText ( symb x int[$,x, symb, xt] )
Return unevaluated integral.
2D3006 ˆINT3 ( f(x) x y F(y) where F'=f )
Undefined integration. No limit for underdetermined form.
3DD006 ˆINTEGRext ( {} prim )
Sumatorias
En este capítulo se encuentran los principales comandos relacionados con sumatorias, y
también algunas subrutinas usadas por esos comandos.
52.1 Referencia
Direcc. Nombre Descripción
0F9007 ˆSUM ( sym idnt sym )
Calcula la antiderivada discreta de una función.
Equivale al comando SIGMA de User RPL cuando en la pila
hay un objeto de clase simbólica y un id.
0FB007 ˆSUMVX ( sym sym )
Internal SUMVX.Works always with respect to the current
variable.
0FD007 ˆRATSUM ( sym sym )
Discrete rational sum.
0FE007 ˆFTAYL ( f shift f' )
Taylor shift for rational fractions.
0FF007 ˆCSTFRACTION? ( ob ob flag )
Taylor shift for rational fractions. Returns TRUE if ob is a cst
fraction.
104007 ˆHYPERGEO ( symb symb )
Tests and does hypergeometric summation.
100007 ˆNONRATSUM ( z/symb symb )
Discrete summation (hypergeometric case).
103007 ˆmeta_cst? ( meta meta flag )
Tests for meta to be cst with respect to current var.
108007 ˆZEILBERGER ( f(n,k) n k d C T )
( f(n,k) n k d F )
Zeilberger algorithm * NOT IMPLEMENTED YET*.
109007 ˆSYMPSI ( sym Psi(x) )
Digamma function.
10B007 ˆSYMPSIN ( sym int Psi(x,n) )
Digamma function.
11C007 ˆ%%PSI ( %%x %% )
Digamma function.
10D007 ˆIBERNOULLI ( #/zint Q )
Bernoulli numbers.
0D9007 ˆNDEvalN/D ( num deno n d num' deno' )
Evals list poly over a list fraction.
0DA007 ˆPEvalN/D ( P n d num d # )
Evals list poly over a list fraction.
3C1006 ˆvgerxssSYMSUM ( Meta2 Meta1 meta )
Symbolic sum with tests for two zints. lam'sumvar bound to
'id/lam' and lam'sumexpr to 'expr'.
Capítulo 53
Operaciones Modulares
Los comandos en este capítulo están relacionados con aritmética modular y otras
operaciones modulares.
53.1 Referencia
53.1.1 Operaciones Modulares
Direcc. Nombre Descripción
252006 ˆFLAGFACTORMOD ( symb symb )
FACTOR modulo.
253006 ˆMFACTORMOD ( M M' )
FACTOR modulo for amtrices.
256006 ˆLIFCext ( {contfrac} fraction )
Converts continued fraction to rational.
0E1006 ˆPEvalMod ( Q Z Zn Q' )
Computes value of polynomial mod Zn.
0E2006 ˆQAddMod ( Q1 Q2 Zn Q' )
Polynomial addition modulo Zn.
0E3006 ˆQSubMod ( Q1 Q2 Zn Q' )
Polynomial subtraction modulo Zn.
0E4006 ˆQMulMod ( Q1 Q2 Zn Q' )
Polynomial multiplication modulo Zn.
0E5006 ˆQDivMod ( Q1 Q2 Zn Qquo Qrem )
Polynomial division modulo Zn. In regular division the
coefficients in the remainder can increase very quickly to tens
of digits, thus it is important to normalize the coefficients
whenever possible.
0E6006 ˆQInvMod ( Q Zn Q' )
Polynomial inversion modulo Zn.
0E7006 ˆQGcdMod ( Q1 Q2 Zn Q' )
Polynomial GCD modulo Zn for univariate polynomials. The
result is made monic.
4C5006 ˆISOL1 ( symb id id symb' )
4C6006 ˆISOLALL ( symb id id {} )
Internal SOLVE.
4C7006 ˆISOL2ext ( symb id symb' )
( symb id {} )
Like ISOL1 if isolflag is set. Otherwise returns the list of all
found solutions.
Direcc. Nombre Descripción
4C8006 ˆBEZOUTMSOLV ( Lpoly Lidnt Lidnt sols )
If no extension in Lpoly, calls ALG48 GSOLVE
Otherwise, solves by Bezout "Gaussian" elimination.
In the latter case, if system seems underdetermined, Lidnt is
truncated. Then the system must be exactly determined and
polynomials must be prime together.
4C9006 ˆROOT{}N ( meta of roots list of roots )
Drops tagged roots.
4CA006 ˆMHORNER ( poly-l {r1...rk} # P[r1...rk] )
Top-level call. Poly-l might be a matrix.
4CB006 ˆMHORNER1 ( P { r } P[..r..] )
4CC006 ˆSQFFext ( Q { F1 mult1 .. Fn multn } )
4CD006 ˆMSQFF ( Q F1 mult1 .. Fn multn #2n )
Full square-free factorization of object. The result is given as a
Meta object.
4CE006 ˆ%1TWO ( ob ob %1 #2 )
Square free factorization of unknown (?) object.
See MSQFF.
4CF006 ˆMZSQFF ( Z Z1 mult1 .. Zn multn #2n )
Full factorization of an integer.
4D0006 ˆMZSQFF1 ( Meta curfac %n newfac T Meta curfac %n+1 )
( Meta curfac %n newfac F Meta' newfac %1 )
Adds integer factor to factor list. If the factor is the same as the
last time, only the multiplicity is increased.
4D2006 ˆMLISTSQFF ( P Meta )
Full square-free factorization of a polynomial with a recursive
call on the GCD of all coefficients.
4D3006 ˆMETASQFFext ( P-list S1 %1 ..Se-1 %e-1 %e ee Te Re )
Square-free factorization.
4DF006 ˆLVARXNXext ( symb symb x lvarnx lvarx )
Finds variable of symb depending on current variable and other
variable. Using LVAR is impossible here because of sqrt.
4E0006 ˆISPOLYNOMIAL? ( ob flag )
Retorna TRUE si symb es un polinomio con respecto a la
variable actual.
4E1006 ˆ2POLYNOMIAL? ( symb1 symb2 symb1 symb2 flag )
Returns TRUE if symb1 and symb2 are polynomial with respect
to current variable.
4E2006 ˆVXINDEP? ( symb symb flag )
Returns TRUE if symb is independent of current variable.
4E4006 ˆRLVARext ( ob {} )
Recursive search of all variables.
53.1.2 Comando LNAME y Similares
Direcc. Nombre Descripción
4DE006 ˆLIDNText ( ob {id/lam} )
Retorna una lista de variables.
23F006 ˆUSERLIDNT ( ob ob []/{} )
Retorna un vector simbólico con las variables (ids o lams) o
una lista vacía.
Equivale al comando LNAME de User RPL cuando en la pila
hay un objeto de clase simbólica o una formación.
Entre los comandos de esta sección (50.1.1) es el único que
ordena las variables.
4EC006 ˆLIDNTLVAR ( ob ob' ob {id/lam} {}lvar )
Retorna en el nivel 2 una lista con los ids y lams de ob'
(usando LIDNText).
Retorna en el nivel 1 la lista anterior además de las variables
de ob (usando LVARext) al final de esa lista.
Tablas de Signos
A sign table is a list which describes thes sign of a expression in different
intervals of a parameter. The list has an odd number of elements and looks like
this:
{ value1 sign1.2 value2 sign2.3 ...signN-1.N valueN }
The values are key values of the parameter, usually −1, +1, and the
locations of singularities or zeros in the expression. The values must be ordered
and can be numbers or symbolic expressions. The signs show the sign of the
expression in the interval between the adjacent values. Signs are ’-’, ’+’,
and ’?’ (if the sign is unknown). To compute the sign table of an expression
with respect to the current variable, use the entry SIGNE1ext. For example,
the sign table of the expression ‘X2 − 1’ is
{ −1 ’+’ -1 ’-’ 1 ’+’ +1 }
Below is a list of the entries related to sign tables.
54.1 Referencia
Direcc. Nombre Descripción
237006 ˆSIGNE ( symb sign )
Compute the sign table of the expression ith respect to the
current variable. Internal version of the UserRPL command
SIGNTAB.
0DC007 ˆSIGNE1ext ( expr sign )
Sign table of a polynomial or rational expression.
0DE007 ˆSIGNUNDEF ( sign )
Returns undefined sign table.
0DF007 ˆSIGNPLUS ( sign )
Returns always positive sign table.
0E0007 ˆSIGNMOINS ( sign )
Returns always negative sign table.
0E1007 ˆSIGNELN ( sign sign )
Returns ln of a sign table.
0E2007 ˆSIGNEEXP ( sign sign' )
Returns exp of a sign table.
0E3007 ˆSIGNESIN ( sign sign' )
Returns sin of a sign table.
0E4007 ˆSIGNECOS ( sign sign' )
Returns cos of a sign table.
0E5007 ˆSIGNETAN ( sign sign' )
Returns tan of a sign table.
0E6007 ˆSIGNEATAN ( sign sign' )
Returns atan of a sign table.
0E7007 ˆSIGNESQRT ( sign sign' )
Returns sqrt of a sign table.
0E8007 ˆSUBSIGNE ( sign min max sign' )
Truncates a sign table.
Direcc. Nombre Descripción
0E9007 ˆSIGNERIGHT ( sign ob sign' )
Places ob at the end of a sign table.
0EA007 ˆSIGNELEFT ( sign ob sign' )
Places ob at the beginning of a sign table.
0EB007 ˆ>SIGNE ( sign sign' )
Prepends { -infinity ? } to a sign table.
0EC007 ˆSIGNE> ( sign sign' )
Appends { ? +infinity } to a sign table.
0ED007 ˆSIGNMULText ( sign1 sign2 sign' )
Multiplies two sign tables.
0DB007 ˆPOSITIFext ( ob ob flag )
Tries to determine if ob is positive. In internal representation,
this depends on increaseflag so that x-1 is positive if increase
flag is cleared, negative otherwise, because x is assumed to
tend to +infinity or zero.
0EE007 ˆZSIGNECK ( ob ob flag )
Returns sign of an expression. Error if unable to find sign.
0F0007 ˆZSIGNE ( ob zint )
Returns sign of an expression. zint=1 for +, -1 for -, 0 for undef.
Expression does not need to be polynomial/rational.
0F1007 ˆzsigne ( meta zint )
Returns sign of a meta symbolic. zint=1 for +, -1 for -, 0 for
undef. Expression does not need to be polynomial/rational.
07D007 ˆCHECKSING ( symb inf sup vx symb inf sup vx flag )
Checks for singularities in expr.
Capítulo 55
Errores
Todos los mensajes de error del CAS tienen números de la forma DEXX (comienzan
todos con DE). Puedes ver cada uno de estos mensajes de error en el apéndice E.
Los comandos ˆERABLEERROR y ˆGETERABLEMSG agregan DE00 al bint que se
encuentra en la pila, para generar un error o conseguir la cadena correspondiente, de
manera que sólo tendrás que especificar los dos últimos dígitos del número del mensaje de
error.
Naturalmente, también puedes usar los comandos de error descritos en el capítulo 23
con los errores del CAS, usando los números de error completos.
55.1 Referencia
Direcc. Nombre Descripción
57E006 ˆERABLEERROR (# )
Llama a un error del CAS.
Equivale a usar :: # DE00 #+ ERROROUT ;
Por ejemplo:
:: # 1C FLASHPTR ERABLEERROR ;
Genera el error # DE1Ch "Unable to factor"
57D006 ˆGETERABLEMSG (# $ )
Consigue una cadena de la tabla de mensajes de error.
Equivale a usar :: # DE00 #+ JstGETTHEMSG ;
Por ejemplo:
:: # 1C FLASHPTR GETERABLEMSG ;
Consigue la cadena "Unable to factor", correspondiente al
mensaje de error # DE1Ch
090006 ˆErrInfRes Error 305h
Genera el error "Infinite Result"
091006 ˆErrUndefRes Error 304h
Genera el error "Undefined Result"
092006 ˆErrBadDim Error 501h
Genera el error "Invalid Dimension"
57F006 ˆCANTFACTOR Error DE1Ch
Genera el error "Unable to factor"
580006 ˆTRANSCERROR Error DE20h
Genera el error "Not reducible to a rational expression"
581006 ˆNONUNARYERR Error DE21h
Genera el error "Non unary operator"
582006 ˆINTERNALERR Error DE26h
Genera el error "CAS internal error"
583006 ˆINVALIDOP Error DE28h
Genera el error "Operator not implemented (SERIES)"
584006 ˆISOLERR Error DE2Ah
Genera el error "No solution found"
Direcc. Nombre Descripción
585006 ˆNONINTERR Error DE2Ch
Genera el error "No solution in ring"
586006 ˆINTVARERR Error DE32h
Genera el error "No name in expression"
587006 ˆZ>#ERR Error DE35h
Genera el error "Integer too large"
0EF007 ˆSIGNEERROR Error DE36h
Genera el error "Unable to find sign"
588006 ˆZ<0ERR Error DE46h
Genera el error "Negative integer"
589006 ˆVXINDEPERR Error DE47h
Genera el error "Parameter is cur. var. dependent"
58A006 ˆNONPOLYSYST Error DE49h
Genera el error "Non polynomial system"
58B006 ˆCOMPLEXERR Error DE4Dh
Genera el error "Complex number not allowed"
58C006 ˆVALMUSTBE0 Error DE4Eh
Genera el error "Polyn. valuation must be 0"
58D006 ˆSWITCHNOTALLOWED Error DE4Fh
Genera el error "Mode switch not allowed here"
119007 ˆNONALGERR Error DE50h
Genera el error "Non algebraic in expression"
58E006 ˆERR$EVALext ( flag # )
( comp ? )
( comp %flag ? )
Si en la pila hay TRUE y un bint, los borra de la pila.
Si en la pila hay FALSE y un bint, quita el flag y ejecuta el
comando ˆERABLEERROR sobre el bint.
Si en la pila hay un compuesto, entonces cambia los bints del
compuesto a cadenas (con ˆGETERABLEMSG) y luego ejecuta
uno por uno los objetos del compuesto (como COMPEVAL).
Si en la pila hay un compuesto y un real (positivo), entonces
efectúa lo descrito en el párrafo anterior, sólo si el número real
representa a un flag de sistema que se encuentra activado.
Ejemplo:
::
{ "ERRORES del CAS:" "\0A1 " &$ BINT1 &$ "\0A2 "
&$ BINT2 &$ "\0A3 " &$ BINT3 &$ "\0A..." &$ }
FLASHPTR ERR$EVALext
;
Retorna la cadena:
“ERRORES del CAS:
1 denominator(s)
2 root(s)
3 last
...”
Obs: la lista debe ir en una sóla línea en el editor de Debug 4x
58F006 ˆSys1IT ( comp )
( comp ? )
Si el flag 99 está desactivado (modo CAS conciso), borra el
compuesto y no hace nada.
Si el flag 99 está activado (modo CAS verboso), llama al
comado ˆERR$EVALext sobre el compuesto.
Capítulo 56
CAS Configuración
Los comandos de este capítulo proveen maneras de configurar las operaciones del CAS.
Las configuraciones que pueden ser hechas aquí son las mismas que pueden ser hechas
por el usuario cambiando los flags o con el formulario de entrada CAS MODES.
56.1 Referencia
Direcc. Nombre Descripción
08F007 ˆCFGDISPLAY ()
Muestra la configuración actual del CAS en la pantalla.
Llama a ˆEXACT?, ˆRCLVX y ˆRCLMODULO
CAS Menus
Los comandos de este capítulo retornan los menús ya incorporados que muestran comandos
del CAS, o hacen otras acciones relacionadas a los menús.
Para información general de los menús, lee el capítulo 37.
57.1 Referencia
Direcc. Nombre Descripción
1D1006 ˆMENUXYext ( #2 #1 {} )
Make list of Erable commands between the given numbers.
08D007 ˆMENUext ( $6...$1 )
If the CAS quiet flag is not set, displays the six strings as menu
keys. Otherwise does nothing.
0B2007 ˆMENUCHOOSE? ( prg flag )
Return best CHOOSE command.
0B3007 ˆMENUCHOOSE ( {} )
Offers a selection to the user. If Flag -117 is set, only installs a
menu. If not, offer a CHOOSE box.
0B4007 ˆMENUGENE1 ( {} )
Menu for CAS.
0B5007 ˆMENUBASE1 ( {} )
Base algebra menu.
0B6007 ˆMENUCMPLX1 ( {} )
Complex operations menu.
0B7007 ˆMENUTRIG1 ( {} )
Trigonometric operations menu.
0B8007 ˆMENUMAT1 ( {} )
Matrix operations menu.
0B9007 ˆMENUARIT1 ( {} )
Arithmetic operations menu.
0BA007 ˆMENUSOLVE1 ( {} )
Solver menu.
0BB007 ˆMENUEXPLN1 ( {} )
Exponential and logarithmic operations menu.
0BC007 ˆMENUDIFF1 ()
Differential calculus menu.
Capítulo 58
58.1 Referencia
Direcc. Nombre Descripción
218006 ˆISPRIME ( z/% %0/%1 )
Internal ISPRIME.
1D6006 ˆFLAGEXPAND ( symb symb' )
Internal xEXPAND. Expands symbolic expression.
1D8006 ˆFLAGFACTOR ( symb symb' )
( z symb )
Internal xFACTOR. Factors symbolic or number.
1D9006 ˆFLAGLISTEXEC ( symb {} symb' )
Internal xSUBST for the case that level 1 is an array or a
matrix.
1DA006 ˆFLAGSYMBEXEC ( symb symb' symb'' )
Internal xSUBST for the case that level 1 is a ymbolic.
1DB006 ˆFLAGIDNTEXEC ( symb id symb' )
Internal xSUBST for the case that level 1 is an id or a lam.
1DC006 ˆFLAGINTVX ( symb symb' )
Internal xINTVX.
1DD006 ˆDERVX ( symb symb' )
Internal xDERVX.
1DE006 ˆSOLVEXFLOAT ( % {} )
Internal xSOLVEVX for a float.
1DF006 ˆSYMLIMIT ( symb symb' symb'' )
Internal xLIMIT for scalars.
1E0006 ˆFLAGMATRIXLIMIT ( [] symb []' )
Internal xLIMIT for matrices.
1E1006 ˆTAYLOR0 ( symb symb' )
Internal xTAYLOR0.
1E2006 ˆFLAGSERIES ( symb id z {} symb' )
Internal xSERIES.
1E4006 ˆPLOTADD ( symb )
Internal xPLOTADD.
1E5006 ˆFLAGIBP ( symb1 symb2 symb3 symb4 )
Internal xIBP.
Direcc. Nombre Descripción
1E6006 ˆFLAGPREVAL ( symb1 symb2 symb3 symb4 )
Internal xPREVAL. Evaluates symb1 at the points symb2 and
symb3 and takes the difference.
1E7006 ˆMATRIXRISCH ( [] id symb' )
Internal xRISCH for matrix arguments.
1E8006 ˆFLAGRISCH ( symb id symb' )
Internal xRISCH for non-matrix argumetns.
1E9006 ˆFLAGDERIV ( symb id symb' )
Internal xDERIV.
1EA006 ˆFLAGLAP ( symb symb' )
Internal xLAP.
1EB006 ˆFLAGILAP ( symb symb' )
Internal xILAP.
1EC006 ˆFLAGDESOLVE ( symb symb' symb'' )
Internal xDESOLVE.
1ED006 ˆFLAGLDSSOLV ( symb1 symb2 symb3 )
Internal xLDEC.
1EF006 ˆFLAGTEXPAND ( symb symb' )
Internal xTEXPAND.
1F0006 ˆFLAGLIN ( symb symb' )
Internal xLIN.
1F1006 ˆFLAGTSIMP ( symb symb' )
Internal xTSIMP.
1F2006 ˆFLAGLNCOLLECT ( symb symb' )
Internal xLNCOLLECT.
1F3006 ˆFLAGEXPLN ( symb symb' )
Internal xEXPLN.
1F4006 ˆFLAGSINCOS ( symb symb' )
Internal xSINCOS.
1F5006 ˆFLAGTLIN ( symb symb' )
Internal xTLIN.
1F6006 ˆFLAGTCOLLECT ( symb symb' )
Internal TCOLLECT.
1F7006 ˆFLAGTRIG ( symb symb' )
Internal xTRIG.
1F8006 ˆFLAGTRIGCOS ( symb symb' )
Internal xTRIGCOS.
1F9006 ˆFLAGTRIGSIN ( symb symb' )
Internal xTRIGSIN.
1FA006 ˆFLAGTRIGTAN ( symb symb' )
Internal xTRIGTAN.
1FB006 ˆFLAGTAN2SC ( symb symb' )
Internal xTAN2SC.
1FC006 ˆFLAGHALFTAN ( symb symb' )
Internal xHALFTAN.
1FD006 ˆFLAGTAN2SC2 ( symb symb' )
Internal xTAN2SC2.
1FE006 ˆFLAGATAN2S ( symb symb' )
Internal xATAN2S.
1FF006 ˆFLAGASIN2T ( symb symb' )
Internal xASIN2T.
200006 ˆFLAGASIN2C ( symb symb' )
Internal xASIN2C.
Direcc. Nombre Descripción
201006 ˆFLAGACOS2S ( symb symb' )
Internal xACOS2S.
206006 ˆSTEPIDIV2 ( z1 z2 z3 z4 )
Internal xIDIV2.
207006 ˆFLAGDIV2 ( symb1 symb2 symb3 symb4 )
Internal xDIV2.
208006 ˆFLAGGCD ( symb1 symb2 symb3 )
Internal xGCD for the case with two symbolic arguments.
209006 ˆPEGCD ( symb1 symb2 symb3 symb4 symb5 )
Internal xEGCD for polynomials.
20B006 ˆABCUV ( symb1 symb2 symb3 symb4 symb5 )
Internal polynomial xABCUV.
20C006 ˆIABCUV ( z1 z2 z3 z4 z5 )
Internal integer xIABCUV.
20D006 ˆFLAGLGCD ( {} {} symb )
Internal xLGCD.
20E006 ˆFLAGLCM ( symb1 symb2 symb3 )
Internal xLCM.
20F006 ˆFLAGSIMP2 ( symb1 symb2 symb3 symb4 )
Internal xSIMP2.
210006 ˆFLAGPARTFRAC ( symb symb' )
Internal xPARTFRAC.
211006 ˆFLAGPROPFRAC ( symb symb' )
Internal xPROPFRAC.
212006 ˆFLAGPTAYL ( P(X) r P(X+r) )
Internal xPTAYL.
213006 ˆFLAGHORNER ( symb1 symb2 symb3 symb4 symb5 )
Internal xHORNER.
214006 ˆEULER ( z z' )
Internal xEULER.
216006 ˆFLAGCHINREM ( A1 A2 A3 )
Internal xCHINREM.
217006 ˆICHINREM ( A1 A2 A3 )
Internal xICHINREM.
219006 ˆSOLVE1EQ ( symb id {} )
Internal xSOLVE for single equations.
21A006 ˆSOLVEMANYEQ ( [] []' {}'' )
Internal xSOLVE for arrays of equations.
21B006 ˆZEROS1EQ ( symb id {} )
Internal xZEROS for single equations.
21C006 ˆZEROSMANYEQ ( [] []' {} )
Internal xZEROS for arrays of equations.
21D006 ˆFCOEF ( [] symb )
Internal xFCOEF.
21E006 ˆFROOTS ( symb [] )
Internal xFROOTS.
21F006 ˆFACTORS ( symb {} )
Internal xFACTORS.
220006 ˆDIVIS ( symb {} )
Internal xDIVIS.
223006 ˆrref ( M A M' )
Internal xrref.
Direcc. Nombre Descripción
229006 ˆMADNOCK ( M symb1 []' []'' symb3 )
Internal xMAD.
22A006 ˆSYSTEM ( [] []' []'' {} []''' )
Internal xLINSOLVE.
22B006 ˆVANDERMONDE ( {} M )
Internal xVANDERMONDE.
22C006 ˆHILBERTNOCK (z M )
Internal xHILBERT.
22E006 ˆCURL ( [exprs] [vars] [] )
Internal xCURL.
22F006 ˆDIVERGENCE ( [exprs] [vars] symb )
Internal xDIV.
230006 ˆLAPLACIAN ( [expr] [vars] symb )
Internal xLAPL.
231006 ˆHESSIAN ( symb A M A' A'' )
Internal xHESS.
232006 ˆHERMITE ( z symb )
Internal xHERMITE.
233006 ˆTCHEBNOCK ( %degree symb )
Internal xTCHEBYCHEFF.
234006 ˆLEGENDRE ( z symb )
Internal xLEGENDRE.
235006 ˆLAGRANGE ( A symb )
Internal xLAGRANGE.
236006 ˆFOURIER ( symb z C% )
Internal xFOURIER.
238006 ˆTABVAR ( symb symb {{}} grob )
Internal xTABVAR.
239006 ˆFLAGDIVPC ( symb1 symb2 z symb3 )
Internal xDIVPC.
23A006 ˆFLAGTRUNC ( symb1 symb2 symb3 )
Internal xTRUNC.
23B006 ˆFLAGSEVAL ( symb symb' )
Internal xSEVAL.
23C006 ˆXNUM ( symb symb' )
Internal xXNUM.
23D006 ˆREORDER ( symb id symb' )
Internal xREORDER.
23E006 ˆUSERLVAR ( symb symb [] )
Internal xLVAR.
23F006 ˆUSERLIDNT ( symb [] )
Internal xLNAME.
241006 ˆADDTMOD ( symb1 symb2 symb3 )
Internal xADDTMOD for scalars.
242006 ˆMADDTMOD ( M M' M'' )
Internal xADDTMOD for matrices.
243006 ˆSUBTMOD ( symb1 symb2 symb3 )
Internal xSUBTMOD for scalars.
244006 ˆMSUBTMOD ( M M' M'' )
Internal xSUBTMOD for matrices.
245006 ˆMULTMOD ( symb1 symb2 symb3 )
Internal xMULTMOD.
Capítulo 59
Miscelánea
En este capítulo se muestran los comandos que no encajaban en ninguno de los capítulos
anteriores.
59.1 Referencia
59.1.1 Rutinas Para Mostrar Modo Verboso
Direcc. Nombre Descripción
579006 ˆVerbose1 ($ )
Display message on line 1 if verbose mode on.
57A006 ˆVerbose2 ($ )
Display message on line 2 if verbose mode on.
57B006 ˆVerbose3 ($ )
Display message on line 3 if verbose mode on.
57C006 ˆVerboseN ($ # )
Display message on given line if verbose mode on.
59.1.2 Evaluación
Direcc. Nombre Descripción
257006 ˆEvalNoCKx* ( ob ob' ob'' )
258006 ˆEvalNoCKx+ ( ob ob' ob'' )
259006 ˆEvalNoCKx- ( ob ob' ob'' )
25A006 ˆEvalNoCKx/ ( ob ob' ob'' )
25B006 ˆEvalNoCKxˆ ( ob ob' ob'' )
25C006 ˆEvalNoCKxCHS ( ob ob' )
25D006 ˆEvalNoCKxINV ( ob ob' )
25E006 ˆEvalNoCKxMOD ( ob ob' ob'' )
25F006 ˆEvalNoCKxPERM ( ob ob' ob'' )
260006 ˆEvalNoCKxCOMB ( ob ob' ob'' )
261006 ˆEvalNoCKxOR ( ob ob' ob'' )
262006 ˆEvalNoCKxAND ( ob ob' ob'' )
263006 ˆEvalNoCKxXOR ( ob ob' ob'' )
264006 ˆEvalNoCKxXROOT ( ob ob' ob'' )
265006 ˆTABVALext ( fnct x {} {}' )
Table of values.
59.1.3 Conversión
Direcc. Nombre Descripción
266006 ˆTOLISText ( o1..on #n Lvar Q1..Qn )
Convert meta of symbolic objects to internal form.
267006 ˆFROMLISText ( Lvar Meta L L' )
Conversion of elements of Meta objec to user format. Meta
does not contain the #n number of element. L is the list of depth
of the elements of Meta. For example to convert a polynomial, a
vector and a matrix:
Lvar = { X }
Meta = { Z1 Z3 }
{ Z0 Z1 }
{ { Z1 { Z1 Z0 } } }
L = { #0 #1 #2 }
L' = { 'X+2' { 0 1 } { { 1 X } } }.
59.1.4 Qpi
Direcc. Nombre Descripción
074007 ˆQPI ( ob ob' )
Internal xXQ.
073007 ˆQpiZ ( ob symb )
Calls ˆQpi% and converts the resulting (real) integers into
zints.
075007 ˆQpiSym ( symb symb' )
Internal xXQ for symbolics.
076007 ˆQpiArry ( [] []' )
Internal xXQ for arrays. Converts each element of the array.
077007 ˆQpiList ( {} {}' )
Internal xXQ for lists. Converts each element of the list.
078007 ˆQpi ( %/C% symb )
Internal xXQ for real and complex numbers.
079007 ˆQpi% ( % symb )
xXQ for reals, but does not convert numbers to zints.
07A007 ˆGetRoot ( %' %' %'' )
Tries to find a square number which is a factor of the argument.
The algorithm only tries numbers smaller than 1024ˆ2-1 and
assumes that % is an integer. The returned results are such
that %=(%')ˆ2*%''. For numbers which do not contain a square
factor, %'=1 and %''=%.
07B007 ˆApprox ( % %' %'' )
Approximates a real number with a fraction. Returns numerator
%' and denominator %''. The accuracy of the approximation is
determinated by the current display format.
59.1.5 Infinito
Direcc. Nombre Descripción
2E2006 ˆINFINIext ( '∞' )
2E3006 ˆMINUSINFext ( '-∞' )
2E4006 ˆPLUSINFext ( '+∞' )
2E5006 ˆ?ext '?'
Pushed the undefined symbolic.
2E6006 ˆPOSINFext ( symb symb # )
Returns #1 if the symbolic contains '∞'.
2E1006 ˆTESTINFINI ( ob ob flag )
Test if object contains infinity.
2E7006 ˆPOSUNDEFext ( symb symb #1/#0 )
( ob ob #0 )
Retorna #1 si el objeto simbólico contiene al simbólico
indefinido '?'.
59.1.8 Irrquads
Direcc. Nombre Descripción
167006 ˆTYPEIRRQ? ( ob flag )
Is ob an irrquad?
168006 ˆDTYPEIRRQ? ( ob ob flag )
DUP, then ˆTYPEIRRQ?.
165006 ˆQXNDext ( irrq a b c )
b=0 and c=1 if stack level 1 is not an irrq.
166006 ˆNDXQext ( a b c irrq )
2D8006 ˆIRRQ#ULTIMATE ( ob # c )
Finds « depth and returns ultimate c of an irrq.
508006 ˆQCONJext ( irrq irrq' )
irrq-conjugate of an irrq. This is not the complex conjugate.
509006 ˆQABSext ( irrq irrq sign )
Finds the sign of an irrq. Work always if irrq is made of Z.
51A006 ˆQNORMext ( Zirr aˆ2-b*cˆ2 )
Irrq-norm of an irrquad. This is not the complex modulus.
4D4006 ˆSECOSQFFext ( :: x<< a b c x>> { fact1 mult1 ... factn multn } )
Factorization of irrquads and Gauss integers.
124006 ˆPREPARext ( o1 o2 a1 b1 c1 a2 b2 c2 )
Returns irrquad decomposition of o1 and o2.
with either c1=c2 or c1 and c2 have no factors in comon.
c1<c2, ordering handled by LESSCOMPLEX? is made by type,
then by CRC.
2DA006 ˆLISTIRRQ ( ob {} {}' )
Add the C-part of all irrquads of object to the list.
59.1.9 Miscelánea
Direcc. Nombre Descripción
3E7006 ˆPSEUDOPREP ( o2 o1 o2*a1.nˆ o1 a1.nˆ )
3FB006 ˆHSECO2RCext ( ob ob' )
Conversion of constants from internal to user form.
3FC006 ˆSECO2CMPext ( seco symb )
Back conversion of complex. polarflag should be disabled if not
at the top level of rational expressions.
3FF006 ˆVALOBJext ( # {..{Q}..} {var1..varn} {..{ob}..} )
Back conversion of objects embedded at depth # in lists.
Simplifies var1..varn.
401006 ˆVAL2ext ( # {..{Q}..} {var1..varn} {..{ob}..} )
Back conversion of objects embedded at depth # in lists. Does
not simplify var1..varn. Conversion is done in asc. power if
positivfflag is set, which is useful for SERIES and LIMIT
commands.
402006 ˆINVAL2 ( P # symbpoly )
LAM2 must contain Lvar, # is the depth.
403006 ˆMETAVAL2 ( # Meta_list Meta_symb )
LMA2 must contain Lvar, LAM1 is modified.
404006 ˆVAL1 ( ob ob )
LAM2 must contain Lvar, LAM1 is modified.
405006 ˆVAL1M ( ob Meta_symb )
LAM2 must contain Lvar, LAM1 is modified.
45C006 ˆIDNTEXEC ( symb idnt symb' )
Tries to find idnt such that symb=0. Return a solution as an
equality 'idnt=..' in symb'.
121006 ˆMP0 ( ob ob 1 )
Returns number 1 of the selected type. The symbolic/ROMPTR
one looks very strange it is used to avoid infinityˆ0/undefˆ0 to
return 1.
26C006 ˆrpnQOBJext ( ob ob' )
prg is fetched from the stack. Looks for all d1, d2, ... at the
beginning of the name of idnt to determine if idnt
represents a derivative of a user function. Stops if at a time the
stripped idnt is in the current directory. Example 'd2d1Y'
returns { #2 } << >> if 'd2d1Y' is not defined and 'd1Y' is
defined as << >> or { #2 #1 } 'Y' if d2d1Y d1Y and Y are
not defined.
29D006 ˆSIMPIDNT ( idnt ob )
Evaluates idnt (looks recursively for its content if defined).
Does not error for circular definition, but displays a warning.
29F006 ˆRCL1IDNT ( idnt/lam ob )
Recursive content of an idnt. LAM1 to LAM3 must be bound.
2A7006 ˆSWPSIMPNDXF ( ob2 ob1 ob1/ob2 )
Simplified fraction (internal).
2A8006 ˆSIMPNDXFext ( ob2 ob1 ob2/ob1 )
Simplified fraction (internal).
2B6006 ˆCMODext ( C2 C1 C1 C2_mod_C1 )
2BD006 ˆSQFF2ext ( l1...ln #n-1 l1'...ln' #n-1 )
2BE006 ˆPPZ ( p p/pgcd pgcd )
ob is the gcd of all constant coefficients of P (integer, Gauss
integers, irrquads with the mplementation of the "gcd" for
irrquads).
Direcc. Nombre Descripción
117007 ˆPPZZ ( ob ob zint )
PPZ with further check to ensure returning a zint.
2BF006 ˆPZHSTR ( a z a mod z )
2C0006 ˆHORNER1ext ( P r P[r] )
2C1006 ˆPeval ( P r P[r] )
P must be a list polynomial.
2C6006 ˆSQRT_IN? ( {} {} flag )
Returns TRUE if one element of {} is a symb containing a sqrt.
2C7006 ˆIS_SQRT? ( symb flag )
2C9006 ˆIS_XROOT? ( symb flag )
2CA006 ˆSTOPRIMIT ( symb )
Stores antiderivative in PRIMIT variable.
2CB006 ˆCONTAINS_LN? ( symb symb flag )
2D4006 ˆFOURIERext ( symb n cn )
Computes n-th Fourier coefficient of a 2 _ periodic function.
2D9006 ˆLESSCOMPLEX? ( ob1 ob2 ob1 ob2 flag )
Compares objects by type and then by CRC.
flag is true if ob1 is less complex than ob2 (ob1>ob2). If ob1 or
ob2 is an irrq, find first ultimate type of ob1 and ob2. If these
ultimate types are equal sort is done by comparing the <<
depth.
2DD006 ˆTABLECOSext ( {} )
Table of special COS values (k*pi/12).
2DE006 ˆTABLETANext ( {} )
Table of special TAN values (k*pi/12).
101007 ˆLINEARAPPLY ( symb nonrat_prg rat_prg symb )
Applies linearity. nonrat_prg is applied for a non rational partç
symb symb. rat_prg is applied for a rational part
symbsymb. Linearity is applied on symb.
106007 ˆA/B2PQR (A B P Q R )
Writes a fraction A/B as E[P]/P*Q/E[R]. Q and positive shifts of
R are prime together.
107007 ˆGOSPER? (P Q R P R Y T )
(P Q R F )
Solves P = Q E[Y] - R Y for Y.
0CB007 ˆFRACPARITY ( fr Z )
Tests if a fraction (internal rep) is even/odd/none. Z=1 if even,
1 if odd, 0 if neither even nor odd.
0D5007 ˆFR2ND% ( fraction-l N D % )
Extract trivial power of fraction.
4D1006 ˆMSECOSQFF ( ob Meta )
Factorization of an extension.
Parte V
Apéndices
Apéndice A
Esto significa que, si sólo veias External con la pila normal, ahora el nombre del
comando (o PTR y la dirección, si ningún nombre es encontrado) será mostrado, si tienes
instalada la biblioteca EXTABLE. Juega un poco con esto y verás cuan útil puede llegar a
ser. Algunos objetos (como los reales y los enteros) aun mantienen su notación usual, pero
en la pila interactiva todos los objetos son descompilados. Probablemente alternes entre los
dos tipos de pila a cada momento. Sería una buena idea asignarle un programa simple a una
tecla para alternar entre los dos tipos de pila. Por ejemplo, podemos asignar la acción a la
tecla Shift derecho+MODE (END). Para esto, en User RPL podemos ejecutar
<< -85. IF DUP FS? THEN CF ELSE SF END >> 22.3 ASN
Comando Descripción
→H “A hex”: Convierte un objeto en una cadena de caracteres hexadecimal. Es una
herramienta común para facilitar transferencia de objetos binarios. Una cadena
hexadecimal es una cadena que sólo tiene los caracteres 0 a 9 y A a F.
H→ “Desde hex”: Esta es la transformación opuesta: crea un objeto a partir de una
cadena de caracteres hexadecimal. La cadena debe ser válida.
→A “To address”: Dado un objeto, este comando retorna la dirección del objeto, el
cual es siempre un hxs de 5 nibbles.
Los objetos cuyas direcciones sean menores que # 80000h están en ROM, y
objetos cuyas direcciones sean mayores están en RAM.
A→ “From address”: Llama el objeto ubicado en la dirección especificada.
Comando Descripción
S→H “String a hex”: Convierte una cadena en otra que contiene la forma hexadecimal
de cada uno de sus caracteres. Por ejemplo, al ser 5A, 59 y 58 los códigos
hexadecimales de X, Y y Z respectivamente, "XYZ" se convierte en
"8595A5".
H→S “Hex a string”: Es la transformación opuesta.
→LST “Crea Lista”: Crea una lista a partir de un meta de User o de otro compuesto
(programas y simbólicos). Un meta de User es cualquier número de objetos en
la pila seguido por un contador representado como número real.
→ALG “Crea Algebraico”: Crea un objeto simbólico a partir de un meta de User o de
otro compuesto. El resultado puede llegar a ser 'Invalid Expression'.
→PRG “Crea programa”: Crea un programa a partir de un meta de User o a partir de
otro compuesto (listas y simbólicos).
COMP→ “Desde Compuesto”: Desintegra un objeto compuesto (listas, programas y
simbólicos) y lo convierte en un meta de User.
→RAM “A la RAM”: Permite copiar un objeto que está en ROM hacia la RAM.
SREV “Reverse string”: Invierte los caracteres de una cadena. Muy Rápido.
POKE Writes data to any address in RAM. Put in level two a hxs with the address, and
in level one a string of hex digits to be written at that address. This is a very
easy way of destroying any “masterpiece” you have created on the calculator :-).
PEEK Extracts raw hex digits from any address. Put the address in level two (an hxs)
and the number of nibbles to get (another hxs) in level one.
APEEK “Address peek”: Like PEEK, but always gets five nibbles, returning them as a
hxs.
R˜SB “Real↔Binario de System”: Convierte de real a bint y viceversa.
SB˜B “Binario de System↔Binario”: Conviert bint a hxs y viceversa.
LR˜R “Real Largo↔Real”: Convierte real largo a real y viceversa.
S˜N “String↔Nombre”: Convierte cadena a nombre global y viceversa.
El tamaño máximo de la cadena es 127.
LC˜C “Complejo Largo↔Complejo”: Convierte complejo largo a complejo y viceversa.
ASM→ “From ASM”: Desensambla un objeto code (lenguaje máquina) y retorna una
cadena con el código fuente.
CRLIB “Create library”: Crea una biblioteca. Es descrito en el apéndice B.
CRC Calcula el CRC. El argumento debe ser una cadena de dígitos hexadecimales,
una biblioteca o un objeto de respaldo (backup).
MAKESTR “Make string”: Crea una cadena con el número de caracteres dado en nivel 1 de
la pila (como número real).
SERIAL Retorna una cadena con el nombre serial interno de la calculadora.
ASM Proporciona acceso al compilador MASD.
ER Usado junto con ASM.
→S2 Desensambla un objeto.
XLIB˜ Crea un rompointer (nombre XLIB) a partir del número de biblioteca (nivel 2) y
del número de comando (nivel 1). Este comando también descompone un
rompointer retornando su número de biblioteca y su número de comando.
A.2.1 Operating Tools para la calculadora HP
Wolfgang Rautenberg es el autor de una biblioteca llamada Operations Tools (llamada
OT49) con varios comandos, algunos de los cuales son útiles para el programador System
RPL. OT49 contiene un creador de bibliotecas y también puede convertir una biblioteca en
directorio. Para convertir una biblioteca en directorio, sólo debes poner el número de la
biblioteca en el nivel 1 de la pila y ejecutar el comando D↔L. Para crear una biblioteca,
primero debes entrar en el directorio que será convertido, en el nivel 1 de la pila no debe
haber un número real (o también puede estar vacía la pila), luego ejecutar el comando D↔L.
El comando Dtype muestra el tipo del objeto que está en el nivel 1 de la pila, si este
objeto es un rompointer (XLIB) o un flashpointer, su contenido es llamado (a menos que esté
escrito en puro lenguaje máquina) y el tipo del contenido es mostrado (con un asterisco al
final).
Uno de los comandos más útiles es 3tog. Este comando alterna entre las tres
representaciones de un objeto compuesto: como lista, como programa y como un objeto
meta de User. Esto puede ser usado para manipular objetos System RPL sin descompilarlos
realmente. 3tog descompone un programa en la pila y podrás reordenar sus elementos en
la pila para luego llamara a 3tog nuevamente para reconstruir el programa.
Otro comando muy útil es Flg˜. Este comando alterna el estado de un flag. Sólo debes
colocar en la pila el número del flag de sistema o de usuario y al llamar al comando, el
estado del flag será cambiado. También será mostrado en la cabecera (header) el cambio
que se ha realizado.
El comando Sys compila o descompila un objeto (dependiendo de si en el nivel 1 de la
pila se encuentra una cadena u otro objeto).
A.3 El Compilador
El compilador incluido en la calculadora HP es MASD.
MASD es llamado con el comando ASM. Este comando espera una cadena en el nivel 1
de la pila y retorna el objeto compilado. Si hay algún error en la escritura de la cadena,
entonces la cadena y una lista serán colocadas en la pila. Estos son los argumentos del
comando ER que explicaremos más adelante.
El compilador MASD por alguna razón necesitá que la cadena que contiene al código
finalice con el carácter “@”. Todas las cadenas con código fuente deberán de tener este
carácter, pues de lo contrario MASD los rechazará. Dicho carácter debe estar sólo en una
línea, al inicio de la línea y sin otros caracteres en esa línea (ni siquiera un salto de línea).
Otra cosa que debemos de tener en cuenta es el estado del flag -92. Si está activado
MASD operará en modo System RPL. Si está desactivado, MASD operará en modo lenguaje
ensamblador. Por lo tanto, si deseas hacer un programa System RPL (o compilar un objeto)
en la calculadora, debes de tener activado el flag -92. Entonces, nada más necesitas hacer
para compilar programas u otros objetos System RPL (sólo colocar @ en la última línea).
Incluso es posible compilar código en lenguaje ensamblador cuando la calculadora está en
modo System RPL: sólo envuelve el código entre las palabras CODE y ENDCODE.
Si estás en modo lenguaje ensamblador, es posible compilar código System RPL
insertando estas dos líneas antes del código:
!NO CODE
!RPL
Ambas son llamadas directivas. La directiva !NO CODE le dice a MASD que compile la
fuente como código System RPL y no como código de lenguaje máquina (una vez más,
puedes insertar código de lenguaje ensamblador entre CODE y ENDCODE). Es buena idea
poner siempre estas dos líneas al inicio de todos tus programas aun si estás en modo
System RPL: de esta manera, el código podrá ser siempre compilado sin importar el estado
de los flags.
Aquí está un código fuente que puede ser leído por MASD.
!NO CODE
!RPL
::
DUPTYPEZINT?
case
FPTR2 ^Z>R
DUPTYPEREAL? ?SEMI
SETTYPEERR
;
@
Lo mostrado arriba es el resultado de desensamblar el comando CKREAL. Como
puedes ver, este convierte números enteros en reales.
Veamos que sucede al ejecutar el comando ASM si hay un error en la escritura de una
cadena que contenga un código fuente. En este caso, la cadena original es retornada en el
nivel 2 y una lista es colocada en el nivel 1. Ahora, con esos dos objetos en la pila,puedes
ejecutar el comando ER. Con esto podrás ver un CHOOSEBOX donde se mostrarán los
errores que hay y podrás escoger cada uno de estos para ir directamente al error en el
código fuente. Corrige el error, presiona ENTER y luego escoge otro error, hasta que todos
los errores hayan sido corregidos. Luego ejecuta ASM (y ER, si es necesario) nuevamente.
Todavía mejor, usa el comando ASM2 de la biblioteca 257, el cual llama al comando ASM y
luego, si hay algún error, llama también a ER.
El compilador MASD soporta algunas características especiales, que pueden ser útiles al
programador. La primera característica que veremos es la que permite el uso de entradas no
soportadas. Puedes definir un nombre para un comando no soportado, haciendo que se
comporte como si fuera una ebntrada en extable (Esto sólo funciona para comandos
normales, no para flashpointers ni rompointers). Para esto, usa la siguiente estructura:
EQU name address
donde name es el nombre de la entrada, y address es su dirección. Por ejemplo, la línea
de abajo define el comando 2NELCOMPDROP, el cual retorna el segundo elemento de un
compuesto:
EQU 2NELCOMPDROP 2825E
con esta definición puedes usar 2NELCOMPDROP en lugar de PTR 2825E para acceder al
comando. Nota que esto sólo funciona para entradas normales.
Otra manera para facilitar la inclusión de entradas no soportadas (especialmente
rompointers y flashpointers), pero que también es útil en otros casos, es usar los DEFINEs.
Su estructura es la siguiente:
DEFINE name value
donde name es una palabra única, y value es el resto de la línea. Después de esta
definición, donde sea que name sea encontrado en el archivo fuente, este será
reemplazado por value. De esta manera, si por ejemplo usas el browser 49 (capítulo 34),
este podría ser definido convenientemente de esta manera:
DEFINE ˆChoose3 FTPR 2 72
De tal manera que simplemente debes insertar ˆChoose3 cuando quieras llamar al
browser.
Hay una estructura que te permite referirte a variables locales con nombres en el código
fuente, pero que producen variables locales sin nombre, y de esta manera combina facilidad
de uso con velocidad.
Las variables locales son declaradas asi:
{{ name1 name2 ... nameN }}
Después de esto, ingresando name1 se convertirá en 1GETLAM, name2 se convertirá en
2GETLAM. Precediendo el nombre de una variable con = o ! guarda algo en la variable,
esto es, =name1 se convierte en 1PUTLAM, y asi sucesivamente. Presta atención a la
manera como los nombres locales son declarados: el primer nombre de variable
corresponde a 1GETLAM (esto es, el objeto que estaba en el nivel uno), y asi
sucesivamente.
A.4 Desensamblando
Como se mencionó brevemente en la descripción de la Biblioteca 256 (véase la sección
A.2), el comando →S2 es el desensamblador en System RPL. Este comando puede
desensamblar cualquier objeto que esté en el nivel uno de la pila en su código fuente, el cual
puede ser ensamblado nuevamente con MASD. Por desgracia, todavía hay algunos errores
en MASD, que impiden que algunos objetos desensamblados sean correctamente
reensamblados. Todos esperamos que en una próxima versión de esta biblioteca, estos
errores sean corregidos. A menudo, uno quiere ver cómo uno de los comandos integrados
en la ROM de calculadora HP década de HP está construido. Por desgracia, es difícil hacerlo
sólo con las herramientas incorporadas en la calculadora. Sin embargo, existen dos
bibliotecas para este propósito: Nosy por Jurjen N. E. Boss, and CQIF, por Pierre Tardy.
Ambas bibliotecas extraen y desensamblan código de la ROM.
Creación de Bibliotecas
Las bibliotecas son una colección de comandos a los que el usuario puede acceder
como si estos comandos estuvieran ya incorporados en la calculadora. Si has escrito un
programa complejo con varias subrutinas, es mucho mejor distribuirlo como una biblioteca en
lugar de distribuirlo como un directorio. Cuando el programa está en una biblioteca, el
usuario no necesita navegar a través de las variables para poder acceder a tu programa; el
usuario sólo debe tipear el nombre del comando desde cualquier lugar en donde se
encuentre.
Los comandos de una biblioteca aparecen en el catálogo, y los usuarios pueden tener
una ayuda disponible para cada comando de una biblioteca.
Hay un menú que muestra todas las bibliotecas instaladas. Pero también una biblioteca
puede mostrarse toda o parte de esta a algunos de las cajas de selección propias de la
calculadora, tales como APPS, STAT, NUM SOLVER, etc.
Por otra parte, se puede hacer que el usuario pueda acceder sólo a algunos de los
comandos de la biblioteca. De esta manera, se evita que el usuario ejecute comandos que
no debe y el programador de la biblioteca sólo debe preocuparse de proporcionar
verificación de errores para los comandos accesibles al usuario.
Lo escrito debe ser suficiente para convencerte de distribuir tus programas como parte
de bibliotecas.
Si deseas crear una biblioteca desde la calculadora puedes usar el comando CRLIB de
la biblioteca 256.
Sólo debes crear algunas variables especiales en un directorio, el cual especifica
algunos aspectos de la biblioteca, y luego ejecutar el comando CRLIB.
Las variables especiales tienen nombres que comienzan con $. Estas variables
configuran las características que tendrá la biblioteca que se creará:
Variable Significado
$ROMID Especifica el número de la biblioteca. Cada biblioteca debe tener un número
único. En una calculadora no pueden estar instaladas 2 bibliotecas que tengan
el mismo número.
Debe ser un número real o entero, en el rango 769-1791.
$TITLE Este es el título de la biblioteca. Los primeros 5 caracteres son mostrados en el
título de la biblioteca.
Debe ser una cadena.
Si esta variable es una cadena vacía, entonces no se podrá acceder a la
biblioteca desde el menú de bibliotecas, pero no evita hacer posible el acceso
desde otro lugar como al presionar APPS, STAT, NUM SLV, etc.
Variable Significado
$VISIBLE Esta es una lista de variables globales (nombres de los comandos visibles).
Las variables que figuran en esta lista se convertirán en comandos accesibles al
usuario en la biblioteca resultante.
$HIDDEN Esta es una lista de variables globales (nombres de los comandos invisibles).
Las variables que figuran en esta lista se convertirán en comandos que no
serán accesibles al usuario en la biblioteca resultante.
$CONFIG Este objeto se encarga de configurar la biblioteca.
Este objeto es evaluado en cada warmstart.
Normalmente, es un programa que vincula la biblioteca al directorio HOME.
Por ejemplo, si el número de biblioteca es 1000:
En User RPL, la variable $CONFIG puede ser:
« 1000. ATTACH »
En System RPL, la variable $CONFIG puede ser:
:: HOMEDIR 1000 XEQSETLIB ;
O también:
:: 1000 TOSRRP ;
Si lo deseas, simplemente puedes guardar el número real 1. dentro de la
variable $CONFIG para que un objeto de configuración por defecto sea
producido, el cual vincula la biblioteca al directorio actual en cada warmstart.
$MESSAGE Esta es una lista de cadenas que estarán disponibles en la biblioteca para su
uso como mensaje de error o para cualquier otro uso.
Si cada mensaje es usado sólo una vez, no vale la pena crear una tabla de
mensajes. Pero si los mensajes son usados en muchos lugares, o si quieres
que sea fácil cambiar el idioma de la biblioteca, entonces sería muy útil crear
una tabla de mensajes.
La lista puede contener como máximo a 255 cadenas. En la calculadora cada
mensaje es identificado como un bint único.
Por ejemplo, si el número de la biblioteca es 1000 (3E8 en hexadecimal),
podrás acceder a un mensaje desde un programa usando:
# 3E801 JstGETTHEMSG
# 3E802 JstGETTHEMSG
# 3E803 JstGETTHEMSG
.........
# 3E8FF JstGETTHEMSG
Para generar un mensaje de error mostrando una de esas cadenas desde un
programa, puedes usar:
# 3E801 ERROROUT
O también:
# 3E801 DO#EXIT
En el capítulo 23 puedes ver más información sobre esto.
La variable $MESSAGE es opcional. No es obligatorio incluirla.
$EXTPRG Este debe ser un nombre global.
Es el nombre del comando que permite la personalización de algunos menús,
adición de ayuda de comandos en el catálogo, y otras cosas.
Ver abajo para más información sobre esto.
Recuerda que sólo los comandos cuyos nombres se encuentran en las
variables $VISIBLE o $HIDDEN serán convertidos en comandos de
biblioteca. Por lo tanto, no debes olvidar que el nombre global contenido en la
variable $EXTPRG también debe estar incluido en una de esas dos listas
($VISIBLE o $HIDDEN).
La variable $EXTPRG es opcional. No es obligatorio incluirla.
B.2 Creación de bibliotecas desde Debug 4x
En el documento complementario del
archivo de descarga se muestran los
pasos para crear tu primera biblioteca en
System RPL con Debug 4x. Debes leer
ese documento para poder crear
fácilmente bibliotecas de esa manera.
Cuando creas una biblioteca con
Debug 4x, no es necesario crear variable
en un directorio. En lugar de ello,
debemos llenar algunos campos en la
ventana Project.
Algunos elementos de la ventana
Project son:
RomID: Especifica el número de la
biblioteca. Debe contener a un número
(259-1791) pero debes escribirlo en base
hexadecimal (103-7FF). No está permitido
el número 788 (314 en hexadecimal), pues esta es una biblioteca que contiene algunos
comandos del CAS.
Title: Es el título de la biblioteca. Los primeros 5 caracteres son mostrados en el título de
la biblioteca. Si dejas este campo en blanco, entonces no se podrá acceder a la biblioteca
desde el menú de bibliotecas, pero esto no evita hacer posible el acceso desde otro lugar
como al presionar APPS, STAT, NUM SLV, etc.
Config: Este objeto se encarga de configurar la biblioteca. Este objeto es evaluado en
cada warmstart. Normalmente, es un programa que adjunta la biblioteca al directorio HOME.
Se usa de la siguiente manera: escribe un programa en el editor y escribe el nombre de este
programa en el campo Config.
Si dejas este campo en blanco, no hay ningún problema, pues en cada warmstart se
ejecutará el programa por defecto, por ejemplo, :: HOMEDIR 1000 XEQSETLIB ; el cual
vincula la biblioteca al directorio HOME.
Message Text: Haciendo doble clic en este campo, podrás escribir los mensajes de error
de la biblioteca. Si cada mensaje es usado sólo una vez, no vale la pena crear una tabla de
mensajes. Pero si los mensajes son usados en muchos lugares, o si quieres que sea fácil
cambiar el idioma de la biblioteca, entonces sería muy útil crear una tabla de mensajes.
Cada mensaje de error debe ir en sólo una línea. Puedes poner caracteres en formato
hexadecimal. Por ejemplo, si un mensaje de error lleva varios renglones, puedes usar el
salto de línea escribiendo \0A como se muestra en la figura.
La lista puede contener como máximo a 255 cadenas. En la calculadora cada mensaje
es identificado como un bint único. Por ejemplo, si el número de la biblioteca es 1000 (3E8
en hexadecimal), podrás acceder a un mensaje desde un programa usando:
# 3E801 JstGETTHEMSG
# 3E802 JstGETTHEMSG
# 3E803 JstGETTHEMSG
.........
# 3E8FF JstGETTHEMSG
Para generar un mensaje de error mostrando una de esas cadenas desde un programa,
puedes usar:
# 3E801 ERROROUT
O también:
# 3E801 DO#EXIT
En el capítulo 23 puedes ver más información sobre esto.
No hay ningún problema si este campo queda en blanco.
* Explicación opcional
xNAME NombreCom ( ... -> ... )
::
* Aquí el contenido
;
...
xNombreCom
...
* Explicación opcional
NULLNAME NombreSub ( ... -> ... )
::
* Aquí el contenido
;
...
NombreSub
...
* Explicación opcional
ASSEMBLE
CON(1) 8 * Tell parser 'Non algebraic'
RPL
xNAME NombreCom ( ... -> ... )
::
* Aquí el contenido
;
En los documentos complementarios que vienen con el archivo de descarga se muestra
como ver el diagrama de pila de cada comando al escribirlo en el editor de Debug 4x, como
se autocompletan los nombres de los comandos, como insertar un grob en el editor, como
depurar errores, etc.
B.3 El Message Handler de la Biblioteca
Las bibliotecas pueden contener un message handler. Este programa es llamado por el
sistema operativo en varias ocasiones, con el fin de que la biblioteca pueda modificar menús,
proveer ayuda online para sus comandos o hacer otras acciones.
A) Cuando se crea una biblioteca desde un directorio (en la calculadora), la variable
reservada puede contener un nombre global. Este es el nombre de una variable en el
directorio, el cual más tarde será un rompointer en la biblioteca. Esta variable debe contener
un programa.
B) Cuando se crea una biblioteca desde Debug 4x, en la ventana Project/Project
Data/Library Information en el campo ExtPrg se puede colocar el nombre de un comando
de la biblioteca. Este comando debe contener un programa.
Este programa debe aceptar un bint en el nivel 1 de la pila y dependiendo del mensaje
específico, otros argumentos en los otros niveles de la pila.
El bint que representa el número de mensaje debe permanecer en la pila, para que el
message handler de otra biblioteca pueda ser llamado inmediatamente después para que
haga sus modificaciones respectivas.
Los siguientes menús puedes ser extendidos usando mensajes de biblioteca:
Las bibliotecas que creamos pueden proveer ayuda para sus propios comandos de una
manera similar, usando los message handlers número 9 y 10.
NULLNAME EXTRA_PROG
:: BINT9 #=casedrop
:: ( romptr F )
DROPTRUE ( romptr T )
BINT9 ( romptr T 9 ) ( todos los comandos tendrán ayuda )
;
BINT10 #=casedrop
:: ( romptr )
DUP ( romptr romptr )
DECOMP$ ( romptr "NombRomp" )
NEWLINE&$ ( romptr "NombRomp\0A" )
SWAP ( "NombRomp\0A" romptr )
ROMPTR># ( "NombRomp\0A" #lib #cmd )
SWAPDROP ( "NombRomp\0A" #cmd ) ( #cmd: 0,1,2... )
{ "Help text for romptr 0"
"Help text for romptr 1"
...
"Help text for romptr N"
}
( "NombRomp\0A" #cmd {$} )
SWAP#1+ ( "NombRomp\0A" {$} #cmd+1 ) ( #cmd+1: 1,2,3... )
NTHCOMPDROP ( "NombRomp\0A" $Help )
&$ ( "NombRomp\0AHelp" )
FALSE ( "NombRomp\0AHelp" F )
SWAP ( F "NombRomp\0AHelp" )
ViewStrObject ( F )
;
;
En este caso, el mensaje número 9 puede verificar el rompointer en una lista, y el mensaje
10 podría usar el comando Lookup o algo parecido para extraer el texto de ayuda.
En vez de sólo mostrar una cadena, el mensaje 10 puede también hacer cosas más
complicadas, como ejecutar una aplicación que muestre ayuda de manera más detallada.
En el siguiente ejemplo, el message handler mostrará la ayudá sólo para algunos
comandos de la biblioteca (comandos de números 0, 3 y 4).
NULLNAME EXTRA_PROG
:: BINT9 #=casedrop
:: ( romptr F )
DROPDUP ( romptr romptr )
ROMPTR># ( romptr #lib #cmd )
SWAPDROP ( romptr #cmd )
LISTA_HELPS ( romptr #cmd {} )
FLASHPTR ListPos ( romptr #i/#0 )
#0<> ( romptr T/F )
BINT9 ( romptr T/F 9 )
;
BINT10 #=casedrop
:: ( romptr )
DUP ( romptr romptr )
DECOMP$ ( romptr "NombRomp" )
NEWLINE&$ ( romptr "NombRomp\0A" )
SWAP ( "NombRomp\0A" romptr ) ( save cmd name as string )
ROMPTR># ( "NombRomp\0A" #lib #cmd )
SWAPDROP ( "NombRomp\0A" #cmd ) ( #cmd: 0,1,2... )
NULLNAME LISTA_HELPS
{ BINT0 "Help text for romptr 0"
BINT3 "Help text for romptr 3"
BINT4 "Help text for romptr 4"
}
B.3.3 El Mensaje que Maneja el Menú de Bibliotecas
Si el menu de una biblioteca es invocado a través del menú LIBS (Shift derecho+2), el
número romid de la biblioteca es enviado al message handler de la biblioteca. Se puede
hacer cualquier cosa aquí, por ejemplo, mostrar en pantalla un texto de bienvenida, hacer
algo divertido con el menú o hacer sonar una melodía. También podrías cambiar la
configuración del menú, por ejemplo, proporcionar funcionalidad a los botones Shift+tecla de
menú, tal como hace la biblioteca Comandos de César Vásquez.
NULLNAME EXTRA_PROG
:: 1000 #=casedrop
:: ( #romid )
ZEROZERO ( #romid #0 #0 )
"(c) 2011 Balán Gonzales\0A" ( #romid #0 #0 $ )
$>grobCR ( #romid #0 #0 grob )
XYGROBDISP ( #romid )
SetDA1Temp ( #romid )
;
;
Apéndice C
La lista mostrada en este capítulo es de todos los comandos accesibles al usuario, con
sus direcciones. En la mayoría de los casos, el nombre User RPL de un comando es igual al
nombre System RPL que puedes colocar en el editor de Debug4x con una x adelante y a
veces también con ˜ adelante. Las pocas excepciones se indican debajo del diagrama de
pila.
Por Ejemplo, el comando →ROW de User RPL en System RPL (editor de Debug 4x) se
llama como:
ROMPTR x\->ROW
Si deseas llamar a ese comando sin guardarlo como el comando actual y sin que quede
marcada la pila, debes usar el comando 'EvalNoCK: (capítulo 30) antes del comando de
User RPL. Por ejemplo asi:
...
'EvalNoCK:
ROMPTR x\->ROW
...
Mejor aun, si deseas evitar la verificación de argumentos, puedes usar la biblioteca Nosy
para ver cual es la entrada interna de ese comando User RPL en System RPL. Para esto,
coloca en el nivel 1 de la pila la lista: {→ROW}. Luego ejecuta el comando Nosy de la
biblioteca Nosy y verás la siguiente pantalla:
La cual indica que para ejecutar lo mismo que el comando →ROW pero sin verificación de
argumentos es suficiente escribir en el editor de Debug 4x:
...
FLASHPTR 003 065
...
El BINT4 en la pantalla indica que el comando →ROW espera un arreglo o una matriz
simbólica en el nivel 1 de la pila.
C.1 Referencia
Direcc. Nombre Descripción
030314 ˜xABCUV ( pa pb c u v )
39A07 xABS ( x x' )
390E4 xACK ()
390C9 xACKALL ()
025314 ˜xACOS2S ( symb symb' )
3A8D8 xACOSH ( x x' )
3A7DC xACOS ( x x' )
06E314 ˜xADDTMOD ( symb1 symb2 symb3 )
0000DE xADDTOREAL ( var )
3AAE5 xALOG ( x x' )
04B0AB xAMORT ( n princ intr bal )
3CA07 xAND ( x1 x2 x3 )
3F033 xANS ( n ob )
3D7AC xAPPLY ( {symb1 .. symbn} f f(symb1...symbn) )
3EAC7 xARCHIVE ( :port:name )
( :IO:name )
3C8C6 xARC ( c r θ1 θ2 )
( {#x #y} #r θ1 θ2 )
3A390 xARG (c θ)
085314 ˜xARIT ()
3BEC5 xARRY> ( [] x1...xn {n} )
( [[]] x11...xnm {n m} )
UserRPL: ARRY→
3BE9B x>ARRY ( x1..xn n [] )
( x11...xnm {n m} [[]] )
UserRPL: →ARRY
024314 ˜xASIN2C ( symb symb' )
023314 ˜xASIN2T ( symb symb' )
3A88E xASINH ( x x' )
3A756 xASIN ( x x' )
3EEE7 xASN ( obj key )
( 'SKEY' )
38DE1 xASR ( # #' )
022314 ˜xATAN2S ( symb symb' )
3A94F xATANH ( x x' )
3A844 xATAN ( x x' )
3EB64 xATTACH (n )
3C49F xAUTO ()
3C3B2 xAXES (c )
( {c tick $x $y } )
04A314 ˜xAXL ( {} [] )
( [] () )
049314 ˜xAXM ( [A] [M] )
04C314 ˜xAXQ ( [nxn] [n] [nxn]' [n] )
3C9D3 xBAR ()
3E196 xBARPLOT ()
080314 ˜xBASE ()
aka: xALGB
3EDCC xBAUD (n )
39765 xBEEP ( freq dur )
3E2C1 xBESTFIT ()
Direcc. Nombre Descripción
3B655 xBIN ()
3E171 xBINS ( min width n [[]] [] )
3C70A xBLANK ( #width #height grob )
3C6E0 xBOX ( {#n1 #m1} {#n2 #m2} )
( c1 c2 )
38F21 xB>R (# R )
UserRPL: B→R
3EE47 xBUFLEN ( nchars 0/1 )
39480 xBYTES ( obj chksum size )
01E0DE xC2P ( {} ????? )
07E314 ˜xCASCFG ()
0330DE xCASCMD (? )
38B28 xCASE ()
3AD1B xCEIL (x n )
3C3DC xCENTR ( (x,y) )
(x )
3B4E9 xCF (n )
03A314 ˜xCHINREM ( []1 []2 []3 )
04D0AB xCHOOSE ( title {elems} pos ob 1 )
( title {elems} pos 0 )
3BC19 xCHR (n $ )
3B362 x%CH ( x1 x2 x3 )
01D0DE xCIRC ( prg {} ????? )
3EDAC xCKSM ( n_type )
3DD4E xCLEAR ( ob1 .. obn )
3DD8E xCLSIGMA ()
UserRPL: CL∑
39144 xCLKADJ ( ticks )
39839 xCLLCD ()
3EC95 xCLOSEIO ()
3E91A xCLUSR ()
UserRPL: CLVAR
081314 ˜xCMPLX ()
3B193 xCNRM ( [] col_norm )
3E5A0 xCOLCT ( symb symb' )
0300DE xCOLLECT ( symb symb' )
3E0FD xSIGMACOL ( x_col y_col )
UserRPL: COL∑
0380AB x→COL ( [[]] [v1]...[vn] n )
( [] x1...xn n )
03E0AB xCOL- ( [] n []' xn )
( [[]] n [[]]' [vn] )
0390AB xCOL→ ( [v1]...[vn] n [[]] )
( x1...xn n [] )
03F0AB xCOL+ ( [[]] [[]]' n [[]]'' )
( [] x n []' )
3B423 xCOMB ( n k Cn,k )
Symbolic argument allowed.
0260AB xCOND ( [[n*n]] x )
3C967 xCONIC ()
39A6C xCONJ ( x x' )
0180AB xCONLIB ()
Direcc. Nombre Descripción
3BF77 xCON ( { n } x [] )
( { n k } x [[]] )
( [] x []' )
0190AB xCONST ( name x )
3989C xCONT ()
38F41 xCONVERT ( x1_u1 x2_u2 x3_u2 )
3DE24 xCORR ( x_correlation )
3A6C2 xCOSH ( x x' )
3A5D0 xCOS ( x x' )
3DE3F xCOV ( x_covariance )
3C58E xC>PX ( (x,y) {#n #m} )
UserRPL: CPX
393CA xCRDIR ( name )
3D128 xCR ()
3B208 xCROSS ( [1] [2] [3] )
3BAF5 xC>R ( (x,y) x y )
UserRPL: CR
057314 ˜xCURL ( [func] [vars] [] )
0120AB xCYLIN ()
0610AB xDARCY ( xe/D yRe xDarcy )
39104 xSETDATE ( date )
39078 xDATE ( date )
39238 xDATE+ ( date ndays date' )
0690AB xdB ( %1 )
0150DD xDBUG ( prog )
( name )
39218 xDDAYS ( date1 date2 days )
3B670 xDEC ()
3E576 xDECR ( name x_new )
3E85C xDEFINE ( 'name=expr' )
( 'name(name1...)=expr(name1...) )
3B549 xDEG ()
391D8 xDELALARM (n )
3D1C7 xDELAY ( x_delay )
3EF3B xDELKEYS ( rc.p )
(0 )
( 'S' )
3C51F xDEPND ( name )
( {name y1 y2} )
( {y1 y2} )
( y1 y2 )
3DCA7 xDEPTH (n )
00E314 ˜xDERIV ( symb var symb' )
003314 ˜xDERVX ( symb symb' )
00F314 ˜xDESOLVE ( eq func func' )
3B1BA xDET ( [[]] x )
3EB84 xDETACH (n )
( :port:n )
3D202 x∂ ( symb var symb' )
03A0AB x→DIAG ( [[]] vec )
03B0AB xDIAG→ ( [] { dims } [[]] )
084314 ˜xDIFF ()
00E0AB xDIFFEQ ()
Direcc. Nombre Descripción
39725 xDISP ( obj n_line )
0160DD xDISPXY ( ob {#x #y} %size )
Display o (decompiled if nexessary) at the given display
coordinates, using either the system font (%size=2) or the
minifont (%size=1).
056314 ˜xDIV ( [func] [vars] func )
026314 ˜xDIV2 ( symb1 symb2 squot srem )
072314 ˜xDIV2MOD ( symb1 symb2 squot srem )
044314 ˜xDIVIS ( symb {} )
071314 ˜xDIVMOD ( symb1 symb2 sq )
062314 ˜xDIVPC ( symb1 symb2 n symb3 )
3816B xDO ()
39527 xDOERR (n )
($ )
(0 )
05B0AB xDOLIST ( {1}...{n} n prog {} )
( {1}...{n} prog {} (n=1) )
0540AB xDOSUBS ( {} n prog {}' )
( {} prog {}' (n=1) )
3B1E1 xDOT ( [1] [2] x )
3C484 xDRAW ()
06B0AB xDRAW3DMATRIX ( [[]] v_min v_max )
3C4BA xDRAX ()
3DC56 xDROP2 ( ob1 ob2 )
3DCC7 xDROPN ( ob1...obn n )
3DC3B xDROP ( ob )
3B06E xD>R ( x (π/180)x )
UserRPL: D→R
3EFEF xDTAG ( tag:obj obj )
3DC05 xDUP2 (1 2 1 2 1 2 )
3F29A xDUPDUP (1 1 1 )
3DCE2 xDUPN ( 1...n n 1...n 1...n )
3DBEA xDUP ( ob ob ob )
0090DD xEDITB ( ob ob' )
0070DD xEDIT ( ob ob' )
39B1E xCONSTANTe (e)
UserRPL: e
02E314 ˜xEGCD ( symb1 symb2 symb3 symb4 symb5 )
02C0AB xEGV ( [[]] [[evect]]' [evals] )
02D0AB xEGVL ( [[]] [egval] )
3805D xELSE ()
38A54 xENDDO ( 1/0 )
UserRPL: END
0570AB xENDSUB (x )
Number of lists in DOSUBS.
3B5DA xENG (n )
088314 ˜xEPSX0 ( symb1 symb2 )
3BDE6 xEQ> ( 'l=r' l r )
UserRPL: EQ
00B0DD xEQW ( symb symb' )
3C553 xERASE ()
3955B xERR0 ()
39591 xERRM ( $msg )
Direcc. Nombre Descripción
39576 xERRN ( $nerr )
038314 ˜xEULER ( z1 z2 )
395AC xEVAL ( ob ? )
06C314 ˜xEXLR ( symb symb1 symb2 )
076314 ˜xEXPANDMOD ( symb1 symb2 )
000314 ˜xEXPAND ( symb1 symb2 )
( [symb1] [symb2] )
3E5E9 xEXPAN ( symb1 symb2 )
3E25E xEXPFIT ()
017314 ˜xEXPLN ( symb1 symb2 )
3AB6F xEXPM ( x x' )
3A9B7 xEXP ( x x' )
0050AB xEYEPT ( xx xy xz )
0620AB xF0λ ( y_lambda xT x_power )
001314 ˜xFACTOR ( symb symb1*symb2... )
( z z1*z2... )
077314 ˜xFACTORMOD ( symb symb1*symb2... )
043314 ˜xFACTORS ( z {z1 m1...} )
( symb {symb1 m1...} )
0600AB xFANNING ( x_x/D y_Re x_fanning )
3F2DF xFAST3D ()
3B635 xFC?C ( n 0/1 )
3B529 xFC? ( n 0/1 )
041314 ˜xFCOEF ( [] symb )
01A0AB xFFT ( [] []' )
00C0DD xFILER ()
391AE xFINDALARM ( date n )
( {date time} n )
(0 n )
3ED76 xFINISH ()
3B59A xFIX (n )
0170AB xFLASHEVAL (# ? )
3ACD1 xFLOOR (x n )
00F0DD xFONT6 ( font )
00E0DD xFONT7 ( font )
00D0DD xFONT8 ( font )
0030DD xFONT→ ( font )
0020DD x→FONT ( font )
38252 xSTARTVAR ( start finish )
UserRPL: FOR
05E314 ˜xFOURIER ( symb z c_z )
3AC87 xFP ( x x' )
39745 xFREEZE (n )
042314 ˜xFROOTS ( symb [] )
3B615 xFS?C ( n 0/1 )
3B509 xFS? ( n 0/1 )
3C955 xFUNCTION ()
3D56B x| ( symb {var val ...} x' )
06B314 ˜xFXND ( 'x/y' x y )
0070DE xGAMMA ( x x' )
04D314 ˜xGAUSS ( symb [vars] [diag] [P] symb' [vars] )
075314 ˜xGCDMOD ( x1 x2 x3 )
02C314 ˜xGCD ( x1 x2 x3 )
Direcc. Nombre Descripción
0550AB xΔLIST ( {} {}' )
3C22D xGETI ( ob pos ob' pos' elm )
ob = [] or [[]] or {} or name
pos = n or {n} or {n m}
3C1C7 xGET ( ob n elm )
ob = [] or [[]] or {} or name
pos = n or {n} or {n m}
3C74A xGOR ( g_targ {#n #m} grob g_targ' )
( g_targ (x,y) grob g_targ' )
( PICT ... ... )
3B57F xGRAD ()
3C5AE xGRAPH ()
UserRPL: PICTURE
00A0AB xGRIDMAP ()
07C314 ˜xGROBADD ( gr1 gr2 gr3 )
3C8A1 x>GROB ( ob n_chrsize grob )
UserRPL: GROB
3D503 xSUM ( var n1 n2 symb x )
UserRPL: ∑
3DDEE xSIGMA- (x )
( [] )
UserRPL: ∑-
3DDC4 xSIGMA+ (x )
( x1...xn )
UserRPL: ∑+
3E156 xSIGMALINE ( symb )
UserRPL: ∑LINE
0590AB x∑LIST ( {} x )
3DE90 xSUMX2 ( xsum )
UserRPL: ∑X2
3DE5A xSUMX ( xsum )
UserRPL: ∑X
3DEC6 xSUMXY ( xsum )
UserRPL: ∑XY
3DEAB xSUMY2 ( xsum )
UserRPL: ∑Y2
3DE75 xSUMY ( xsum )
UserRPL: ∑Y
3C7D8 xGXOR ( g_targ {#n #m} g_src g_targ' )
( g_targ (x,y) g_src g_targ' )
( PICT ... ... )
046314 ˜xHADAMARD ( [M1] [M2] [M3] )
020314 ˜xHALFTAN ( symb symb' )
3880D xHALT ()
0040DD x→HEADER (n )
0050DD xHEADER→ (n )
05C314 ˜xHERMITE ( z symb )
059314 ˜xHESS ( symb [vars] [M] [grad] [vars] )
3B68B xHEX ()
054314 ˜xHILBERT ( z [M] )
3C9C1 xHISTOGRAM ()
3E1CA xHISTPLOT ()
3B14C xHMS- ( hms1 hms2 hms3 )
Direcc. Nombre Descripción
3B12C xHMS+ ( hms1 hms2 hms3 )
3B0EC x>HMS ( x x' )
UserRPL: HMS
3B10C xHMS> ( x x' )
UserRPL: HMS
39405 xHOME ()
037314 ˜xHORNER ( symb1 x symb2 x symb3 )
031314 ˜xIABCUV ( n1 n2 n3 n4 n5 )
0060DE xIBERNOULLI (n x )
00B314 ˜xIBP ( uv' v uv -u'v )
03B314 ˜xICHINREM ( []1 []2 []3 )
027314 ˜xIDIV2 ( n1 n2 quot rem )
3C02E xIDN ( n [[]] )
( [[]] [[]]' )
( name [[]] )
02F314 ˜xIEGCD ( n1 n2 c b a )
37F48 xIF ()
387AC xIFERR ()
01B0AB xIFFT ( [] []' )
396A4 xIFT ( 0/1 obj ? )
395F3 xIFTE ( 0/1 objT objF ? )
39B3B xi (i )
011314 ˜xILAP ( symb symb' )
3B87E xIM ( (x,y) y )
( [] []' )
3E54C xINCR ( name x' )
3C33E xINDEP ( name )
( {name x1 x2} )
( {x1 x2} )
( x1 x2 )
08A314 ˜x∞ ( '+∞' )
Infinity
04C0AB xINFORM ( $ {flds} fmt {rst} {init} {} 1 )
( $ {flds} fmt {rst} {init} 0 )
3EEBD xINPUT ( $prompt $ $' )
( $prompt {specs} $' )
3D434 x∫ ( x1 x2 symb var symb' )
3F007 xINT ( f(var) var x0 F(x0) )
004314 ˜xINTVX ( f(x) F(x) )
074314 ˜xINVMOD ( x x' )
3A32B xINV ( x 1/x )
( [[]] [[]]' )
3AC3D xIP (x n )
029314 ˜xIQUOT ( n1 n2 n3 )
02B314 ˜xIREMAINDER ( n1 n2 n3 )
3F0B7 xI>R (n x )
UserRPL: I→R
3E648 xISOL ( symb var symb' )
03C314 ˜xISPRIME? (n 1 )
(n 0 )
050314 ˜xJORDAN ( [nxn] minpol chrpol {} [] )
3EE2C xKERRM ( msg )
07B314 ˜xKEYEVAL ( rc.p ? )
Direcc. Nombre Descripción
39854 xKEY ( rc 1 )
(0 )
06C0AB x→KEYTIME ( ticks )
06D0AB xKEYTIME→ ( ticks )
3ECE4 xKGET ( name )
( "name" )
( {names} )
( {{old new}...} )
394F1 xKILL ()
3C5C9 xLABEL ()
05D314 ˜xLAGRANGE ( [2xn] pol )
0000DD x→LANGUAGE (n )
0010DD xLANGUAGE→ (n )
058314 ˜xLAPL ( symb [vars] symb' )
010314 ˜xLAP ( symb symb' )
397E5 xLAST ( ob1 .. obn )
UserRPL: LASTARG
3C881 x>LCD ( grob )
UserRPL: →LCD
3C866 xLCD> ( grob )
UserRPL: LCD→
02D314 ˜xLCM ( symb1 symb2 symb3 )
055314 ˜xLCXM ( n1 n2 prog [] )
012314 ˜xLDEC ( symb1 symb2 symb3 )
05A314 ˜xLEGENDRE ( n pol )
032314 ˜xLGCD ( {symb...} {} gcd )
0160AB xLIBEVAL (# ? )
3EB42 xLIBS ( {title nlib nport ...} )
005314 ˜xLIMIT ( func point lim )
3C68C xLINE ( (x1,y1) (x2,y2) )
( {#n1 #m1} {#n2 #m2} )
3E214 xLINFIT ()
0150AB xLININ ( symb var 0/1 )
052314 ˜xLINSOLVE ( [eqs] [vars] [eqs] {pp} sol )
014314 ˜xLIN ( symb symb' )
3BAC1 xLIST> ( {} ob1...obn n )
UserRPL: LIST→
3B7D2 x>LIST ( ob1 .. obn n {} )
UserRPL: LIST
06D314 ˜xLNAME ( symb [vars] )
016314 ˜xLNCOLLECT ( symb symb' )
3AB2F xLNP1 ( x x' )
3AA01 xLN ( x x' )
3E239 xLOGFIT ()
3AA73 xLOG ( x x' )
0320AB xLQ ( [[]] [[L]] [[Q]] [[P]] )
3DF83 xLR ( Intercept Slope )
02B0AB xLSQ ( [B] [[A]] []' )
( [[B]] [[A]] [[]]' )
0300AB xLU ( [[]] [[L]] [[U]] [[P]] )
06A314 ˜xLVAR ( symb symb [vars] )
051314 ˜xMAD ( [] det inv coeff cpol )
3B02E xMANT ( x x' )
Direcc. Nombre Descripción
066314 ˜xMAP ( {} prog {}' )
3DAD0 xMATCHUP ( symb {spat srepl} symb' 0/1 )
( symb {spat srepl scond} symb' 0/1 )
UserRPL: "MATCH
3DEE1 xMAXSIGMA ( xmax )
( [x1...xn] )
UserRPL: MAX∑
39AE4 xMAXR ( MAXR )
3ADA5 xMAX ( x y x' )
0760AB xMCALC ( var )
( {vars} )
( "ALL" )
3DEFC xMEAN ( xmean )
( [x1...xn] )
3E8C1 xMEM (x )
3E9D4 xMENU (% )
07A314 ˜xMENUXY ( n1 n2 )
3DF17 xMINSIGMA ( xmin )
( [x1...xn] )
UserRPL: MIN∑
0110DD x→MINIFONT ( font )
0120DD xMINIFONT→ ( font )
0730AB xMINIT ()
39B01 xMINR ( MINR )
3AE2B xMIN ( x y x' )
0740AB xMITM ( title {vars} )
079314 ˜xMODSTO ( mod )
3AFCB xMOD ( x y x' )
0770AB xMROOT ( var x )
( "ALL" )
04E0AB xMSGBOX ($ )
0720AB xMSOLVR ()
070314 ˜xMULTMOD ( symb1 symb2 symb3 )
0750AB xMUSER ( var )
( {vars} )
( "ALL" )
0060DD x→NDISP (n )
01C0AB xNDIST ( xq v x x' )
3F2B5 xNDUPN ( ob n ob .. ob n )
39976 xNEG ( x x' )
394AA xNEWOB ( ob ob )
3831C xNEXT ()
03D314 ˜xNEXTPRIME ( n n' )
3DE09 xNSIGMA ( nrows )
UserRPL: N∑
3F264 xNIP ( ob1 ob2 ob2 )
3CB13 xNOT ( x x' )
3F0FC xNOVAL ()
0560AB xNSUB ( npos )
3BBF9 xNUM ($ n )
39785 x>NUM ( x x' )
UserRPL: →NUM
0060AB xNUMX (n )
Direcc. Nombre Descripción
0070AB xNUMY (n )
3885C xRPN-> ( ob1 .. obn )
UserRPL: →
3BE38 xOBJ> ( ob ? )
UserRPL: OBJ→
3B6A6 xOCT ()
3950C xOFF ()
3EC75 xOPENIO ()
3E8F0 xORDER ( {names} )
3CA8D xOR ( x y x' )
3DC8C xOVER (1 2 1 2 1 )
039314 ˜xPA2B2 ( n n' )
3C98B xPARAMETRIC ()
3EDEC xPARITY (n )
0090AB xPARSURFACE ()
034314 ˜xPARTFRAC ( symb symb' )
393EA xPATH ( {HOME dir1 .. dirn} )
04F314 ˜xPCAR ( [nxn] pol )
0450AB xPCOEF ( [roots] [coefs] )
00D0AB xPCONTOUR ()
01F0AB xPCOV ( xpcovariance )
3C4F5 xPDIM ( (xmin,ymin) (xmax,ymax) )
( #width #height )
3B477 xPERM ( n k n' )
0460AB xPEVAL ( [coefs] x x' )
3EAA7 xPGDIR ( name )
3F27F xPICK3 (1 2 3 1 2 3 1 )
3DCFD xPICK ( 1...n n 1..n 1 )
3C72A xPICT ( PICT )
05A0AB xπLIST ( {} x )
06A0AB xPINIT ()
39AC7 xPI (π)
UserRPL: π
3C638 xPIXOFF ( (x,y) )
( {#n #m} )
3C60E xPIXON ( (x,y) )
( {#n #m} )
3C662 xPIX? ( (x,y) 1/0 )
( {#n #m} 1/0 )
3EE9D xPKT ( data type response )
00A314 ˜xPLOTADD (f )
3C392 xPMAX ( (x,y) )
3C372 xPMIN ( (x,y) )
3C979 xPOLAR ()
3BB94 xPOS ( str substring n/0 )
( {} ob n/0 )
073314 ˜xPOWMOD ( symb exp symb' )
3D0D7 xPR1 ( ob ob )
3DFDD xPREDV (x y )
3E01D xPREDX (y x )
3DFFD xPREDY (x y )
00C314 ˜xPREVAL ( f x1 x2 symb )
( f x1 x2 x )
Direcc. Nombre Descripción
03E314 ˜xPREVPRIME ( n n' )
3D1E7 xPRLCD ()
38BBF xPROMPT ($ )
08B314 ˜xPROMPTSTO ( var )
0440AB xPROOT ( [coefs] [roots] )
035314 ˜xPROPFRAC ( x symb' )
3D10D xPRST ()
3D143 xPRVAR ( name )
( {names} )
( :port:name )
01D0AB xPSDEV ( xpsdev )
( {x1...xn} )
0040DE xPSI ( symb symb' )
0030DE xPsi ( symb n symb' )
036314 ˜xPTAYL ( pol x pol' )
3E87C xPURGE ( name )
{names} )
:port:name )
:port:nlib )
3C139 xPUTI ( ob pos obj [] pos' )
ob = [] or [[]] or {} or name
pos = n or {n} or {n m}
3C0BF xPUT ( ob pos obj ob' )
ob = [] or [[]] or {} or name
pos = n or {n} or {n m}
3EA49 xPVARS ( nport {} mem )
3C5E4 xPVIEW ( (x,y) )
( {#n #m} )
3C56E xPX>C ( {#m #n} (x,y) )
UserRPL: PX→C
3DA3E x->Q ( x a/b )
UserRPL: →Q
3DA63 x->QPI ( x symb )
UserRPL: Q→
0310AB xQR ( [[]] [[Q]] [[R]] [[P]] )
3E66F xQUAD ( symb var symb' )
3D6F6 xQUOTE ( ob 'ob )
028314 ˜xQUOT ( p1 p2 p3 )
04B314 ˜xQXA ( symb [vars] [[]] [vars] )
3B564 xRAD ()
3B3E6 xRAND (x )
02A0AB xRANK ( [[]] n )
0350AB xRANM ( {m n} [[]] )
3DBCA xPREDIV ( x y x/y )
UserRPL: RATIO
38F01 xR>B (x # )
UserRPL: RB
3D393 xRCEQ ( EQ )
3B7ED xR>C ( x y (x,y) )
UserRPL: RC
3918E xRCLALARM ( n {date time action rep} )
3B715 xRCLF ( {#s1 #u1 #s2 #u2} )
03F0DE xRCLVX ( name )
Recall the current content of the reserved
CAS variable VX.
3DDA9 xRCLSIGMA ( [[]] )
UserRPL: RCL∑
3EF79 xRCLKEYS ( {ob ... key ...} )
3EA2E xRCLMENU (x )
3E6F1 xRCL ( var x )
( :port:nlib lib )
( :port:name ob )
( :port:{path} ob )
3B6FA xRCWS (n )
3B0AE xR>D ( x (180/π)x )
UserRPL: R→D
3BEEC xRDM ( ob size ob' )
( name size )
ob= [] or [[]]
size = {n} or {n m}
3B401 xRDZ (x )
3ED22 xRECN ( name )
( $name )
0110AB xRECT ()
3ED56 xRECV ()
048314 ˜xREF ( [[]] [[]]' )
3B819 xRE ( (x,y) x )
( [] []' )
02A314 ˜xREMAINDER ( p1 p2 p3 )
0130DD xRENAME ( name name' )
069314 ˜xREORDER ( pol var pol' )
38105 xREPEAT ( 1/0 )
3B9D2 xREPL ( ob pos new ob' )
ob= [[]] or [] or {} or $ or PICT
pos= N or {n m} or (n,m)
3C41A xRES ( n_int )
3EAE7 xRESTORE ( :port:name )
0050DE xRESULTANT ( p1 p2 res )
05D0AB xREVLIST ( {1...n} {n...1}' )
3F070 xR>I (x n )
UserRPL: R→I
00D314 ˜xRISCH ( f var F )
0220AB xRKFERR ( {} h {} h dy err )
0210AB xRKFSTEP ( {} tol h {} tol h' )
0200AB xRKF ( {} xtol xTf {} xtol )
( {} {xtol step} xTf {} xtol )
38E01 xRL ( # #' )
38E21 xRLB ( # #' )
3AEB1 xRND ( x n x' )
3B16C xRNRM ( [] x )
3DD33 xROLLD ( n ... 1 n 1 n...2 )
3DD18 xROLL ( 1...n n 2...n 1 )
06F0AB xROMUPLOAD ()
3D3CE xROOT ( prog/s var guess x )
( prog/s var {guesses} x )
3DC71 xROT (1 2 3 2 3 1 )
Direcc. Nombre Descripción
03C0AB xROW- ( [[]] nrow [[]]' [] )
( [] n []' elt )
03D0AB xROW+ ( [[]] [[]]' n [[]]'' )
( [[]] [] n [[]]' )
( [] n n' [] )
0360AB x→ROW ( [[]] [1]...[n] n )
( [] x1...xn n )
0370AB xROW→ ( [1]...[n] n [] )
( x1...xn [] )
38E41 xRR ( # x' )
38E61 xRRB ( # x' )
0340AB xRREF ( [[]] [[]]' )
047314 ˜xrref ( [[]] [pp] [[]]' )
078314 ˜xRREFMOD ( [[]] [[]]' )
0240AB xRRKSTEP ( {} xtol h last {} xtol h' cur )
0230AB xRRK ( {} xtol xTfinal {} xtol )
0250AB xRSBERR ( {} h {} h dy err )
3B22F xRSD ( [B] [[A]] [Z] []' )
( [[B]] [[A]] [[Z]] [[]]' )
0400AB xRSWP ( []/[[]] i j []/[[]] )
3C9E5 xSAME ( ob1 ob2 1/0 )
3EE82 xSBRK ()
3C444 x*H ( xf )
UserRPL: SCALEH
3C464 x*W ( yf )
UserRPL: SCALEW
3C4D5 xSCALE ( xs ys )
3E1EF xSCATRPLOT ()
0330AB xSCHUR ( [[]] [[Q]] [[T]] )
3B5BA xSCI (n )
3E127 xSCLSIGMA ()
UserRPL: SCL∑
3E385 xSCONJ ( name )
07D314 ˜xSCROLL ( ob )
3DF32 xSDEV ( xsdev )
( [x1...xn] )
3ECB0 xSEND ( name )
( {names} )
( {{old new}...} )
0530AB xSEQ ( prog var start end incr {} )
007314 ˜xSERIES ( func var order {} symb' )
3ED91 xSERVER ()
064314 ˜xSEVAL ( symb symb' )
3B4C9 xSF (n )
3E696 xSHOW ( symb name symb' )
( symb {names} symb' )
0630AB xSIDENS ( x x' )
0020DE xSIGMA ( f var F )
0010DE xSIGMAVX ( f(x) F(x) )
05F314 ˜xSIGNTAB ( symb {} )
3A3EE xSIGN ( x x' )
033314 ˜xSIMP2 ( x y x/gcd y/gcd )
0220DE xSIMPLIFY ( symb symb' )
Direcc. Nombre Descripción
018314 ˜xSINCOS ( symb symb' )
3A678 xSINH ( x x' )
3E331 xSINV ( name )
3A57C xSIN ( x x' )
3BB1F xSIZE ( ob n )
( ob {N m} )
38E81 xSL ( # #' )
38EA1 xSLB ( # #' )
00C0AB xSLOPEFIELD ()
3E35B xSNEG ( name )
0290AB xSNRM ( [] x )
03F314 ˜xSOLVE ( symb var {zeros} )
086314 ˜xSOLVER ()
008314 ˜xSOLVEVX ( symb {zeros} )
05E0AB xSORT ( {} {}' )
0130AB xSPHERE ()
3A4EF xSQ ( x x' )
38EC1 xSR ( # #' )
0280AB xSRAD ( [[]] x )
38EE1 xSRB ( # #' )
3EC55 xSRECV ( n $ 0/1 )
0100DD xSREPL ( str find repl str' )
381AB xSTART ( start finish )
3B5FA xSTD ()
3851F xSTEP (n )
( symb )
3D3AE xSTEQ ( ob )
3EE62 xSTIME (x )
39164 xSTOALARM ( time n )
( {date time act rep} n )
3B749 xSTOF ( {#s1 #u1 #s2 #u2} )
3DD6E xSTOSIGMA ( ob )
UserRPL: STO∑
0400DE xSTOVX ( name )
Store object into the reserved CAS variable VX.
3EF07 xSTOKEYS ( {ob key ...} )
( {'S' ob key ...} )
( 'S' )
3E739 xSTO ( ob name )
( ob :port:name )
( lib port )
( ob 'name(i)' )
3E823 xSTO> ( ob id )
( ob symb )
Like xSTO, but if the level 1 argument is symbolic, use the first
element of it as the variable to write to.
3E406 xSTO- ( ob name )
3E46C xSTO/ ( ob name )
3E4D2 xSTO* ( ob name )
3E3AF xSTO+ ( ob name )
3BBD9 xSTR> ( $ ob )
UserRPL: STR→
0580AB xSTREAM ( {} prog x )
Direcc. Nombre Descripción
3BBBE x>STR ( ob $ )
UserRPL: →STR
3B6C1 xSTWS (n )
3B8D7 xSUB ( ob start end ob' )
ob= [[]], $, {}, grob
start,end = n, {n m}, (n,m)
002314 ˜xSUBST ( symb var=s1 symb' )
06F314 ˜xSUBTMOD ( x1 x2 x3 )
02E0AB xSVD ( [[]] [[U]] [[V]] [S] )
02F0AB xSVL ( [[]] [] )
3DC20 xSWAP ( ob1 ob2 ob2 ob1 )
04E314 ˜xSYLVESTER ( [[]] [D] [P] )
39705 xSYSEVAL (# ? )
061314 ˜xTABVAL ( symb(x) {vals} symb(x) {{vals} {res}} )
060314 ˜xTABVAR ( symb(x) symb(x) {{}{}} grob )
3EFB1 x->TAG ( ob tag :tag:ob )
UserRPL: →TAG
0520AB xTAIL ( {} {}' )
( $ $' )
01C0DE xTAN2CS2 ( symb symb' )
021314 ˜xTAN2SC2 ( symb symb' )
01F314 ˜xTAN2SC ( symb symb' )
3A70C xTANH ( x x' )
3A624 xTAN ( x x' )
006314 ˜xTAYLOR0 ( symb symb' )
3E6CA xTAYLR ( symb var n symb' )
05B314 ˜xTCHEBYCHEFF ( n pol )
01A314 ˜xTCOLLECT ( symb symb' )
0640AB xTDELTA ( x y x' )
065314 ˜xTEVAL ( ob ? time )
013314 ˜xTEXPAND ( symb symb' )
3C8FA xTEXT ()
37F7F xTHEN ( 0/1 )
39093 xTICKS (# )
39124 xSETTIME ( time )
UserRPL: →TIME
3905D xTIME ( time )
0650AB xTINC ( x y x' )
3C6B6 xTLINE ( (x1,y1) (x2,y2) )
( {#n1 #m1} {#n2 #m2} )
019314 ˜xTLIN ( symb symb' )
3E97B xTMENU ( % [InitMenu%] )
( Ob [@LIST InitMenu] )
3DF4D xTOT ( xsum )
( {x1...xn} )
0270AB xTRACE ( [[]] x )
045314 ˜xTRAN ( [[]] [[]]' )
( name )
3EE0C xTRANSIO (n )
01C314 ˜xTRIGCOS ( symb symb' )
082314 ˜xTRIGO ()
01D314 ˜xTRIGSIN ( symb symb' )
01B314 ˜xTRIG ( symb symb' )
Direcc. Nombre Descripción
01E314 ˜xTRIGTAN ( symb symb' )
3C084 xTRN ( [[]] [[]]' )
( name )
3AF3E xTRNC (x n )
063314 ˜xTRUNC ( symb1 symb2 symb3 )
3C99D xTRUTH ()
015314 ˜xTSIMP ( symb symb' )
391F8 xTSTR ( date time $ )
39456 xTVARS ( ntype {} )
( {n...} {} )
0470AB xTVM ()
0480AB xTVMBEG ()
0490AB xTVMEND ()
04A0AB xTVMROOT ( var x )
3B2DC x%T ( x y 100y/x )
3BC39 xTYPE ( ob %type )
38FD7 xUBASE ( u u' )
3900B xUFACT ( u1 u2 u3 )
0140DD xUFL1→MINIF ( ob n font )
38FB5 x>UNIT ( x u u' )
UserRPL: →UNIT
3F249 xUNPICK ( obn...ob1 ob n ob...ob2 )
3F22E xUNROT (1 2 3 3 1 2 )
38195 xUNTIL ()
39420 xUPDIR ()
3E07D xUTPC ( n x x' )
3E0BD xUTPF ( n1 n2 x x' )
3E09D xUTPN ( n v x x' )
3E0DD xUTPT ( n x x' )
38F81 xUVAL (u x )
3C2AC xV> ( []/() x y )
( []/() x y z )
(in current co-system)
UserRPL: V→
3C2D6 x>V2 ( x y [] )
( x y () )
UserRPL: →V2
3C30A x>V3 ( x y z [] )
UserRPL: →V3
053314 ˜xVANDERMONDE ( {} [[]] )
3943B xVARS ( {} )
3DF68 xVAR (x )
( [x1...xn] )
08C314 ˜xVER ($ )
00F0AB xVERSION ($ $ )
00A0DD xVISITB ( name )
0080DD xVISIT ( name )
3DB04 xMATCHDN ( symb {spat srepl} symb' 0/1 )
( symb {spat srepl scond} symb' 0/1 )
UserRPL: ↓MATCH
3BDB2 xVTYPE ( name n )
3A442 xSQRT ( x x' )
UserRPL: √
Direcc. Nombre Descripción
39819 xWAIT ( sec )
( 0 rc.p )
380DB xWHILE ()
0080AB xWIREFRAME ()
390AE xWSLOG ($ $ $ $ )
3ABAF xFACT ( x x' )
UserRPL: !
3E03D xXCOL (n )
0700AB xXGET ( name )
3EC35 xXMIT ($ 1 )
( $ $rest 0 )
067314 ˜xXNUM ( x x' )
3CB7A xXOR ( # #' #'' )
( $ $' $'' )
( 1/0 1/0 1/0 )
3AD65 xXPON (% )
( symb )
0710AB xXPUT ( name )
068314 ˜xXQ ( x x' )
0500AB xXRECV ( name )
3C915 xXRNG ( x1 x2 )
3A278 xXROOT ( y x Y' )
06E0AB xXSERV ()
04F0AB xXSEND ( name )
0000AB xXVOL ( x1 x2 )
0030AB xXXRNG ( x1 x2 )
39CFC x- ( x y x-y )
39F49 x/ ( x y x/y )
39DE8 x* ( x y x*y )
3CF80 x<=? (x y 1 )
(x y 0 )
UserRPL: ≤
3CD21 x#? (x y 1 )
(x y 0 )
UserRPL: ≠
3D01F x>=? (x y 1 )
(x y 0 )
UserRPL: ≥
39B58 x+ ( x y x+y )
3CE42 x< (x y 1 )
(x y 0 )
3CBF6 x== (x y 1 )
(x y 0 )
3CEE1 x> (x y 1 )
(x y 0 )
398B9 x= ( x y x=y )
3B251 x% ( x y xy/100 )
3E05D xYCOL (n )
3C935 xYRNG ( y1 y2 )
00B0AB xYSLICE ()
0010AB xYVOL ( y1 y2 )
3A097 xˆ ( y x yˆx )
0040AB xYYRNG ( y1 y2 )
Direcc. Nombre Descripción
040314 ˜xZEROS ( symb var {zeros} )
05F0AB xZFACTOR ( xTr yPr xZf )
0020AB xZVOL ( x1 x2 )
Apéndice D
Mensajes de Error
En este apéndice se muestran todos los mensajes de error de la calculadora HP, incluso
cuando la mayoría no tiene nada que ver con errores. Es posible generar errores con estos
mensajes directamente usando los comandos ERRORSTO o ERROROUT, o llamarlos a la pila
como cadenas con el comando JstGetTHEMESG. (capítulo 23). Los números listados están
en base hexadecimal. Están actualizados a la versión de ROM 2.15 y en idioma español.
Para generar una lista de mensajes de error como esta, puedes ejecutar el siguiente
programa en el emulador y luego pegarlo a un documento como éste.
::
BINT2 ( #2 )
>LANGUAGE ( )
DOHEX ( )
NULL$ ( $ )
1000 ( $ #final ) ( Puedes cambiarlo )
BINT1 ( $ #final #inicial ) ( Puedes cambiarlo )
DO
INDEX@ ( $ #i )
DO>STR ( $ "x #####h" )
BINT3 ( $ "x #####h" #3 )
OVERLEN$ ( $ "x #####h" #3 #long )
#1- ( $ "x #####h" #3 #long-1 )
SUB$ ( $ "#####" )
DUP ( $ "#####" "#####" )
DISPROW1 ( $ "#####" )
"\09" &$ ( $ "#####\09" )
INDEX@ ( $ "#####\09" #i )
JstGETTHEMSG ( $ "#####\09" $msj )
DUPNULL$? ( $ "#####\09" $msj flag )
ITE
2DROP
:: ( $ "#####\09" $msj )
"\0A"
"\0A\09" ( $ "#####\09" $msj "\0A" "\0A\09" )
FLASHPTR 00F 01A ( $ "#####\09" $msj' % )
DROP ( $ "#####\09" $msj' )
&$ ( $ "#####\09mensaje" )
&$ ( "...i\09mensaje" )
NEWLINE$&$ ( "...i\09mensaje\0A" )
;
LOOP
( $ )
;
#err Mensaje
1 Memoria insuficiente
2 Directorio recursivo
3 Nombre local indefin.
4 Nombre XLIB indefinido
5 Memoria borrada
6 Corte de corriente
7 Atención:
8 Tarjeta: datos invál.
9 Objeto en uso
A Puerta no disponible
B Sin espacio en puerta
C No objeto en puerta
D Recuperando memoria
E Intento recup.memoria?
F Reinserte RAM,pulse ON
10 No mem. p.config. todo
11 Nombre FPTR indefin.
12 Invalid Bank Datos
13 Full Check Bad CRC
14 Cmprs: not a user bank
15 No or 2 system bank
16 Invalid bank
17 Invalid bank number
18 Inexisting pack
19 Pack twice
1A Ins. Mem.
1B Erase Fail, Rom faulty
1C Erase Fail, Low bats
1D Erase Fail, Locked Block
1E Write Adr outside ROM
1F Write Fail, Rom Faulty
20 Write Fail, Low bats
21 Write Fail, Locked Block
22 Invalid DOS Name
23 File already opened
24 Invalid File Handle
25 Invalid File Index
26 Invalid File Mode
27 Disk Full
28 Disk Format Error
29 Disk Change
2A No SD card inserted
2B Not enough ARM memory
2C DOS call unsupported
2D DOS unknown error
2E Disk Protected
101 No puedo guardar pila
102 Impos.revisar caráct.0
103 Función usuario incorr
104 Ecuación inexistente
106 Sintaxis incorrntos
107 Número real
108 Número complejo
109 Cadena
10A Forma.núms.reales
10B Forma.núms.complej
10C Lista
10D Global Name
10E Local Name
10F Program
110 Algebraic
111 Binary Integer
112 Graphic
113 Tagged
114 Unit
115 XLIB Name
116 Directory
117 Library
118 Backup
119 Function
11A Command
11B Val.bin.de sistema
11C Número real largo
11D Núm.complejo largo
11E Formación encaden.
11F Carácter
120 Cóodigo
121 Datos, biblioteca
122 Externo
124 LAST STACK desactivado
125 LAST CMD desactivado
126 HALT no permitido
127 Formación
128 Argumentos:núm incorr.
129 Referencia circular
12A Director. no permitido
12B Directorio no vacío
12C Definición incorrecta
12D Falta biblioteca
12E PPAR inválido
12F Resultado: núm.no real
130 Imposible aislar
131 No espacio para pila
132 Attención:
133 Error:
134 ¿Borrar?
135 No queda memoria
136 Pila
137 Última pila
138 Últimos comandos
139 Asignación de teclas
13A Alarmas
13B Últimos argumentos
13C Conflicto de nombre
13D Línea de comando
13F Interrupted
140 Integer
141 Symbolic Matrix
142 Font
143 Aplet
144 Extended Real
145 Extended Complex
146 FlashPtr
147 Extended Ptr
148 MiniFont
149 Extended 1
14A Extended 2
14B Extended 3
14C YES
14D NO
14E TRUE
14F FALSE
150 Are you sure?
151 Low Memory Condition
Please Wait...
152 CATALOG
153 Nonexistent Find Pattern
154 Not Found
155 Nonexistent Replace Pattern
156 Can't Find Selection
157 Y= not available
158 Warning:
Changes will not be saved
159 Result not editable in EQW
201 Muy pocos argumentos
202 Argumento incorrecto
203 Argumento:valor incorr
204 Nombre no definido
205 LASTARG desactivado
206 Subexpresión
incompleta
207 ( ) implícitos apagados
208 ( ) implícitos activados
301 Desborde p.defecto,pos
302 Desborde p.defecto,neg
303 Desborde por exceso
304 Resultado indefinido
305 Resultado infinito
501 Dimensión inválida
502 Elemento inválido
503 Suprimiendo línea
504 Suprimiendo columna
505 Insertando línea
506 Insertando columna
601 Datos ∑ inválidos
602 ∑DAT inexistente
603 Datos ∑ insuficient.
604 ∑PAR inválido
605 ∑DAT inválidos:LN(Neg)
606 ∑DAT inválidos: LN(0)
607 EQ inválido
608 Ecuación actual
609 No hay ecuación actual
60A Introd.ecuac,pulse NEW
60B Nombre la ecuación,
pulse ENTER
60C Elija tipo de trazado
60D Catálogo vacío
60E indefinido
60F No hay datos en ∑DAT
610 Auto-ajuste de escala
611 Resolviendo:
612 Sin datos. Introduzca
613 los valores, pulse∑+
614 Seleccione un modelo
615 No alarmas pendientes
616 Pulse ALRM para crear
617 Próxima alarma:
618 Alarme pasada:
619 Alarma reconocida
61A Intro.alarma,pulse SET
61B Selecc.interval.repet.
61C Menú,configuración E/S
61D Traza.tipo:
61E ""
61F (FUERA DE PANTALLA)
620 PTYPE INVÁLIDO
621 Nombre datos estadíst.
pulse ENTER
622 Intro.valor(Zoom fuera
si >1), pulse ENTER
623 Copiado en la pila
624 Zoom al eje X con AUTO
628 IR/Cable:
629 ASCII/binario:
62A Baud:
62B Paridad:
62C Tipo de Checksum:
62D Código de traducción:
62E Intro.matriz,luego NEW
62F No Associated Numeric View
701 Algebraic
702 RPN
703 Standard
704 Std
705 Fixed
706 Fix
707 Scientific
708 Sci
709 Engineering
70A Eng
70B Degrees
70C Radians
70D Grads
70E Rectangular
70F Polar
710 Spherical
711 Operating Mode
712 Number Format
713 Angle Measure
714 Coord System
715 FM,
716 Beep
717 Key Click
718 Last Stack
719 Choose calculator operating mode
71A Choose number display format
71B Choose decimal places to display
71C Choose angle measure
71D Choose coordinate system
71E Use comma as fraction mark?
71F Enable standard beep?
720 Enable key click?
721 Save last stk for UNDO and ANS?
722 CALCULATOR MODES
723 Font:
724 Stack:
725 Small
726 Textbook
727 Edit:
728 Small
729 Full Page
72A Indent
72B EQW:
72C Small
72D Small Stack Disp
72E Header:
72F Clock
730 Analog
731 Choose system font
732 Display stack using small font?
733 Use pretty print in the stack?
734 Edit using small font?
735 Edit in full page?
736 Automatically indent new lines?
737 Edit in EQW using small font?
738 Display EQW using small font?
739 Choose header height
73A Display ticking clock?
73B Analog clock?
73C DISPLAY MODES
73D Indep var:
73E Modulo:
73F Verbose
740 Step/Step
741 Complex
742 Approx
743 Incr Pow
744 Simp Non-Rational
745 Rigorous
746 Numeric
747 Enter independent variable name
748 Enter modulo value
749 Display calculus information?
74A Perform operations step by step?
74B Allow complex numbers?
74C Perform approx calculations?
74D Increasing polynomial ordering?
74E Simplify non rational expr?
74F Don't simplify |X| to X?
750 Replace constants by values?
751 CAS MODES
752 Goto row:
753 Goto column:
754 Specify a row to go to
755 Specify a column to go to
756 Matrix Writer
757 Bad range value
758 Start:
759 Step:
75A Type:
75B Zoom:
75C Small Font
75D File:
75E Enter starting value
75F Enter increment value
760 Choose table format
761 Enter zoom factor
762 Display table using small font?
763 Enter a filename to save data
764 TABLE SETUP
765 Automatic
766 Build Your Own
767 Function
768 Polar
769 Parametric
76A Diff Eq
76B Conic
76C Truth
76D Histogram
76E Bar
76F Scatter
770 Slopefield
771 Fast3D
772 Wireframe
773 Ps-Contour
774 Y-Slice
775 Gridmap
776 Pr-Surface
777 Deg
778 Rad
779 Grad
77A Type:
77B ∠:
77C EQ:
77D Indep:
77E Connect
77F Simult
780 H-Tick:
781 V-Tick:
782 Pixels
783 Depnd:
784 Save Animation
785 ∑DAT:
786 Col:
787 Cols:
788 F:
789 H-Var:
78A V-Var:
78B Stiff
78C ∂F∂Y:
78D ∂F∂T:
78E Choose type of plot
78F Choose angle measure
790 Enter function(s) to plot
791 Enter independent variable name
792 Connect plot points?
793 Plot functions simultaneously?
794 Enter horizontal tick spacing
795 Enter vertical tick spacing
796 Tick spacing units are pixels?
797 Enter dependent variable name
798 Save slices animation?
799 Enter data to plot
79A Enter col to use for horizontal
79B Enter col to use for vertical
79C Enter horizontal variable
79D Enter vertical variable
79E Use stiff diff eq solver?
79F Enter derivative w.r.t. soln
7A0 Enter derivative w.r.t. indep
7A1 PLOT SETUP
7A2 H-View:
7A3 V-View:
7A4 Indep Low:
7A5 High:
7A6 Step:
7A7 Pixels
7A8 Depnd Low:
7A9 High:
7AA X-Left:
7AB X-Right:
7AC Y-Near:
7AD Y-Far:
7AE Step Indep:
7AF Depnd:
7B0 Bar Width:
7B1 Z-Low:
7B2 Z-High:
7B3 XE:
7B4 YE:
7B5 ZE:
7B6 Init:
7B7 Final:
7B8 Init-Soln:
7B9 Tol:
7BA XXLeft:
7BB XXRight:
7BC YYNear:
7BD YYFar:
7BE Enter minimum horizontal value
7BF Enter maximum horizontal value
7C0 Enter minimum vertical value
7C1 Enter maximum vertical value
7C2 Enter minimum indep var value
7C3 Enter maximum indep var value
7C4 Enter indep var increment
7C5 Indep step units are pixels?
7C6 Enter minimum depend var value
7C7 Enter maximum depend var value
7C8 Enter bar width
7C9 Enter minimum Z view-volume val
7CA Enter maximum Z view-volume val
7CB Enter X eyepoint coordinate
7CC Enter Y eyepoint coordinate
7CD Enter Z eyepoint coordinate
7CE Enter absolute error tolerance
7CF Enter minimum XX range value
7D0 Enter maximum XX range value
7D1 Enter minimum YY range value
7D2 Enter maximum YY range value
7D3 PLOT WINDOW
7D4 Default
7D5 FUNCTION
7D6 POLAR
7D7 PARAMETRIC
7D8 DIFF EQ
7D9 CONIC
7DA TRUTH
7DB HISTOGRAM
7DC BAR
7DD SCATTER
7DE SLOPEFIELD
7DF FAST3D
7E0 WIREFRAME
7E1 PS-CONTOUR
7E2 Y-SLICE
7E3 GRIDMAP
7E4 PR-SURFACE
7E5 PLOT WINDOW -
7E6 Enter minimum X view-volume val
7E7 Enter maximum X view-volume val
7E8 Enter minimum Y view-volume val
7E9 Enter maximum Y view-volume val
7EA Enter indep var sample count
7EB Enter depnd var sample count
7EC Goto Level:
7ED Specify a level to go to
7EE HISTORY
801 Must be >= 0
802 Must be bewteen 0 and 1
803 µ0:
804 :
805 N:
806 α:
807 σ:
808 Null hypothesis population mean
809 Sample mean
80A Sample Size
80B Significance level
80C Population standard deviation
80D Z-TEST: 1 µ, KNOWN σ
80E Alternative Hypothesis
80F 1:
810 σ1:
811 N1:
812 α:
813 2:
814 σ2:
815 N2:
816 Sample mean for population 1
817 Std deviation for population 1
818 Sample size for population 1
819 Significance level
81A Sample mean for population 2
81B Std deviation for population 2
81C Sample size for population 2
81D Z-TEST: 2 µ, KNOWN σ
81E π0:
81F x:
820 N:
821 α:
822 Null hyp. population proportion
823 Success count
824 Sample size
825 Significance level
826 Z-TEST: 1 P
827 X1:
828 N1:
829 α:
82A X2:
82B N2:
82C Success count for sample 1
82D Size of sample 1
82E Significance level
82F Success count for sample 2
830 Size of sample 2
831 Z-TEST: 2 P
832 :
833 Sx:
834 µ0:
835 α:
836 N:
837 Null hypothesis population mean
838 Sample Standard deviation
839 Sample Mean
83A Significance level
83B Sample size
83C T-TEST: 1 µ, UNKNOWN σ
83D 1:
83E S1:
83F N1:
840 α:
841 2:
842 S2:
843 N2:
844 Pooled?
845 Sample mean for population 1
846 Std deviation for sample 1
847 Sample size for population 1
848 Significance level
849 Sample mean for population2
84A Std deviation for sample 2
84B Sample size for population 2
84C "Pooled" if checked
84D T-TEST: 2 µ, UNKNOWN σ
84E :
84F σ:
850 N:
851 C:
852 Sample mean
853 Population standard deviation
854 Sample size
855 Confidence level
856 CONF. INT.: 1 µ, KNOWN σ
857 1:
858 σ1:
859 N1:
85A C:
85B 2:
85C σ2:
85D N2:
85E Sample mean for population 1
85F Std deviation for sample 1
860 Size of sample 1
861 Sample mean for population 2
862 Std deviation for sample 2
863 Size of sample 2
864 Confidence level
865 CONF. INT.: 2 µ, KNOWN σ
866 x:
867 N:
868 C:
869 Sample success count
86A Sample size
86B Confidence level
86C CONF. INT.: 1 P
86D 1:
86E N1:
86F C:
870 2:
871 N2:
872 Sample 1 success count
873 Sample 1 size
874 Sample 2 success count
875 Sample 2 size
876 Confidence level
877 CONF. INT.: 2 P
878 :
879 Sx:
87A N:
87B C:
87C Sample mean
87D Sample standard deviation
87E Sample size
87F Confidence level
880 CONF. INT.: 1 µ, UNKNOWN σ
881 1:
882 S1:
883 N1:
884 C:
885 2:
886 S2:
887 N2:
888 Pooled
889 Sample 1 mean
88A Std deviation for sample 1
88B Sample 1 size
88C Sample 2 mean
88D Std deviation for sample 2
88E Sample 2 size
88F Confidence level
890 Pooled if checked
891 CONF. INT.: 2 µ, UNKNOWN σ
892 Search for:
893 Replace by:
894 Case Sensitive
895 Search For:
896 Enter search pattern
897 Enter replace pattern
898 Case sensitive search?
899 Enter search pattern
89A FIND REPLACE
89B FIND
89C Goto Line:
89D Specify a line to go to
89E GOTO LINE
89F Goto Position:
8A0 Specify a position to go to
8A1 GOTO POSITION
8A2 H-Factor:
8A3 V-Factor:
8A4 Recenter on cursor
8A5 Enter horizontal zoom factor
8A6 Enter vertical zoom factor
8A7 Recenter plot on cursor?
8A8 ZOOM FACTOR
8A9 Object:
8AA Name:
8AB Directory
8AC Enter New Object
8AD Enter variable name
8AE Create a new directory?
8AF NEW VARIABLE
8B0 Select Object
901 Tests the null hypothesis that the population mean is a given value, H0: µ= µ0,
against an alternative hypothesis.
Example data
A set of 50 random numbers from 0 to 1, generated by a calculator, has a mean of
0.461368. The population should have:µ = 0.5 and σ = 0.2887
Calculation
Assume that the standard deviation of the population is 0.2887. Test the null
hypothesis, H0: µ = 0.5 against the alternative hypothesis that the mean is less than
0.5, H1:µ < 0.5. Test at the 5% level.
Results
p > 0.05. Accept H0, There is insufficient evidence that the calculator is not
functioning properly.
902 Tests the null hypothesis that the population means are equal, H0: µ1=µ2, against
an alternative hypothesis. The population standard deviation must be known.
Example data
A set of 50 random numbers from 0 to 1, generated by one calculator, has a mean
of 0.461368. A second calculator generates a set of 50 numbers, with a mean of
0.522851. The populations should have µ = 0.5 and σ = 0.2887. Test that these
samples indicate that the calculators are operating differently.
Calculation
Test the null hypothesis, H0:µ1 = µ2, against the alternative hypothesis that the
means are different, H1: µ1 ‹ µ2. Test at the 5% level.
Results
Since p > 0.05, accept the null hypothesis. Too little evidence to suspect that the
calculators are operating differently.
903 Tests the null hypothesis that the proportion of successes in the population is a
given value, H0: π=p0, against an alternative hypothesis.
Example data
A set of 50 random numbers between 0 and 1, generated by a calculator. 21 of the
numbers are less than 0.5. The population should have π=0.5.
Calculation
Test the alternative hypotheses H1: π < 0.5 against the null hypothesis H0: π = 0.5
at the 5% level.
Result
The test returns a Z-value of -1.1313..., with a probability of 0.1289.... Since this
probability is greater than α = 0.05, accept the null hypothesis Evidence is not
strong enough to suspect the random number generator is faulty.
904 Tests the null hypothesis that the proportions of success in two populations are
equal, H0: π1=π2, against an alternative hypothesis.
Example data
A set of 50 random numbers, between 0 and 1, generated by one calculator. 21 of
the numbers are less than 0.5. A second set of 50 random numbers generated by
another calculator. 26 of them are less than 0.5.
Calculation
Test the alternative hypotheses H1: π1 < π2 against the null hypothesis H0: π1 =
π2 at the 5% level.
Result
The test returns a Z-value of -1.0018..., with a probability of 0.1582.... Since this
probability is greater than α = 0.05, accept the null hypothesis. Evidence is not
strong enough to suspect that the two calculators are functioning differently.
905 Used when the population standard deviation is not known. Tests the null
hypothesis that the population mean is a given value, H0: µ=µ0, against an
alternative hypothesis.
Example data
A set of 50 random numbers, between 0 to 1, is generated by a calculator. The
sample mean is 0.461368 and the sample standard deviation is 0.2776. Ideally, the
mean of the population should be 0.5. Is this sample evidence that the calculator is
producing random numbers that are too small?
Calculation
Use a t-test to test the null hypothesis that the mean is 0.5, H0: µ = 0.5, against the
alternative hypothesis that the mean is less than 0.5, H1: µ < 0.5. Test at the 5%
level.
Results
Since p > 0.05, we accept the null hypothesis. Insufficient evidence to suspect the
calculator of improper functioning.
906 Used when the population standard deviation is not known. Tests the null
hypothesis that the population means are equal, H0: µ1=µ2, against an alternative
hypothesis.
Example data
A set of 50 random numbers from 0 to 1, generated by one calculator, has a mean
of 0.461368 and a sample standard deviation of 0.2776. A set of 50 random
numbers generated by a second calculator has a mean of 0.522851 and a sample
standard deviation of 0.2943.
Calculation
Use a t-test to test the null hypothesis that the means are equal, H0: µ1 = µ2,
against the alternative hypothesis that the means are different, H1: µ1 ‹ µ2. Test at
the 5% level.
Results
Since p > 0.05, accept the null hypothesis Insufficient evidence to suspect the
calculators of behaving differently.
907 Uses Normal distribution to calculate a confidence interval for µ, the true mean of a
population, when the true standard deviation, σ is known.
Example data
A set of 50 random numbers between 0 to 1, generated by a calculator.
Sample mean = 0.461368.
The population should have:
µ = 0.5
σ = 0.2887
Calculation
Calculate a 99% true mean confidence interval from the data. The confidence
interval should contain 0.5 if the random number generator is true.
Results
The calculated confidence interval is [0.3562, 0.5665]. The probability is .99 that the
population mean is in this interval.
908 Uses Normal distribution to calculate a confidence interval for the difference in the
means of two populations, when the standard deviations are known.
Example data
Two sets of 50 random numbers between 0 to 1, each generated by a different
calculator.
Results
The calculated confidence interval is [-.2102, 0.0872]. The probability is .99 that the
difference between the population means is in this interval.
909 Uses the Normal distribution to calculate a confidence interval for π, the true
proportion of successes in a population, based on the number of successes, X, in a
sample of size n.
Example data
A set of 50 random numbers, between 0 and 1, generated by a calculator. 21 of the
numbers are less than 0.5.
Calculation
Calculate a 99% confidence interval for the true proportion of numbers less than 0.5
produced by this generator. Interval should contain 0.5 if the generator is true.
Results
The calculated confidence interval is [0.2402, 0.6000]. The probability is .99 that the
true proportion of numbers less than .5 is in this interval.
90A Uses the Normal distribution to calculate a confidence interval for π1 - π2, the
difference of the true proportion of successes in two populations. Calculation is
based on the number of successes, X1, in a sample of size n1 from the first
population, and the number of successes, X2, in a sample of size n2 from the
second population.
Example data
A set of 50 random numbers, between 0 and 1, generated by one calculator. 21 of
the numbers are less than 0.5. A second set of 50 random numbers generated by
another calculator. 26 numbers are less than 0.5.
Calculation
Calculate a 99% confidence interval for the difference of the true proportions of
numbers less than 0.5 produced. The interval should contain 0 if there is no
significant difference between the calculators.
Results
The calculated confidence interval is [-.3558, .1558]. The probability is .99 that the
difference between the proportions of success of the two populations is in this
interval.
90B Uses the Student's t-distribution to calculate a confidence interval for the true mean
of a population, when the true population standard deviation, is unknown. The
calculation is based on the sample mean and sample standard deviation.
Example data
A set of 50 random numbers from 0 to 1, generated by a calculator. The sample
mean is 0.461368 and the sample standard deviation is 0.2776.
Calculation
Calculate a 99% confidence interval for the true mean of population of random
numbers generated. If the calculator is operating properly, this interval should
contain 0.5.
Results
The calculated confidence interval is [0.3562, 0.5666]. The probability is .99 that the
population mean is in this interval.
90C Uses the Student's t-distribution to calculate a confidence interval for the difference
in the means of two populations when standard deviations are unknown. The
calculation is based on the sample means and the sample standard deviations.
Example data
A set of 50 random numbers from 0 to 1, generated by one calculator, has a mean
of 0.461368 and a sample standard deviation of 0.2776. A set of 50 random
numbers generated by a second calculator has a mean of 0.522851 and a sample
standard deviation of 0.2943.
Calculation
Calculate a 99% confidence interval for the true difference in the means of the
populations of random numbers generated by these two calculators.
Results
The calculated confidence interval is [-0.2118, 0.0888]. The probability is .99 that
the difference between the population means is in this interval.
90D Inconclusive result
A01 Mala Estimación
A02 ¿Constante?
A03 Interrupción
A04 Cero
A05 Cambio de signo
A06 Extremo
B01 Unidad inválida
B02 Unidades incompatibles
C01 Checksum discorde
C02 Tiempo excedido
C03 Error de recepción
C04 Mem.intermed. excedida
C05 Error de paridad
C06 Transferencia fallida
C07 Error de protocolo
C08 Comando Servidor Invál
C09 Puerta cerrada
C0A Conectando
C0B Nuevo intento n°
C0C Espero comand.Servidor
C0D Enviando
C0E Recibiendo
C0F Objeto desechado
C10 Paquete n°
C11 Procesando el comando
C12 IOPAR inválido
C13 PRTPAR inválido
C14 E/S: pilas, baja carga
C15 Pila vacía
C16 Línea
C17 Nombre inválido
D01 Fecha incorrecta
D02 Hora incorrecta
D03 Repetición inválida
D04 Alarma inexistante
B901 Press [CONT] for menu
B902 reset/delete this field
B903 Reset value
B904 Delete value
B905 Reset all
B906 Valid object types:
B907 Valid object type:
B908 Any object
B909 Real number
B90A (Complex num)
B90B "String"
B90C [ Real array ]
B90D [(Cmpl array)]
B90E { List }
B90F Name
B910 « Program »
B911 'Algebraic'
B912 # Binary int
B913 _Unit object
B914 Invalid object type
B915 Invalid object value
B916 Calculator Modes
B917 Number Format:
B918 Angle Measure:
B919 Coord System:
B91A Beep
B91B Clock
B91C FM,
B91D Choose number display format
B91E Enter decimal places to display
B91F Choose angle measure
B920 Choose coordinate system
B921 Enable standard beep?
B922 Display ticking clock?
B923 Use comma as fraction mark?
B924 Standard
B925 Std
B926 Fixed
B927 Fix
B928 Scientific
B929 Sci
B92A Engineering
B92B Eng
B92C Degrees
B92D Deg
B92E Radians
B92F Rad
B930 Grads
B931 Grad
B932 Rectangular
B933 Polar
B934 Spherical
B935 SYSTEM FLAGS
B936 01 General solutions
B937 02 Constant → symb
B938 03 Function → symb
B939 14 Payment at end
B93A 19 →V2 → vector
B93B 20 Underflow → 0
B93C 21 Overflow → ±9E499
B93D 22 Infinite → error
B93E 27 'X+Y*i' → '(X,Y)'
B93F 28 Sequential plot
B940 29 Draw axes too
B941 31 Connect points
B942 32 Solid cursor
B943 33 Transfer via wire
B944 34 Print via IR
B945 35 ASCII transfer
B946 36 RECV renames
B947 37 Single-space prnt
B948 38 Add linefeeds
B949 39 Show I/O messages
B94A 40 Don't show clock
B94B 41 12-hour clock
B94C 42 mm/dd/yy format
B94D 43 Reschedule alarm
B94E 44 Delete alarm
B94F 51 Fraction mark: .
B950 52 Show many lines
B951 53 No extra parens
B952 54 Tiny element → 0
B953 55 Save last args
B954 56 Standard beep on
B955 57 Alarm beep on
B956 58 Show INFO
B957 59 Show variables
B958 60 [α][α] locks
B959 61 [USR][USR] locks
B95A 62 User keys off
B95B 63 Custom ENTER off
B95C 65 All multiline
B95D 66 Stack:x lines str
B95E 67 Digital clock
B95F 68 No AutoIndent
B960 69 Line edit
B961 70 →GROB 1 line str
B962 71 Show addresses
B963 72 Stack:current fnt
B964 73 Edit:current font
B965 74 Right stack disp
B966 75 Key click off
B967 76 Purge confirm
B968 79 Textbook on
B969 80 EQW cur stk font
B96A 81 GRB Alg cur font
B96B 82 EQW edit cur font
B96C 83 Display grobs on
B96D 85 Normal stk disp
B96E 90 CHOOSE:cur font
B96F 91 MTRW:matrix
B970 92 MASD asm mode
B971 94 Result = LASTCMD
B972 95 RPN mode
B973 97 List:horiz disp
B974 98 Vector:horiz disp
B975 99 CAS:quiet
B976 100 Step by step off
B977 103 Complex off
B978 105 Exact mode on
B979 106 Simp. in series
B97A 109 Sym. factorize
B97B 110 Normal matrices
B97C 111 Simp non rat.
B97D 112 i simplified
B97E 113 Linear simp on
B97F 114 Disp 1+x → x+1
B980 115 SQRT simplified
B981 116 Prefer cos()
B982 117 CHOOSE boxes
B983 119 Rigorous on
B984 120 Silent mode off
B985 123 Allow Switch Mode
B986 125 Accur. Sign-Sturm
B987 126 rref w/ last col
B988 127 IrDA mode
B989 128 Cmplx var allowed
B98A 01 Principal value
B98B 02 Constant → num
B98C 03 Function → num
B98D 14 Payment at begin
B98E 19 →V2 → complex
B98F 20 Underflow → error
B990 21 Overflow → error
B991 22 Infinite → ±9E499
B992 27 'X+Y*i' → 'X+Y*i'
B993 28 Simultaneous plot
B994 29 Don't draw axes
B995 31 Plot points only
B996 32 Inverse cursor
B997 33 Transfer via IR
B998 34 Print via wire
B999 35 Binary transfer
B99A 36 RECV overwrites
B99B 37 Double-space prnt
B99C 38 No linefeeds
B99D 39 No I/O messages
B99E 40 Show clock
B99F 41 24-hour clock
B9A0 42 dd.mm.yy format
B9A1 43 Don't reschedule
B9A2 44 Save alarm
B9A3 51 Fraction mark: ,
B9A4 52 Show one line
B9A5 53 Show all parens
B9A6 54 Use tiny element
B9A7 55 No last args
B9A8 56 Standard beep off
B9A9 57 Alarm beep off
B9AA 58 Don't show INFO
B9AB 59 Show names only
B9AC 60 [α] locks Alpha
B9AD 61 [USR] locks User
B9AE 62 User keys on
B9AF 63 Custom ENTER on
B9B0 65 Level 1 multiline
B9B1 66 Stk: 1 line str
B9B2 67 Analog clock
B9B3 68 AutoIndent
B9B4 69 Infinite line edit
B9B5 70 →GROB x lines str
B9B6 71 No addresses
B9B7 72 Stack:mini font
B9B8 73 Edit:mini font
B9B9 74 Left stack disp
B9BA 75 Key click on
B9BB 76 No purge confirm
B9BC 79 Textbook off
B9BD 80 EQW mini stk font
B9BE 81 GRB Alg mini font
B9BF 82 EQW edit mini fnt
B9C0 83 Display grobs off
B9C1 85 SysRPL stk disp
B9C2 90 CHOOSE:mini font
B9C3 91 MTRW:list of list
B9C4 92 MASD SysRPL mode
B9C5 94 Result <> LASTCMD
B9C6 95 Algebraic mode
B9C7 97 List:vert disp
B9C8 98 Vector:vert disp
B9C9 99 CAS:verbose
B9CA 100 Step by step on
B9CB 103 Complex on
B9CC 105 Approx. mode on
B9CD 106 !Simp. in series
B9CE 109 Num. factorize
B9CF 110 Large matrices
B9D0 111 !Simp non rat.
B9D1 112 i not simplified
B9D2 113 Linear simp off
B9D3 114 Disp x+1 → 1+x
B9D4 115 SQRT !simplified
B9D5 116 Prefer sin()
B9D6 117 Soft MENU
B9D7 119 Rigorous off
B9D8 120 Silent mode on
B9D9 123 Forb. Switch Mode
B9DA 125 FastSign-no Sturm
B9DB 126 rref w/o last col
B9DC 127 HP-IR mode
B9DD 128 Vars are reals
B9DE Object:
B9DF Obs in
B9E0 Name:
BA01 1.Send to Calculator
BA02 2.Get from Calculator
BA03 3.Print display
BA04 4.Print
BA05 5.Transfer
BA06 6.Start Server
BA07 Enter names of vars to send
BA08 Vars in
BA09 SEND TO CALCULATOR
BA0A Port:
BA0B Dbl-Space
BA0C Delay:
BA0D Xlat:
BA0E Linef
BA0F Baud:
BA10 Parity:
BA11 Len:
BA12 Choose print port
BA13 Enter object(s) to print
BA14 Print extra space between lines?
BA15 Enter delay between lines
BA16 Choose character translations
BA17 Print linefeed between lines?
BA18 Choose baud rate
BA19 Choose parity
BA1A Enter printer line length
BA1B PRINT
BA1C Type:
BA1D OvrW
BA1E Fmt:
BA1F Chk:
BA20 Choose transfer port
BA21 Choose type of transfer
BA22 Enter names of vars to transfer
BA23 Choose transfer format
BA24 Choose checksum type
BA25 Overwrite existing variables?
BA26 TRANSFER
BA27 Local vars
BA28 Remote PC files
BA29 Files in
BA2A Enter name of dir to change to
BA2B Choose Remote Directory
BA2C Infrared
BA2D IR
BA2E Wire
BA2F Kermit
BA30 XModem
BA31 Odd
BA32 Even
BA33 Mark
BA34 Space
BA35 Spc
BA36 ASCII
BA37 ASC
BA38 Binary
BA39 Bin
BA3A None
BA3B Newline (Ch 10)
BA3C Newl
BA3D Chr 128-159
BA3E →159
BA3F →255
BA40 Chr 128-255
BA41 One-digit arith
BA42 Two-digit arith
BA43 Three-digit CRC
BA44 HP-IR
BA45 IrDA
BA46 14K
BA47 19K
BA48 38K
BA49 57K
BA4A 115K
BA4B 15K
BA4C 1200
BA4D 2400
BA4E 4800
BA4F 9600
BA50 USB
BA51 Serial
BB01 1.Single-var
BB02 2.Frequencies
BB03 3.Fit data
BB04 4.Summary stats
BB05 SINGLE-VARIABLE STATISTICS
BB06 ∑DAT:
BB07 Type:
BB08 Mean
BB09 Std Dev
BB0A Variance
BB0B Total
BB0C Maximum
BB0D Minimum
BB0E Enter statistical data
BB0F Enter variable column
BB10 Choose statistics type
BB11 Calculate mean?
BB12 Calculate standard deviation?
BB13 Calculate variance?
BB14 Calculate column total?
BB15 Calculate column maximum?
BB16 Calculate column minimum?
BB17 Sample
BB18 Population
BB19 FREQUENCIES
BB1A X-Min:
BB1B Bin Count:
BB1C Bin Width:
BB1D Enter minimum first bin X value
BB1E Enter number of bins
BB1F Enter bin width
BB20 FIT DATA
BB21 X-Col:
BB22 Y-Col:
BB23 Model:
BB24 Enter indep column number
BB25 Enter dependent column number
BB26 Choose statistical model
BB27 Correlation
BB28 Covariance
BB29 PREDICT VALUES
BB2A Y:
BB2B Enter indep value or press PRED
BB2C Enter dep value or press PRED
BB2D SUMMARY STATISTICS
BB2E Calculate:
BB2F ∑X
BB30 ∑Y
BB31 ∑X2
BB32 ∑Y2
BB33 ∑XY
BB34 N∑
BB35 Calculate sum of X column?
BB36 Calculate sum of Y column?
BB37 Calculate sum of squares of X?
BB38 Calculate sum of squares of Y?
BB39 Calculate sum of products?
BB3A Calculate number of data points?
BB3B Linear Fit
BB3C Logarithmic Fit
BB3D Exponential Fit
BB3E Power Fit
BB3F Best Fit
BB40 5.Hypoth. tests
BB41 6.Conf. interval
BC01 1.Browse alarms
BC02 2.Set alarm
BC03 3.Set time, date
BC04 SET ALARM
BC05 Message:
BC06 Time:
BC07 Date:
BC08 Repeat:
BC09 Enter "message" or « action »
BC0A Enter hour
BC0B Enter minute
BC0C Enter second
BC0D Choose AM, PM, or 24-hour time
BC0E Enter month
BC0F Enter day
BC10 Enter year
BC11 Enter alarm repeat multiple
BC12 Enter alarm repeat unit
BC13 SET TIME AND DATE
BC14 Choose date display format
BC15 Monday
BC16 Tuesday
BC17 Wednesday
BC18 Thursday
BC19 Friday
BC1A Saturday
BC1B Sunday
BC1C None
BC1D AM
BC1E PM
BC1F 24-hour time
BC20 24-hr
BC21 1 January
BC22 2 February
BC23 3 March
BC24 4 April
BC25 5 May
BC26 6 June
BC27 7 July
BC28 8 August
BC29 9 September
BC2A 10 October
BC2B 11 November
BC2C 12 December
BC2D Week
BC2E Day
BC2F Hour
BC30 Minute
BC31 Second
BC32 Weeks
BC33 Days
BC34 Hours
BC35 Minutes
BC36 Seconds
BC37 Month/Day/Year
BC38 M/D/Y
BC39 Day.Month.Year
BC3A D.M.Y
BC3B ALARMS
BD01 1.Integrate
BD02 2.Differentiate
BD03 3.Taylor poly
BD04 4.Isolate var
BD05 5.Solve quad
BD06 6.Manip expr
BD07 INTEGRATE
BD08 Expr:
BD09 Var:
BD0A Result:
BD0B Enter expression
BD0C Enter variable name
BD0D Enter lower limit
BD0E Enter upper limit
BD0F Choose result type
BD10 Choose disp format for accuracy
BD11 DIFFERENTIATE
BD12 Value:
BD13 Enter variable value
BD14 Expression
BD15 TAYLOR POLYNOMIAL
BD16 Order:
BD17 Enter Taylor polynomial order
BD18 ISOLATE A VARIABLE
BD19 Principal
BD1A Get principal solution only?
BD1B SOLVE QUADRATIC
BD1C MANIPULATE EXPRESSION
BD1D MATCH EXPRESSION
BD1E Pattern:
BD1F Replacement:
BD20 Subexpr First
BD21 Cond:
BD22 Enter pattern to search for
BD23 Enter replacement object
BD24 Search subexpressions first?
BD25 Enter conditional expression
BD26 Symbolic
BD27 Numeric
BE01 Plot
BE02 Type:
BE03 ∠:
BE04 H-View:
BE05 Autoscale
BE06 V-View:
BE07 Choose type of plot
BE08 Choose angle measure
BE09 Enter function(s) to plot
BE0A Enter minimum horizontal value
BE0B Enter maximum horizontal value
BE0C Autoscale vertical plot range?
BE0D Enter minimum vertical value
BE0E Enter maximum vertical value
BE0F Plot (x(t), y(t))
BE10 Enter complex-valued func(s)
BE11 Plot y'(t)=f(t,y)
BE12 Enter function of INDEP and SOLN
BE13 Enter derivative w.r.t. SOLN
BE14 Enter derivative w.r.t. INDEP
BE15 Use Stiff diff eq solver?
BE16 ∑Dat:
BE17 Col:
BE18 Wid:
BE19 Enter data to plot
BE1A Arrays in
BE1B Enter column to plot
BE1C Enter bar width
BE1D Cols:
BE1E Enter col to use for horizontal
BE1F Enter col to use for vertical
BE20 Steps:
BE21 Enter indep var sample count
BE22 Enter dep var sample count
BE23 Plot Options
BE24 Lo:
BE25 Hi:
BE26 Axes
BE27 Simult
BE28 Connect
BE29 Pixels
BE2A H-Tick:
BE2B V-Tick:
BE2C Enter minimum indep var value
BE2D Enter maximum indep var value
BE2E Draw axes before plotting?
BE2F Connect plot points?
BE30 Plot functions simultaneously?
BE31 Enter indep var increment
BE32 Indep step units are pixels?
BE33 Enter horizontal tick spacing
BE34 Enter vertical tick spacing
BE35 Tick spacing units are pixels?
BE36 Depnd:
BE37 Enter dependent var name
BE38 Enter minimum dep var value
BE39 Enter maximum dep var value
BE3A H-Var:
BE3B V-Var:
BE3C Enter max indep var increment
BE3D Choose horizontal variable
BE3E Choose vertical variable
BE3F 0 INDEP
BE40 1 SOLN
BE41 SOLN(
BE42 X-Left:
BE43 X-Right:
BE44 Y-Near:
BE45 Y-Far:
BE46 Z-Low:
BE47 Z-High:
BE48 Enter minimum X view-volume val
BE49 Enter maximum X view-volume val
BE4A Enter minimum Y view-volume val
BE4B Enter maximum Y view-volume val
BE4C Enter minimum Z view-volume val
BE4D Enter maximum Z view-volume val
BE4E XE:
BE4F YE:
BE50 ZE:
BE51 Enter X eyepoint coordinate
BE52 Enter Y eyepoint coordinate
BE53 Enter Z eyepoint coordinate
BE54 Save Animation
BE55 Save animation data after plot?
BE56 XX-Left:
BE57 XX-Rght:
BE58 YY-Near:
BE59 YY-Far:
BE5A Enter minimum XX range value
BE5B Enter maximum XX range value
BE5C Enter minimum YY range value
BE5D Enter maximum YY range value
BE5E XX and YY Plot Options
BE5F Zoom Factors
BE60 H-Factor:
BE61 V-Factor:
BE62 Recenter at Crosshairs
BE63 Enter horizontal zoom factor
BE64 Enter vertical zoom factor
BE65 Recenter plot at crosshairs?
BE66 Reset plot
BE67 Dflt
BE68 Auto
BE69 Function
BE6A Polar
BE6B Conic
BE6C Truth
BE6D Parametric
BE6E Diff Eq
BE6F Histogram
BE70 Bar
BE71 Scatter
BE72 Slopefield
BE73 Wireframe
BE74 Ps-Contour
BE75 Y-Slice
BE76 Gridmap
BE77 Pr-Surface
BF01 1.Solve equation
BF02 2.Solve diff eq
BF03 3.Solve poly
BF04 4.Solve lin sys
BF05 5.Solve finance
BF06 SOLVE EQUATION
BF07 Enter value or press SOLVE
BF08 Eq:
BF09 Enter function to solve
BF0A Funcs in
BF0B Solver Variable Order
BF0C Variables:
BF0D Enter order of vars to display
BF0E SOLVE Y'(T)=F(T,Y)
BF0F f:
BF10 ∂f∂y:
BF11 ∂f∂t:
BF12 Indep:
BF13 Init:
BF14 Final:
BF15 Soln:
BF16 Tol:
BF17 Step:
BF18 Stiff
BF19 Enter function of INDEP and SOLN
BF1A Enter derivative w.r.t. SOLN
BF1B Enter derivative w.r.t. INDEP
BF1C Enter independent var name
BF1D Enter initial indep var value
BF1E Enter final indep var value
BF1F Enter solution var name
BF20 Enter initial solution var value
BF21 Press SOLVE for final soln value
BF22 Enter absolute error tolerance
BF23 Enter initial step size
BF24 Calculate stiff differential?
BF25 f
BF26 Tolerance
BF27 Solution
BF28 SOLVE AN·X^N++A1·X+A0
BF29 Coefficients [ an a1 a0 ]:
BF2A Roots:
BF2B Enter coefficients or press SOLVE
BF2C Enter roots or press SOLVE
BF2D Coefficients
BF2E Roots
BF2F SOLVE SYSTEM A·X=B
BF30 A:
BF31 B:
BF32 X:
BF33 Enter coefficients matrix A
BF34 Enter constants or press SOLVE
BF35 Enter solutions or press SOLVE
BF36 Constants
BF37 Solutions
BF38 N:
BF39 I%YR:
BF3A PV:
BF3B PMT:
BF3C P/YR:
BF3D FV:
BF3E Enter no. of payments or SOLVE
BF3F Enter yearly int rate or SOLVE
BF40 Enter present value or SOLVE
BF41 Enter payment amount or SOLVE
BF42 Enter no. of payments per year
BF43 Enter future value or SOLVE
BF44 Choose when payments are made
BF45 TIME VALUE OF MONEY
BF46 N
BF47 I%/YR
BF48 PV
BF49 PMT
BF4A FV
BF4B End
BF4C Begin
BF4D Beg
BF4E AMORTIZE
BF4F Payments:
BF50 Principal:
BF51 Interest:
BF52 Balance:
BF53 Enter no. of payments to amort
BF54 Principal
BF55 Interest
BF56 Balance
C001 Unable to find root
DE01 denominator(s)
DE02 root(s)
DE03 last
DE04 obvious
DE05 factorizing
DE06 value
DE07 test(s)
DE08 searching
DE09 TAYLR of ↓ at
DE0A nth
DE0B is
DE0C numerator(s)
DE0D Less than
DE0E multiplicity
DE0F list of
DE10 at
DE11 factor(s)
DE12 Eigenvalues
DE13 Computing for
DE14 Root mult <
DE15 Numerical to symbolic
DE16 Invalid operator
DE17 Result:
DE18 Pivots
DE19 Press CONT to go on
DE1A Test
DE1B To be implemented
DE1C Unable to factor
DE1D Z is not = 1 mod 4
DE1E Z is not prime
DE1F Empty {} of equations
DE20 Not reducible to a rational expression
DE21 Non unary operator
DE22 User function
DE23 Non isolable operator
DE24 Not exact system
DE25 Parameters not allowed
DE26 CAS internal error
DE27 Invalid ^ for SERIES
DE28 Operator not implemented (SERIES)
DE29 No variable in expr.
DE2A No solution found
DE2B Invalid derivation arg
DE2C No solution in ring
DE2D Not a linear system
DE2E Can't derive int. var
DE2F Diff equation order>2
DE30 INT:invalid var change
DE31 Mode switch cancelled
DE32 No name in expression
DE33 Invalid user function
DE34 Can't find ODE type
DE35 Integer too large
DE36 Unable to find sign
DE37 Non-symmetric matrix
DE38 ATAN insufficent order
DE39 ASIN at infinity undef
DE3A Unsigned inf error
DE3B LN[Var] comparison err
DE3C Undef limit for var
DE3D Bounded var error
DE3E Got expr. indep of var
DE3F Can't state remainder
DE40 LN of neg argument
DE41 Insufficient order
DE42 ABS of non-signed 0
DE43 Numeric input
DE44 Singularity! Continue?
DE45 Cancelled
DE46 Negative integer
DE47 Parameter is cur. var. dependent
DE48 Unsimplified sqrt
DE49 Non polynomial system
DE4A Unable to solve ODE
DE4B Array dimension too large
DE4C Unable to reduce system
DE4D Complex number not allowed
DE4E Polyn. valuation must be 0
DE4F Mode switch not allowed here
DE50 Non algebraic in expression
DE51 Purge current variable
DE52 Reduction result
DE53 Matrix not diagonalizable
DE54 Int[u'*F(u)] with u=
DE55 Int. by part u'*v, u=
DE56 Square root
DE57 Rational fraction
DE58 Linearizing
DE59 Risch alg. of tower
DE5A Trig. fraction, u=
DE5B Unknown operator (DOMAIN)
DE5C Same points
DE5D Unsigned inf. Solve?
DE5E CAS not available
DE5F Can not store current var
DE60 Not available on the HP40G
DE61 Not available on the HP49G
DE62 SERIES remainder is O(1) at order 3
DE63 Delta/Heaviside not available from HOME
DE64 Warning, integrating in approx mode
DE65 Function is constant
DE66 Can not unbind local vars
DE67 Replacing strict with large inequality
DE68 No valid environment stored
DF01 Administrador archivos
DF02 NO
DF03 ABORT
DF04 TODO
DF05 SI
DF06 REN
DF07 Ya existe
DF08 Sobreescribir ?
DF09 Renombrar
DF0A ELEGIR DESTINO
DF0B Estás Seguro?
DF0C Modo Búsqueda Inactivo
DF0D Modo Búsqueda Activo
DF0E Nuevo Directorio?
DF0F Clasificar por:
DF10 Original
DF11 Tipo
DF12 Nombre
DF13 Tamaño
DF14 Inv. Tipo
DF15 Inv. Nombre
DF16 Inv. Tamaño
DF17 Enviando con Xmodem:
DF18 EDITA
DF19 COPIA
DF1A MOVER
DF1B RCL
DF1C EVALU
DF1D ARBOL
DF1E BORRA
DF1F RENOM
DF20 NUEVO
DF21 ORDEN
DF22 ENVIA
DF23 RECIB
DF24 PARAR
DF25 VER
DF26 EDITB
DF27 CABEC
DF28 LISTA
DF29 CLASI
DF2A XENVI
DF2B CHDIR
DF2C CANCL
DF2D OK
DF2E CHECK
DF2F ATENCION: El formato
borrará la tarjeta SD
DF30 Desea continuar?
DF31 FORMAT
DF32 Espere por favor...
E101 Avogadro's number
E102 Boltzmann
E103 molar volume
E104 universal gas
E105 std temperature
E106 std pressure
E107 Stefan-Boltzmann
E108 speed of light
E109 permittivity
E10A permeability
E10B accel of gravity
E10C gravitation
E10D Planck's
E10E Dirac's
E10F electronic charge
E110 electron mass
E111 q/me ratio
E112 proton mass
E113 mp/me ratio
E114 fine structure
E115 mag flux quantum
E116 Faraday
E117 Rydberg
E118 Bohr radius
E119 Bohr magneton
E11A nuclear magneton
E11B photon wavelength
E11C photon frequency
E11D Compton wavelen
E11E 1 radian
E11F 2π radians
E120 ∠ in trig mode
E121 Wien's
E122 k/q
E123 “0/q
E124 q*“0
E125 dielectric const
E126 SiO2 dielec cons
E127 ref intensity
E128 CONSTANTS LIBRARY
E129 Undefined Constant
E301 Starting Solver
E302 OF
E303 Keyword Conflict
E304 No Picture Available
E305 NEAR
E306 MINE
E307 MINES
E308 SCORE:
E309 YOU MADE IT!!
E30A YOU BLEW UP!!
E30B Need ROM >= 208
E401 Invalid Mpar
E402 Single Equation
E403 EQ Invalid for MINIT
E404 Too Many Unknowns
E405 All Variables Known
E406 Illegal During MROOT
E407 Solving for
E408 Searching
E501 Bad Molecular Formula
E502 Undefined Element
E503 Undefined Property
E601 No Solution
E602 Many or No Solutions
E603 I%YR/PYR ‰ -100
E604 Invalid N
E605 Invalid PYR
E606 Invalid #Periods
E607 Undefined TVM Variable
E608 END mode
E609 BEGIN mode
E60A payments/year
E60B Principal
E60C Interest
E60D Balance
FF01 StreamSmart Setup
FF02 Plot Setup
FF03 Sensor Setup
FF04 Unit Setup
FF05 Export Setup
FF06 Event Setup
FF07 Calibrate
FF08 Experiment
FF09 Overlay
FF0A Stack
FF0B Average
FF0C Single Value
FF0D Minimum
FF0E Maximum
FF0F Auto
FF10 WYSIWYG
FF11 StreamSmart Setup
FF12 Plot Setup
FF13 Sensor Setup
FF14 Unit Setup
FF15 Export Setup
FF16 Event Setup
FF17 Calibrate
FF18 Experiment
FF19 Waiting to read Sensor
FF1A A sensor was not detected. Connect a sensor and try again.
10001 Invalid $ROMID
10002 Invalid $TITLE
10003 Invalid $MESSAGE
10004 Invalid $VISIBLE
10005 Invalid $HIDDEN
10006 Invalid $EXTPRG
10101 Invalid File
10102 Too Many
10103 Unknown Instruction
10104 Invalid Field
10105 Val betw 0-15 expected
10106 Val betw 1-16 expected
10107 Label Expected
10108 Hexa Expected
10109 Decimal Expected
1010A Can't Find
1010B Label already defined
1010C { expected
1010D } expected
1010E ( expected
1010F Forbidden
10110 Bad Expression
10111 Jump too Long
10112 Val betw 1-8 expected
10113 Insuffisant Memory
10114 Matrix Error
10115 Define Error
10116 [ or ] expected
10117 ARM register expected
10118 ARM invalid imediate
31401 No Message here