Friday, July 25, 2014

Mi primer post sobre Erlang

Así que...hace un par de días atrás decidí (por segunda vez) aprender Erlang...pero esta vez...me lo estoy tomando en serio -;)

Pero...que diablos es Erlang? En palabras simples...en un lenguaje de programación multi-paradigma, concurrente y funcional...simple, no?

Erlang es realmente un excelente y buen lenguaje...pero...luego de estos par de días...mi cerebro me está comenzando a doler...ya le haré saber más adelánte porque...

En fín...estoy leyendo Learn You Some Erlang for Great Good...que puede ser leído online aquí o comprado aquí. Yo lo compré -;)

Así que...pueden esperar un interesante review apenas termine de leerlo...

Como hago usualmente con nuevos lenguajes de programación...quería portar algo que ya había hecho antes hacia Erlang...porque para mi...esa es la mejor manera de entender...

Tomé el código para una salida LED que había construído para Python y Julia y lo porte a Erlang...pueden leer el blog aquí.

Aquí está el código en Erlang...

led.erl
-module(led).
-export([showLED/0,showLED/1]).

printLines(Counter,Long,Lines,Digits,Line1,Line2,Line3)
 when Counter > Long ->
  [io:format("~s",[X]) || X <- Line1], io:format("~n"),
  [io:format("~s",[X]) || X <- Line2], io:format("~n"),
  [io:format("~s",[X]) || X <- Line3], io:format("~n");
  
printLines(Counter,Long,Lines,Digits,Line1,Line2,Line3)
 when Counter =< Long ->
 printLines(Counter+1,Long,Lines,Digits,
      Line1 ++ [element(1,element(1,X)) || {X,Y}<-Lines, Y == element(Counter,list_to_tuple(Digits))],
      Line2 ++ [element(1,element(2,X)) || {X,Y}<-Lines, Y == element(Counter,list_to_tuple(Digits))],
      Line3 ++ [element(1,element(3,X)) || {X,Y}<-Lines, Y == element(Counter,list_to_tuple(Digits))]).

showLED() ->
 io:format("You must enter a number!~n").
            
showLED(Number) ->
 Lines = [{{{" _  ",1},{"| | ",2},{"|_| ",3}},0},{{{"  ",1},{"| ",2},{"| ",3}},1},
   {{{" _  ",1},{" _| ",2},{"|_  ",3}},2},{{{"_  ",1},{"_| ",2},{"_| ",3}},3},
   {{{"    ",1},{"|_| ",2},{"  | ",3}},4},{{{" _  ",1},{"|_  ",2},{" _| ",3}},5},
   {{{" _  ",1},{"|_  ",2},{"|_| ",3}},6},{{{"_   ",1},{" |  ",2},{" |  ",3}},7},
   {{{" _  ",1},{"|_| ",2},{"|_| ",3}},8},{{{" _  ",1},{"|_| ",2},{" _| ",3}},9}],
 Line1 = "", Line2 = "", Line3 = "", Counter = 1,
 Numbers = integer_to_list(Number),
 Long = length(Numbers),
 Digits = lists:map(fun(X) -> X - 48 end, Numbers),
 printLines(Counter,Long,Lines,Digits,Line1,Line2,Line3).

Y aquí está el resultado...


Así que...voy a decirles porque me duele el cerebro...y espero que esto no los haga alejarse de Erlang...au contraire...en realidad debería de darle una oportunidad a Erlang -;)

Primero...Las variables son invariables...lo cual significa...una vez que asignamos que A = 1 entonces A va a ser 1 por siempre y para siempre...no importa cuantas veces hagas A = 2...A va a seguir siendo 1...y por supuesto vas a tener un error si intentas hacer A = 2...porque A es 1...entiendes!

Segundo...No hay loops...no hay For's...no hay While's...no hay Do...While's...nada...solo recursión...funciones que se llaman a ellas mismas...multiples veces hasta que algo las haga parar...

Tercero...String...no son strings...sip...no hay strings en Erlang...todo es numérico...así que al final "A" es 65...

Cuarto...Orientación a Objetos...ni siquiera lo intenten...no sirve...este es un lenguaje de programación funcional...olvidate de las clases, metodos, atributos, friends, templates...y todo eso...

Ok...porque querrías aprender Erlang luego de leer todas estas cosas sin sentido? Fácil...porque Erlang cambia tu forma de pensar completamente...olvidate de todo lo que haz aprendido antes...debes pensar y hacer las cosas de una manera totalmente distinta...pero creánme...luego de un par de días con Erlang...te vas a convertir en un mejor programador...eso se los aseguro...

Saludos,

Blag.
Development Culture.

No comments: