Llevo un tiempo interesado en los analizadores léxicos y sintácticos para poder crear ficheros de configuración más amigables o sistemas de interfaces de usuario basados en consola que puedan emplear un formato libre de construcción de instrucciones (algo más complejo que el típico comando y argumentos). Eso sumado a mi afición por Erlang dio como resultado el encontrar: leex y yecc; un analizador léxico y sintáctico respectivamente.
Estas búsquedas, igualmente, dieron con una serie de lenguajes nuevos, que han sido desarrollados usando estos analizadores, sobre Erlang, por lo que aprovechan sus ventajas, y salvan algunos de los inconvenientes que tienen algunas personas al ver Erlang por primera vez, con respecto a la sintaxis del lenguaje y la asignación única de variables.
Reia
Con el primer lenguaje que me topé fue Reia, del cual hablé ya en otra ocasión. Este lenguaje fue desarrollado por una persona a la que le gusta mucho la sintaxis particular de Python y Ruby, pero también es muy aficionado a Erlang. Las primeras versiones de Reia tenían un formato muy parecido a Python con tintes de Ruby, y fue modificándose poco a poco, haciendo que cada vez más, se pareciese a Ruby.
La última noticia que he tenido sobre Reia, es que su desarrollador ha decidido abandonar su desarrollo, debido a que encontró otro lenguaje muy parecido, hecho de la misma forma, y que considera que se desarrolló de una forma mucho más elegante. Este lenguaje es Elixir. Por lo que, junto con el autor del lenguaje, Jose Valim, Tony (creador de Reia), se sumará a la lista de desarrolladores de Elixir.
Un ejemplo del lenguaje (aunque se puede ver en el artículo anterior):
# Hello, world!
"Hello, world!".puts()
LFE
Un lenguaje que también me ha llamado la atención, aunque al igual que Erlang, su sintaxis es algo rara para programadores del tipo Java, PHP, Ruby, Python y similares, es LFE (Lisp Flavoured Erlang, algo como Erlang con sabor a Lisp). Este lenguaje, desarrollado por Robert Virding, es una sintaxis de Lisp sobre Erlang.
Se encarga de traducir la sintaxis exacta de lo que se escribe a código Erlang. Un ejemplo de lo que se escribiría en LFE:
(defmodule myhello
(export (start 0)))
(defun start ()
(: io format '"Hello World!~n"))
Se traduciría así en código Erlang:
-module(myhello).
-export([start/0]).
start() ->
io:format("Hello Wordl!~n", []).
El sistema no tiene una forma fácil de compilar, pero el sistema está bien desarrollado y para los amantes de la sintaxis Lisp o Scheme es una gran oportunidad de poder desarrollar en ese entorno.
La ventaja de LFE, es que mantiene completamente la ideología en sí de Erlang y solo cambia la sintaxis, por lo que la metodología de OTP es completamente válida y se puede emplear al 100% como si de Erlang en sí se tratara.
Elixir
Lo descubrí a través de Reia. Este lenguaje, al igual que Reia, se basa en Ruby, sin tintes de Python. Ofrece una orientación a objetos más fuerte que Ruby y que Reia, ya que ni tan siquiera admite funciones de tipo built-in como puts, todos los métodos deben de pertenecer a un objeto.
La motivación e influencias en la creación de Elixir fueron, precisamente, Reia y LFE, según afirma el propio Jose Valim en su respuesta a la noticia de Tony de parar el desarrollo de Reia.
Este lenguaje, permite además, hacer scripting, por lo que da una mayor versatilidad. El lenguaje es muy parecido (tiene algunas variaciones) que Ruby y tiene acceso a módulos Erlang de forma sencilla.
Un ejemplo del código:
module Hello
def world
IO.puts "Hello World"
end
end
Elixir respeta un poco, o intenta llevar a su sintaxis, el paradigma de OTP de una forma más o menos asequible. En el ejemplo gen_server_bookshelf, se muestra cómo crear un gen_server y las diferencias que agrega al paradigma de OTP, debido a la propia ideología del lenguaje. El uso del pattern matching en los argumentos de las llamadas hace que se vea muy parecido a Erlang por lo que es un buen ejemplo de cambio de sintaxis manteniendo la potencia de Erlang por debajo.
Efene
Desarrollado por Mariano Guerra y basado en la sintaxis de JavaScript y Python, Efene es otro de los lenguajes que se ejecuta sobre la máquina virtual de Erlang.
Un ejemplo de este lenguaje:
# classic hello world
hello = fn (Who) {
io.format("hello ~s!~n", [Who])
}
@public
run = fn () {
hello("world")
}
La sintaxis del lenguaje, para los que prefieran el formato de tipo JavaScript, será más cómoda, y el uso de los módulos se abstrae, permitiendo usar los que ya trae consigo Erlang (ejemplo el io.format, que es una traducción para el io:format de Erlang).
El defecto viene quizás en el hecho de que efene no tiene soporte de procesos, por lo que el lanzamiento de los mismos, junto con la posibilidad de usar el paradigma de OTP encubierto en el propio lenguaje, se anula completamente.
Conclusiones
Muchos de los lenguajes tienen la potencia de aportar una nueva sintaxis, que era el gran problema que le veían muchos programadores a Erlang, sobre una potente infraestructura. No obstante, el paradigma de programación que introduce Erlang a través de OTP queda un poco tapado o incluso anulado en algunos de estos lenguajes, afortunadamente, de los vistos, solo efene.
En sí, quien programa en Erlang, y termina usando y viendo el paradigma del lenguaje en sí, la programación funcional, OTP y su sintaxis, es normal que no quiera abstraerse a otro tipo de sintaxis. No obstante, admito que a veces, tener otra sintaxis más amigable se agradece, no solo por ver mejor el lenguaje, sino también para introducir a más gente en él.