featured image

El día 9 de abril recibimos la noticia de la liberación de Erlang 17.0. Esta nueva versión marca un hito en Erlang por tres motivos fundamentales: una nueva nomenclatura en el número de versión, la adición de mapas como tipo básico y clausuras con nombre. ¿Qué relavancia tiene esto realmente?

Versiones de Erlang

Hasta la versión R16, la nomenclatura empleada por el equipo principal de Erlang se basaba en el uso de una letra "R" (release) empleada antes del número principal de liberación (16 en este caso). Con esto nos indicaban la rama principal de liberación de Erlang/OTP. Para las primeras versiones no estables (release candidate) se agregaba a esa nomenclatura una "A" (alpha) y cuando ya era estable "B" (beta). En las liberaciones dentro de la rama se agregaban dígitos numéricos, siendo la primera cero y después el número, como R15B01, R15B02. Por último y separado por un guión (-) podíamos encontrar el número de liberación de corrección de fallos. La más reciente fue R16B03-1, y hay otras más antiguas como R12B-5.

El sistema era bastante específico pero muy diferente al empleado en otros proyectos, que se basan normalmente en el estándar de semantic versioning (o versionado semántico) en el que se emplean tres dígitos separados por puntos: MAJOR.MINOR.PATCH, indicando la liberación mayor (MAJOR) de la rama, pequeñas liberaciones en la misma rama (MINOR) y correcciones de fallos (PATCH).

Esta nueva versión de Erlang sigue la nueva nomenclatura y ha sido liberada como 17.0.

Mapas

Ahora algo que afecta más directamente al lenguaje en sí. Desde hace tiempo se hablaba de la inclusión de mapas en Erlang/OTP. Joe Armstrong en su nueva revisión del libro Programming Erlang incluye el concepto de mapas. Los mapas son colecciones asociativas de pares clave-valor. Reciben muchos nombres según el lenguaje en el que se implementen, en Erlang los llamaremos mapas.

Los mapas vienen como una necesidad imperativa de mejorar el uso que en Erlang tienen los registros. Los registros tienen muchas limitaciones por ser tipos de datos del compilador. Los mapas eliminan este problema y agregan muchas más características como:

  • Crear un conjunto de datos accesible a través de una clave y con la síntaxis propia del lenguaje.
  • Es distinguido del resto de tipos de datos (el registro se traduce a tupla).
  • No tiene la dependencia de ser construido solo en tiempo de compilación.
  • Puedes ser utilizado en expresiones de matching.

Podemos ver un ejemplo del uso de los mapas:

A = #{ a => 10 },
B = A#{ b => 20 },
case A of
   #{ a := 10 } -> ok
end.

La sintaxis es parecida a la de los registros pero se agrega la asignación a través de la flecha => para asignar un valor (o para cambiarlo) o podemos usar el operador de match :=. En caso de la asignación, si el valor no existe se agrega al resultado del mapa, y si existe se actualiza con el nuevo valor. El match comprueba que la clave tenga un valor que case con el que se pasa.

A todo esto le podemos agregar el uso de la sintaxis de mapas de comprensión:

A = #{ a => 1, b => 2 },
#{ K => V*2 || K := V <- A }
% #{ a => 2, b => 4 }

B = [ {a,1}, {b,2} ],
#{ K => V*2 || {K,V} <- B }
% #{ a => 2, b => 4 }

Sumamos además la inclusión de un módulo llamado maps con funciones como: remove, size, get, put, keys, values, map, foldl, foldr, ... y las BIFs para guardas is_map y map_size.

Clausuras con Nombre

Uno de los problemas típicos del factorial, es que no puede programarse a través de clausuras porque si intentamos hacer algo como esto:

F = fun(1) -> 1; 
       (N) -> N * F(N-1) 
    end.

Nos arrojará un error ya que la variable F aún no ha sido definida. Después de que la comunidad de Erlang le diese muchas vueltas a cómo solucionar este problema, llegaron a la solución de darle un nombre a estas funciones de clausura. Por ello, ahora en podemos definir esto anterior de la siguiente forma:

F = fun Fact(1) -> 1;
        Fact(N) -> N * Fact(N-1)
    end.

Con esa nomenclatura ya podemos nombrar a nuestra clausura desde dentro de la misma para poder realizar la recursividad sin tener que recurrir a construir o definir funciones como tales.

Otros cambios y mejoras

Aunque el cambio de versión y la agregación de los mapas constituyen dos cambios bastante disruptivos en la cronología de Erlang marcando un antes y un después, no son los únicos cambios que agrega este lanzamiento de versión. Listo a continuación de la noticia de liberación algunos de estos otros cambios y mejoras:

  • Erlang/OTP ahora también funciona en el sistema operativo OSE.
  • Mejoras y optimizaciones en ASN.1.
  • Nueva opción para sockets TCP, UDP y SCTP de {active,N}.
  • Un nuevo programador (opcional) para el mecanismo de balanceo.
  • Incrementado el radio de ocupación del garbage collector (recolector de basura).
  • Funcionalidad experimental dirty schedulers.
  • Mejoras en el soporte de unicode.

Conclusiones

Erlang está evolucionando mucho en los últimos años y la comunidad es cada vez más numerosa y activa, las entregas de las nuevas versiones se van realizando a un buen ritmo y la agregación de elementos nuevos y llamativos en cada una de ellas hacen que cada vez más Erlang tome partido y presencia como plataforma y lenguaje en empresas, universidades, conferencias, talleres, etc. ¿Quieres sumarte y participar en esta aventura?