Translate

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

jueves, 22 de enero de 2026

APIs Ligeras con Crystal y Kemal parte 2


Seguimos con Crystal + Kemal. Podemos simular una API para gestionar usuarios en memoria:


require "kemal"

require "json"


struct User

  property id : Int32

  property name : String

end


users = [

  User.new(id: 1, name: "Alice"),

  User.new(id: 2, name: "Bob")

]


get "/users" do

  users.to_json

end


get "/users/:id" do |env|

  id = env.params.url["id"].to_i

  user = users.find { |u| u.id == id }

  if user

    user.to_json

  else

    env.response.status_code = 404

    { error: "User not found" }.to_json

  end

end


Kemal.run


Con solo unas líneas, tenés una API REST rápida y compilada a código nativo.


Kemal permite agregar middlewares personalizados para logging, autenticación o cabeceras:


before_all do |env|

  puts "Request: #{env.request.method} #{env.request.path}"

end


También incluye un middleware logger integrado:


add_handler Kemal::Logger.new


Gracias al modelo de fibers de Crystal, Kemal puede manejar múltiples requests concurrentes sin bloquear el hilo principal.

Esto lo hace ideal para APIs I/O-bound (por ejemplo, servicios que consultan bases de datos o APIs externas).


get "/async" do

  spawn do

    sleep 1

    puts "Tarea asíncrona completada"

  end

  "Procesando..."

end


Kemal es un ejemplo perfecto del espíritu de Crystal:

  • Sintaxis clara y expresiva.
  • Ejecución compilada, rápida y eficiente.
  • Concurrencia simple y no bloqueante.
  • Framework minimalista y productivo.

Si te gusta Sinatra en Ruby o Express en Node.js, vas a sentirte como en casa, pero con el rendimiento de un lenguaje compilado.

miércoles, 21 de enero de 2026

APIs Ligeras con Crystal y Kemal


Crystal es un lenguaje que combina la velocidad de C con la elegancia de Ruby.

Entre sus frameworks web más populares se destaca Kemal, un microframework minimalista y rápido, muy similar a Sinatra (Ruby) o Express (Node.js).

Primero, asegúrate de tener instalado Crystal.

Podés verificarlo con:

crystal --version


Y si no lo tenés instalado podés ejecutar este comando: 

curl -fsSL https://crystal-lang.org/install.sh | sudo bash


Luego, instalá Kemal agregándolo a tu proyecto con shards, el gestor de dependencias de Crystal.


shards init


Editá el archivo shard.yml y agregá:


dependencies:

  kemal:

    github: kemalcr/kemal


Finalmente, instalá las dependencias:


shards install


Creamos un archivo app.cr:


require "kemal"


get "/" do

  "Hola desde Crystal con Kemal!"

end


Kemal.run


Y ejecutamos:

crystal run app.cr


📍 Luego, abrí http://localhost:3000

Vas a ver la respuesta:


Hola desde Crystal con Kemal!


Kemal permite definir rutas con parámetros y manejar JSON fácilmente:


require "kemal"

require "json"


get "/saludo/:nombre" do |env|

  nombre = env.params.url["nombre"]

  { mensaje: "Hola, #{nombre}!" }.to_json

end


Kemal.run


GET http://localhost:3000/saludo/Emanuel


Responde con:

{"mensaje": "Hola, Emanuel!"}


martes, 20 de enero de 2026

Concurrencia en Crystal: Fibers y Channels al Estilo Go


El lenguaje Crystal combina la sintaxis elegante de Ruby con un modelo de concurrencia ligero y eficiente, inspirado en Go.

En lugar de hilos del sistema operativo, Crystal usa fibers, que permiten ejecutar múltiples tareas de forma concurrente dentro del mismo proceso.

Una fiber es una unidad ligera de ejecución gestionada por el runtime de Crystal (no por el sistema operativo).

Varias fibers pueden ejecutarse “en paralelo” sobre un solo hilo de sistema, haciendo que la concurrencia sea cooperativa y eficiente.


Se crean usando la palabra clave spawn:


spawn do

  puts "Hola desde una fiber!"

end


puts "Hola desde el hilo principal!"

sleep 0.1


Salida posible:

Hola desde el hilo principal!

Hola desde una fiber!


El sleep al final evita que el programa termine antes de que la fiber se ejecute (las fibers corren de forma asíncrona).

Las fibers se comunican a través de channels, una abstracción segura para enviar y recibir mensajes sin necesidad de locks.


channel = Channel(String).new

spawn do

  channel.send("Mensaje desde otra fiber")

end


puts channel.receive


Salida:

Mensaje desde otra fiber


Los Channel son tipados (Channel(Int32), Channel(String), etc.), y pueden usarse para coordinar tareas concurrentes.


Veamos un ejemplo más realista con varias fibers:


channel = Channel(Int32).new


# Productor

spawn do

  5.times do |i|

    puts "Produciendo #{i}"

    channel.send(i)

    sleep 0.2

  end

  channel.close

end


# Consumidor

spawn do

  for value in channel

    puts "Consumiendo #{value}"

  end

end


sleep 2


Salida:

Produciendo 0

Consumiendo 0

Produciendo 1

Consumiendo 1

Produciendo 2

Consumiendo 2

Produciendo 3

Consumiendo 3

Produciendo 4

Consumiendo 4


Crystal no crea múltiples hilos del sistema por cada fiber.

Las fibers son gestionadas por el scheduler del runtime.

El modelo es asíncrono cooperativo: las fibers ceden el control cuando hacen operaciones de I/O o esperan datos.

Este enfoque reduce el costo de cambio de contexto y permite miles de fibers concurrentes sin overhead.

Crystal adopta el modelo CSP (Communicating Sequential Processes) de Go, pero mantiene la simplicidad y legibilidad de Ruby.

Es importante notar que Crystal 1.x usa un solo hilo del sistema (no hay paralelismo real entre núcleos).

Sin embargo, el equipo de Crystal está trabajando en soporte multithreaded para futuras versiones.


Esto significa que las fibers son ideales para:

  • I/O concurrente (HTTP, base de datos, archivos).
  • Operaciones asíncronas livianas.
  • Pero no para tareas intensivas en CPU.


La concurrencia en Crystal es una de sus características más elegantes:

  • Usa fibers para tareas concurrentes sin complicaciones.
  • Permite comunicación segura con channels.
  • Ofrece un modelo simple, escalable y eficiente.


Si disfrutás del enfoque de Go o Elixir, pero querés la sintaxis de Ruby y velocidad de C, Crystal es una alternativa brillante para explorar.

sábado, 17 de enero de 2026

Crystal: El Lenguaje de Programación que Combina la Elegancia de Ruby con la Velocidad de C


En el mundo de la programación, los lenguajes suelen ubicarse entre dos extremos: los rápidos y eficientes, como C o Rust, y los expresivos y productivos, como Ruby o Python.

Crystal intenta unir lo mejor de ambos mundos: la velocidad de C con la sintaxis elegante de Ruby.

Crystal es un lenguaje de programación compilado, tipado estáticamente, y con una sintaxis muy parecida a Ruby.

Está diseñado para ofrecer una experiencia de desarrollo rápida y agradable, sin sacrificar el rendimiento.


Algunos de sus pilares son:

  • Sintaxis legible y concisa.
  • Compilación nativa a binarios.
  • Tipado estático con inferencia de tipos.
  • Recolección de basura (GC).
  • Soporte para concurrencia mediante fibers y channels, inspirados en Go.


Un programa clásico en Crystal se ve así:



def greet(name : String)

  puts "Hola, #{name}!"

end


greet("Emanuel")


A simple vista, parece Ruby. Pero a diferencia de Ruby, Crystal compila a código máquina:


crystal build hello.cr

./hello

# => Hola, Emanuel!


Crystal detecta automáticamente los tipos sin necesidad de declararlos explícitamente, usa inferencia de tipos:


name = "Crystal"

version = 1.12

puts "#{name} #{version}"


El compilador infiere que name es String y version es Float64, verificando los tipos en tiempo de compilación.

Esto evita muchos errores sin perder flexibilidad.


Crystal implementa un modelo de concurrencia basado en fibers (hilos ligeros) y channels, similar a Go:


channel = Channel(Int32).new


spawn do

  3.times do |i|

    channel.send(i)

  end

end


3.times do

  puts "Recibido: #{channel.receive}"

end


Cada spawn ejecuta una tarea concurrente dentro del mismo proceso, permitiendo aplicaciones altamente escalables sin la complejidad de los hilos tradicionales.


Crystal incluye muchas herramientas integradas:

  • crystal build → compila el código a un ejecutable.
  • crystal run → ejecuta directamente un programa.
  • crystal spec → framework de pruebas (similar a RSpec).
  • shards → gestor de dependencias oficial.


Ejemplo de uso con Shards:


shards init

shards install


Crystal se utiliza en:

  • Desarrollo de APIs REST (con frameworks como Kemal o Lucky).
  • CLI tools y aplicaciones de sistema.
  • Programas que requieren rendimiento sin sacrificar legibilidad.


Ejemplo con Kemal (un microframework web):


require "kemal"


get "/" do

  "Hola desde Crystal!"

end


Kemal.run


Crystal es un lenguaje ideal si buscás:

  • La belleza sintáctica de Ruby.
  • El rendimiento de C.
  • Un sistema de tipos seguro pero sin verbosidad.
  • Concurrencia sencilla y eficiente.


Aunque su ecosistema es más pequeño que el de Go o Rust, Crystal está ganando tracción entre quienes valoran productividad y rendimiento equilibrados.



viernes, 1 de noviembre de 2019

¿Cuál es el mejor y más nuevo lenguaje de programación?


Encontré dicha pregunta en quora, y la respuesta :

  • Julia (Influenciado por: Fortran, Lisp, Lua, Python, Perl, Ruby y MATLAB)
  • Kotlin (Influenciado por: JavaScript, Java, C# y Scala)
  • Elm (Influenciado por: Standard ML, F#, Haskell y OCaml)
  • Elixir (Influenciado por: LFE, Clojure, Erlang and Ruby)
  • Rust (Influenciado por: C#, Ruby, C++, Alef, Haskell, NIL, Cyclone, Limbo y Erlang)
  • Crystal (Influenciado por: C, Ruby, C# and Python)
  • Groovy (Influenciado por: Python, Java, Smalltalk, Objective-C y Perl)
  • R (Influenciado por: S, XLispStat, Common Lisp y Scheme)
  • Hack (por Facebook)
  • Go (Influenciado por: C, Python, Smalltalk, Alef, CSP, Modula, Pascal, Limbo y BCPL)
  • Dart (por Google)
  • Bosque (Nuevo lenguaje de programación de Microsoft)
  • Ballerina (Basado en Java, Javascript, Go, Rust, C#)
  • V (Basado en Go y Rust)

La verdad no conocía a Bosque, Ballerina y V. 

Más allá de dicha respuesta, a mi entender, todo depende de a que te vas a dedicar, por ejemplo: 

Si vas a hacer una aplicación base, base de datos, sistema operativos, aplicaciones de escritorio: 
  • V
  • Go 
  • Rust

Si te queres dedicar a ciencia de datos : 
  • Julia
  • R

Si queres hacer back-end de aplicaciones : 
  • Kotlin
  • Groovy
  • Bosque
  • Ballerina
  • Hack
  • Elixir

Aplicaciones front-end :
  • Elm
  • Dart

Me puedo equivocar, pero es mi opinión. 

Otra cosa, faltan lenguajes que siempre nuevos, como Scala, Idris, Swift o tantos otros...

Opinen!


sábado, 11 de agosto de 2018

Crystal v0.26.0 fue liberado !!


Crystal es un lenguaje que tiene muchísimo futuro y en mi opinión es el lenguaje orientado a objeto de tipado estático mejor diseñado.

Es simple y la inferencia de tipos lo hace fácil de usar y al ser de tipado estático es muy rápido. 

Esta es su versión 0.26.0 y sigue creciendo. 

Lo único que a mi modo de ver las cosas debería hacer es correr en una plataforma donde pueda reutilizar frameworks como dot net core o java. Eso le daría una popularidad increíble.

Sin más espero que siga creciendo este gran lenguaje.

Dejo link:
https://crystal-lang.org/
https://github.com/crystal-lang/crystal/blob/master/CHANGELOG.md

miércoles, 10 de enero de 2018

Lenguajes de programación para aprender en 2018

Quiero compartir un excelente articulo sobre lenguajes de programación en 2018 (es decir este año)

Si bien el articulo no presenta mayor sorpresa, lista los lenguajes más populares de 2017 y que seguirán fuerte en 2018. Ojo aparece Scala (esto me llamo mucho la atención)

Yo empece el año con Crystal y se lo recomiendo porque esta muy bueno el lenguaje.

Dejo link: https://platzi.com/blog/lenguajes-de-programacion-2018/?utm_source=facebook&utm_medium=paidsocial&utm_campaign=pubetapa0

martes, 9 de enero de 2018

Juego de Serie en Crystal


Cuando quiero aprender un nuevo lenguaje desarrollo un juego de series, es decir aparece una serie con un valor faltante y el jugador debe completarlo.

Uno de los requerimientos no funcionales es que se pueda agregar una serie nueva fácilmente, para cumplirlo vamos a utilizar las ventajas de herencia y polimorfismo.

Vamos a desarrollar este juego en Crystal :

Comencemos haciendo un nuevo proyecto:

crystal init app secuenciaCrystal
cd secuenciaCrystal

y luego probamos compilar :

shards build

Y todo debería funcionar. 

Ahora utilizaremos visual code con un plugin para crystal, para importar el proyecto, vamos a abrir carpeta y seleccionamos la carpeta donde estamos trabajando : 


Ahora vamos a hacer un archivo secuencia.cr que va a tener las clases de secuencias:


abstract class Secuencia

  @secuencia : Array(Int32)

  getter secuencia

  def initialize()
    @secuencia = generarSecuencia()
  end

  abstract def generarSecuencia() : Array(Int32)

end

class SecuenciaPar < Secuencia

  def generarSecuencia() : Array(Int32)
     Array(Int32).new(4) { |i|
       i * 2 * rand(100) + rand(10) * 2
     }

  end

end

class SecuenciaInPar < Secuencia

  def generarSecuencia() : Array(Int32)
    Array(Int32).new(4) { |i|
       i * 2 * rand(100) + rand(10) * 2 + 1
    }
  end

end

Luego hacemos otro archivo para juego:

require "./secuencia.cr"

class Juego

  getter puntos

  @secuencia : Secuencia

  def initialize()
    @puntos = 0
    @secuencia = generarSecuencia()
  end

  def generarSecuencia() : Secuencia
    i = rand(2)

    case i
        when 0
          SecuenciaPar.new
        else
          SecuenciaInPar.new
    end
  end

  def valor1()
    @secuencia.secuencia[0]   
  end

  def valor2()
    @secuencia.secuencia[1]   
  end

  def valor4()
    @secuencia.secuencia[3]   
  end

  def esta_bien?(num : Int32?) : Bool
    if @secuencia.secuencia[2] == num
       @puntos = @puntos + 1
       @secuencia = generarSecuencia()
       true
    else
       @puntos = @puntos - 1
       @secuencia = generarSecuencia()
       false
    end
  end

end

Y por ultimo tenemos el programa propiamente dicho:

require "./secuenciaCrystal/*"
require "./juego.cr"


module SecuenciaCrystal
  puts "Bienvenido a Secuancia Crystal"
  juego = Juego.new
  while true
    puts juego.valor1.to_s + " " + juego.valor2.to_s + " ______ " + juego.valor4.to_s + " \n"
    puts "Ingere el valor \n"
   
    valorStr = gets.to_s
   
    valor = (valorStr).to_i32

    if juego.esta_bien?(valor)
      puts " Ganaste !! Tus puntos : " + juego.puntos.to_s
    else
      puts " Perdiste !! Tus puntos : " + juego.puntos.to_s
    end
    puts "Ingere 0 para salir y otro valor para continuar"
    if gets()  == "0"
      break
    end

  end
  puts "Bye!"
end


Como se puede apreciar el diseño del juego permite generar una interfaz de consola o gráfica o en otra tecnología esta es la mayor ventaja de separar nuestros objetos de la capa de presentación.

Funcionando es muy divertido:



Dejo el repo: https://github.com/emanuelpeg/secuenciaCrystal



domingo, 7 de enero de 2018

Primeros pasos con Crystal parte 2


Instalado el compilador y probado. Podemos empezar a hacer nuestro primer proyecto.

Para poder continuar el post con un ide un poco más comoda que nano, voy a usar el visual code con un pluging para Crystal. Es muy fácil instalar esto, van a complementos y buscan Crystal :



Si conocen otra IDE mejor, por favor comenten. Gracias.

Ahora voy a la consola y voy hacer mi proyecto:

crystal init app MiPrimerApp

Esto creo todo un proyecto ya listo para usar con git y con dependencias, versión y todo lo necesario :

Por ahora y solo por ahora, vamos a hacer un "Hola mundo" . Editamos MiPrimerApp.cr y escribimos:

require "./MiPrimerApp/*"

module MiPrimerApp
  puts "Hola Mundo"
end

Luego en la consola entramos en la carpeta MiPrimerApp

cd MiPrimerApp

Ahora a ejecutar:

crystal deps

Para resolver las dependencias

crystal docs

Para generar la documentación. 

shards build

Para compilar todo. (luego hablaremos de shards)

Si todo fue bien, podemos entrar a la carpeta bin y ejecutar nuestra aplicación: 

 cd bin/
./MiPrimerApp 

Y listo!!



sábado, 6 de enero de 2018

Primeros pasos con Crystal

Ya instalado Crystal, vamos a comenzar haciendo un "Hola mundo"

Para hacer un ejemplo rápido vamos a utilizar la consola.

Primero con nano, vamos a hacer nuestro archivo que debe tener extensión .cr :

nano holaMundo.cr

Luego vamos a programar el hola mundo : 

puts "Hola Mundo"

Luego salimos y guardamos.

Ahora vamos a compilar y ejecutar: 

crystal holaMundo.cr

Si solo queremos ejecutar podemos hacer : 

crystal run holaMundo.cr 

Para generar un ejecutable debemos hacer : 

crystal build holaMundo.cr

Luego podemos ejecutar nuestro programa con : 

./holaMundo

Por defecto, los archivos ejecutables generados no están completamente optimizados. Para activar optimizaciones, se debe usar --release

crystal build holaMundo.cr --release

Si queremos no solo trabajar con un solo archivo sino hacer proyectos debemos utilizar el comando init pero eso sera en otro post. 

Instalar Crystal en Linux


Para instalar Crystal en Linux es muy fácil.

Vamos por pasos:

Primero, debe agregar el repositorio a su configuración APT. Podemos hacerlo con este comando:

curl https://dist.crystal-lang.org/apt/setup.sh | sudo bash

Eso agregará la clave de firma y la configuración del repositorio. Si queremos hacerlo manualmente, ejecutamos los siguientes comandos como root:

apt-key adv --keyserver keys.gnupg.net --recv-keys 09617FD37CC06B54
echo "deb https://dist.crystal-lang.org/apt crystal main" > /etc/apt/sources.list.d/crystal.list
apt-get update

Una vez que el repositorio está configurado, estamos listo para instalar Crystal:

sudo apt-get install crystal

Algunas veces necesitará instalar el paquete build-essential para ejecutar o construir programas Crystal. Puedes instalarlo con el comando:

sudo apt-get install build-essential

Y Listo!!

Dejo link: https://crystal-lang.org/docs/installation/on_debian_and_ubuntu.html



Ruby + C = Crystal

Imaginate un lenguaje con la potencia de C pero la sintaxis de Ruby. En resumen eso es Crystal, un lenguaje con chequeo de tipos y sintaxis similar a Ruby.

Veamos un ejemplo:

# A very basic HTTP server
require "http/server"

server = HTTP::Server.new(8080) do |context|
  context.response.content_type = "text/plain"
  context.response.print "Hello world, got #{context.request.path}!"
end

puts "Listening on http://127.0.0.1:8080"
server.listen

Este pequeño ejemplo hemos montado un servidor web con una página de ejemplo.

Crystal tiene chequeo de tipo forma estática, por lo que el compilador detectará cualquier tipo de error antes de que falle en el tiempo de ejecución. Además, y para mantener el lenguaje limpio, Crystal tiene inferencia de tipos, por lo que no es necesario indicar el tipo la mayoría de las veces.

def shout(x)
  # Notice that both Int32 and String respond_to `to_s`
  x.to_s.upcase
end

foo = ENV["FOO"]? || 10

typeof(foo) # => (Int32 | String)
typeof(shout(foo)) # => String

Los tipos no permiten null y las variables nullable se representan como una unión entre el tipo y null. Como consecuencia, el compilador comprobará automáticamente si hay referencias nulas en tiempo de compilación.

if rand(2) > 0
  my_string = "hello world"
end

puts my_string.upcase

Si corremos esto :

$ crystal hello_world.cr
Error in hello_world.cr:5: undefined method 'upcase' for Nil (compile-time type is (String | Nil))

puts my_string.upcase

Crystal posee un potente sistema de macro , que abarca desde la inspección básica de plantillas y AST hasta la inspección de tipos y la ejecución de programas externos arbitrarios.

class Object
  def has_instance_var?(name) : Bool
    {{ @type.instance_vars.map &.name.stringify }}.includes? name
  end
end

person = Person.new "John", 30
person.has_instance_var?("name") #=> true
person.has_instance_var?("birthday") #=> false

Crystal usa hilos verdes, llamados fibras, para lograr concurrencia. Las fibras se comunican entre sí mediante canales, como en Go o Clojure, sin tener que recurrir a la memoria compartida o bloqueos.

channel = Channel(Int32).new
total_lines = 0
files = Dir.glob("*.txt")

files.each do |f|
  spawn do
    lines = File.read(f).lines.size
    channel.send lines
  end
end

files.size.times do
  total_lines += channel.receive
end

puts total_lines

Crystal tiene una sintaxis dedicada para llamar fácilmente a bibliotecas nativas, eliminando la necesidad de volver a implementar tareas de bajo nivel.

# Fragment of the BigInt implementation that uses GMP
@[Link("gmp")]
lib LibGMP
  alias Int = LibC::Int
  alias ULong = LibC::ULong

  struct MPZ
    _mp_alloc : Int32
    _mp_size : Int32
    _mp_d : ULong*
  end

  fun init_set_str = __gmpz_init_set_str(rop : MPZ*, str : UInt8*, base : Int) : Int
  fun cmp = __gmpz_cmp(op1 : MPZ*, op2 : MPZ*) : Int
end

struct BigInt < Int
  def initialize(str : String, base = 10)
    err = LibGMP.init_set_str(out @mpz, str, base)
    raise ArgumentError.new("invalid BigInt: #{str}") if err == -1
  end

  def <=>(other : BigInt)
    LibGMP.cmp(mpz, other)
  end
end

Las bibliotecas de Crystal se empaquetan como fragmentos y se distribuyen a través de Git sin necesidad de un repositorio centralizado. Los comandos incorporados permiten que las dependencias se especifiquen fácilmente a través de un archivo YAML y se obtengan de sus respectivos repositorios.

name: my-project
version: 0.1
license: MIT

crystal: 0.21.0

dependencies:
  mysql:
    github: crystal-lang/crystal-mysql
    version: ~> 0.3.1

Esto es solo un post de muestra. Para empezar de lleno vamos a tener que instalar el lenguaje y luego a estudiar, pero esos serán otros post.

Dejo link: https://crystal-lang.org/
https://github.com/crystal-lang/crystal/

domingo, 4 de junio de 2017

9 lenguajes que deberías aprender en el 2017


Muy pocas veces me encuentro con un articulo que dice que debemos aprender algo y coincido, normalmente son tecnologías ya consolidadas pero esta vez me encontré con un articulo que no le importo hacer futurología y tiro algunos nombres de lenguajes que son poco comunes en estas listas.

Los lenguajes que debemos aprender son:

  • Kotlin: como era de esperar, todo el mundo habla de él luego de convertirse en el lenguaje soportado por Android. 
  • Elm: Lenguaje funcional por demás interesante, permite compilar a html y javascript.
  • Julia: Similar a python pero dedicado a la ciencia. 
  • Elixir: Lenguaje funcional que hemos hablado ciento de veces en el blog.
  • Rust: Lenguaje de propósito general, que se parece mucho a C++
  • Crystal: Este si no lo conocía, se viene un post en breve. 
  • Groovy: En serio? yo creía que venia bajando su popularidad y de repente aparece en esta lista. 
  • R: Si haces algo con estadísticas debes conocer a R, es un lenguaje funcional dedicado a la estadísticas, que cada vez adquiere más adeptos. 
  • Go: El lenguaje de google viene lento pero seguro ganando mercado. 

Entre las cosas que me llamaron la atención puedo nombrar:

  • El 90% de los lenguajes nombrados tienen al menos un post en el blog! (tengo que hacer algo de publicidad)
  • Podríamos decir que la mitad o más son lenguajes funcionales, o que aplican técnicas de programación funcional, Entonces, a aprender funcional, no?


Por lo tanto decidí compartir este articulo:
http://www.rankred.com/new-programming-languages-to-learn/