Programando en Ceylon y PSeInt

Existe una herramienta para aprender a programar llamada PSeInt, en esta ocasión vamos a realizar ejemplos de programación básica y comparando esos códigos en Ceylon.

Ejemplos

1. Se requiere obtener la talla de una persona sabiendo que su peso es de 54.5 kg y su índice de masa corporal es de 22.1.
Fórmulas:
imc=peso/(talla*talla)
peso=(talla*talla)*imc
talla=sqrt(peso/imc)

Usando PSeInt escribimos:

Ahora en Ceylon:
obtenerTalla.ceylon

void run(){
variable Float peso=54.5;
variable Float talla=0.0;
variable Float imc=22.1;

function sqrt(Float x) => x^0.5; //para obtener la raíz

talla=sqrt(peso/imc);
print("talla: ``talla`` ");
}

Compilamos y ejecutamos:

2. Obtener un bono de ventas, teniendo en cuenta que el objetivo (de ventas) debe ser igual o mayor a 300.

Y obtenemos:

En Ceylon:

obtenerBono.ceylon

void run(){
  variable Integer ventas=320;
  variable Integer objetivo=300;
  variable String mensaje="";
  variable Float bono=0.0;

  if(ventas>=objetivo){
    bono=0.045*(ventas-objetivo);
    mensaje="Exito";
  }else{
    bono=0.0;
    mensaje="Fracaso";
  }

  print(" ``mensaje``  , bono obtenido: ``bono`` ");

}

Compilamos y ejecutamos:

3. Un menú para elegir una película. Si es mayor de edad permitirá mostrar el menú.

Código:

Proceso obtener_opcion
    Definir opc Como Entero;
    Definir edad Como Entero;
    Definir permiso Como Logico;
    Definir aviso Como Caracter;
    aviso="";
   
    Escribir "¿Cuantos años tienes?";
    Leer edad;
   
    Si edad>=18 Entonces
        permiso=Verdadero;
    Sino
        permiso=Falso;
    Fin Si
   
    Si permiso Entonces
        Escribir "Cartelera Cine de Terror";
        Escribir "1. Masacre en Texas";
        Escribir "2. La isla de la bruja";
        Escribir "3. El misterio del valle de las sombras";
        Escribir "Elije una: ";
        Leer opc;
       
        Segun opc Hacer
            1:
                aviso="Debes traer ropa interior de sobra ... no es broma";
            2:
                aviso="Aceptable, si no quieres dormir varios días";
            3:
                aviso="Una opción bastante recomendable... para ir al psiquiatra";
            De Otro Modo:
                aviso="Esa opcion es invalida";
            Fin Segun
   
    FinSi
    Escribir aviso;
   
   
FinProceso

Obtenemos:

Ahora en Ceylon:

void run(){
  variable String aviso="";
  variable Boolean permiso=false;

  print("Cuantos años tienes?");
  String edadStr=process.readLine();
  Integer? _edad=parseInteger(edadStr);
 
  if(exists _edad){
    Integer edad=_edad;
    if(edad>=18){
      permiso=true;
    }else{
      permiso=false;
    }
  }
 
  if(permiso){
    print("Cartelera Cine de Terror");
    print("1. Masacre en Texas");
    print("2. La isla de la bruja");
    print("3. El misterio del valle de las sombras");
    print("Elije una: ");
    String opcStr=process.readLine();
    Integer? _opc=parseInteger(opcStr);

    if(exists _opc){
    Integer opcion=_opc;
    switch(opcion)
    case (1){aviso="Debes traer ropa interior de sobra ... no es broma";}
    case (2){aviso="Aceptable, si no quieres dormir varios días";}
    case (3){aviso="Una opción bastante recomendable... para ir al psiquiatra";}
    else{aviso="Esa opcion es invalida";}
    }

  }
  print("``aviso``");
 
 }

Compilamos y ejecutamos:

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Ceylon

Hola, me da gusto siempre ver que haya posts aportando contenido y no solamente haciendo preguntas... sobre todo si el contenido incluye algo de Ceylon.

Solamente hay algo que me saltó a la vista en tu código: anotaste todo como variable, pero no modificas los valores. Y a todo le pusiste tipo, lo cual pues no está mal, hace el código más legible, pero puedes usar la inferencia de tipos (que solamente funciona a nivel local, de modo que no se complica mucho la lectura). Recuerda que es preferible tener inmutabilidad, a menos que necesites que algo sea mutable. Entonces por ejemplo tu primer ejemplo puede quedar así:

void run(){
  value peso=54.5;
  value imc=22.1;
  function sqrt(Float x) => x^0.5; //para obtener la raíz
  value talla=sqrt(peso/imc);
  print("talla: ``talla`` ");
}

El segundo quedaría así:

void run(){
  value ventas=320;
  value objetivo=300;
  String mensaje; //no se asigna aún
  Float bono; //no se asigna aún, por tanto sí hay que ponerle tipo
  if(ventas>=objetivo){
    bono=0.045*(ventas-objetivo);
    mensaje="Exito";
  }else{
    bono=0.0;
    mensaje="Fracaso";
  }
  print(" ``mensaje``  , bono obtenido: ``bono`` ");
}

El último ejemplo está interesante porque hay muchas maneras de resolverlo y sirve para mostrar distintos estilos y práticas recomendables. En este caso sí me gustaría mostrar una versión bastante distinta, haciendo enfoque en la separación de responsabilidades:

Integer? pedirEdad() {
  print("Cuantos años tienes?");
  value edadStr=process.readLine();
  return parseInteger(edadStr);
}

Boolean tienePermiso() {
  if (exists edad = pedirEdad()) {
    return edad >= 18;
  }
  return false;
}

String menu() {
  print("Cartelera Cine de Terror");
  print("1. Masacre en Texas");
  print("2. La isla de la bruja");
  print("3. El misterio del valle de las sombras");
  print("Elije una: ");
  while (true) {
    String opcStr=process.readLine();
    if(exists opcion=parseInteger(opcStr)){
      switch(opcion)
      case (1){ return "Debes traer ropa interior de sobra ... no es broma";}
      case (2){ return "Aceptable, si no quieres dormir varios días";}
      case (3){ return "Una opción bastante recomendable... para ir al psiquiatra";}
      else {
        print("Esa opcion es invalida");
      }
  } else {
    print("Debes ingresar una opción del 1 al 3.");
  }
}

void run(){
  value permiso = tienePermiso();
  if(permiso){
    print(menu());
  } else {
    print("No tienes permiso de ir al cine, niño.");
 }
}

Todavía se podría separar más, encapsulando el código que captura la entrada del usuario y devuelve la opción elegida.

Imagen de Sr. Negativo

Re:Ceylon

El código del menú que escribiste es más legible y se entiende mejor, gracias.