HP Prime - Consideraciones del Lenguaje PPL - 2° Parte

Consideraciones importantes para programadores en PPL, se presenta un resumen de puntos relevantes al lenguaje, segunda parte donde se hace mención algunas pautas a tener en cuenta para el manejo de programas.



Consideraciones del Lenguaje PPL - II
PROGRAMAS II

Terminando con las consideraciones generales en programas, se describe algunos temas más sobre las características especiales que tiene el lenguaje. La próxima sección desarrollará específicamente el tema de Gráficos en HP Prime, tema importante para el desarrollo de Interfaces propias.


Cadenas

Único dato tipo texto. Las cadenas en PPL no se distinguen mucho sobre otros lenguajes, cada caracter se representa mediante 2 bytes, cubriendo los caracteres principales Unicode. Admite algunas secuencias de escape, pero en cuanto a utilidad, sólo \n es rescatable, puesto que el resto de secuencias de escape no tienen una función visible. La tabulación puede definirse pero no se muestra en los medios de salida como MSGBOX, PRINT, TEXTOUT, etc. (sí es interpretado en la App Doc.txt)



Excepto "\0" (u0000) que es usado como fin de cadena (también en C y lenguajes derivados), cuando de alguna manera se asigne este valor se debe recordar el efecto que tiene sobre los medios de visualización de la calculadora (Inicio, PRINT, TEXTOUT, etc).



Como se ha visto previamente, a una cadena se le puede modificar asignándole valores reales o de tipo entero sobre la variable mediante índices, los valores asignados se basan en Unicode y pueden visualizarse en la biblioteca de carácteres. Las cadenas no aceptan asignaciones en posiciones inexistentes.



Existe la posibilidad de extraer parte de la cadena mediante 2 parámetros sobre la variable, posición del caracter inicial y cantidad de caracteres a extraer, pero se recomienda el uso del comando MID para esta acción.




Enteros

La otra forma de usar números. En la calculadora existen 3 tipos de datos numéricos: Reales, Enteros y Complejos, de los complejos no hay mucho que hablar, pero hablar de enteros es relativamente extenso incluso respecto a los reales.

Una característica de un entero es que siempre tendrá una base, la base en la que usualmente se representan los números es 10 (decimal) y se representa mediante el sufijo d,  para la escritura de un entero es necesario anteponer el signo #, por lo tanto 125 (Real) se escribe #125d (Entero). Aunque este tipo de dato no parece ser muy cómodo, es así como se definen los enteros en la calculadora, no significando más ni menos en eficiencia al compararse con reales (ambos ocupan 16 bytes en memoria), se pueden expresar en 4 bases distintas.



Un entero posee una estructura similar a un real, por ese motivo puede ser usado al igual que aquellos datos, en ese sentido la conversión y reconversión de valores es opcional, debido a que sin importar la base y el tipo, el número sigue siendo el mismo.



Ya entendido estos puntos, se debe saber algo más, un entero esta definido por una cantidad de bits a ser utilizados para expresarlo, por ejemplo los enteros anteriores pueden usar hasta 32 bits (se cambió la cantidad de bits predeterminado para visualizar los bits).



Conociéndose el esquema de definición #valor:bits[base], surge un término llamado enteros firmados, que no es más que permitir la representación de enteros negativos. Un entero firmado se distingue por llevar un guión largo [–] junto a los bits (se visualiza cuando este formato no es predeterminado), debido al uso de 1 bits para regular si es negativo o no, el rango va de -1 a -63 bits, un bits menos para los enteros no firmados (1 a 64bits). Sea cual sea el formato, los valores representan los mismo valores, un número negativo tiene su equivalente en número positivo en informática.



Lo conveniente de los enteros, es que se puede acceder a cada bit (codiciado para almacenar valores booleanos), usando índices para seleccionar el bit deseado, partiendo desde 0 como primera posición. Al igual que las cadenas, se puede extraer porciones del entero usando 2 índices.



Por último, se vuelve a resaltar la utilidad de los enteros como contenedor masivo de valores boleanos, también que sea cual sea el medio para convertir el valor de real a entero y viceversa, resulta un proceso adicional innecesario puesto que los valores pueden ser usados sin problemas en ambos estados (los procesos de conversión adicionan cálculos).




Comando EXPR( )

Insertar código en funciones. Gracias a que HP PPL tiene una estructura sencilla, es posible usar EXPR. El comando tiene una acción muy completa sobre el código, una gran creación casi exclusiva para la calculadora HP Prime (característica poco usual en estos tiempos).

Este comando requiere una cadena como parámetro, y como es esperado podemos crear nuestras cadenas para enviárselas a este comando (esa es la idea), la cadena a interpretarse como código será compilado y ejecutado, por lo tanto debe seguir las reglas sintácticas y semánticas del lenguaje.



Como se observa, puede usarse para obtener el resultado de una instrucción, o para realizar una acción del tipo modificar como una asignación, dibujo en pantalla, etc.

Debe entenderse que la cadena evaluada inserta su código en un ámbito inferior al del bloque actual, por lo tanto respeta adecuadamente el Ámbito de variables (puede acceder a variables de usuario, locales del programa, de la función y del bloque actual).


Función (Tipo de dato)

Expresión sin evaluar. Un dato tipo función permite crear expresiones como 'X+Y', 'SIN(X)²', etc, con la finalidad de guardar un esquema de datos que puedan ser reemplazados posteriormente. Una función siempre se define dentro de comillas simples, siendo posible agregar operaciones aritméticas y comandos existentes.



Respecto a qué expresiones se pueden crear, pues no tienen límites fuera de una sintaxis adecuada. Sabiéndose el hecho que trabaja con variables, es consecuente entender que las variables deben existir (incluídas variables locales y funciones propias), es por este mismo motivo que no se pueden crear funciones o expresiones que involucren variables inexistentes en las aplicaciones como Función, Gráficos avanzados y sobre todo el muy concurrido error en la aplicación Solucionador (muchos usuarios crean variables adicionales para obtener una copia fiel a la expresión que buscan).



Una expresión resulta útil para los casos donde se requiere guardar ecuaciones para luego derivarlas o integrarlas, a continuación se muestra resultados esperados de estos cálculos (recordar que los resultados no son expresiones). Debido a que esta operación es de Inicio (uso simple), debemos usar el comando EXPR para lograrlo.



Una vez que la expresión ha sido creada, no se vuelve a verificar si las variables que estan dentro existen, por esa razón se puede pasar expresiones con variables hacia otras funciones donde la variable no existe, incluso hacia Inicio.



El objetivo más importante en cuanto a PPL es usar los datos tipo función con el comando EVAL y con el operador de reemplazo.

El comando EVAL reemplaza los valores actuales de cada variable y ejecuta cada comando insertado, aplica un nivel de evaluación, por lo que a veces puede ser necesario aplicar muchas capas de evaluación hasta hallar un dato numérico si eso es lo que se busca.



Por otro lado el operador de reemplazo permite reemplazar una o más variables por sentencia, los valores insertados no reemplazan a los valores actuales de las variables, solo se aplican mientras se use este comando. Para este caso también usamos el comando EXPR.



Ciertamente todas estas alternativas resultan insuficientes para procesos complejos, ya que muchos conocen el gran manejo que tiene el CAS sobre variables, los comandos más importantes de esta vista son simplify, exact, expand, subst, int, diff. Si deseas conocer más detalles ingresa a Consideraciones 5° Parte (recordar que en CAS se usan variables que no existen, por lo que existen algunas diferencias al usar variable de PPL o Home).






Paso por valor y referencia

Por defecto y carencia. Los comandos y/o funciones en la calculadora tienen una sola forma de recibir parámetros, y es colocandolos entre paréntesis y separados por comas, esta acción lo que hace es pasar datos por valor, no existe un operador que modifique tal flujo.

No es posible crear funciones que pasen o reciban valores por referencia. La finalidad de una función así es para realizar una acción sobre una variable o grupo de variables distintas para cada ocasión que es usada (recordando que el fin de una función es ser reutilizada).

Se puede lograr un efecto similar al paso por referencia usando el comando EXPR (como se ha indicado en algunos videotutoriales), el cual puede ser usado de 2 formas para este fin. En los siguiente casos se usará 3 variables, a las cuales primero se le duplica y mostrado con MSGBOX, luego es triplicado y nuevamente mostrado; el resultado debe ser una lista de los nuevos valores, resultado esperado: {30,42,66}.

1. Función con formato habitual

Para lograr editar las variables desde diversos extremos del programa, debemos modificar el Ámbito de las variables necesarias (haciéndolas globales, idea que no agrada a muchos) para que la nueva función pueda acceder a ellas.



Ventaja: Permite verificar sintaxis antes de la ejecucción, el código en EXPR es mínimo.
Desventaja: Requiere hacer globales las variables involucradas.

2. Función como cadena

Gracias a la capacidad del comando EXPR, el cual consiste en insertar código en un subámbito; la función creada se encargará de crear una cadena de código, la cual se puede evaluar en cualquier ámbito.



Ventaja: Puede usar variables en cualquier ámbito.
Desventaja: La compilación se extiende a toda la función, requiere el uso de EXPR en cada uso.

Recordatorio

Este tipo de funciones requieren pasar siempre las variables involucradas como parámetro, ya que su objetivo es elegir la(s) variables(s) a utilizar. Estos métodos no son aconsejables en bucles de procesamiento, sobre todo la segunda forma mostrada; puede permitirse su uso siempre y cuando no sea crítico, el uso del comando EXPR consume más recursos de lo usual (se compila la cadena, que equivale a verificarla y estructurarla).

Comandos integrados

Las funciones propias solo pueden recibir datos por valor, al igual que la gran mayoría de comandos integrados que cuenta la calculadora, sin embargo existen comandos integrados en HP PPL que sí hacen uso de esta característica. A continuación se resalta los pocos comandos que actúan por referencia, algunos de tipo matriz y otros de tipo entrada.



No se menciona a los comandos de dibujo para la edición de Gráficos, puesto que el funcionamiento de estos se basa en pasar datos tipo función (G0-9 siempre asumidos como datos tipo función), así que podría parecer un funcionamiento de paso por referencia, pero las variables gráficas no son simples datos, los comandos aquí usan las variables como destino.


Estructura IFERR (Captura del error)

Captura de error. Similar a las estructuras de otros lenguajes, IFERR nos permite probar un grupo de instrucciones y responder ante su posible falla. En un programa puede ser usado unas cuántas veces para resolver ciertos incovenientes.



Cuando un error ocurre dentro del bloque controlado, un número de error es almacenado en Ans, este puede usarse en el bloque de respuesta THEN o en líneas externas, ya que la variable Ans tiene acceso desde cualquier extremo de la calculadora.


Múltiples resultados (Listas como parámetros)

Muchos comandos de Inicio (Home) y CAS permiten recibir listas como parámetros; posiblemente por el funcionamiento de las listas, tal como se vió en el artículo anterior (las operaciones actuan sobre cada uno de sus elementos).



Entendiendo el funcionamiento de listas, muchas de nuestras funciones podrían ser compatibles con esta característica.





HOME vs PPL

Casi terminando con esta sección, hablemos de similitudes y diferencias entre Inicio (algunos le dicen Home) y HP PPL (mal reducido a PPL). Para esta ocasión recordemos esas imágenes en publicaciones tipo trivia donde se invita a encontrar algunas diferencias, 5 o 7 usualmente, las imágenes son casi las mismas pero sabemos que existen minúsculas variaciones entre ellas; descrito esto, es igual al caso de Inicio y PPL, ambos entornos tienen más similitudes que diferencias.

Similitudes

Describir lo que se puede hacer en ambos sería describir toda la calculadora, por lo tanto vamos a exagerar solo un poco y decir que se puede lograr lo mismo, usar los mismo comandos, mismas estructuras condicionales y repetitivas, acceder a variables, practicamente estan a un mismo nivel, salvo que Inicio es más un padre para los programas desarrollados en HP PPL, por lo que el lenguaje puede usar todo lo disponible en Inicio.

Diferencias

Recordar que Inicio es el principal medio de visualización de la calculadora (interfaz principal), y como tal posee características que dan facilidades al usuario: visualización en formato de libro de texto, omisión de comillas simples para resultados y efectos sobre el formato de los datos. Es la configuración de Inicio quien determina ciertos criterios de compilación para PPL y la forma como se muestran los datos al ejecutarse tales programas (decimales, enteros, complejos, fuente, etc). Las entradas de Inicio son similares a cadenas que se ingresan al comando EXPR (no es posible escribir Funcion BEGIN ... END; como si ya se encontrara dentro del ámbito de una función), es una comparación casi exacta (ambos transforman ABC a A*B*C), lo sería si no se mostrara un mensaje de advertencia al asignar un dato a una variable inexistente: ¿Desea crear una variable ...?.



Usar PPL es trabajar en bruto, código escrito en líneas sin un formato agradable para las ecuaciones, pero su utilidad consta en automatizar el uso de la calculadora mediante la creación de funciones que agrupan instrucciones (almacenar instrucciones).


#pragma

Al estar en el editor de programas y presionar la tecla "Menu", hay una opción que resulta confusa, "Introducir programa", y claro que es confuso, según el manual debería decir "Introducir pragma". Luego de elegir esa opción puedes volver a recordar que no existe la función Ctrl + Z en el emulador.



Un poco de teoría es mencionar que en cuanto a compilación de programas existen directivas, en el caso de PPL pueden modificar ciertas opciones de compilación como asumir un campo como código CAS en vez de código PPL (#cas: Inicio de código CAS, #end: Fin de código CAS) y otras alteraciones como los que hace la directiva #pragma.

La directiva #pragma permite dar instrucciones al compilador para realizar ciertas tareas, el formato estándar es #pragma Nombre (argumentos); y en HP Prime solo se ha mostrado la existencia del nombre mode. De acuerdo al Manual de usuario, los parametros para mode "obligarán" al programa a compilar bajo la configuración que se le indique, cuya finalidad es la adaptación de un programa escrito para una cultura que utiliza diferentes símbolos de agrupación (. en vez de ,); también es usado para omitir las diferencias en la configuración de cada usuario (respecto al formato predeterminado de un entero).



Los parametros para mode son separator1 e integer2,3,4; se usa separator(.,;) en vez de usar HSeparator:=0 (o la opción deseada) y integer(h32) en vez de , Base:=3, Bits:=32 y Signed:=0. Esto con el fin de no alterar la configuración del usuario que usa nuestro programa (al respaldar los valores anteriores es posible que no sean cargados nuevamente ante la presencia de un error de ejecución).



Por supuesto, todos los parámetros no son obligatorios, entendiendo que el orden de los modificadores no pueden ser alterados; es posible solo alterar el formato de los enteros o solo los separadores, pero debe ser casi una obligación usar por lo menos separator, al usar colores o datos enteros en general sí será necesario definir integer (solo para datos escritos en código, no es necesario si serán ingresados por INPUT).



Un programa puede contener varias directivas #pragma si es necesario, solo pueden definirse fuera del bloque de cualquier función.



Tener cuidado sobre todo al definir integer, si no se conoce mucho sobre bases y número de Bits pueden surgir problemas como truncamiento de bits como se ha visto en la imagen anterior, significando en ocasiones no poder definir los colores correctamente, o no permitiendo definir transparencias a colores.


Temas adicionales

  • Teclado de usuario: Uso, Creación y Tipos
  • Creando un menú de opciones
  • Comando EXPR
  • Ámbito de variables
  • Omisiones en sintaxis 
  • Función recursiva
  • Almacenamiento persistente de datos
  • Tipos de datos: Rangos, Límites y Bytes
  • Optimización de programas
  • Programando con errores
  • Depuración de programas



Retorna a Consideraciones en Programas I

Comentarios

  1. No sé que actualización han hecho pero ahora si escribo matriz(-2) no me lo reconoce y no me devuelve una columna. Devuelve error.

    ResponderEliminar
    Respuestas
    1. Es extraño, hasta ahora esa sintaxis esta vigente, intenta averiguar el problema para tu caso.

      Eliminar

Publicar un comentario

Lo más visto