Ir al contenido principal

Paveando con elixir

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.

Comentarios

Comments powered by Disqus