HP Prime - Consideraciones del Lenguaje PPL - 5° Parte

Consideraciones importantes para programadores en PPL, se presenta un resumen de puntos relevantes al lenguaje, cuarta parte donde se hace mención a la interacción PPL-CAS los cuales son entonrnos independientesy distintos.



Consideraciones del Lenguaje PPL - V
Interacción Inicio/CAS

Como se había mencionado brevemente en Consideraciones - 1° Parte, la mayoría de los comandos CAS no podrán usarse libremente o como uno lo espera, esto debido a que HP PPL y CAS son ambientes de ejecucción muy distintos, por esa razón se debe tomar en cuenta que existen criterios especiales para usar CAS en HP PPL.

Esta sección no enseña a programar en CAS; como se ha descrito, aquí se explica las maneras en que se puede usar el CAS dentro de HP PPL. Si desean más información sobre el uso de CAS se recomienda mucho ver estos videos.


Recordando

Sabemos que existen 4 formas para usar comandos CAS:
  • Usando simplemente el Comando( ).
  • Usando CAS.Comando( ), en ocasiones que no se intertepreta correctamente como CAS.
  • Usando CAS(Expresión CAS), similar al anterior.
  • Creando una función CAS con #cas #end. La función debe contener por lo menos una variable de llegada para poder usarla y creará la función como elemento externo al programa. (Esto ya no es programación PPL, sino programación CAS)

Diseño vigente

A partir del peligroso pero innovador firmware 2016 04 14 (10077), se modificó considerablemente el uso de CAS en Inicio y viceversa debido a las grandes limitaciones y manipulación confusa que resaltaban al querer interactuar entre ambos sistemas, por lo que se aplicaron y publicaron nuevos fundamentos para esta necesidad.

El cambio se mantiene hasta la actualidad con una manipulación muy aceptable (el cual se describe y extiende en este artículo), se abarcó los temas de resolución de nombres (detallando las prioridades en Inicio y CAS), breve explicación del paso de argumentos y por último lo importante para este artículo, la alternativa desarrollada para la Interacción Inicio/CAS. Puedes leer el Artículo en español para conocer más a detalle lo mencionado.


¿Qué tan diferente es CAS?

Paradigma distinto. Un Sistema Algebraico Computacional SAC (CAS en inglés), requiere funcionar con variables simbólicas, como por ejemplo x+y=4 o x2=4, variables que no necesariamente deben estar declaradas o que contengan un valor fijo.

Si quieres conocer más información de lo que es CAS ingresa a este breve artículo.

Por lo tanto el CAS se basa como norma general, en funcionar con variables que no existen para facilitar el trabajo con varias variables, lo que se conoce como trabajar simbólicamente, manipulando las variables sin pedirles un resultado como si trabajaramos en nuestros cuadernos, este formato distinto se refiere a un lenguaje declarativo funcional, muy distinto a un lenguaje imperativo procedural que sería el más típico en la programación de este nivel (por ejemplo HP PPL).

El CAS en la calculadora no es algo propio de HP, no es algo que se haya creado desde sus inicios con la finalidad de funcionar en la calculadora HP Prime, el CAS de la calculadora se basa en un programa libre llamado Xcas (existen otros programas CAS como Mathcad, Maple, Mathematica, Matlab, etc). Un programa que sigue actualizando y mejorando, posee muchas herramienta, por este motivo, su implementación en la calculadora es obviamente parcial, trayendo confusión en la interacción con el resto de entornos de la calculadora por firmware y por el mal uso que le dan los usuarios.

Por basarse en un programa de distinto origen y paradigma, el CAS de la calculadora posee comandos, tipos de variables y sintaxis de declaración muy distintos en muchas ocasiones.

Tipos de datos en CAS:
  • DOM_INT o DOM_int
    a:=2, a:=210. Sinónimos: integer
  • DOM_FLOAT
    a:=1.15, a:=27.3. Sinónimos: float
  • DOM_COMPLEX
    a:=1+i. Sinónimos: complex
  • DOM_IDENT
    Toda variable no creada es de este tipo. Usar purge(a) para quitar asignación a una variable.
  • DOM_LIST
    a:=1,2,3 a:=[1,2,3]. Al igual que PPL, las listas pueden contener valores de todo tipo.
  • DOM_SYMBOLIC
    a:=x+y, a:=1/x, a:=sqrt(2) a:=5_atm. Sinónimos: symbol
  • DOM_RAT
    a:=1/2, a:=99/100. Sinónimos: rational
  • DOM_STRING
    a:="123", a:="texto".
  • DOM_FUNC
    a(x):=1+x, a(x,y):=x+y2. También funciones/programas creados en #cas #end.

A estos tipos podemos acceder con la función type (similar a TYPE de HP PPL), cada uno de estos tipos poseen un valor númerico si se los evalua con el comando EVAL.



Hasta la actualidad, toda variable creada en CAS será almacenada en una sección aparte, no es posible crear una variable CAS propia de un programa, es decir una variable global CAS para el programa (sí es posible dentro de una función CAS propia), por esta razón no es recomendable manipular estas variables sin conocer algunos detalles. En el caso de ser necesaria la creación de variables temporales CAS, deberás eliminarlos al finalizar con purge(variable) para no generar residuos molestos.

Por lo que podrán notar, existe incompatibilidad de tipos con PPL, siendo los más solictados las listas, vectores y matrices. Este problema fue atendido convirtiendo todos estos tipos en el tipo DOM_LIST, por lo que debemos estar preparados cuando la calculadora transforme nuestros datos en este formato.




El uso de CAS en HP PPL (criterios especiales)

Cadenas, la alternativa de solución. Como PPL no admitiría por ningún motivo una variable no creada como: x+5, x+y2=10, tenemos una grave dificultad al querer realizar operaciones CAS como "solve". Esto actualmente se ha logrado atender mediante el uso de cadenas por razones muy obvias (a un texto no se le verifica nada). Permitiendo interpretar esas cadenas como si no tuvieran comillas en un ambiente CAS (se evaluan al pasarlos como parámetros). Ejemplo:



Incluso puede definirse en simultáneo parámetros que no son cadenas, las cadenas solo nos deberían ayudar a enviar parámetros que contienen variables simbólicas al CAS. Ejemplo:



Sin embargo, los parámetros tipo cadena no pueden trabajar con operaciones, puesto que perderían su calidad de interpretarse sin comillas (oportunidad de evaluarse) en la vista CAS, y pasaría a ser un simple texto. Ejemplo de este problema en base a los ejemplos anteriores:



Esto podría ser una gran desventaja, puesto que la finalidad de usar CAS es manipular las ecuaciones, expresiones o muchos de los parámetros que trabajan de forma simbólica, para ello tenemos la alternativa de evaluarlo manualmente con el comando EVAL.



Finalmente, como lo más importante en programación es guardar datos (en este caso guardar nuestras expresiones simbólicas), podemos manipular directamente las cadenas sobre variables, y usarlas con un EVAL en los parámetros CAS donde sea necesario. Usamos el EVAL debido a que al no hacerlo, la evaluación del parámetro solo extraería la cadena de la variable, y no seguiría con la evaluación de la cadena, ya que solo existe una capa de evaluación.




¿Y ahora cómo envío cadenas al CAS?

Esto se logra como se pudo observar en el punto anterior, rompiendo el flujo de interpretación Cadena-CAS usando una operación o algún otro medio. El objetivo es crear una capa adicional para que al momento de evaluar el parámetro, no llegue a la cadena en un paso.

Por ejemplo, existen muchas funciones CAS que pueden manipular cadenas y otros objetos, y queremos usarlos en PPL o en Home. Veamos el caso del comando head (primer elemento):



Podemos romper la interpretación de diferentes formas, basándonos en enviar datos no evaluados o insertando operaciones.



Cuando tenemos nuestras cadenas insertadas en variables, también lo podemos realizar omitiendo el EVAL como se había mostrado anteriormente, esto hará que lo que se envíe sea netamente el contenido de la cadena, y no su interpretación (evaluación).




Usando QUOTE( ) o ' '

A veces necesario. Es posible enviar parámetros mediante expresiones al CAS de esta forma, pero es limitada al no poder usar variables simbólicas (este tipo de expresiones trabaja con PPL, por lo tanto con variables existentes), pero llega a ser útil en algunos aspectos como observamos en el envío de cadenas al CAS anteriormente.


¿Cuándo usar CAS.comando( ) o CAS( )?

Alternativas. No es usual recurrir a estos formatos, pero resultan prácticos al reservar un ambiente CAS obligatorio para los comandos que se utilizen conjuntamente con estos.

Existen muchas funciones que coinciden en nombre en HP PPL y CAS cuya variación es mayúscula/minúscula generalmente, como el comando type, eval, triangle, etc. Para lograr que PPL reconozca el origen o dicho de otro modo que lo evalue como comando en CAS, usamos el sufijo CAS.comando( ) o CAS.variable. Esta alternativa sirve incluso para comandos PPL.



El comando CAS( ), es similar pero debemos ingresar todo como cadena (ya sabemos qué conlleva esto), incluso el comando, pero su función no queda ahí, también podemos ingresar cálculos tipo CAS como si se tratase de la vista CAS. Tales como realizar una asignación a una variable simbólica (se crea una variable CAS externa al programa) o convertir textos en expresiones CAS para obtener salidas de datos más elegantes y sencillas que con las cadenas.



Para ambos casos, se debe respestar el uso de las comillas dobles para el insertado de variables simbólicas y el uso del comando EVAL cuando sea necesario.


#cas #end

Creación externa. Este formato es creado al marcar "CAS" al momento de crear un programa, pero ello es simplemente una sintaxis de compilación que puede ser borrada o reescrita sin inconvenientes. Se usa específicamente para crear una o más funciones externas tipo CAS, variables tipo función/programa (DOM_FUNC) que la calculadora ubica en CAS/Programas.

 



Las directivas #cas #end permiten precisamente la Programación CAS; para poder usar estas funciones es necesario en muchas ocasiones usarlo con un parámetro aún si este no lo necesite. Ejemplo: FuncCAS01(0) en vez de solo FuncCAS o FuncCAS( ).



Borrar esta parte del código NO es equivalente a eliminar el programa CAS de la calculadora, como se había mencionado, estos programas fueron creados de forma externa, por lo que tener un error de sintaxis en el código de algún tipo tampoco afecta el funcionamiento del programa CAS en otras plataformas o vistas, ya que pudo haber sido compilado en una versión anterior del programa.



Si deseas leer otro artículo respecto al CAS, revisa esta Publicación de Han en el foro The Museum of HP Calculators.



Comentarios

  1. MUY BUEN ARTICULO ME GUSTARIA SABER QUE CODIGO PUEDO USAR PARA HACER UN REPORTE QUE SUPERE LA LINEA 5000, PROBE CON VARIOS CODIGOS PERO TODOS TIENEN EL MISMO ERROR AL DETENERSE EN LA LINEA 5000 ESPERO DE TU AYUDA

    ResponderBorrar
    Respuestas
    1. Con reporte te refieres a usar la terminal?
      Todo objeto en HP Prime tiene límites, la terminal puede mostrar los últimos 2040 caracteres, se puede almacenar hasta un poco menos de 4KB = 4096 Bytes, recordando que cada caracter se representa con 2 Bytes y que los saltos de línea [ENTER] también son caracteres.
      Si necesitas un medio de salida más extenso puedes usar una Nota.

      Borrar
    2. En el caso que te refieras a acumular caracteres en una cadena, estas pueden almacenar hasta 65,535 caracteres.
      Pasarse de ese límite se lanza un mensaje de error por memoria insuficiente, que en realidad significa haber llegado al límite almacenable para este tipo de dato.

      Borrar
  2. Hola que tal mi pregunta es existe algún código que pueda usar para colorear el numero o la letra de un resultado dado ?

    ResponderBorrar
    Respuestas
    1. Necesitaría saber en qué vista o comando estas usando tal código para darte una respuesta específica.
      Respecto a las interfaces integradas de la calculadora, los únicos lugares donde se puede dar color al texto son en las Notas, la Info de una App, las etiquetas de los elementos Num View de la App Geometría, el contenido de las celdas de la App Hoja de cálculo y creo que eso sería todo.
      Si te refieres a que estas creando tu propia interfaz con ayuda de TEXTOUT, pues en la ayuda puedes ver qué parámetro corresponde al color.

      Borrar
  3. Gracias por las aclaraciones Amigo.

    ResponderBorrar
  4. hola me gustaria saber como podria obtener el codigo fuente de un app de hp prime. me gustaria modificar algunas cosas ya que tiene errores el programa. gracias por la respuesta

    ResponderBorrar
    Respuestas
    1. En HP Prime el código es abierto, no hay forma de protegerlo.
      Para ver el código de cualquier programa o App, ve al catálogo de programas, o puedes hacer doble clic si estas en el Kit de conectividad

      Borrar
    2. Disculpa, pero el código de la aplicación "ANESH" está invisible (solo muestra un fondo blanco) cuando hago doble clic en el catálogo de programas. Será que el código fuente está protegido o solo se encuentra oculto?

      Borrar
  5. hola, lo abrí el programa pero el código me sale desordenado y no se por donde empezar a codificarlo, te mando el programa para que lo veas haber si me reenvías el código a este correo ronalicapa@gmail.com, haber si te inspiras y lo perfeccionas este programa. me podrias dejar tu correo para enviarte el programa. el programa funciona con la versión v2016 04 14. seria de mucha ayuda si me reenvias el codigo para poder modificarlo mil gracias por el tiempo.

    ResponderBorrar
    Respuestas
    1. https://mega.nz/#!zAlC0J7I!JIr69VgsUE2eDFqhRKlanXKN-SsCqbpb5hCNRzM3pms

      Borrar
    2. disculpame ElAmigoCarlos si lo incomodo solo quiero el codigo de ese programa para poder modificarlo. ya que yo no puedo obtenerlo. gracias por su tiempo.

      Borrar
    3. Si quieres una versión con un formato entendible, te recomiendo que te contactes con el equipo que lo desarrolló, son de la Universidad Nacional San Cristobal de Huamanga - Ayacucho, Perú , encuentras sus datos en About.

      Borrar
    4. Listo ElAmigoCarlos, muchas gracias por la ayuda.

      Borrar
  6. Ese lenguaje críptico que emplea consigue todo menos aclarar los conceptos esenciales de la programación. Recuerde a Feynman: "SI no logra explicarlo en un lenguaje sencillo es porque no ha logrado entenderlo"

    ResponderBorrar
  7. En tu programa:

    #pragma mode(separator(.,))

    EXPORT interpola(mat)
    BEGIN
    LOCAL n;
    IF TYPE(mat)=6 AND SIZE(CAS.lname(mat)▶n)=1 AND CAS.SIZE(mat)=[3,2] THEN
    CAS(mat(1)-mat(2))▶mat(2);
    CAS(mat(1)-mat(3))▶mat(3);
    CAS(mat(2)/mat(3))▶mat(1);
    solve("exact(mat(1,1)=mat(1,2))",n(0))▶n; approx(n(0))
    ELSE
    PRINT; PRINT("Error, the argument must be an array of 3x2 and contain only one variable\n\nExample:\ninterpola([[-1,2],[5,8],[3,x]]) → 6"); EXPR(0)
    END
    END;

    no entiendo dos lineas de comando

    #pragma mode(separator(.,)) no entiendo que hace

    solve("exact(mat(1,1)=mat(1,2))",n(0))▶n; approx(n(0)) no entiendo lo de n(0)

    podrías ayudarme, gracias

    ResponderBorrar
    Respuestas
    1. YA ENTENDÍ LO DE #pragma mode(separator(.,))

      Gracias a tus perfectos apuntes, pero de la otra línea de código sigo sin entender n(0)

      Borrar
    2. Hola, ese código funcionaba perfectamente en versiones anteriores, ahora el código de interpola es más arcaico.
      n(0) → n(último elemento) → Retorna el último elemento de la estructura "n".
      Se puede usar 0 para obtener la última posición, pudo ser 1 ya que esta restringido a una sola incógnita en la matriz

      Borrar
  8. Alguien que me indique como usar el solve para hacer correr en un programa utilizo los comandos quebme muestra en la calculadore pero no me sale al momento de imprimir los resultados

    ResponderBorrar

Publicar un comentario

Lo más visto

Matriz (Tipo) - HP Prime