<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-34099487</id><updated>2009-02-21T13:31:48.276-03:00</updated><title type='text'>Lambda Space</title><subtitle type='html'>A begginer's approach to programming world.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-34099487.post-2578407137384454091</id><published>2007-01-26T14:06:00.000-03:00</published><updated>2007-01-26T14:07:44.961-03:00</updated><title type='text'>E-Books</title><content type='html'>http://lab.lpicn.org/pub/books/&lt;br /&gt;&lt;br /&gt;Eu aproveitei. (Já tinha a maioria dos que me interessavam).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-2578407137384454091?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/2578407137384454091/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=2578407137384454091' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/2578407137384454091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/2578407137384454091'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2007/01/e-books.html' title='E-Books'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-4451375038389084112</id><published>2007-01-23T15:02:00.000-03:00</published><updated>2007-01-23T15:04:18.808-03:00</updated><title type='text'>Mierda</title><content type='html'>Para quem acha que o VB é algo sexy!&lt;br /&gt;&lt;br /&gt;http://www.ddj.com/dept/windows/184403996&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-4451375038389084112?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/4451375038389084112/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=4451375038389084112' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/4451375038389084112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/4451375038389084112'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2007/01/mierda.html' title='Mierda'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-2333215124680038314</id><published>2007-01-03T14:17:00.000-03:00</published><updated>2007-01-03T14:18:57.793-03:00</updated><title type='text'>Limpe o cache do Linux</title><content type='html'>&lt;pre&gt;echo 1 &gt; /proc/sys/vm/drop_caches&lt;br /&gt;&lt;br /&gt;Done it.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-2333215124680038314?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/2333215124680038314/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=2333215124680038314' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/2333215124680038314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/2333215124680038314'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2007/01/limpe-o-cache-do-linux.html' title='Limpe o cache do Linux'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-8032789736333829087</id><published>2007-01-02T12:50:00.000-03:00</published><updated>2007-01-02T12:55:56.490-03:00</updated><title type='text'>Kernel</title><content type='html'>O kernel do Linux tem 4500 arquivos C e Assembly dividido em 270 subdiretórios. São praticamente 2 milhões de linhas de código, que ocupam mais de 58Mb de espaço em disco.&lt;br /&gt;&lt;br /&gt;Não se assuste.&lt;br /&gt;&lt;br /&gt;Windows 2000 = 30 milhões de linhas de código&lt;br /&gt;Netscape Communicator = 17 milhões de linhas de código&lt;br /&gt;&lt;br /&gt;PS: Contagem feita em cima do kernel da série 2.2, já defasado. Agora provavelmente a quantidade de linhas aumentou (provavelmente de forma proporcionalmente menor... visando eficiência).&lt;br /&gt;&lt;br /&gt;Fonte dos números: Understand Linux Kernel -  Terceira Edição&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-8032789736333829087?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/8032789736333829087/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=8032789736333829087' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/8032789736333829087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/8032789736333829087'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2007/01/kernel.html' title='Kernel'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-2822734292527801884</id><published>2006-12-01T10:15:00.000-03:00</published><updated>2006-12-01T10:21:36.885-03:00</updated><title type='text'>Python Challenge Part II</title><content type='html'>http://www.pythonchallenge.com/pc/def/map.html&lt;br /&gt;&lt;br /&gt;Neste desafio, eu estava tentando fazer um código one-line para resolvê-lo e ainda imprimir em formato de string, como frase pronta para ler. Não fui lá muito feliz, o código sofre de um problema crônico :P.&lt;br /&gt;&lt;br /&gt;O range está aí para evitar que traduza o espaço por exemplo. Precisa de melhoras. Alguém se habilita ? Em uma linha, por favor.&lt;br /&gt;&lt;br /&gt;for a in [x for x in map(lambda y: chr(ord(y) + 2),test) if ord(x) in range(67,122)]: print a,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-2822734292527801884?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/2822734292527801884/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=2822734292527801884' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/2822734292527801884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/2822734292527801884'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/12/python-challenge-part-ii.html' title='Python Challenge Part II'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-4376338467718623066</id><published>2006-11-28T21:54:00.000-03:00</published><updated>2006-11-28T21:58:30.288-03:00</updated><title type='text'>PyExcelerator</title><content type='html'>http://sourceforge.net/projects/pyexcelerator&lt;br /&gt;&lt;br /&gt;PyExcelerator. Gera arquivos  no formato Excel. Sem a mínima necessidade de estar no Windows (usando a extensão win32 do Python dá para fazer planilhas utilizando diretament o Excel via componentes COM).&lt;br /&gt;&lt;br /&gt;Eu usei bastanta sob ambiente Unix-Like mesmo e roda no oocalc e no excel de forma transparente. Dá para inserir fórmulas, formatar células, fontes, etc.&lt;br /&gt;&lt;br /&gt;O código é um pouco complicado, usa decorators demais. Ademais, a especificação da planilha do Excel é realmente complicada, tornando o código um tanto obscuro. A documentação é inexistente, vem alguns exemplos e só.&lt;br /&gt;&lt;br /&gt;:)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-4376338467718623066?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/4376338467718623066/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=4376338467718623066' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/4376338467718623066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/4376338467718623066'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/11/pyexcelerator.html' title='PyExcelerator'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-116471911462614865</id><published>2006-11-28T09:58:00.000-03:00</published><updated>2006-11-28T10:05:14.636-03:00</updated><title type='text'>Parser - Um problema às vezes.. (um problema resolvido)</title><content type='html'>SAX - Complicado&lt;br /&gt;PullDom - Simples demais&lt;br /&gt;MiniDom - Ideal&lt;br /&gt;&lt;br /&gt;Use o Tidy e seu wrapper Python uTidyLib (http://utidylib.berlios.de/) para transformar um html mal-formado em bem-formado. E só depois passeie pelo arquivo gerado (com o minidom, de preferência).&lt;br /&gt;&lt;br /&gt;Dica: Nas opções do uTidyLib, sete o DTD manualmente com 'doctype = strict' (onde 'strict' pode ser transitional ou frameset). O padrão é 'auto', o qual coloca o cabeçalho, mas há um bug que em alguma situação isso não ocorre. No meu teste, páginas com o cabeçalho loose.dtd (do html 4) ficavam sem DTD e o parser não funcionava corretamente (pois não sabe como identificar entidades como  )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-116471911462614865?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/116471911462614865/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=116471911462614865' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/116471911462614865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/116471911462614865'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/11/parser-um-problema-s-vezes-um-problema.html' title='Parser - Um problema às vezes.. (um problema resolvido)'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-116378664799986767</id><published>2006-11-17T15:03:00.000-03:00</published><updated>2006-11-17T15:04:08.010-03:00</updated><title type='text'>Who dares ?</title><content type='html'>&lt;a href="http://www.pythonchallenge.com/"&gt;The Python Challenge&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-116378664799986767?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/116378664799986767/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=116378664799986767' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/116378664799986767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/116378664799986767'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/11/who-dares.html' title='Who dares ?'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-116376994942605518</id><published>2006-11-17T10:24:00.000-03:00</published><updated>2006-11-17T10:25:49.436-03:00</updated><title type='text'>HTML Parser</title><content type='html'>You didn't write that awful page. You're just trying to get some data out of it.  Right now, you don't really care what HTML is supposed to look like.  &lt;p&gt;&lt;/p&gt;&lt;p&gt;Neither does this parser.&lt;/p&gt;&lt;p&gt;http://www.crummy.com/software/BeautifulSoup/&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-116376994942605518?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/116376994942605518/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=116376994942605518' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/116376994942605518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/116376994942605518'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/11/html-parser.html' title='HTML Parser'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-116024019492523721</id><published>2006-10-07T13:54:00.000-03:00</published><updated>2006-10-07T13:56:34.933-03:00</updated><title type='text'>Java! :(</title><content type='html'>- O coletor de lixo (garbage collector) do Java não funciona, porquê se funcionasse já teria coletado todos os programas em Java feito até hoje.&lt;br /&gt;&lt;br /&gt;- Dizer que Java é bom porquê funciona em todas as plataformas é como dizer que sexo anal é bom porquê dá pra fazer nos dois gêneros (masculino e feminino).&lt;br /&gt;&lt;br /&gt;aausheaushuahsuehaseseaseuhsuhse!&lt;br /&gt;&lt;br /&gt;http://uncyclopedia.org/wiki/Java&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-116024019492523721?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/116024019492523721/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=116024019492523721' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/116024019492523721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/116024019492523721'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/10/java.html' title='Java! :('/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-116001361216053122</id><published>2006-10-04T22:34:00.000-03:00</published><updated>2006-10-04T23:00:12.180-03:00</updated><title type='text'>Haskell - Awesome!</title><content type='html'>&lt;a style="font-family: courier new;" href="http://en.wikipedia.org/wiki/Fibonacci_sequence"&gt;Sequência Fibonnaci&lt;/a&gt;&lt;span style="font-family: courier new;"&gt; à vista, implementação em C (criando um array com os valores):&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: courier new;"&gt;&lt;span style="font-weight: bold;"&gt;int * fibArray(int n) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    int * fibs;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    fibs = (int *)malloc((sizeof int) * n);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    for (i = 0; i &lt;&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        fibs[i] = a;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        temp = a + b;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        a = b;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        b = temp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    return fibs;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-family: courier new;"&gt;Hum.. um tanto complicado... esse cálculo do tamanho do array não deveria estar aí, isso não é divertido.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;Fun factor = 1&lt;/span&gt;&lt;span style="font-family: courier new;"&gt; (hehe)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Bem, vamos fazer o mesmo em Haskell.&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-weight: bold; font-family: courier new;"&gt;fibs = 0 : 1 : [ a + b | (a, b) &lt;- zip fibs (tail fibs)]&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family: courier new;"&gt;Só isso ? Você me pergunta. Ok, não é só isso, precisamos declarar o tipo:&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-weight: bold; font-family: courier new;"&gt;fibs :: [Int]&lt;/pre&gt;&lt;span style="font-family: courier new;"&gt;Ok. Só isso agora ? Sim, só isso.  É, eu também me assustei quando li esse trecho de código. Meio indigesto. Vamos devagar...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Vamos explicar o "0 : 1 : ..."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Listas em Haskell, são exatamente como em Python:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[2,3,4,5]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;O operador ":" significa 'inclua a esquerda da lista. Ou seja, a instrução:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;1 : [2,3,4,5] retorna uma lista [1,2,3,4,5].&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Ou seja, já entendemos que a lista acima, tem 0 e 1 no começo. Perfeito. A outra parte é bizarra ainda, vamos ver... hum.. ham... é list comprehension! Que segue a seguinte forma em haskell:&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: courier new;"&gt;&lt;span style="font-weight: bold;"&gt;[ func x | x &lt;- list, boolFunc x ]&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family: courier new;"&gt;Aí, é um loop implícito. Vejamos, no nosso exemplo da sequência fibonnaci não tinha nenhuma função booleana dizendo o que deveria ou não ser avaliado. x vem de list (uma suposta lista), e é utilizado em func x se boolFunc x for verdadeiro. Difícil ? Exemplos!&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-weight: bold; font-family: courier new;"&gt;nums :: [Int]&lt;br /&gt;&lt;br /&gt;[ x + 1 | x &lt;- nums ]&lt;br /&gt;= [ 5, 3, 7, 9, 6, 12 ]&lt;br /&gt;&lt;br /&gt;[ x * x | x &lt;- nums, x &lt; 7 ]&lt;br /&gt;= [ 16, 4, 36, 25 ]&lt;br /&gt;&lt;br /&gt;[ 2 * x | x &lt;- 9 : 1 : nums ]&lt;br /&gt;= [ 18, 2, 8, 4, 12, 16, 10, 22 ] &lt;br /&gt;&lt;br /&gt;[ "String" | x &lt;- nums, x &lt; 5 ]&lt;br /&gt;= [ "String", "String" ]  &lt;/pre&gt;&lt;span style="font-weight: normal; font-family: courier new;"&gt;Note que a ordem é preservada, super-importante para o nosso exemplo da sequência Fibonnaci. Agora vamos avaliar a parte mais difícil! :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: normal; font-family: courier new;"&gt;O quê dos infernos é '(a,b)' e 'zip fibs (tail fibs)' ???? Os valores entre parênteses são bem conhecidos de programadores Python (eu incluso), são tuplas! Uma maneira eficiente de se passar um conjunto de valores sem precisar declarar uma estrutura pra isso.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: normal; font-family: courier new;"&gt;o zip é um comando do &lt;/span&gt;&lt;span style="font-style: italic; font-weight: normal; font-family: courier new;"&gt;Prelude&lt;/span&gt;&lt;span style="font-weight: normal; font-family: courier new;"&gt; - biblioteca com as funções de base do Haskell. O zip 'zipa' duas listas juntas com seus valores. Ou seja, a lista resultante de:&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-weight: bold; font-family: courier new;"&gt;zip [ 1, 3, 6, 2 ] [ "duck", "duck", "duck", "goose" ]&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: normal;"&gt;é&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-weight: bold; font-family: courier new;"&gt;[ (1, "duck"), (3, "duck"), (6, "duck"), (2, "goose") ]&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family: courier new;"&gt;Já tail é mais simples, bem direta. Ele tira da lista o primeiro elemento. A lista [1,2,3,4,5] utilizada no tail vira [2,3,4,5]. O zip pega dois argumentos, que são fibs (a lista, como ela é), e uma lista sem o primeiro elemento que é dada pelo '(tail fibs)'. &lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;Notem que o primeiro parâmetro de zip é fibs! Mas fibs é a lista que É DEFINIDA pela expressão! Como pode ?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Oh meu deus do Shell! Continua... :)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-116001361216053122?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/116001361216053122/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=116001361216053122' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/116001361216053122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/116001361216053122'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/10/haskell-awesome.html' title='Haskell - Awesome!'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-116001202712630065</id><published>2006-10-04T22:12:00.000-03:00</published><updated>2006-10-04T23:01:01.920-03:00</updated><title type='text'>Programação Funcional - Parte II (Descrição de linguagens)</title><content type='html'>&lt;span style="font-family: courier new;"&gt;Citação de &lt;/span&gt;&lt;a style="font-family: courier new;" href="http://www.catb.org/%7Eesr/faqs/hacker-howto.html"&gt;How to Become a Hacker&lt;/a&gt;&lt;span style="font-family: courier new;"&gt; (por Eric S. Raymond)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-family: courier new;"&gt;LISP is worth learning for a different reason — the profound enlightenment experience you will have when you finally get it. That experience will make you a better programmer for the rest of your days, even if you never actually use LISP itself a lot.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;Eu posso dizer que ele está certo. É incrível como você muda um pouco os conceitos, abstrai mais o código, deixa de lado coisas que só o computador acha divertido fazer e que não tem nada a ver com o código. Sou iniciante nesta área, mas altamente entusiasmado com as idéias que o paradigma funcional traz. Você talvez nunca use, mas mudará seu jeito de pensar (consequentemente, de programar). 3 diferentes implementações do paradigma funcional - as melhores, ao meu olho de iniciante:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;LISP - &lt;/span&gt;&lt;a style="font-family: courier new;" href="http://clisp.cons.org/"&gt;Implementação Common Lisp&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Haskell - &lt;/span&gt;&lt;a style="font-family: courier new;" href="http://www.haskell.org"&gt;Site Oficial&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Erlang - &lt;/span&gt;&lt;a style="font-family: courier new;" href="http://www.erlang.org"&gt;Site Oficial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Haskell está sendo meu principal expoente nesse novo modo de pensar (novo é relativo a mim, o paradigma é mais velho que o paradigma OO). Haskell pode ser compilada para bytecode, código C e código nativo. Ah, e claro, pode ser interpretada. Poderosissíma! Sofreu influências de Miranda e ML. Haskell tem muitas coisas avançadas que não são achadas em outras linguagens, mas por essas coisas é duramente criticada por fazerem Haskell parecer demasiadamente complexa e complicada.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;LISP alcançou relativa popularidade, devido ao popular editor de textos Emacs. Sim, ele é escrito em LISP. É uma linguagem compilada. Com tipagem forte e dinâmica. Sofreu influências de LISP e Smalltalk.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Erlang tem maior sucesso comercial, foi criado pela Ericsson, que a utiliza até hoje. Passou a ser &lt;/span&gt;&lt;span style="font-style: italic; font-family: courier new;"&gt;open-source&lt;/span&gt;&lt;span style="font-family: courier new;"&gt; em 1998. Extremamente completa no que diz respeito a bibliotecas nativas. É leve e comprovadamente estável. Suporta computação distribuída, suporta &lt;/span&gt;&lt;span style="font-style: italic; font-family: courier new;"&gt;hot swapping&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;. A implementação Ericsson é interpretada, mas também inclui um compilador. Criar e gerenciar processos em Erlang é trivial, onde na maioria das linguagens os processos (ou threads) são considerados complicados e sujeito a erros.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-family: courier new;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-116001202712630065?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/116001202712630065/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=116001202712630065' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/116001202712630065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/116001202712630065'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/10/programao-funcional-parte-ii-descrio.html' title='Programação Funcional - Parte II (Descrição de linguagens)'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-115997169015252051</id><published>2006-10-04T11:17:00.000-03:00</published><updated>2006-10-04T23:01:34.733-03:00</updated><title type='text'>Programação Funcional</title><content type='html'>&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Um novo modo de pensar.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Em linguagens imperativos, atribuir dados é uma operação e é feito em sequência. Na programação funcional (Haskell será o principal expoente aqui, talvez seguido por Erlang que pretendo dar uma olhada) o símbolo '=' significa exatamente o que ele é. Uma variável é igual a seu  valor não somente depois da atribuição, mas em todos os pontos da execução. O grande ponto disso, é que você não precisa guardar o dado para retornar seu valor. Você pode, vamos dizer assim, saber seu  valor antes do tempo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;Exemplos de programação funcional (em Haskell!)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Uma função declarada em C:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;int teste (int num) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;    int result;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;    result = num * 10 + 4;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;    return result;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;# Isso pode ser resumido a:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;int teste (int num) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;    return num * 10 + 4;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;}&lt;/span&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;# A mesma função em Haskell:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;teste num = num * 10 + 4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;# É basicamente isso. Mas ainda falta a declaração do tipo:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;teste :: Int -&gt; Int # Isso significa que teste recebe um int e retorna um int&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Haskell também tem arrays, mas o tipo mais usado é a lista. Uma lista não é guardada em ordem na memória por Haskell (um array é guardado em ordem). Haskell tem habilidades que permite acessar uma lista mais rápido que um array.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Continua....&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-115997169015252051?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/115997169015252051/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=115997169015252051' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/115997169015252051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/115997169015252051'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/10/programao-funcional.html' title='Programação Funcional'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-115931888108695972</id><published>2006-09-26T21:54:00.000-03:00</published><updated>2006-10-04T11:22:33.673-03:00</updated><title type='text'>Common Gotchas Part I</title><content type='html'>&lt;span style="font-family: courier new;font-family:webdings;" &gt;Problemas em Python que parecem deixar o usuário novato encucado (tá, ocasionalmente, experiente também), juntamente da solução deles. São comumente chamados de 'gotchas', uma forma abreviada de 'got you'. Alguns lhe pegam de surpresa quando você está começando, outros são comportamentos esotéricos (jeito bonito de dizer 'bizarro') do Python.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;Atribuição cria referências e não cópias&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Isso pode ser um ''gotcha'' se você não entender como Python referencia variáveis.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;&gt;L = [1,2,3]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;&gt;M = ['X', L, 'Y'] # Coloca uma referência a L&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;&gt;M&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;['X', [1, 2, 3], 'Y']&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;&gt;L[1] = 0 # Muda M também&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;&gt;M&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;['X', [1, 0 ,3], 'Y']&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;Solução&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Este efeito pode se tornar importante em programas grandes, e algumas vezes referências compartilhadas é exatamente o que você quer. Se não são, você pode evitar isso copiando-os explicitamente; para listas, você pode fazer um cópia top-level usando slice sem limites definido.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;&gt;L = [1,2,3]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;&gt;M = ['X', L[:], 'Y'] # Coloca uma cópia de L&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;&gt;M&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;['X', [1, 2, 3], 'Y']&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;&gt;L[1] = 0 # Só muda L, não M&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;&gt;M&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;['X', [1, 2 ,3], 'Y']&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;&gt;L&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[1, 0, 3]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Lembre-se, cópias top-level não copiam listas dentro de listas, por exemplo. Se quiser copiar uma estrutura destas, use o módulo copy padrão.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;Repetição adiciona um nível de profundidade&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Quando sequências são aninhadas, o efeito pode não ser o que você espera. Veja o exemplo a seguir:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;&gt;&gt;&gt;L = [4,5,6]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;&gt;&gt;&gt;X = L * 4   # Como [4,5,6] + [4,5,6] + ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;&gt;&gt;&gt;Y = [L] * 4 # Como [L] + [L] + ... = [L, L, ...]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;&gt;&gt;&gt;X&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;[4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;&gt;&gt;&gt;Y&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;[[4, 5, 6], [4, 5, 6], [4, 5, 6], [4, 5, 6]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Como L foi aninhado na segunda repetição, Y termina colocando referências de volta a lista original referenciada por L e fica passível do mesmo tipo de erro da seção anterior. (ver seção acima)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;Solução&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;A mesma do problema anterior.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;Estruturas de dados cíclicas não podem ser impressas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Se um objeto contêm uma referência a ele mesmo, é chamado de um objeto cíclico. Nas versões de Python anterior a 1.5.1, executar 'print' nesses objetos falhava, pois o 'print' do Python não era esperto o suficiente para reconhecer o ciclo (você via o mesmo texto sendo impresso repetidamente, até você parar a execução). Este caso é detectado agora, mas é bom saber: estraturas cíclicas podem fazer seu código cair em loops inesperados.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: courier new;"&gt;&gt;&gt;&gt;L = ['oi.']; L.append(L) # Faz um append ao mesmo objeto&lt;br /&gt;&gt;&gt;&gt;L                        # Antes da versão 1.5.1, ocorre um loop&lt;br /&gt;                          # infinito&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;Solução&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Simplesmente, não faça isso. Pode haver boas razões para criar ciclos, mas a menos que você tenha código que saiba como manipular isso, você provavelmente não vai querer que seus objetos façam referências a eles mesmos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;Tipos imutáveis não podem ser mudados por índice&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;NÃO DÁ PRA MUDAR TIPOS IMUTÁVEIS PELO ÍNDICE. :D&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;&gt;&gt;&gt;T = (1, 2, 3)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;&gt;&gt;&gt;T[2] = 4         # erro!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;&gt;&gt;&gt;T = T[:2] + (4,) # agora sim!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;Solução&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Construa um novo objeto com slice, concatenação, etc e retorne o valor ao objeto original. Parece ser trabalho adicional, mas a vantagem é que os efeitos colaterais que atingem listas (mutáveis) não atingem tipos imutáveis como strings e tuplas.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:webdings;" &gt;Não espere sempre um resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;Lembrete: operações como list.append() e list.sort() não retornam valor (tá, retornam None). Chame-as sem atribuir a nenhuma variável. É comum que iniciantes façam operações como:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;&gt;&gt;&gt;list = list.append(X)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:webdings;" &gt;E pensam que list contém a nova lista. De fato, perderam a referência para 'list', pois 'list' fica com valor 'None'.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-115931888108695972?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/115931888108695972/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=115931888108695972' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/115931888108695972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/115931888108695972'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/09/common-gotchas-part-i.html' title='Common Gotchas Part I'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-115928146868749418</id><published>2006-09-26T11:35:00.000-03:00</published><updated>2006-09-26T11:37:48.703-03:00</updated><title type='text'>Perl Info</title><content type='html'>Pra quem sempre quis aprender/ver um pouco de Perl e sempre teve preguiça de catar no google.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.perlmonks.org/index.pl?node_id=284175"&gt;Where and how to start learning Perl&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No complaining, now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-115928146868749418?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/115928146868749418/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=115928146868749418' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/115928146868749418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/115928146868749418'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/09/perl-info.html' title='Perl Info'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-115923638026636673</id><published>2006-09-25T22:55:00.000-03:00</published><updated>2006-09-25T23:12:24.053-03:00</updated><title type='text'>Frustração</title><content type='html'>Bem, a cada dia o PHP me decepciona mais e mais na sua falta de poder de fogo. :(&lt;br /&gt;&lt;br /&gt;Python é realmente poderoso. Perl também, e pode ser concisa demais (e bagunçada demais também, na maioria dos casos).&lt;br /&gt;&lt;br /&gt;Python 2.5 saiu!&lt;br /&gt;&lt;br /&gt;http://www.python.org/download/releases/2.5/highlights/&lt;br /&gt;&lt;br /&gt;E enquanto isso, sigo estudando (ou tentando estudar).&lt;br /&gt;&lt;br /&gt;A OO do PHP é péssima (e isso é eufemismo). Tudo que se faz em PHP visando reusabilidade e manutencionabilidade reduz-se a lixo. É super fácil e pode ser muito produtiva... mas por outro lado.. bem, é uma faca de dois gumes. Pelo jeito, PHP não foi criado para ser bonito. A resposta padrão dos programadores PHP é que de qualquer jeito, PHP funciona.&lt;br /&gt;&lt;br /&gt;Hoje mesmo, estava vendo como a linguagem tem um sistema de segurança fraco, deixa por padrão passar erros que em outras linguagens seriam fatais. (Programadores PHP, liguem seu error_reporting em E_ALL!)&lt;br /&gt;&lt;br /&gt;Espero estar trabalhando com Python (tá.. serve Perl ou C) em breve.&lt;br /&gt;&lt;br /&gt;Aprender nunca é demais.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-115923638026636673?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/115923638026636673/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=115923638026636673' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/115923638026636673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/115923638026636673'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/09/frustrao.html' title='Frustração'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34099487.post-115777584539713596</id><published>2006-09-09T01:00:00.000-03:00</published><updated>2006-09-09T01:39:58.506-03:00</updated><title type='text'>Instalação do Psycopg</title><content type='html'>Bem, me disseram (e li) que o psycopg consegue ser melhor que o pygresql, popy e mais outro que não lembro o nome exatamente. Realmente, pelo que ando lendo parece ser bem melhor, do ponto de vista técnico (e é isso que importa, não ?). Ele é multithreading e segue a especificação DP-API 2.0, pra citar algumas vantagens.&lt;br /&gt;&lt;br /&gt;O psycopg suporta multithreading, o que é vantajoso em ambientes como o CherrPy, onde no qual se ele não fosse multithreading, não se torna possível compartilhar a mesma conexão entre 10 threads diferentes por exemplo. Cada thread teria sua conexão, o que pode não ser um problema num ambiente de pequeno uso. Mas imagina 5000 threads ? :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://initd.org/pub/software/psycopg/psycopg2-2.0.5.1.tar.gz"&gt;Aqui&lt;/a&gt; você pega o psycopg em sua última versão lançada. (2.0.51).&lt;br /&gt;&lt;br /&gt;Se o Postgre não estiver no PATH do sistema (aqui no Slack 11, não colocou por padrão), sete no setup.cfg (depois de ter descompactado) a variável pg_config com o caminho do pg_config (usualmente, /usr/local/pgsql/bin/pg_config).&lt;br /&gt;&lt;br /&gt;The show:&lt;br /&gt;&lt;br /&gt;python setup.py install&lt;br /&gt;&lt;br /&gt;Or:&lt;br /&gt;&lt;br /&gt;easy_install .&lt;br /&gt;# dentro do diretório do psycopg, claro.&lt;br /&gt;&lt;br /&gt;Um erro interessante que deu aqui, foi acusar a falta da libpq.so.4. Ela está na sua pasta do pgsql/lib.&lt;br /&gt;&lt;br /&gt;Coloque ela no /etc/ld.so.conf e rode o ldconfig pra linkar as bibliotecas. Agora sim.&lt;br /&gt;&lt;br /&gt;Pode ir no python e digitar&lt;br /&gt;&lt;br /&gt;import psycopg2&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34099487-115777584539713596?l=lambdaspace.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaspace.blogspot.com/feeds/115777584539713596/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34099487&amp;postID=115777584539713596' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/115777584539713596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34099487/posts/default/115777584539713596'/><link rel='alternate' type='text/html' href='http://lambdaspace.blogspot.com/2006/09/instalao-do-psycopg.html' title='Instalação do Psycopg'/><author><name>Nicholas Amorim</name><uri>http://www.blogger.com/profile/02828954807738846189</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11282073312337315679'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry></feed>