Ceylon: Interoperabilidad con Java

Ceylon nos permite la interoperabilidad con Java, podemos importar sus librerías e integrarlas a nuestro código. En este post haremos un ejemplo de como importar librerías de Java a nuestro código Ceylon.

En este caso no usaremos ningún IDE, usaremos la consola de comandos (en mi caso uso Linux). Crearemos una estructura de directorios similar a esta:

Tendremos estos tres archivos con la extensión *.ceylon:

  1. run.ceylon
  2. module.ceylon
  3. package.ceylon

Dentro de cada archivo escribiremos:

run.ceylon

shared void run(){
   print("Importando librerias de Java en Ceylon");
}

module.ceylon

module holaCeylon "1.0.0"{
    import java.base "7"; // se debe tener instalada la versión 7 del JDK
}

package.ceylon
shared package holaCeylon;

Ahora volvemos al archivo run.ceylon e importamos la librería java.util.HashMap de Java.

run.ceylon

import java.util  { HashMap }

shared void run(){
   print("Importando librerias de Java en Ceylon");
   value romanos = HashMap<String,Integer>();
    romanos.put("I", 1);
    romanos.put("V", 5);
    romanos.put("X", 10);
    romanos.put("L", 50);
    romanos.put("C", 100);
    romanos.put("D", 500);
    romanos.put("M", 1000);
    print(romanos.values());
}

Compilamos:

ceylon compile source/holaCeylon/run.ceylon

Cuando compilamos se crea un directorio más o menos así:

Ejecutamos: ceylon run holaCeylon/1.0.0

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

Archivos

Una explicación rápida de esos archivos:

El car es un Ceylon ARchive (así como un jar es un Java ARchive). Ahí vienen los .class y algunos metadatos para la carga de módulos en tiempo de ejecución.

El src es un zip con los fuentes de tu módulo.

El car.idx y car.index son creo que para OSGi.

Los sha1 son los checksums con SHA-1 de los demás archivos.

Imagen de Cid

Que usaron para modularizar ?

Entonces Ceylon utiliza OSGi para modularizar o solo es compatible con OSGi ?

Imagen de ezamudio

compatible

Es compatible con OSGi. Y también con Maven. Pero el sistema de módulos de Ceylon se implementa con JBoss Modules.

Imagen de Sr. Negativo

gracias por la explicación

Gracias por la explicación de esos archivos @ezamudio.

Imagen de ezamudio

por cierto

El esquema que usamos para importar módulos de Java es ya con los nombres propuestos para Jigsaw. Es decir java.base solamente te trae lo más básico de Java, sin base de datos ni parsers de XML ni interfaces gráficas, etc.

Aquí hay más info al respecto:

http://ceylon-lang.org/documentation/1.1/reference/interoperability/java...

Imagen de Sr. Negativo

package.desktop

Buen tip. Ya empecé a probar algunas cosas más.

module.ceylon

module holaCeylon "1.0.0"{
        import java.base "7";
        import java.desktop "7";//incluye a javax.swing
}

package.ceylon

shared package holaCeylon;

run.ceylon

import javax.swing { JOptionPane }

shared void run(){
        value c=Calculo();
        String? opc=JOptionPane.showInputDialog("\t1. Calcular grados Fahrenheit\n2. Calcular grados Celsius\nSalir (cualquier tecla)");

        if(exists opc){
                value opc_=opc;
                switch (opc)
                case ("1") {
                        Float? numero=parseFloat(JOptionPane.showInputDialog("Introduce grado Celsius"));
                        if(exists numero){
                                value numero_=numero;
                                JOptionPane.showMessageDialog(null,"Celsius: ``c.fahrenheit(numero)``");       
                        }

                }
                case ("2") {
                        Float? numero=parseFloat(JOptionPane.showInputDialog("Introduce grado Fahrenheit"));
                        if(exists numero){
                                value numero_=numero;
                                JOptionPane.showMessageDialog(null,"Celsius: ``c.celsius(numero)``");  
                        }
            }
            else {
            process.exit(0);
        }

        }
}

class Calculo(){
        shared Float celsius(Float fahr){
                return (fahr - 32) / 1.8;
        }

        shared Float fahrenheit(Float cels){
                return (1.8 * cels) + 32;
        }
}