<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Erlang on Peczenyj's Blog</title><link>http://pacman.blog.br/categories/erlang/</link><description>Recent content in Erlang on Peczenyj's Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 19 Jun 2008 15:15:00 -0300</lastBuildDate><atom:link href="http://pacman.blog.br/categories/erlang/atom.xml" rel="self" type="application/rss+xml"/><item><title>Erlang é dificil (parte 2)</title><link>http://pacman.blog.br/blog/2008/06/19/erlang-dificil-parte-2/</link><pubDate>Thu, 19 Jun 2008 15:15:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/06/19/erlang-dificil-parte-2/</guid><description>&lt;div class='post'>
Agora vamos usar as funções específicas para manipular listas.&lt;br />&lt;br />&lt;pre>&lt;code>-module(tut).&lt;br />-export([generate/1]).&lt;br />&lt;br />%%&lt;br />%% Funcao generate(X)&lt;br />%% Quando X for 0, retorna [0]&lt;br />%% Quando X > 0, retorna [X,X-1,...,0]&lt;br />%% Caso contrario retorna [0,1,2,...,abs(X)]&lt;br />%%&lt;br />generate(0) -> [0];&lt;br />generate(L) when integer(L), L > 0 -> &lt;br /> lists:seq(0,L); % cria uma lista de 0 até L&lt;br />generate(L) when integer(L) -> &lt;br /> % vamos reverter a lista?&lt;br /> lists:reverse(generate(-L)).&lt;/pre>&lt;/code>&lt;br />&lt;br />Muito mais simples, certo? Veja o teste:&lt;br />&lt;br />&lt;pre>$ erl&lt;br />Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [kernel-poll:false]&lt;br />&lt;br />Eshell V5.5.5 (abort with ^G)&lt;br />1> c(tut). &lt;br />{ok,tut}&lt;br />2> tut:generate(5) ++ tut:generate(-5).&lt;br />[0,1,2,3,4,5,5,4,3,2,1,0]&lt;br />3> &lt;/pre>&lt;br />&lt;br />O operador ++ une 2 listas :)&lt;/div></description></item><item><title>Erlang é dificil?</title><link>http://pacman.blog.br/blog/2008/06/18/erlang-dificil/</link><pubDate>Wed, 18 Jun 2008 19:10:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/06/18/erlang-dificil/</guid><description>&lt;div class='post'>
Erlang é realmente dificil?&lt;br />&lt;br />&lt;pre>&lt;code>-module(tut).&lt;br />-export([generate/1]).&lt;br />&lt;br />%%&lt;br />%% Funcao generate(X)&lt;br />%% Quando X for 0, retorna [0]&lt;br />%% Quando X > 0, retorna [X,X-1,...,0]&lt;br />%% Caso contrario retorna [0,1,2,...,abs(X)]&lt;br />%%&lt;br />generate(0) -> [0];&lt;br />generate(L) when integer(L) -> gera_lista(L).&lt;br />&lt;br />gera_lista(L) when L &amp;gt; 0 -> gera_lista_direita(L);&lt;br />gera_lista(L) -> gera_lista_inversa(-L).&lt;br />&lt;br />gera_lista_direita(L) -> gera_lista_direita(L,[]).&lt;br />&lt;br />gera_lista_direita(-1,Z) -> Z;&lt;br />gera_lista_direita( L,Z) -> &lt;br /> %io:format("chamando: gera_lista_direita(~p,Z)~n",[L]),&lt;br /> gera_lista_direita(L - 1,[L | Z]).&lt;br />&lt;br />gera_lista_inversa(L) -> gera_lista_inversa(L,[]).&lt;br />&lt;br />gera_lista_inversa(-1,Z) -> Z;&lt;br />gera_lista_inversa( L,Z) -> gera_lista_inversa(L,0,Z).&lt;br />&lt;br />gera_lista_inversa(-1,_,Z) -> gera_lista_inversa(-1,Z);&lt;br />gera_lista_inversa( L,A,Z) -> &lt;br /> %io:format("chamando: h(~p,~p,Z)~n",[L,A]), &lt;br /> h(L - 1, A + 1,[A | Z]).&lt;/pre>&lt;/code>&lt;br />&lt;br />Ok, dessa forma é dificil. Erlang é uma linguagem funcional, ou seja, suas funções seguem um raciocínio matemático e não imperativo. Vc sente o problema quando quer resolver algo iterativo ou utilizar variaveis de qualquer forma.&lt;br />&lt;br />Fiz uma pequena função chamada generate, do modulo tut (de &lt;span style="font-style:italic;">tutorial&lt;/span>, uma vez que estou seguindo um). Ela é muito simples, se vc informar 0, ela gera uma lista simples contendo 0. Se vc passar um numero positivo ela gera uma lista de 0 até o número, inclusive. Se o numero for negativo, ele assume que vc quer fazer fazer a lista de forma inversa.&lt;br />&lt;br />Veja só:&lt;br />&lt;pre>$ erlc tut.erl # compilando o modulo&lt;br />$ erl&lt;br />Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [kernel-poll:false]&lt;br />&lt;br />Eshell V5.5.5 (abort with ^G)&lt;br />1> c(tut). # carregando o modulo&lt;br />{ok,tut}&lt;br />2> tut:generate(0). # invocando modulo:funcao(parametros).&lt;br />[0]&lt;br />3> tut:generate(10).&lt;br />[0,1,2,3,4,5,6,7,8,9,10]&lt;br />4> tut:generate(-10).&lt;br />[10,9,8,7,6,5,4,3,2,1,0]&lt;br />5> &lt;/pre>&lt;br />&lt;br />A função &lt;span style="font-weight:bold;">generate&lt;/span> chama a função gera_lista se o parametro passado for um número inteiro.&lt;br />A função &lt;span style="font-weight:bold;">gera_lista&lt;/span> chama a função para gerar a lista direita ou inversa, de acordo com o valor do parâmetro.&lt;br />&lt;br />Veja só a simplicidade:&lt;br />&lt;br />&lt;pre>&lt;code>gera_lista_direita(L) -> gera_lista_direita(L,[]).&lt;br />&lt;br />gera_lista_direita(-1,Z) -> Z;&lt;br />gera_lista_direita( L,Z) -> &lt;br /> %io:format("chamando: gera_lista_direita(~p,Z)~n",[L]),&lt;br /> gera_lista_direita(L - 1,[L | Z]).&lt;/pre>&lt;/code>&lt;br />&lt;br />quando eu chamo gera_lista_direita(10) eu estou, na verdade, chamado a função gera_lista_direita(10,[]), onde eu fico usando uma lista como acumulador.&lt;br />&lt;br />A operação [L | X] pode ser lida como [ elemento | lista ] , ou seja, eu adiciono um elemento em uma lista. gera_lista_direita(10,[]) vai chamar, então, gera_lista_direita(9,[10]), e depois gera_lista_direita(8,[9, 10]), e assim recursivamente até gera_lista_direita(-1,Z), quando eu retorno a lista. Fica claro se removerem os comentários (%) da frente dos io:format, que é a forma de fazer PPADD (Passei Por Aqui Driven Development) em Erlang.&lt;br />&lt;br />Erlang precisa de MUITA pratica, principalmente de quem nunca programou em uma linguagem funcional e fica tentado a fazer coisas 'não ortodoxas' ;-)&lt;br />&lt;br />Ah sim, o google é seu amigo:&lt;br />&lt;br />http://www.dei.isep.ipp.pt/~paf/orgcdocs/Intro_Erlang.pdf&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>anselmo alves&lt;/div>
&lt;div class='content'>
Para os que quiserem mais informações sobre BDD com Erlang no Giraffas ou até desmistificar o tema, acessem: &lt;A HREF="http://vp.blog.br/" REL="nofollow">2web&lt;/A>.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Exatamente. Mas eu bloguei primeiro }-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
Mas o negócio não é só fazer BDD com Erlang, é fazer BDD com Erlang no Giraffas! Aí sim o bicho pega. Só conheço uma pessoa no mundo capaz de fazer isso.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Uma coisa de cada vez.&lt;BR/>&lt;BR/>Só depois eu descobri que erlang ja tem todas essas funções no módulo lists -- e deve ser até bem mais rápido.&lt;BR/>&lt;BR/>Erlante tem um framework eunit, mas ai fazer BDD com isso são outros 500.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Guilherme Garnier&lt;/div>
&lt;div class='content'>
Legal Pac. Mas vc não explicou como fazer BDD com Erlang no Giraffas...&lt;/div>
&lt;/div>
&lt;/div></description></item></channel></rss>