RPL [5] es un sistema operativo de calculadora portátil y un lenguaje de programación de aplicaciones utilizado en las calculadoras gráficas científicas RPN (notación polaca inversa) de Hewlett-Packard de las series HP 28 , 48 , 49 y 50 , pero también se puede utilizar en calculadoras que no son RPN, como las series 38 , 39 y 40. Internamente, también lo utilizaban las 17B , 18C , 19B y 27S . [7]
RPL es un lenguaje de programación estructurado basado en RPN, pero igualmente capaz de procesar expresiones algebraicas y fórmulas, implementado como un intérprete enhebrado . [8] RPL tiene muchas similitudes con Forth , ambos lenguajes están basados en pila , así como el LISP basado en lista . A diferencia de las calculadoras HP RPN anteriores, que tenían una pila fija de cuatro niveles , la pila dinámica utilizada por RPL solo está limitada por la RAM disponible , y la calculadora muestra un mensaje de error cuando se queda sin memoria en lugar de eliminar silenciosamente los argumentos de la pila como en las pilas RPN de tamaño fijo. [9]
RPL se originó en las instalaciones de desarrollo de HP en Corvallis, Oregón, en 1984 como reemplazo de la práctica anterior de implementar los sistemas operativos de las calculadoras en lenguaje ensamblador . [7] La primera calculadora que lo utilizó internamente fue la HP-18C y la primera calculadora que lo puso a disposición de los usuarios fue la HP-28C, ambas de 1986. [10] [7] La última calculadora de bolsillo compatible con RPL, la HP 50g, se suspendió en 2015. [11] [12] [13] Sin embargo, existen múltiples emuladores que pueden emular las calculadoras RPL de HP que se ejecutan en una variedad de sistemas operativos y dispositivos, incluidos los teléfonos inteligentes iOS y Android.También hay una serie de proyectos comunitarios para recrear y ampliar RPL en calculadoras más nuevas, como newRPL [14] [15] o DB48X , [16] [17] que pueden agregar características o mejorar el rendimiento. [18]
La variante interna de bajo a medio nivel de RPL, llamada System RPL (o SysRPL ) se utiliza en algunas calculadoras HP anteriores, así como en las mencionadas anteriormente, como parte de su lenguaje de implementación del sistema operativo . En la serie HP 48, esta variante de RPL no es accesible para el usuario de la calculadora sin el uso de herramientas externas, pero en la serie HP 49/50 hay un compilador integrado en la ROM para utilizar SysRPL. Es posible provocar un fallo grave al codificar en SysRPL, por lo que se debe tener cuidado al utilizarlo. La versión de alto nivel User RPL (o UserRPL ) del lenguaje está disponible en dichas calculadoras gráficas para desarrollar programas de aplicación tanto textuales como gráficos. Todos los programas UserRPL se representan internamente como programas SysRPL, pero utilizan solo un subconjunto seguro de los comandos SysRPL disponibles. Sin embargo, la comprobación de errores que forma parte de los comandos UserRPL hace que los programas UserRPL sean notablemente más lentos que los programas SysRPL equivalentes. El comando UserRPL SYSEVAL le indica a la calculadora que procese partes designadas de un programa UserRPL como código SysRPL.
Los bloques de control RPL no son estrictamente postfix . Aunque hay algunas excepciones notables, las estructuras de los bloques de control aparecen como lo harían en un lenguaje infijo estándar. La calculadora gestiona esto permitiendo que la implementación de estos bloques se salte hacia adelante en el flujo del programa según sea necesario.
RPL admite pruebas condicionales básicas mediante la estructura IF/THEN/ELSE. La sintaxis básica de este bloque es:
SI condición ENTONCES si es verdadero [SINO si es falso] FIN
El siguiente ejemplo prueba si el número en la parte inferior de la pila es "1" y, si es así, lo reemplaza con "Igual a uno":
« SI 1 == ENTONCES "Igual a uno" FIN »
La construcción IF evalúa la condición y luego prueba el resultado en la parte inferior de la pila. Como resultado, RPL puede admitir opcionalmente bloques IF de estilo FORTH, lo que permite determinar la condición antes del bloque. Al dejar la condición vacía, la declaración IF no realizará ningún cambio en la pila durante la ejecución de la condición y utilizará el resultado existente en la parte inferior de la pila para la prueba:
« 1 == SI ENTONCES "Igual a uno" FIN »
Las pruebas condicionales de posfijo se pueden realizar utilizando las funciones IFT ("if-then") e IFTE ("if-then-else").
IFT e IFTE extraen dos o tres comandos de la pila, respectivamente. El valor superior se evalúa como un valor booleano y, si es verdadero, el segundo valor superior se vuelve a colocar en la pila. IFTE permite un tercer valor "else" que se volverá a colocar en la pila si el valor booleano es falso.
El siguiente ejemplo utiliza la función IFT para sacar un objeto de la parte inferior de la pila y, si es igual a 1, lo reemplaza con "Uno":
« 1 == "Uno" IFT »
El siguiente ejemplo utiliza la función IFTE para extraer un objeto de la parte inferior de la pila y, si es igual a 1, lo reemplaza por "Uno". Si no es igual a 1, lo reemplaza por la cadena "No uno":
« 1 == "Uno" "No uno" IFTE »
IFT e IFTE evaluarán un bloque de programa dado como uno de sus argumentos, lo que permite una forma más compacta de lógica condicional que una estructura IF/THEN/ELSE/END. El siguiente ejemplo extrae un objeto de la parte inferior de la pila y lo reemplaza con "One", "Less" o "More", según sea igual, menor o mayor que 1.
« DUP1 == «SUELTA "Uno"» « 1 < "Menos" "Más" IFTE » IFTE »
Para admitir una lógica condicional más compleja, RPL proporciona la estructura CASE/THEN/END para manejar múltiples pruebas exclusivas. Solo se ejecutará una de las ramas dentro de la instrucción CASE. La sintaxis básica de este bloque es:
CASO condición_1 ENTONCES si-condición_1 FIN ... condición_n ENTONCES si-condición_n FIN si ninguno FIN
El código siguiente ilustra el uso de un bloque CASE/THEN/END. Dada una letra en la parte inferior de la pila, la reemplaza con su cadena equivalente o "Letra desconocida":
« CASO DUP "A" == ENTONCES "Alpha" FIN DUP "B" == ENTONCES "Beta" FIN DUP "G" == ENTONCES "Gamma" FIN "Carta desconocida" FIN SWAP DROP @ Deshazte de la letra original »
Este código es idéntico al siguiente bloque IF/THEN/ELSE/END anidado equivalente:
« SI DUP "A" == ENTONCES "Alfa" DEMÁS SI DUP "B" == ENTONCES "Beta" DEMÁS SI DUP "G" == ENTONCES "Gama" DEMÁS "Carta desconocida" FIN FIN FIN SWAP DROP @ Deshazte de la letra original »
RPL proporciona una instrucción FOR/NEXT para realizar un bucle de un índice a otro. El índice del bucle se almacena en una variable local temporal a la que se puede acceder en el bucle. La sintaxis del bloque FOR/NEXT es:
índice_desde índice_a PARA nombre_de_variable instrucción_de_bucle SIGUIENTE
El siguiente ejemplo utiliza el bucle FOR para sumar los números del 1 al 10. La variable de índice del bucle FOR es "I":
« 0 @ Comienza con cero en la pila 1 10 @ Bucle del 1 al 10 PARA I @ "I" es la variable local I + @ Agregue "I" al total acumulado SIGUIENTE @ Repetir... »
El bloque START/NEXT se utiliza para un bloque simple que se ejecuta desde un índice de inicio hasta un índice de fin. A diferencia del bucle FOR/NEXT, la variable de bucle no está disponible. La sintaxis del bloque START/NEXT es:
índice_desde índice_hasta INICIO instrucción_de_bucle SIGUIENTE
Tanto FOR/NEXT como START/NEXT admiten un incremento de paso definido por el usuario. Al reemplazar la palabra clave NEXT de terminación por un incremento y la palabra clave STEP, la variable de bucle se incrementará o decrementará en un valor diferente al valor predeterminado de +1. Por ejemplo, el siguiente bucle retrocede de 10 a 2 al decrementar el índice del bucle en 2:
« 10 2 INICIO - 2 PASOS »
El bloque WHILE/REPEAT/END en RPL admite un bucle indefinido con la prueba de condición al inicio del bucle. La sintaxis del bloque WHILE/REPEAT/END es:
MIENTRAS condición REPETIR instrucción_de_bucle FIN
El bloque DO/UNTIL/END en RPL admite un bucle indefinido con la prueba de condición al final del bucle. La sintaxis del bloque DO/UNTIL/END es:
DO loop_statement HASTA condición FINALIZADA
Se consideraron varios sistemas operativos y lenguajes existentes, pero ninguno podía cumplir con todos los objetivos de diseño. Por lo tanto, se desarrolló un nuevo sistema, que fusiona la interpretación de subprocesos de Forth con el enfoque funcional de Lisp . El sistema operativo resultante, conocido extraoficialmente como RPL (por Reverse-Polish Lisp), hizo su primera aparición pública en junio de 1986 en la calculadora HP-18C Business Consultant.(NB: Este título se cita a menudo como "RPL: un lenguaje de control matemático". Hay un extracto disponible en: [3][4])
RPL significa Reverse Polish Lisp. En los primeros días del desarrollo de RPL, nos cansamos de llamar al sistema sin nombre "el nuevo sistema", y uno de los miembros del equipo de desarrollo se le ocurrió "RPL", tanto como un juego de palabras con "RPN", que ha sido el sello amado/odiado de las calculadoras HP desde siempre, y como una indicación precisa de la derivación del lenguaje de
Forth
y
Lisp
.
RPL nunca tuvo la intención de ser un término público; en el momento del artículo del
HP Journal
(agosto de 1987) sobre la
HP 28C
hubo un intento de crear un nombre menos extravagante, de ahí "lenguaje procedimental basado en ROM", que conservaba las iniciales pero tenía un sonido más digno. El equipo de desarrollo nunca lo llama de otra manera que (las iniciales) RPL. Puedes elegir cualquiera de las dos versiones completas que prefieras. ¿O qué tal "El lenguaje de los ricos"? Bill Wickes, HP Corvallis.
RPL significa Reverse Polish Lisp (Lisp polaco inverso). Combinaba el lenguaje de cálculo RPN de los modelos anteriores con características de los lenguajes de programación Lisp y Forth . Durante un tiempo, HP explicó las letras RPL como un acrónimo de "ROM-based Procedural Language" (lenguaje procedimental basado en ROM).
:
HP-28C
: primera calculadora RPL completa: a fines de la década de 1980, HP desarrolló un nuevo lenguaje de programación para su nueva serie de calculadoras extremadamente potentes. Al combinar elementos de RPN,
Lisp
y
Forth
, HP ideó un lenguaje llamado RPL (o lenguaje procedimental basado en ROM).