Ceylon

El lenguaje de programación creado por Gavin King para aplicaciones empresariales

Varianza en Ceylon

Bueno pues después del artículo maratónico acerca de varianza en Java, ahora quiero explicar cómo se implementó esto en Ceylon. Para ello vamos a usar los mismos ejemplos, de modo que quede clara la comparación.

Lo primero son las tres clases para el ejemplo, y la primera función:

class A() {}
class B() extends A() {}
class C() extends B() {}

B f(B param) => C();

Hasta aquí, todo funciona exactamente igual que en Java:

B algo;
A a = f(algo); //OK
B b = f(algo); //OK
C c = f(algo); //Error

f(A()); //ERROR
f(B()); //OK
f(C()); //OK

En Ceylon también existe la covarianza en los tipos de retorno, similar a lo que se introdujo en Java 5:

class Padre() {
  shared default A metodo() => A();
}
class Hijo() extends Padre() {
  shared actual C metodo() => C();
}

Con los parámetros no se puede hacer algo similar. Ceylon no tiene sobrecarga de métodos, pero no tiene contravarianza en los parámetros; por lo tanto, al refinar un método de un supertipo, los parámetros deben ser exactamente del mismo tipo que en la declaración original, o el compilador emite un error.

Ceylon 1.1.0 “Ultimate Ship The Second”

Ceylon 1.1.0 “Ultimate Ship The Second” listo para ser descargado.

"Listo"
shared void run(){
  print("Ceylon 1.1.0 Ultimate Ship The Second ");
}

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:

Reseña del Taller de Ceylon: Conceptos Basicos (y experimentos no tan basicos). Primera Parte

El sábado pasado asisti al taller de Ceylon, en el taller vimos diferentes temas: Conceptos básicos, Clases, Manejo de Nulos, Uniones e Intersecciones, Funciones, Iterables

En la sección de Conceptos Básicos vimos al típico hola mundo:

void hello() {
    print("¡Holá, Mundo!");
}

En Ceylon un programa es simplemente una función de primer nivel sin parámetros.

Vimos que cuando una funcion sólo devuelve una expresión, se puede abreviar usando la "flecha gorda"

void helloName() => print(greeting("Ceylon"));

Y tambien nos introdujeron a los parametros variadicos (los que pueden aceptar multiples valores):

Integer sum(Integer* numeros) {
    variable value sum = 0; //Los valores asignables deben anotarse con "variable"
    for (x in numeros) {
        sum+=x;
    }
    return sum;
}

Una de las caracteristicas mas interesantes de Ceylon es que puede inferir el tipo de una
declaración local.

void inferredTypes() {
    Integer time = process.milliseconds;
    value nl = process.newline;
    function sqr(Float float) => float*float;
}

Ceylon: comparativa con otros lenguajes

Como ya se ha escrito aqui en este sitio, Ceylon es un lenguaje de programación en desarrollo que pretende tomar lo bueno de Java y olvidarse de lo malo.

¿Cómo compilo/ejecuto un programa en Ceylon?

Antes de comenzar comenzar debes decargar la versión actual 0.4 (Analytical Engine).

Compilar:

ceylon compile source\programa.ceylon

Ejecutar:

ceylon run default

El clásico programa Hola mundo

En Ceylon.

holamundo.ceylon

doc "Esto se usa para documentar el programa"
by "el que escribe el programa"
void run(){
  print("Hola mundo");
}

Si todo sale bien debe imprimir:

"Hola mundo"

En Groovy.
holamundo.groovy

println "Hola mundo"

En Python.
holamundo.py

print "Hola mundo"

En Scala.
Holamundo.scala

object Holamundo{

 def main(args: Array[String]){
   
   println("Hola mundo");
}

}

JavaOne 2012 charlas técnicas en YouTube

El equipo del Oracle Learning Portal publica las charlas técnicas impartidas en la JavaOne 2012 en su canal de YouTube.

Las charlas son variadas y no tienen desperdicio, las pongo aquí para que las puedan aprovechar.

JavaOne 2012 Technical Tracks:

  1. Core Java Platform (69 videos)
  2. Development Tools and Techniques (75 videos)
  3. Emerging Languages on the JVM (35 videos)
  4. Enterprise Service Architectures and the Cloud (66 videos)
  5. Java EE Web Profile and Platform Technologies (81 videos)
  6. Java ME, Java Card, Embedded and Devices (78 videos)
  7. JavaFX and Rich User Experiences (48 videos)

Y aquí el canal de Oracle Learning Portal.

Ejemplos en Ceylon

Aquí les dejo unos código muy sencillos en este lenguaje.

Game Of Life en Ceylon

En el Code Retreat que hubo en Agosto de 2012, el reto fue implementar el famoso Game of Life, en parejas. En mi equipo, @juwe y yo lo desarrollamos en Ceylon (no me impuse; él se animó, jejej).

Apenas hoy lo pude subir a un repositorio que tenemos en GitHub especialmente para ejemplos de Ceylon, después de darle una buena actualizada al código porque han habido varios cambios en la sintaxis y en el módulo de lenguaje desde que escribimos esto originalmente: ya teníamos comprensiones, funciones de orden superior, funciones anónimas y varias otras cosas, pero no teníamos por ejemplo el assert, tuplas, ni la sintaxis actual para secuencias y colecciones iterables; la sintaxis para funciones anónimas cambió ligeramente, al igual que la de parámetros variádicos (los famosos varargs).

Comprehensiones en Ceylon

Las comprehensiones (o algo que se les parezca) son una característica ya prácticamente obligatoria en los nuevos lenguajes, al menos si quieren ser considerados cool. Y Ceylon no se queda atrás.

Las comprehensiones en Ceylon funcionan usando una variante especial de for, la cual acepta una sola expresión, en vez de un bloque de código. La expresión puede ser a su vez otro for, o bien un if, que actúa como un filtro, o cualquier otra expresión que devuelva algún valor. Todo eso termina siendo azúcar sintáctica para crear y devolver un objeto Iterable que se puede pasar en invocaciones a métodos o funciones que esperan argumentos secuenciados (de los que terminan con elípsis), o usarse directamente en cualquier lugar donde se pueda usar un Iterable.

Esto a fin de cuentas puede ser más poderoso que tener métodos como map y filter en las colecciones, y además permite hacer implementaciones más eficientes, ya que los iteradores intermedios involucrados se van utilizando conforme se necesitan, en vez de tener que procesar completamente una colección antes de pasar a la siguiente fase.

Si usan Groovy o Scala, puede que ya estén familiarizados con algunas de estas operaciones. Por ejemplo, tomar una lista de palabras y devolverlas en reversa:

["hola", "mundo", "javaMexico", "Ceylon"].collect { it.reversed() } //Groovy

List("hola", "mundo", "javaMexico", "Ceylon").map { _.reverse } //Scala

for (w in { "hola", "mundo", "javaMexico", "Ceylon" }) w.reversed; //Ceylon

Distribuir contenido