Mostrando las entradas con la etiqueta Ceylon. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Ceylon. Mostrar todas las entradas

miércoles, 3 de octubre de 2018

¿Cuáles son los mejores lenguajes que se ejecutan en la JVM?


Quiero compartir este ranking de lenguajes que corren en la JVM. Al parecer viene ganando Kotlin, claramente ayudado por android.

Lo que me sorprende es que en segundo lugar este Clojure, es una grata sorpresa.  Sin más...

Dejo link: https://www.slant.co/topics/397/~best-languages-that-run-on-the-jvm


martes, 22 de agosto de 2017

Ceylon es de la fundación eclipse

Al parecer el lenguaje Ceylon se ha movido a la fundación eclipse. Por medio de un post lo han publicado Stéphane Épardaud y Gavin King, nos han dicho:

"Red Hat es sinónimo de Open source, calidad y confianza a la comunidad. Pero también hemos tenido un temor creciente de que la fuerte asociación con una sola compañía pueda haber frenado nuestra comunidad. Siempre hemos visto este proyecto como un "terreno neutral", no como un vehículo para los objetivos de negocio de una empresa, pero no estamos seguros si el proyecto es percibido de esa manera desde fuera."

Por lo tanto este proyecto va estar bajo la fundación eclipse. Esto no se si es bueno o malo, en lo que coincido es que le va dar una briza más open sources al proyecto y espero que siga creciendo.

Dejo links:
https://ceylon-lang.org/blog/2017/08/21/eclipse-ceylon/
https://projects.eclipse.org/proposals/eclipse-ceylon

miércoles, 8 de marzo de 2017

Ceylon 1.3.2 fue liberado!!


El lenguaje diseñado por el amigo Gavin King, llego a su versión 1.3.2 y nos prueba que esta maduro y que tambien esta en todos lados.

Lo que prueba que la industria lo recibió muy bien. Recordemos que su objetivo era modernizar a Java pero no introducir conceptos extraños a java.

Ceylon 1.3.2 es un release menor del lenguaje pero con más de 100 temas cerrados. Esta versión presenta assemblies, que permiten exportar módulos de Ceylon como repositorios de Maven, hace que sea aún más fácil que antes tener un proyecto mixto de Java y Ceylon en Maven, permite la interpolación de cadenas en aserciones e introduce la inicialización perezosa para atributos.

 Esta versión de Ceylon ha sido probada con una amplia variedad de bibliotecas y frameworks Java, incluyendo:

  • Spring Boot,
  • WildFly and WildFly Swarm,
  • Hibernate (JPA),
  • RESTEasy (JAXB and JAX-RS),
  • Weld (CDI) and Guice,
  • Eclipse Equinox, Apache Karaf, and Apache Felix (OSGi),
  • Spark,
  • RxJava
  • JOGL (OpenGL), and
  • Android.
Y las mejoras más importantes son: 


  • Assemblies (archivo .cas)
  • Genera repositorios Maven 
  • Suporta proyerctos mixtos Java and Ceylon 
  • String interpolation en mensajes 
  • Initialización Lazy para atributos marcados para esto
Dejo link: 

miércoles, 21 de septiembre de 2016

Ceylon 1.3.0 esta aquí!!


Ceylon 1.3.0 esta disponible para descargar! Si si si!
Ceylon 1.3.0 es un release muy importante con aproximadamente de 330 problemas solucionados. Este es el primer release que soporta desarrollo Android, tambien soporta lo paquetes  Node Package Manager (npm).

Y trae muchas novedades, entre las que podemos nombrar:

  • Soporte para IntellJ
  • Soporte para eclipse
  • Soporte para Android
  • Soporte para el sistema de paquetes, npm
  • Soporte para la creación de microservice con WildFly Swarm
  • Full soporte para Java 8
  • Y más!!


Dejo link: https://ceylon-lang.org/blog/2016/09/19/ceylon-1-3-0/

miércoles, 1 de octubre de 2014

Ceylon roadmap


Charan charan !! Ceylon 1.0 ha sido liberado!!

Y el equipo de Ceylon sigue trabajando, la versión 1.1 va a estar centrada en mejoras de rendimiento e interoperabilidad y la versión 1.2 añadirá nuevas características del lenguaje.

A prestar atención!!

Dejo link:
http://ceylon-lang.org/documentation/1.0/roadmap/

miércoles, 13 de agosto de 2014

domingo, 20 de julio de 2014

Lista por comprensión


¿Recuerdan de las definiciones matemáticas de por ejemplo números pares o múltiplos que veíamos en la escuela? por ejemplo la definición de los números pares mayores a 10 sería así:

s = { 2 * x  | x  € N, 2 * x > 10 }

Esto se lee como los números pares (2*x) que pertenecen (€) a los números naturales (N) y que sean mayores que 10.  La parte anterior al separador se llama la función de salida, x es la variable, N es el conjunto de entrada y  2 * x > 10 es el predicado.




De esta forma se define la lista de forma compresiva. Es decir se puede conocer el valor de la lista dependiendo de la posición sin enumerar sus elementos. Esta definición se podría escribir en Haskell de la siguiente manera:

s = [ 2*x | x <- [0..], x*2 > 10 ]

Como vemos es muy similar a la definición matemática, solo que se define los números naturales como [0..] los dos puntos indican que esta lista es infinita. Cuando pensamos en una lista infinita, automáticamente relacionamos con un bucle que nunca termina o con un cuelgue de nuestro programa, esto es porque venimos del mundo imperativo pero cómo Haskell ejecuta las sentencias de forma perezosa, podemos modelar listas infinitas sin problema.

Podemos modelar diferentes listas sin ningún problema, por ejemplo  todos los números del 50 al 100 cuyo resto al dividir por 7 fuera 3 :

ghci> [ x | x <- [50..100], x `mod` 7 == 3]
[52,59,66,73,80,87,94]

La lista de dobles de los números naturales y que el cuadrado sea mayor a 3:

s = [ 2*x | x <- [0..], x^2 > 3 ]

Por suerte las listas por compresión, no son solo una característica de Haskell sino que se encuentra en diferentes lenguajes, voy a mostrar el ejemplo de la lista de dobles de los números naturales y que el cuadrado sea mayor a 3 en diferentes lenguajes:

Ceylon
{ for (x in 0..100) if ( x**2 > 3) x * 2 }

Clojure
 (take 20
   (for [x (range) :when (> (* x x) 3)]
     (* 2 x)))
 ;; ⇒ (4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42)

CoffeeScript
 (x * 2 for x in [0..20] when x*x > 3)

Elixir
for x <- 0..100, x*x > 3, do: x*2

Erlang
 S = [2*X || X <- lists:seq(0,100), X*X > 3].

F#
> seq { for x in 0..100 do
          if x*x > 3 then yield 2*x } ;;
val it : seq<int> = seq [4; 6; 8; 10; ...]

Groovy
s = (1..100).grep { it ** 2 > 3 }.collect { it * 2 }
s = (1..100).grep { x -> x ** 2 > 3 }.collect { x -> x * 2 }

JavaScript 1.7
 js> [2*x for each (x in [0,1,2,3,4,5,6,7]) if (x*x<5)]
 [0, 2, 4]

Julia
y = [x^2+1 for x in 1:100]

Perl 6
my @s = ($_ * 2 if $_ ** 2 > 3 for ^100);

Python
S = [2 * x for x in range(101) if x ** 2 > 3]

Scala
val s = for (x <- Stream.from(0) if x*x > 3) yield 2*x

Smalltalk
((1 to: 100) select: [:x|x*x>3]) collect: [:x|2*x]

Algunos lenguajes tienen diferentes formas de hacer lo mismo y para algunos lenguajes no uso todos los números naturales sino hasta el 100.

En resumen podemos decir que las listas por comprensión es una característica de algunos lenguajes con lo cual podemos definir listas de forma comprensiva.

Dejo link: http://en.wikipedia.org/wiki/List_comprehension

lunes, 26 de mayo de 2014

Prueba un lenguaje de forma online


El programador curioso por lo general se siente frustrado al ser encasillado en un lenguaje, siempre cree que puede haber otra forma de hacer las cosas, mejor o peor pero distinta.

Es sabido que cuando crees encontrar el lenguaje perfecto simplemente se está ignorando un montón de problemas los cuales no aplicaría muy bien ese lenguaje que parece perfecto.

Por suerte los programadores curiosos o inquietos tienen muchas herramientas que les permiten investigar nuevos horizontes. Entre ellas están las páginas que permiten probar un lenguaje de forma online. Sin tener que instalar nada le podemos dar una primera probada a ese lenguaje que nos interesa tanto.

Vamos a revisar las páginas que en mi humilde opinión son muy buenas para introducirnos en un lenguaje:

Groovy web console : Groovy es un lenguaje de tipado dinamico que corre sobre la plataforma Java. Es un lenguaje sumamente interesante. Groovy web console es una página sumamente simple que te permite ejecutar Groovy de forma rápida y sencilla.

Try Clojure: Clojure es un lenguaje para los amantes de Lisp. Clojure es un derivado de Lisp y corre sobre la plataforma Java. Try Clojure nos brinda la consola RELP de Clojure de forma web.

Try Ruby: Si no conocen Ruby, ésta es tu oportunidad. Try Ruby no solo permite ejecutar Ruby sino que nos brinda un conjunto de actividades para acrecentar nuestro conocimiento.

Scala Tutorials: Scala es un lenguaje multiparadigma (Funcional y Orientado a Objeto) que corre en la plataforma Java. Scala Tutorials es un tutorial básico de Scala que te permite jugar con el lenguaje y sobre todo aprender

Try Haskell: Haskell es un lenguaje funcional que es bueno que aprendas. Muy rico en conceptos, cambia tu forma de pensar un problema. Try Haskell es una página inspirada en try ruby que permite probar este maravilloso lenguaje.

Try Ceylon: Ceylon es el lenguaje de la empresa JBoss para la plataforma Java, en este lenguaje esta trabajando Gavin King (el creador de hibernate) entre otros. Try Ceylon tiene la misma esencia que try ruby o try haskell y a la vez nos permite probar ejemplos. Nobleza obliga, gracias Enrique Zamudio por recordarme. 

Compile online: Y por ultimo Compile online que es una página que no solo permite probar innumerables lenguajes también se puede probar frameworks javascript y distintas tecnologías web.

En conclusión para probar un lenguaje solo se necesita un browser y un poco de tiempo. Conocen otra pagina que debería estar en la lista? Cual les pareció más interesante?


lunes, 24 de marzo de 2014

Mixin, Mixin y más Mixin...


El mixin es una técnica para la reutilización de código. El objetivo es que una función pueda estar en diferentes clases, aunque las clases no tengan ninguna relación.

Los mixin fueron utilizados por primera vez en Flavors que era un enfoque a la orientación a objetos utilizado en Lisp Machine Lisp. La ventaja de los mixin es que fomentan la reutilización de código y evitan problemas típicos asociados con la herencia múltiple.

¿Cómo funciona? Existen diferentes formas de implementarlo dependiendo del lenguaje.

Scala

En scala existen entidades llamadas traits. Los traits son características, similares a las interfaces de java, pero pueden contener código. Código que va a ser reutilizados por las clases que utilicen esta característica. Por supuesto una clase puede utilizar varias características.

Voy a tomar el ejemplo del libro programming in scala.  Supongamos que queremos modelar la amistad entonces vamos hace un trait llamado Friend.

trait Friend {
val name : String
def listen() = println("Your friend " + name + "is listening")
}

Como se puede ver se declaro el val name, el cual debe ser proveído por la clase que vamos a mixiar. Ahora tenemos que utilizar a Friend, si la clase que utiliza este trait no extiende de ninguna clase podemos utilizar extends, por ejemplo:

class Human(val name: String) extends Friend

Human podría reescribir los métodos de Friend, por ejemplo si extendemos a Human en Man y Woman, estos también pueden reescribir estos métodos.

Cuando una clase extiende de otra clase se debe utilizar la palabra clave with. Con with podemos utilizar varios trait. Veamos la clase Dog:

class Dog(val name:String) extends Animal with Friend {
      override def listen = println(name + "'s listening quietly")
}

En el ejemplo reescribimos el método sólo para mostrar que se puede reescribir, pero si no es necesario no se debe reescribir.

Ahora podemos utilizar el trait heredado y es más podemos tipar por ese trait como lo hacemos en java con las interfaces:

val john = new Man("John" )
val sara = new Woman("Sara" )
val comet = new Dog("Comet" )

john.listen
sara.listen
comet.listen

val mansBestFriend : Friend = comet

mansBestFriend.listen

También podemos utilizar el mixin en instancias no solo en clases por ejemplo una clase gato, el gato por naturaleza no es muy amistoso:

class Cat(val name: String) extends Animal

Pero existe un gato llamado snowy que es muy amigable, entonces podemos hacer lo siguiente:

val snowy = new Cat("Snowy" ) with Friend
val friend : Friend = snowy
friend.listen

Mixin es una técnica de reutilización de código que nos provee gran flexibilidad en Scala. Veamos como se implementa en Ruby.

Ruby

En Ruby definimos módulos y podemos importar estos módulos en nuestras clases.

module Debug
   def who_am_i?
      "#{self.class.name} (\##{self.id}): #{self.to_s}"
   end
end

class Phonograph
  include Debug
  # ...
end

class EightTrack
  include Debug
  # ...
end

ph = Phonograph.new("West End Blues")
et = EightTrack.new("Surrealistic Pillow")

ph.who_am_i? #Phonograph (#935520): West End Blues
et.who_am_i?  #EightTrack (#935500): Surrealistic Pillow

Groovy 

El caso de Groovy resuelve el mixin con anotaciones o con el método mixin, es como una fusión de Java y Ruby.
 Pero como Ruby tiene la ventaja de ser un lenguaje de tipado dinámico, lo que nos da ciertas libertades.


Usemos anotaciones:

class Dog {
  def talk() {
    "Woof, woof"
  }
}


@Mixin(Dog)
class Talk {
  // other stuff here
}

Y listo! Pero a la vez groovy permite hacer mixin con instancias no solo con clases de la siguiente manera:

someoneElsesClass.mixin(Dog)

Como es dinámicamente tipado, no hay problema si hacemos:

someoneElsesClass.talk()

En Scala si queríamos hacer esto usábamos with en el constructor tipando de esta manera al objeto:

val snowy = new Cat("Snowy" ) with Friend
val friend : Friend = snowy
friend.listen

El método mixin de Groovy tiene la ventaja que se puede utilizar en cualquier momento, no como la palabra reservada de Scala with que sólo se puede utilizar en el constructor.

Dart

Dart implementa el mixin muy similar a scala, es decir tiene trait que pueden ser agregados a las instancias o a las clases. Pero además tiene interfaces, veamos un ejemplo:

interface Shape {
   num perimeter();
}

trait Rectangle implements Shape {
   final num height, width;

   Rectangle(num this.height, num this.width); // Compact constructor syntax.

   num perimeter() => 2*height + 2*width; // Short function syntax.
}

class Square extends Rectangle {
   Square(num size) : super(size, size);
}

Dart usa las interfaces como Java, pero tiene trait como Scala y estas características se pueden combinar.

Ceylon

En Ceylon existen las interfaces que al igual que Scala pueden contener código; es decir una interfase de Ceylon es similar a un trait de Scala:

shared interface Writer {
    shared formal Formatter formatter;
   
    shared formal void write(String string);
   
    shared void writeLine(String string) {
        write(string);
        write(process.newLine);
    }
   
    shared void writeFormattedLine(String formatString, Object... args) {
        writeLine( formatter.format(formatString, args) );
    }
   
}

shared class ConsoleWriter()
        satisfies Writer {
   
    formatter = StringFormatter();
   
    shared actual void write(String string) {
        writeLine(string);
    }
   
}

Hay una diferencia sutil pero importante entre los traits de Scala y las interfaces en Ceylon: en Ceylon no puedes guardar estado en las interfaces; es decir, no puedes tener atributos concretos (ni mutables ni inmutables). Solamente puedes definir atributos como "formal", para que los implemente la clase que satisfaga dicha interfaz. La única manera de tener atributos concretos en una interfaz es definirlos con getter y opcionalmente con setter, pero atributos simples no lo permite.

Como podemos ver en todos los lenguajes la idea la similar, cambia un poco la forma de implementarla.

Mixin es una característica de los lenguajes modernos, que nos brinda una forma práctica de reutilización de código.

Que implementación les gusto más?

jueves, 12 de diciembre de 2013

Top 10 Ceylon Language Features I Wish We Had In Java

Que buen resumen de las características de Ceylon voy a dejar:
http://ht.ly/rFUAY

Por estas razones es que debemos elegir Ceylon!!

jueves, 14 de noviembre de 2013

Ceylon 1.0.0 is now available


Sip, la versión 1.0 del lenguaje Ceylon fue liberada hoy. Y esta versión incluye:


  • Una implementación completa del lenguaje.
  • Un conjunto de herramienta de linea de comando, tanto para compilar a bytecode java, como para compilar a javascript.
  • Una poderosa arquitectura basada en modulos.
  • Y un modulo para el lenguaje con el SDK de Ceylon.


Muy bueno!!

Dejo link: http://ceylon-lang.org/blog/2013/11/12/ceylon-1/

martes, 24 de septiembre de 2013

Ceylon 1.0 beta

Y con ustedes...
Pa ra ra ra ra...

Ceylon 1.0 beta. Con 3 añitos de desarrollo se libero una version beta del lenguaje Ceylon con todas las características.  Lo que quiere decir que el lenguaje implemento toda la especificación. Tanto para la maquina virtual Java como a Javascript. Además de esta versión del lenguajes,  también se libero un versión de su IDE. Con muchas nuevas características.

Dejo links:
http://ceylon-lang.org/blog/2013/09/22/ceylon-1/
http://ceylon-lang.org/documentation/1.0/spec/

sábado, 20 de julio de 2013

Las personas detras del lenguaje

Hace muy poco me entere que la persona que creo Groovy, James Strachan dijo: "I can honestly say if someone had shown me the Programming in Scala book by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I'd probably have never created Groovy." En crespense, si conocía Scala, ni me gastaba en crear Groovy.

La pregunta es quien es  James Strachan? y que hace de su vida ahora? Quienes son las personas detras del lenguaje y cual es su opinión acerca de él.

James Strachan creador de Groovy, tiene un cv impresionante y una opinión muy particular de su lenguaje. Creador del lenguaje Groovy aunque no continuo el desarrollo. Se dedico a crear varios proyectos en Apache y uno más impresionante que el otro; además es commiter de otros proyectos como maven o Jakarta Commons. Actualmente trabaja en Red Hat. Y le gusta mucho Scala.


Martin Odersky creador del lenguaje Scala; profesor en EPFL de la materia métodos de programación. Martin trabajo en lenguajes de programación la mayoría de su carrera. Martin primero estudio la programación estructurada y orientada a objetos como estudiante de doctorado de Niklaus Wirth, luego se enamoró de la programación funcional, mientras trabajaba en IBM y Yale. Cuando Java salió, comenzó a agregar construcciones de programación funcionales. Esto lo llevó a estudiar los lengujes de programación pizza y GJ y eventualmente a Java 5 con los genéricos. Durante ese tiempo, también se desempeño como desarrollador en javac, el compilador de referencia actual de Java.
Entre otras cosas dicto un curso en cursera que se los recomiendo.

Rich Hickey creador del lenguaje Clojure, , Es un diseñador, consultor y arquitecto de aplicaciones de software que trabaja de forma  independiente con más de 20 años de experiencia en todas las facetas del desarrollo de software. Rich ha trabajado en sistemas de programación, automatización broadcast, análisis de audio y toma de huellas digitales, diseño de bases de datos, gestión de rendimiento, sistemas de encuestas de salida y listeners de máquinas.
Rich Hickey describe el desarrollo de Clojure como la búsqueda de un lenguaje que no pudo encontrar: un lisp funcional por defecto, integrado sobre un entorno robusto en lugar de ser su propia plataforma, y con la programación concurrente en mente.

Gavin King es el creador de uno de los frameworks más famosos de lenguaje Java, Hibernate. También trabajo en el  Java Community Process por parte de Red Hat (empresa en la que trabaja) en la definición de la especificación de EJB y JPA y también de CDI. Actualmente trabaja en el lenguaje Ceylon, lenguaje que compila a la plataforma java y a javascript.
Como el explica Gavin, el diseño de Ceylon parte de una pregunta, como sería java si fuera hecho hoy en día? Con esa idea diseña un lenguaje moderno de tipado estático parecido a Java. Ceylon que tiene como principal objetivo actualizar el lenguaje Java.


JRuby fue creado originalmente por Jan Arne Petersen, en 2001. En ese momento y durante los años siguientes, el código fue un porte directo del código 1.6 C de Ruby. Con el lanzamiento de Ruby 1.8.6, comenzó un esfuerzo para actualizar las características y semántica de JRuby. Desde 2001, varios contribuyentes han asistido el proyecto, si bien el equipo actual consta de cuatro miembros principales.
Los desarrolladores principales de JRuby son Charles Nutter, Thomas Enebo, Ola Bini y Nick Sieger. En septiembre de 2006, Sun Microsystems contrató a Enebo y Nutter para trabajar a tiempo completo en JRuby. En junio de 2007, ThoughtWorks contrató a Ola Bini para trabajar en Ruby y JRuby. En julio de 2009, los desarrolladores de JRuby dejaron Sun para continuar el desarrollo de JRuby en Engine Yard.
Jan Arne Petersen también participo de varios proyectos open source como: GNOME Control Center, GTK+, Nautilus, Totem, GPE, FreeCiv, GnuCash.

Jython se desarrollo por Jim Hugunin, Barry Warsaw, Samuele Pedroni, Brian Zimmer, y Frank Wierzbicki.
Jim Hugunin primero creo el lenguaje python luego trabajo en el proyecto jython y llevo Python a Java para luego trabajar en el proyecto IronPython y llevar python a .net. Luego que Microsoft abandonara IronPython Jim fue contrratado por Google, donde trabaja hasta ahora. También trabajo en el diseño de AspectJ.


jueves, 11 de julio de 2013

Historia de los lenguajes en Java

Es interesante ver esta imagen, porque por ejemplo para mi Groovy era más viejo que scala y no es así; vean con sus propios ojos:

Y para la gente cual sera el próximo lenguaje, sin dudas que para mi no hay un ganador indiscutido, cada uno se adapta. Les dejo el link del resultado de la encuesta que organizo infoQ:

http://www.infoq.com/research/next-jvm-language

miércoles, 8 de mayo de 2013

Módulos en Ceylon

Ya hablamos bastante de Ceylon, para los que no se acuerdan; es un lenguaje creado por la empresa Red Hat que corre en la plataforma Java.

Porque puede ser tan especial este lenguaje? Por muchas razones, hoy vamos a ver una que me parece que es una de las mejores ideas de los Lenguajes que corren en la plataforma Java. Y es la módularidad, esto lo tenemos en java por medio de herramientas o frameworks, nosotros en java podemos indicar con maven o Ivy por ejemplo la versión de la librería que vamos a utilizar.

Ceylon en cambio nos permite hacer esto a nivel lenguaje por medio de los módulos  El código es organizado dentro de paquetes y módulos. Con Ceylon obtenemos una módularidad real independiente de la herramienta que utilicemos para construir nuestra aplicación.  

Veamos un ejemplo de modulo:


module com.osintegrators.example.ceylon.hello '1.0.0' {

import ceylon.net '0.5';

import ceylon.dbc '0.5';

import java.jdbc '7';

import java.base '7';

}

Dejo link:
http://ceylon-lang.org/features/
http://m.infoworld.com/d/application-development/first-look-gavin-kings-ceylon-217197

sábado, 16 de marzo de 2013

Nuevo versión de Ceylon!!



Si señores Ceylon M5 es ta aquí!! y que nos podemos encontrar en esta nueva versión?

Bueno esta versión viene con varias novedades, por ejemplo las tuplas, interacción directa con javascript, el operador : , verbatim strings (que seria en castellano como cadenas textuales) , tipos de parámetros por defecto, nuevos módulos como ceylon.time para las fechas y ceylon.net.httpd; y más y más!!

A medida que vaya aprendiendo las nuevas características las posteo.

Dejo links:
http://ceylon-lang.org/documentation/1.0/roadmap/#milestone_5_done
http://ceylon-lang.org/blog/2013/02/15/progress-report/

martes, 19 de febrero de 2013

Que es List comprehension??


List comprehension seria en español como "Lista de comprensión" pero me suena raro la traducción. Más allá de la traducción, que sería List comprehension? Bueno antes que nada, se acuerdan de las definiciones matemáticas de por ejemplo números pares o múltiplos que veíamos en la escuela? por ejemplo la definición de los números pares mayores a 10 sería así:

s = { 2 * x  | x  € N, 2 * x > 10 }

Esto se lee como los números pares (2*x) que pertenecen (€) a los números naturales (N) y que sean mayores que 10. Esto define la lista de forma compresiva. Es decir se puede conocer el valor de la lista dependiendo de la posición sin enumerar sus elementos. Esto si lo definimos en Haskell sería así:

s = [ 2*x | x <- [0..], x*2 > 10 ]

Como vemos es muy similar a la definición matemática, lo que indica que Haskell es muy buen lenguaje funcional. Se ve que los se define los números naturales como [0..] lo que indica que esta lista es infinita; por lo tanto la búsqueda de cada elemento se hace de forma perezosa.

Otros lenguajes implementan las List comprehension, por ejemplo Python, Scala, Erlang, Ceylon, Clojure, F#, Groovy, Ruby, etc.

En resumen podemos decir que List comprehension es una característica de algunos lenguajes con lo cual podemos definir listas de forma comprensiva y algo importante es que se pueda resolver de forma perezosa, para no tener que calcular elementos que no usamos.


Dejo link:
http://www.haskell.org/haskellwiki/List_comprehension
http://www.erlang.org/doc/programming_examples/list_comprehensions.html
http://en.wikipedia.org/wiki/List_comprehension