Este fin de semana estuve jugando un poco con Elixir. Elixir es un lenguaje de programación funcional muy similar a Ruby implementado sobre la VM de Erlang. Es un lenguaje interesante y aunque la sintaxis es algo similar a Ruby apenas rascamos un poco la superficie y las diferencias se notan muchísimo.
Elixir es puramente funcional, esta diseñado para manejar de manera eficiente la programación concurrente.
Entre las cosas que me llamaron la atención son:
-
la utilidad mix
-
los guards (guardias?)
-
pattern matching
mix
Mix es una utilidad de linea de comandos, al parecer extensible, permite instalar nuevas funcionalidades, crear proyectos y demás. Parece ser muy flexible y potente, y me llamo la atención que sea incluído por defecto en el lenguaje. Debo admitir que no estoy todavía interiorizado con la mayoría de sus comandos (solo lo utilize para instalar hex y subsecuentemente Phoenix un framework web que aún no he probado).
El comando mix new por ejemplo nos dejará hacer un nuevo proyecto ya listo con sus carpetas de test y configuración
elixir $ mix new example2 * creating README.md * creating .gitignore * creating mix.exs * creating config * creating config/config.exs * creating lib * creating lib/example2.ex * creating test * creating test/test_helper.exs * creating test/example2_test.exs Your Mix project was created successfully. You can use "mix" to compile it, test it, and more: cd example2 mix test Run "mix help" for more commands.
Guards
Al definir las funciones en Elixir podemos utilizar guards, que básicamente hacen que ese método solo sea utilizado en caso de cumplirse x condición (is_list, is_integer). También podemos definir nuevos guards a traves de macros ( no se pueden llamar funciones externas/remotas) desde un guard. He aquí un ejemplo bastante trivial y probablemente demasiado complicado para lo que hace, que toma edades desde la linea de comandos y determina si son mayores de edad o no.
defmodule Example do def main(args) do Enum.each(args, fn(arg) -> determine( elem( Integer.parse( arg ),0) ) end ) end defmacro is_adult(age) do quote do: 18 <= unquote(age) end defmacro is_minor(age) do quote do: 18 > unquote(age) end def determine(arg) when is_adult(arg) do IO.puts "Mayor de edad" IO.puts "Edad ingresada: #{arg}" end def determine(arg) when is_minor(arg) do IO.puts "Menor de edad" IO.puts "Edad ingresada: #{arg}" end end
Pattern Matching
En elixir la expresion 5 = x por ejemplo realiza una operación de matching, es por eso que si hacemos esto:
iex(1)> x = 5 5 iex(2)> 5 = x 5 iex(3)> 3 = x ** (MatchError) no match of right hand side value: 5
Arroja un error del tipo MatchError. Raro no?
En fin. He visto muy poquito aún de Elixir, pero sin dudas parece un bicho lo suficientemente extraño como para analizarlo, eventualmente me gustaría ver bien como trabaja con multiples hilos y probar el framework Phoenix.
Comments
Comments powered by Disqus