<?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' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-14325535</id><updated>2012-02-03T11:43:54.838-08:00</updated><category term='linux'/><category term='xfs'/><category term='administração'/><category term='Lucid Inc'/><category term='filesystem'/><category term='opengl'/><category term='mathematic'/><category term='cl-randist'/><category term='empresas'/><category term='random'/><category term='macros'/><category term='graphics'/><category term='change'/><category term='q'/><category term='statistics'/><category term='reiserfs'/><category term='random varible'/><category term='symbolic'/><category term='Lisp'/><category term='clim'/><category term='user-interface'/><category term='reposiviness'/><title type='text'>Varuzza on Lisp</title><subtitle type='html'>Informações e comentários sobre Lisp.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>62</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14325535.post-2228366488788246364</id><published>2009-05-27T18:12:00.000-07:00</published><updated>2009-05-27T18:17:52.483-07:00</updated><title type='text'>Começando a molhar os pés com Clojure</title><content type='html'>Para comemorar a versão 1.0 do &lt;a href="http://www.pragprog.com/titles/shcloj/programming-clojure"&gt;livro&lt;/a&gt; sobre &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; resolvi voltar a estudar a linguagem.&lt;br /&gt;&lt;br /&gt;Quando se começa uma nova linguagem é sempre difícil achar uma configuração de ambiente que seja confortável. Para common lisp a escolha é simples, slime é a melhor opção, porém, para qualquer linguagem que envolve a JVM é preciso pesar bem o uso de uma IDE estabelecida para java.&lt;br /&gt;&lt;br /&gt;Para NetBeans existe o plugin &lt;a href="http://www.enclojure.org/"&gt;enclojure&lt;/a&gt;, que funciona com o &lt;a href="http://www.netbeans.org/next/"&gt;NetBeans 6.5&lt;/a&gt;. Ao instala-lo tive duas boas surpresas: a qualidade gráfica do NetBeans, que está com belas fontes com anti-aliasing e a segunda foi o fato do plugin em estágio alpha estar funcionando com REPL e tudo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-2228366488788246364?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/2228366488788246364/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=2228366488788246364' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/2228366488788246364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/2228366488788246364'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2009/05/comecando-molhar-os-pes-com-clojure.html' title='Começando a molhar os pés com Clojure'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-8796046473080631194</id><published>2009-05-19T20:23:00.000-07:00</published><updated>2009-05-19T20:26:08.055-07:00</updated><title type='text'>Forth, Lisp e 8 bits</title><content type='html'>Forth é feito para  maquinas pequenas. De uma olhada no código fonte em assembly dessa versão de forth:&lt;br /&gt;&lt;br /&gt;http://www.annexia.org/_file/jonesforth.s.txt&lt;br /&gt;&lt;br /&gt;Eles criaram uma maneira de eliminar o call de forma a economizar alguns bytes por chamada de função. Forth é muito legal. Vale sempre lembrar que foi feita uma versão para atari:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;http://www.pelulamu.net/viznut/blog/2007-05-26/atari-forth-small.jpg&lt;br /&gt;&lt;br /&gt;O lisp já tem outra filosofia, ele foi criado para fazer manipulação simbólica. Não faz muito sentido um lisp de 8, bits porque cada palavra da alocada possui alguns bits como tag de tipo. Tanto é assim, que o principal computador na época aurea do lisp era o &lt;a href="http://www.inwap.com/pdp10/"&gt;PDP-10&lt;/a&gt; que tinha 36 bits, portanto dava para usar 4 bits para tagging e sobravam 32 bitrts para armazenar os valores.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-8796046473080631194?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/8796046473080631194/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=8796046473080631194' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/8796046473080631194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/8796046473080631194'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2009/05/forth-lisp-e-8-bits.html' title='Forth, Lisp e 8 bits'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-7569487327972306677</id><published>2009-05-08T03:49:00.000-07:00</published><updated>2009-05-08T03:50:57.785-07:00</updated><title type='text'>Brief Incomplete and Mostly Wrong history of programming languages</title><content type='html'>Muito divertido esse post:&lt;br /&gt;&lt;br /&gt;http://james-iry.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html&lt;br /&gt;&lt;br /&gt;Especialmente para quem conhece a história do Lisp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-7569487327972306677?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/7569487327972306677/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=7569487327972306677' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/7569487327972306677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/7569487327972306677'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html' title='Brief Incomplete and Mostly Wrong history of programming languages'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-6074463774882152671</id><published>2008-10-14T13:30:00.000-07:00</published><updated>2008-10-23T18:55:45.221-07:00</updated><title type='text'>Aprendendo Scala</title><content type='html'>Estou aprendendo a &lt;a href="http://www.scala-lang.org/"&gt;linguagem de programação Scala&lt;/a&gt;, que é uma linguagem de programação funcional estaticamente tipada que gera código para a JVM e para .NET.&lt;br /&gt;&lt;br /&gt;Scala é bastante elegante, com várias novidades no tratamento da tipagem que tornam a linguagem muito menos verborrágica que o java. A sintaxe para criar closures é particularmente elegante: x =&gt; expr&lt;br /&gt;&lt;br /&gt;Porém, já descobri algumas coisas que eu estou sentindo falta:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; Multiple values return: Em scala é possível retornar uma n-tupla, mas não é a mesma coisa, não é possível ignorar os valores secundários da função como no lisp, e especialmente, não existe a construção multiple-values-bind.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Geração dinâmica de classes. É impressionante como é difícil fazer ORM em uma linguagem estática. Não existe nada no hibernate que permita fazer uma introspeção no banco e gerar o código da classes automaticamente, como o rails e o cakephp fazem. É preciso fazer uso de um gerador de código estático como o salto-db (ugle).&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Update:&lt;/i&gt; É possível fazer multiple-value-bind em scala:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;val (a,b) = (1,2)&lt;br /&gt;a: Int = 1&lt;br /&gt;b: Int = 2&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/14325535-6074463774882152671?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/6074463774882152671/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=6074463774882152671' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/6074463774882152671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/6074463774882152671'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/10/aprendendo-scala.html' title='Aprendendo Scala'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-1147295728959576435</id><published>2008-10-06T10:59:00.001-07:00</published><updated>2008-10-06T10:59:25.290-07:00</updated><title type='text'>13949712720901ForOSX</title><content type='html'>&lt;a href="http://blogs.sun.com/bblfish/entry/vote_for_java6_on_leopard"&lt;br /&gt;&gt;Java  1.6 for OS x&lt;/a&gt;!!!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;13949712720901ForOSX&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-1147295728959576435?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/1147295728959576435/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=1147295728959576435' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/1147295728959576435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/1147295728959576435'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/10/13949712720901forosx.html' title='13949712720901ForOSX'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-1868261431327360054</id><published>2008-08-17T20:41:00.000-07:00</published><updated>2008-08-17T20:53:17.427-07:00</updated><title type='text'>Testanto o rucksack</title><content type='html'>&lt;a hef="http://common-lisp.net/project/elephant/"&gt;Elephant&lt;/a&gt; é uma biblioteca para persistência de dados em Common Lisp construída em cima do &lt;a href="http://www.oracle.com/technology/products/berkeley-db/index.html"&gt;BerkeleyDB&lt;/a&gt;. A biblioteca tem uma boa documentação e uma comunidade de usuários e mantenedores ativa, porém, eu não consigo fazer ela funcionar no Linux 64 bits (No Mac 32 bits funciona). Já escrevi para a lista deles e nenhuma resposta. É um bug na invocação da função em C db-env-create da BerkeleyDB. Tentei eu mesmo debugar o código do elephant, mas não foi para frente.&lt;br /&gt;&lt;br /&gt;Resolvi uma nova abordagem, hoje eu testei a biblioteca &lt;a href="http://common-lisp.net/project/rucksack/"&gt;Rucksack&lt;/a&gt;. É um código menos maduro que o Elephant e aparentemente só um desenvolvedor o mantém, no entanto, o Rucksack não depende de nenhum código em C, é uma implementação de persistência totalmente feita em Common Lisp, inclusive com indexação por B-Tree. O desempenho me pareceu bom, consegui inserir mais de 26 mil registros em aproximadamente 140 segundos no MacBook.&lt;br /&gt;&lt;br /&gt;É muito bonito fazer tudo isso sem sair do Lisp. Essa biblioteca parece ter um grande potencial, por exemplo, uma linguagem de queries OOP ou baseada em Prolog iria ser muito legal (uma espécie de AllegroCache Free software).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-1868261431327360054?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/1868261431327360054/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=1868261431327360054' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/1868261431327360054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/1868261431327360054'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/08/testanto-o-rucksack.html' title='Testanto o rucksack'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-8339636397702905232</id><published>2008-07-29T13:54:00.000-07:00</published><updated>2008-07-29T14:03:39.809-07:00</updated><title type='text'>XEmacs no windows</title><content type='html'>No windows é melhor utilizar o XEmacs do que o GNU Emacs. Além dele possuir um &lt;a href="http://www.xemacs.org/Download/win32/"&gt;instalador legal&lt;/a&gt;, ele reenderiza as fontes melhor que a versão do Stallman.&lt;br /&gt;&lt;br /&gt;Uma curiosidade é que o XEmacs é um fork do GNU Emacs feito pela Lucid na esperança de escapar da falência após o AI Winter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-8339636397702905232?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/8339636397702905232/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=8339636397702905232' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/8339636397702905232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/8339636397702905232'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/07/xemacs-no-windows.html' title='XEmacs no windows'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-292410410959068315</id><published>2008-07-27T07:30:00.001-07:00</published><updated>2008-07-27T07:33:20.508-07:00</updated><title type='text'>Windows Vista</title><content type='html'>Logo que o vista eu o testei brevemente. Minha primeira impressão havia sido péssima, o sistema me pareceu lento e kitsch, muito pior que o XP.&lt;br /&gt;&lt;br /&gt;Ontem eu tentei novamente e minha impressão mudou completamente. Não sei se é porque eu testei em uma máquina nova, mais rápida e com monitor LCD widescreen, o use é porque o Vista SP1 esta muito melhor que o original, o fato é a minha impressão sobre o Vista mudou fortemente, atualmente eu o acho melhor que o XP (mas ainda não é um Mac OS X).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-292410410959068315?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/292410410959068315/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=292410410959068315' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/292410410959068315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/292410410959068315'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/07/windows-vista.html' title='Windows Vista'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-1605101738385398911</id><published>2008-07-15T05:09:00.000-07:00</published><updated>2008-07-15T05:18:23.787-07:00</updated><title type='text'>A biblioteca mpfr</title><content type='html'>Acabei de descobrir (na lista do GMP) a biblioteca &lt;a href=""&gt;mpfr&lt;/a&gt; (feita pela INRIA, provavelmente quer dizer MP france). Esta biblioteca é uma extensão do GMP, que adiciona regras de arredondamento e funções transcedentais. &lt;br /&gt;&lt;br /&gt;As regras de arredondamento tem como objetivo retornar resultados com todos os digitos significativos, de maneira similar ao mathematica. Tenho a impressão que o mpfr é muito mais adequado para aplicações matemáticas do que o GMP.&lt;br /&gt;&lt;br /&gt;Agora preciso adapter o cl-mpfloat para utilizar o mpfr.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-1605101738385398911?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/1605101738385398911/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=1605101738385398911' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/1605101738385398911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/1605101738385398911'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/07/biblioteca-mpfr.html' title='A biblioteca mpfr'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-149718291226444552</id><published>2008-07-13T18:38:00.001-07:00</published><updated>2008-07-13T18:40:28.832-07:00</updated><title type='text'>Sempre tem um comando para você</title><content type='html'>Para formatar o valor de pi que aparece no post anterior, eu descobri um novo comando do unix: fold. Ele quebra linhas muito longas em linhas com 80 colunas, ou outro valor especificado com a opção -w.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-149718291226444552?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/149718291226444552/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=149718291226444552' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/149718291226444552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/149718291226444552'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/07/sempre-tem-um-comando-para-voc.html' title='Sempre tem um comando para você'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-4047039414403412353</id><published>2008-07-13T18:07:00.000-07:00</published><updated>2008-07-13T18:37:44.045-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='q'/><title type='text'>Calculando pi em lisp</title><content type='html'>O método de &lt;a href="http://en.wikipedia.org/wiki/Brent-Salamin_algorithm"&gt;Brent-Salamin (ou Gauss-Legendre)&lt;/a&gt; é um algoritmo muito simples para calcular o valor de pi (não sei se é o mais eficiente).&lt;br /&gt;&lt;br /&gt;O problema de calcular qualquer uma dessas constates é lidar com a precisão de máquina, não é possível calcular pi com mais de algumas casas decimais usando as operações de ponto flutuante do processador.&lt;br /&gt;&lt;br /&gt;Infelizmente, ao contrário do CLISP, o SBCL não tem a capacidade de lidar com números de precisão arbitrária, por isso eu fiz um cffi binding para as funções para float de precisão arbitraria da biblioteca &lt;a href="http://gmplib.org/"&gt;GMP&lt;/a&gt; (GNU Multiple Precision Arithmetic Library). O código esta disponível via git: &lt;a href="http://www.lambdatau.com/git/cl-mpfloat/"&gt;http://www.lambdatau.com/git/cl-mpfloat.git&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Além do binding, eu fiz um wrapper em CLOS para simplificar o uso. A performance não é nada espetacular, o programa demora 2.7s para calcular pi com 300 mil casas decimais, mas é prático.&lt;br /&gt;&lt;br /&gt;Talvez uma DSL para compilar as expressões aritméticas em chamadas a biblioteca, de forma a minimizar a alocação de valores, melhore a performance.&lt;br /&gt;&lt;br /&gt;Segue a primeira página do valor calculado:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;3.141592653589793238462643383279502884197169399375&lt;br /&gt;10582097494459230781640628620899862803482534211706&lt;br /&gt;79821480865132823066470938446095505822317253594081&lt;br /&gt;28481117450284102701938521105559644622948954930381&lt;br /&gt;96442881097566593344612847564823378678316527120190&lt;br /&gt;91456485669234603486104543266482133936072602491412&lt;br /&gt;73724587006606315588174881520920962829254091715364&lt;br /&gt;36789259036001133053054882046652138414695194151160&lt;br /&gt;94330572703657595919530921861173819326117931051185&lt;br /&gt;48074462379962749567351885752724891227938183011949&lt;br /&gt;12983367336244065664308602139494639522473719070217&lt;br /&gt;98609437027705392171762931767523846748184676694051&lt;br /&gt;32000568127145263560827785771342757789609173637178&lt;br /&gt;72146844090122495343014654958537105079227968925892&lt;br /&gt;35420199561121290219608640344181598136297747713099&lt;br /&gt;60518707211349999998372978049951059731732816096318&lt;br /&gt;59502445945534690830264252230825334468503526193118&lt;br /&gt;81710100031378387528865875332083814206171776691473&lt;br /&gt;03598253490428755468731159562863882353787593751957&lt;br /&gt;78185778053217122680661300192787661119590921642019&lt;br /&gt;89380952572010654858632788659361533818279682303019&lt;br /&gt;52035301852968995773622599413891249721775283479131&lt;br /&gt;51557485724245415069595082953311686172785588907509&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Alguém esta vendo alguma mensagem oculta ai?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-4047039414403412353?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/4047039414403412353/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=4047039414403412353' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/4047039414403412353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/4047039414403412353'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/07/calculando-pi-em-lisp.html' title='Calculando pi em lisp'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-4237593557543848808</id><published>2008-05-29T19:32:00.000-07:00</published><updated>2008-05-29T19:37:34.625-07:00</updated><title type='text'>Animação com o cl-opengl</title><content type='html'>Ontem de noite eu adaptei um exemplo do livro OpenGL SuperBible para o lisp. É um programinha que desenha um retângulo que fica andando na tela. Com ajuda do Luís Oliveira eu consegui uasr o evento de tick para controlar a velocidade da animação.&lt;br /&gt;&lt;br /&gt;Eu adicionei um efeito com a cor, ela vai mudando conforme o triangulo anda pela tela. Assim o programa fica um pouco menos simplório.&lt;br /&gt;&lt;br /&gt;O programa segue abaixo.&lt;br /&gt;&lt;br /&gt;&lt;verbatim&gt;&lt;br /&gt;;;&lt;br /&gt;;; Bounce Rectangles&lt;br /&gt;;;&lt;br /&gt;;; Adapted from OpenGL Superbible pg. 62&lt;br /&gt;;;&lt;br /&gt;&lt;br /&gt;(declaim (optimize (speed 3) (debug 0) (safety 0)))&lt;br /&gt;&lt;br /&gt;(eval-when (:load-toplevel :compile-toplevel)&lt;br /&gt;  (asdf:oos 'asdf:load-op :cl-glut))&lt;br /&gt;&lt;br /&gt;(defclass bounce-window (glut:window)&lt;br /&gt;  ((x :initform 0)&lt;br /&gt;   (y :initform 0)&lt;br /&gt;   (range :initform 100.0)&lt;br /&gt;   (window-height :initform 100.0)&lt;br /&gt;   (window-width :initform 100.0)&lt;br /&gt;   (size :initform 10)&lt;br /&gt;   (xstep :initform 2)&lt;br /&gt;   (ystep :initform 3)&lt;br /&gt;   (terminated  :accessor terminated :initform nil))&lt;br /&gt;&lt;br /&gt;  (:default-initargs &lt;br /&gt;    ;; Call tick event every 25 milis (approx.)&lt;br /&gt;    :tick-interval 25&lt;br /&gt;    :width 600 :height 400 :pos-x 100 :pos-y 100&lt;br /&gt;    :mode '(:double :rgb) :title "Bounce Rectangles"))&lt;br /&gt;&lt;br /&gt;(defgeneric color (self color x y))&lt;br /&gt;&lt;br /&gt;(defmethod glut:reshape ((win bounce-window) w h)  &lt;br /&gt;  (gl:viewport 0 0 w h)&lt;br /&gt;  (gl:matrix-mode :projection)&lt;br /&gt;  (gl:load-identity)&lt;br /&gt;  (with-slots (range window-height window-width) win&lt;br /&gt;    (let ((aspect-ratio (/ (float w) (float h))))&lt;br /&gt;      (declare (float aspect-ratio))&lt;br /&gt;      (if (&lt;= w h)&lt;br /&gt;   (progn &lt;br /&gt;     (setf window-height (/ range aspect-ratio))&lt;br /&gt;     (setf window-width range)&lt;br /&gt;     (gl:ortho (- range) range (- window-height) window-height range (- range)))&lt;br /&gt;   (progn&lt;br /&gt;     (setf window-height range)&lt;br /&gt;     (setf window-width (* range aspect-ratio))&lt;br /&gt;     (gl:ortho (- window-width) window-width (- range) range  range (- range))))))&lt;br /&gt;  (gl:matrix-mode :modelview)&lt;br /&gt;  (gl:load-identity))&lt;br /&gt;&lt;br /&gt;;; Calculated color by (x,y)&lt;br /&gt;(defmethod color ((self bounce-window) color x y)&lt;br /&gt;  (with-slots (window-width window-height) self&lt;br /&gt;    (let ((alpha (/ (* 2 (abs x)) window-width))&lt;br /&gt;   (beta  (/ (* 2 (abs y)) window-height)))&lt;br /&gt;    (case color&lt;br /&gt;      (R alpha)&lt;br /&gt;      (B beta )&lt;br /&gt;      (G (- alpha) beta)))))&lt;br /&gt;&lt;br /&gt;;; Change the vertex color according to (x, y)&lt;br /&gt;(defmethod color-vertex ((self bounce-window) x y)&lt;br /&gt;  (gl:color (color self 'R x y) (color self 'G x y) (color self 'B x y))&lt;br /&gt;  (gl:vertex x y))&lt;br /&gt;  &lt;br /&gt;(defmethod glut:display ((self bounce-window))&lt;br /&gt;  (gl:clear :color-buffer)&lt;br /&gt;  (with-slots (x y xstep ystep size) self&lt;br /&gt;    (gl:begin :polygon)&lt;br /&gt;    (color-vertex self (- x size) (- y size))&lt;br /&gt;    (color-vertex self (+ x size) (- y size))&lt;br /&gt;    (color-vertex self (+ x size) (+ y size))&lt;br /&gt;    (color-vertex self (- x size) (+ y size))&lt;br /&gt;    (gl:end))&lt;br /&gt;  (glut:swap-buffers))&lt;br /&gt;&lt;br /&gt;;; Update rectangle position&lt;br /&gt;(defmethod glut:tick ((self bounce-window))&lt;br /&gt;  (with-slots (x y xstep ystep size range terminated window-width window-height) self&lt;br /&gt;    (incf x xstep)&lt;br /&gt;    (incf y ystep)&lt;br /&gt;    &lt;br /&gt;    (when (&gt; (+ (abs x) size) window-width)&lt;br /&gt;      (setf xstep (- xstep)))&lt;br /&gt;&lt;br /&gt;    (when (&gt; (+ (abs y) size) window-height)&lt;br /&gt;      (setf ystep (- ystep)))&lt;br /&gt;&lt;br /&gt;    ;; Check bound. THis is in case the window is made&lt;br /&gt;    ;; smaller while rectangel is bouncing and the &lt;br /&gt;    ;; rectangle suddenly find itself outside the new &lt;br /&gt;    ;; clipping volume&lt;br /&gt;    (if (&gt; x (+ window-width (- size) xstep))&lt;br /&gt; (setf x (+ window-width (- size) -1))&lt;br /&gt; (if (&lt; x (- (+ window-width xstep)))&lt;br /&gt;     (setf x (- (+ window-width 1)))))&lt;br /&gt;&lt;br /&gt;    (if (&gt; y (+ window-height (- size) ystep))&lt;br /&gt; (setf y (+ window-height (- size) -1))&lt;br /&gt; (if (&lt; y (- (+ window-height ystep)))&lt;br /&gt;     (setf y (- (+ window-height 1)))))&lt;br /&gt;&lt;br /&gt;    ;; Don't post-redisplay if window is closed (otherwise crash sbcl)&lt;br /&gt;    (if (not terminated)&lt;br /&gt; (glut:post-redisplay))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(defmethod glut:keyboard ((win bounce-window) key x y)&lt;br /&gt;  (declare (ignore x y))&lt;br /&gt;  (when (or (eql key #\Esc) (eql key #\q))&lt;br /&gt;    (glut:close win)))&lt;br /&gt;&lt;br /&gt;(defmethod glut:close ((win bounce-window))&lt;br /&gt;  (glut:disable-tick win)&lt;br /&gt;  (setf (terminated win) t)&lt;br /&gt;  (glut:destroy-current-window))&lt;br /&gt;&lt;br /&gt;(defun bounce-rectangle ()&lt;br /&gt;  (let ((win (make-instance 'bounce-window)))&lt;br /&gt;    (glut:display-window  win)))&lt;br /&gt;&lt;/verbatim&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-4237593557543848808?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/4237593557543848808/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=4237593557543848808' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/4237593557543848808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/4237593557543848808'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/05/animao-com-o-cl-opengl.html' title='Animação com o cl-opengl'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-4635040513998012980</id><published>2008-05-28T21:23:00.001-07:00</published><updated>2008-05-28T21:23:56.141-07:00</updated><title type='text'>Closures versus objetos</title><content type='html'>Closures são entidades fluidas, eles podem aparecer e desaparecer sem que ninguém perceba. Já os objetos, possuem uma enorme plaquinha com o nome deles e a família à qual pertencem e telefone para ligar caso eles se percam.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-4635040513998012980?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/4635040513998012980/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=4635040513998012980' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/4635040513998012980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/4635040513998012980'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/05/closures-versus-objetos.html' title='Closures versus objetos'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-580018458564434337</id><published>2008-05-14T04:00:00.000-07:00</published><updated>2008-05-14T04:20:16.171-07:00</updated><title type='text'>Programadores humanistas</title><content type='html'>Peter Seibel escreveu o excelente &lt;a href="http://gigamonkeys.com/book/"&gt; Practical Common Lisp&lt;/a&gt;. Em uma palestra ministrada no google ele diz que se formou em letras, mas como ele sabia programar acabou indo trabalhar na WebLogic, empresa que fez um dos primeiros application server para java.&lt;br /&gt;&lt;br /&gt;Tim O'Really também é formado em letras, ele começou escrevendo manuais técnicos com um amigo e hoje é um guru que da palestras sobre web, programação, etc. Mitchell Kapor estudou psicologia, linguistica e computação na universidade, ele criou o Lotus 1-2-3 ficou rico e agora é venture capitalist.&lt;br /&gt;&lt;br /&gt;Nos três casos eu fiqeui surpreso de ver grandes programadores com formação em humanas. Mas pensando melhor no assunto isso me parece resultado da formação menos rígida que se tem nas universidades americanas. No Brasil é preciso escolher o curso antes de entrar na universidade, nos EUA entra-se na universidade e após fazer uma série de cursos obrigatórios para todos se escolhe um "major", que é a disciplina na qual o aluno vai se especializar.&lt;br /&gt;&lt;br /&gt;Eu sempre achei a abordagem americana estranha, mas vendo esses exemplos mudei de opnião.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-580018458564434337?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/580018458564434337/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=580018458564434337' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/580018458564434337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/580018458564434337'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/05/programdores-humanistas.html' title='Programadores humanistas'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-7167209238874565463</id><published>2008-05-08T13:48:00.000-07:00</published><updated>2008-05-08T13:57:59.617-07:00</updated><title type='text'>A new function a day</title><content type='html'>Estou fazendo um simulação que calcula um determinado valor para diversos valores de y. A cada passo eu salvo o valor de y e f(y) em um arquivo para depois construir um gráfico.&lt;br /&gt;&lt;br /&gt;Porém, quando y fica muito grande a simulação come toda a memória e eu tenho que matar o lisp. Após matar o lisp olho para o arquivo gerado e vejo que ele esta vázio pois o buffer do arquivo não havia sido preenchido nenhuma vez. &lt;br /&gt;&lt;br /&gt;Após alguns momentos de raiva eu pesquiso por flush com o apropos. Encontro esta função&lt;br /&gt;&lt;br /&gt;  (sb-int::flush-standard-output-streams)&lt;br /&gt;&lt;br /&gt;Nenhuma documentação sobre ele, porém faz o que eu preciso, além dos valores no arquivo eu agora consigo imprimir um monitor para acompanhar o andamento do programa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-7167209238874565463?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/7167209238874565463/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=7167209238874565463' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/7167209238874565463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/7167209238874565463'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/05/new-function-day.html' title='A new function a day'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-4874055210637318170</id><published>2008-04-09T20:39:00.000-07:00</published><updated>2008-04-09T20:48:44.381-07:00</updated><title type='text'>Garamond no TeX</title><content type='html'>Garamond é uma ótima fonte, boa alternativa para variar do Computer Modern.&lt;br /&gt;&lt;br /&gt;Quem quiser usar o Garamond no LaTeX deve ir para este link:&lt;br /&gt;&lt;br /&gt;http://gael-varoquaux.info/computers/garamond/index.html&lt;br /&gt;&lt;br /&gt;Existem outros pacotes com a configuração do Garamond para LaTeX, mas este é o que funcionou melhor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-4874055210637318170?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/4874055210637318170/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=4874055210637318170' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/4874055210637318170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/4874055210637318170'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/04/garamond-no-tex.html' title='Garamond no TeX'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-1276142922037138879</id><published>2008-03-30T16:39:00.000-07:00</published><updated>2008-03-30T17:18:11.492-07:00</updated><title type='text'>Pure Lisp on X</title><content type='html'>Um projeto antigo e interessante é o clx, uma implementação do X protocol em Lisp. Nada mais simples para fazer programação gráfica, ele abre um socket com o xserver e manda ver, sem FFI, sem bibliotecas em C, pure lisp on X.&lt;br /&gt;&lt;br /&gt;A implementação que funcinou no SBCL (1.0.15) foi a que esta disponível através de:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  darcs get http://common-lisp.net/~crhodes/clx&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Funciona tanto no Linux quanto no OS X.&lt;br /&gt;&lt;br /&gt;Eu fiz um pequeno exemplo que utiliza a minha biblioteca cl-randist. Para executar é preciso pegar a ultima versão com o git:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  git clone http://lambdatau.com/git/cl-randist&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Depois de instalar as duas bibliotecas, não se esqueça de atualizar os links para o asdf.&lt;br /&gt;&lt;br /&gt;O código do programa esta abaixo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(eval-when (:compile-toplevel)&lt;br /&gt;  (require 'clx)&lt;br /&gt;  (require 'cl-randist)&lt;br /&gt;  (defpackage #:xgauss&lt;br /&gt;    (:use #:cl #:xlib :randist)&lt;br /&gt;    (:export run)))&lt;br /&gt;&lt;br /&gt;(in-package :xgauss)&lt;br /&gt;&lt;br /&gt;(defun run (&amp;key (width 400) (height 400)  (host ""))&lt;br /&gt;  (let* ((display (xlib:open-display host))&lt;br /&gt;  (screen (first (xlib:display-roots display)))&lt;br /&gt;  (black (xlib:screen-black-pixel screen))&lt;br /&gt;  (white (xlib:screen-white-pixel screen))&lt;br /&gt;  (root-window (xlib:screen-root screen))&lt;br /&gt;&lt;br /&gt;  (points (loop for i from 0 to 10000&lt;br /&gt;      collect (cons&lt;br /&gt;        (floor (random-normal (/ width 2) (/ width 10)))&lt;br /&gt;        (floor (random-normal (/ height 2) (/ height 10))))))&lt;br /&gt;       &lt;br /&gt;  (gc (xlib:create-gcontext&lt;br /&gt;     :drawable root-window&lt;br /&gt;     :foreground black&lt;br /&gt;     :background white))&lt;br /&gt;&lt;br /&gt;  (my-window (xlib:create-window&lt;br /&gt;       :parent root-window&lt;br /&gt;       :x 0&lt;br /&gt;       :y 0&lt;br /&gt;       :width width&lt;br /&gt;       :height height&lt;br /&gt;       :background white&lt;br /&gt;       :event-mask (xlib:make-event-mask :exposure&lt;br /&gt;             :button-press))))&lt;br /&gt;    (xlib:map-window my-window)&lt;br /&gt;    (xlib:event-case (display :force-output-p t&lt;br /&gt;         :discard-p t)&lt;br /&gt;      (:exposure ()&lt;br /&gt;   (dolist (pt points)&lt;br /&gt;     (xlib:draw-point my-window&lt;br /&gt;       gc&lt;br /&gt;       (car pt) (cdr pt))))&lt;br /&gt;      (:button-press () t))&lt;br /&gt;    (xlib:destroy-window my-window)&lt;br /&gt;    (xlib:close-display display)))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O resultado é este:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1_1yOlN_87I/R_As-Y3jlyI/AAAAAAAABXM/qpdY64ZMRzU/s1600-h/xgauss.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_1_1yOlN_87I/R_As-Y3jlyI/AAAAAAAABXM/qpdY64ZMRzU/s320/xgauss.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5183692621442422562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vejam uma bela nuvem gaussiana :-)&lt;br /&gt;&lt;br /&gt;O código é muito simples, a maior parte é burocracia para abrir uma janela e criar um graphic context, toda a ação esta nestes dois trechos, o primeiro que gera 10 mil pontos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  (points (loop for i from 0 to 10000&lt;br /&gt;      collect (cons&lt;br /&gt;        (floor (random-normal (/ width 2) (/ width 10)))&lt;br /&gt;        (floor (random-normal (/ height 2) (/ height 10))))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E o segundo que manipula os eventos do X:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    (xlib:event-case (display :force-output-p t&lt;br /&gt;         :discard-p t)&lt;br /&gt;      (:exposure ()&lt;br /&gt;   (dolist (pt points)&lt;br /&gt;     (xlib:draw-point my-window&lt;br /&gt;       gc&lt;br /&gt;       (car pt) (cdr pt))))&lt;br /&gt;      (:button-press () t))&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/14325535-1276142922037138879?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/1276142922037138879/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=1276142922037138879' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/1276142922037138879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/1276142922037138879'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/03/pure-lisp-on-x.html' title='Pure Lisp on X'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_1_1yOlN_87I/R_As-Y3jlyI/AAAAAAAABXM/qpdY64ZMRzU/s72-c/xgauss.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-5705790155777075678</id><published>2008-03-29T20:56:00.000-07:00</published><updated>2008-03-29T21:18:18.258-07:00</updated><title type='text'>Pensando como programador em C</title><content type='html'>Estava tentando fazer um cache para valores de uma função. O resultado é a macro que esta abaixo.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  (defmacro with-cache (cache key &amp;body body)  &lt;br /&gt;    (with-gensyms (cached? value)&lt;br /&gt;      `(if ,cache&lt;br /&gt;    (multiple-value-bind (,cached? ,value) (has-key? ,cache ,key)&lt;br /&gt;      (if ,cached?&lt;br /&gt;          ,value&lt;br /&gt;          (set-value ,cache ,key&lt;br /&gt;          (progn&lt;br /&gt;         ,@body))))&lt;br /&gt;      ;; cache eq null -&gt; no caching&lt;br /&gt;    (progn ,@body))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nada mais simples. Se a variavel cache for nil body é executado, caso contrário testa-se para ver se key já esta no cache com a função has-key?, que caso o valor esteja presente já o retorna como segundo valor. Se o valor não estiver no cache, o valor retornado por body é armazenado e retornado por set-value.&lt;br /&gt;&lt;br /&gt;A primeira implementação e has-key? e set-value utilizavam somente hash-table, o problema é que quando um valor é armazenado no cache ele ali permanece para sempre.  Por isso eu precisava implementar alguma forma de controle.&lt;br /&gt;&lt;br /&gt;Pensei em controlar o tamanho do cache, quando ele ficasse cheio eu eliminaria os valores mais antigos da hash table. O problema é descobrir uma função que retorna-se a quantidade de memória utilizada por um dado objeto, um equivalente sizeof do C.  Só encontrei uma função específica do Allegro CL: find-object-size e mais nada.&lt;br /&gt;&lt;br /&gt;Só que eu estava pensando como um programador em C, viciado em controle manual de memória. O que eu precisava era uma forma de avisar o Garbage Colletor que os valores no cache podiam ser deselocados quando fosse preciso. &lt;br /&gt;&lt;br /&gt;Como quase sempre a solução para o meu problema já existia em Lisp, e se chama weak reference[1]. Uma weak reference é um ponteiro que não conta na hora de avaliar se um objeto pode ser jogado no lixo ou não. Em algumas implementações (SBCL incluído) é possível especificar no make-hash-table se os ponteiros vão ser do tipo weak com o parâmetro :weakness.&lt;br /&gt;&lt;br /&gt;Existem diversas opção de weakness para hash-table, eu escolhe o tipo :value, que mantém o pair key,value enquanto houverem referências para o valor.&lt;br /&gt;&lt;br /&gt;[1] http://www.haible.de/bruno/papers/cs/weak/WeakDatastructures-writeup.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-5705790155777075678?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/5705790155777075678/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=5705790155777075678' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/5705790155777075678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/5705790155777075678'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/03/pensando-como-programador-em-c.html' title='Pensando como programador em C'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-721707158745795525</id><published>2008-03-07T20:17:00.000-08:00</published><updated>2008-03-07T20:20:05.929-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='random varible'/><category scheme='http://www.blogger.com/atom/ns#' term='cl-randist'/><title type='text'>cl-randist no cliki</title><content type='html'>Publiquei a minha biblioteca de geracao de variaveis aletaorias no &lt;a href="http://www.cliki.net/cl-randist"&gt; cliki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Tambem esta disponivel a &lt;a href="http://www.lambdatau.com/cl-randist/"&gt; documentacao do pacote&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-721707158745795525?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/721707158745795525/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=721707158745795525' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/721707158745795525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/721707158745795525'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/03/cl-randist-no-cliki.html' title='cl-randist no cliki'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-6417267703763898918</id><published>2008-02-28T06:21:00.000-08:00</published><updated>2008-02-28T06:31:10.168-08:00</updated><title type='text'>Hospedando o cl-randist</title><content type='html'>Criei um entrada para o meu projeto cl-randist no google code:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/cl-randist/"&gt;http://code.google.com/p/cl-randist/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A interface para criacão dos projetos é muito boa e ele oferece além de espaco para dowloads uma wiki e sistema de controle de versão. Infelizmente a única opcão é o SVN, portanto eu criei clones do meu repositório Git em outros dois hosts: &lt;a href="http://github.com/lvaruzza/cl-randist/tree/master"&gt;github&lt;/a&gt; e &lt;a href="http://gitorious.org/projects/cl-randist"&gt;gitorious&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O github tem uma inferface melhor, mas talvez se torne pago após o período beta. O bom é que como o git é distribuído, a localizacão do repositório não é um ponto crucial.&lt;br /&gt;&lt;br /&gt;PS: Agora que eu tenho uma wiki disponível, talvez eu crie vergonha na cara e escreva a documentacão do cl-randist.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-6417267703763898918?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/6417267703763898918/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=6417267703763898918' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/6417267703763898918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/6417267703763898918'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/02/hospedando-o-cl-randist.html' title='Hospedando o cl-randist'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-9206523001470115611</id><published>2008-02-24T06:36:00.000-08:00</published><updated>2008-02-24T06:53:20.285-08:00</updated><title type='text'>Otimização de código em Lisp</title><content type='html'>O Lisp pode funcionar com dynamic typing ou static typing, sendo que no segundo caso não é feita promoção automática de tipos como no C. Portanto se vc declara que uma função recebe double-float, ela só pode receber double floats.&lt;br /&gt;&lt;br /&gt;Existem 3 tipos de declações de tipos no lisp:&lt;br /&gt;&lt;br /&gt;1) (defun f (x)&lt;br /&gt;       (declare (type fixnum x))&lt;br /&gt;       (1+ x))&lt;br /&gt;&lt;br /&gt;O declare serve como dica para o compilador otimizar o código. Dependendo de como estiverem as declarações de otimização podem este declare pode gerar códigos diferentes, dependendo das diretivas de otimização:&lt;br /&gt;&lt;br /&gt; (defun speedy-f (x)&lt;br /&gt;       (declare (type fixnum x)&lt;br /&gt;                    (otimize (speed 3)))&lt;br /&gt;       (1+ x))&lt;br /&gt;&lt;br /&gt;Vai gerar um código otimizado para inteiros e que sinaliza um erro caso seja passado outro tipo de dado. Porém:&lt;br /&gt;&lt;br /&gt; (defun speedy-unsafe-f (x)&lt;br /&gt;       (declare (type fixnum x)&lt;br /&gt;                    (otimize (speed 3) (safety 0)))&lt;br /&gt;       (1+ x))&lt;br /&gt;&lt;br /&gt;Vai gerar um código que aceita qualquer coisa e retorna um resultado errado, no meu computador:&lt;br /&gt;&lt;br /&gt;(speedy-unsafe-f 1d0) &lt;br /&gt;&lt;br /&gt;=&gt; 8599862262&lt;br /&gt;&lt;br /&gt;2) O coerce é uma função que gera explicitamente o código de conversão de tipo. Por exemplo&lt;br /&gt;&lt;br /&gt;(loop for x from 1 to 10 sum (/ x))&lt;br /&gt;=&gt;  7381/2520&lt;br /&gt;&lt;br /&gt;Já &lt;br /&gt;&lt;br /&gt;(loop for x from 1 to 10 sum (/ (coerce x 'float)))&lt;br /&gt;=&gt; 2.9289684&lt;br /&gt;&lt;br /&gt;3) Por fim existe a declaração da assinatura da função:&lt;br /&gt;&lt;br /&gt;(declaim (ftype (function (fixnum) fixnum) f))&lt;br /&gt;(defun f (x)&lt;br /&gt;  (declare (type fixnum x))&lt;br /&gt;  (1+ x))&lt;br /&gt;&lt;br /&gt;Que pode ajudar na otimização na chamada de f.&lt;br /&gt;&lt;br /&gt;Existe muito pouca documentação em como criar códigos otimizados no lisp. Experimentação, ler códigos otimizados de outros e as mensagens de compilação do SBCL (principalmente com o highlight do SLIME) são as maneiras de aprender como faze-lo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-9206523001470115611?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/9206523001470115611/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=9206523001470115611' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/9206523001470115611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/9206523001470115611'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/02/otimizao-de-cdigo-em-lisp.html' title='Otimização de código em Lisp'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-1757199947618786856</id><published>2008-02-23T20:48:00.000-08:00</published><updated>2008-02-23T20:57:29.437-08:00</updated><title type='text'>[Anúncio] cl-randist</title><content type='html'>O meu primeiro projeto em lisp é uma biblioteca para a geração de variáveis aleatórias segundo distribuições probabilísticas. O código esta disponível no repositório:&lt;br /&gt;&lt;br /&gt;http://www.lambdatau.com/git/cl-randist.git&lt;br /&gt;&lt;br /&gt;Para obter uma copia da biblioteca utilize o git[1], com o comando:&lt;br /&gt;&lt;br /&gt;git clone http://www.lambdatau.com/git/cl-randist&lt;br /&gt;&lt;br /&gt;Acho que o código já esta em uma condição utlizado por outras pessoas em fase beta (por conta e risco de cada um, eu testei a média e a variância de cada função para um número grande de valores, e os valores estão razoavelmente próximos do esperado). &lt;br /&gt;&lt;br /&gt;Ainda não existe documentação, mas a biblioteca disponibiliza as seguintes funções:&lt;br /&gt;&lt;br /&gt;   random-uniform      (Utiliza o gerador de números aleatórios da implementação, que no caso do SBCL é o Mersene Twister)&lt;br /&gt;   &lt;br /&gt;   random-normal      (implementa o algoritmo zigurate)&lt;br /&gt;   random-gamma     (implementa oa algoritmo Marsaglia and Tsang)&lt;br /&gt;&lt;br /&gt;   random-beta&lt;br /&gt;   random-binomial&lt;br /&gt;   random-negative-binomial&lt;br /&gt;&lt;br /&gt;   random-poisson&lt;br /&gt;   random-exponential&lt;br /&gt;   random-multinomial&lt;br /&gt;   random-f&lt;br /&gt;   random-pareto&lt;br /&gt;&lt;br /&gt;   random-chi-square&lt;br /&gt;&lt;br /&gt;Todas as função implementadas são traduções manuais do código em C da biblioteca GSL[2]. &lt;br /&gt;&lt;br /&gt;Com execeção da função para a geração de variáveis aleatórias discretas, que eu peguei o código do Mario S. Mommer[3]:&lt;br /&gt;&lt;br /&gt;   make-discrete-random-var&lt;br /&gt;&lt;br /&gt;Exemplo de uso:&lt;br /&gt;&lt;br /&gt;  (asdf:oos 'asdf:load-op :cl-randist)&lt;br /&gt;&lt;br /&gt;  (use-package :randist)&lt;br /&gt;&lt;br /&gt;  (random-normal 10d0 2d0)&lt;br /&gt;&lt;br /&gt;  (let ((discrete (make-discrete-random-var #p(0.5 0.3 0.1 0.1))))&lt;br /&gt;     (print (funcall discrete)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bom proveito para quem se interessa por probabilidade e simulações.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] http://git.or.cz/&lt;br /&gt;[2] http://www.gnu.org/software/gsl/&lt;br /&gt;[3] http://prxq.wordpress.com/2006/04/17/the-alias-method/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-1757199947618786856?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/1757199947618786856/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=1757199947618786856' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/1757199947618786856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/1757199947618786856'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/02/anncio-cl-randist.html' title='[Anúncio] cl-randist'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-8332202851797704211</id><published>2008-01-04T05:48:00.000-08:00</published><updated>2008-01-04T05:53:04.419-08:00</updated><title type='text'>How to Mess with clos in subtle ways</title><content type='html'>The code below is wrong and stupid, but can generate very  subtle bugs,especially if the class definition and de nstring-capitalize code aren't related&lt;br /&gt;&lt;br /&gt;  ;; STEP 1: Define a class&lt;br /&gt;  (defclass foo ()&lt;br /&gt;   ((xxx :initarg :xxx)))&lt;br /&gt;  (make-instance 'foo :xxx 1)&lt;br /&gt;&lt;br /&gt;  ;; STEP 2: use nstring-capitalize in the keyword symbol&lt;br /&gt;  (nstring-capitalize (symbol-name :xxx))&lt;br /&gt;&lt;br /&gt;  ;; STEP 3: try to make of instance of class&lt;br /&gt;  (make-instance 'foo :xxx 1)&lt;br /&gt;&lt;br /&gt;The result is:&lt;br /&gt;&lt;br /&gt; Invalid initialization argument: :XXX in call for class #&lt;STANDARD-CLASS FOO&gt;.&lt;br /&gt;   [Condition of type SB-PCL::INITARG-ERROR]&lt;br /&gt;&lt;br /&gt; See also:&lt;br /&gt;  Common Lisp Hyperspec, 7.1.2 [section]&lt;br /&gt;&lt;br /&gt; Backtrace:&lt;br /&gt;  0: (SB-PCL::CHECK-INITARGS-2-PLIST (:XXX 1) #&lt;STANDARD-CLASS FOO&gt; (:|Xxx|) T)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;According to http://www.lispworks.com/documentation/HyperSpec/Body/f_symb_2.htm&lt;br /&gt;&lt;br /&gt;"symbol-name returns the name of symbol. The consequences are undefined if name is ever modified."&lt;br /&gt;&lt;br /&gt;Shame on me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-8332202851797704211?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/8332202851797704211/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=8332202851797704211' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/8332202851797704211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/8332202851797704211'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2008/01/how-to-mess-with-clos-in-subtle-ways.html' title='How to Mess with clos in subtle ways'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-7145327961550531932</id><published>2007-10-28T04:28:00.000-07:00</published><updated>2007-10-28T04:29:05.281-07:00</updated><title type='text'>Pensamento do dia</title><content type='html'>Programadores Lisp são legais, o difícil é juntar mais de um na mesma sala.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-7145327961550531932?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/7145327961550531932/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=7145327961550531932' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/7145327961550531932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/7145327961550531932'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/10/pensamento-do-dia.html' title='Pensamento do dia'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-2235345348115557398</id><published>2007-10-07T18:14:00.000-07:00</published><updated>2007-10-07T18:46:38.646-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>Bouncing Rectangle (OpenGL demo)</title><content type='html'>Adaptei um dos exemplos do livro OpenGL Super Bible de C para Lisp. Adaptei para a biblioteca cl-opengl (em algum post anterior eu explico como instalar a biblioteca). O programa é bem simples, porém bonitinho, ele desenha um quadrado vermelho que fica zanzando pela tela.&lt;br /&gt;&lt;br /&gt;A tradução é extremamente linear, basta trocar o prefixo da função pelo pacote apropriado e tirar o sufixo: glColor3f -&gt; gl:color.&lt;br /&gt;&lt;br /&gt;O ponto menos óbvio é definir os callbacks, pois é preciso criar uma função em lisp que será invocada pelo C. Por isso a função tem que ser definida utiliando defcallback do cffi. Os calbacks são referenciados com a função calback.&lt;br /&gt;&lt;br /&gt;Quando a função bounce é executada ela trava o REPL, mas ela pode ser executada em um thread separada, através da função make-thread.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(sb-thread:make-thread #'bounce)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Uma experiência muito interessante é modificar o programa com ele rodando, seja em uma thread separada ou não. Modifiquem a função timer, por exemplo multiplicando por 2 o incremento da posição (linhas 28 e 29):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  (incf x1 (* 2 xstep))&lt;br /&gt;  (incf y1 (* 2 ystep))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Após um C-c C-k no Slime o quadrado aumenta de velocidade imediatamente, tai algo que não rola em C ou Java.&lt;br /&gt;&lt;br /&gt;Vejam o código em  Lisp abaixo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;;; From OpenGL SuperBible, chap 2, pag 62&lt;br /&gt;;;&lt;br /&gt;;; Bouncing rectangle&lt;br /&gt;&lt;br /&gt;(defparameter x1 0.0)&lt;br /&gt;(defparameter y1 0.0)&lt;br /&gt;(defparameter rsize 25)&lt;br /&gt;(defparameter xstep 1)&lt;br /&gt;(defparameter ystep 1)&lt;br /&gt;(defparameter window-width 100)&lt;br /&gt;(defparameter window-height 100)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(cffi:defcallback render-scene :void ()&lt;br /&gt;  (gl:clear :color-buffer-bit)&lt;br /&gt;  (gl:color 1.0 0 0)&lt;br /&gt;  (gl:rect x1 y1 (+ x1 rsize) (- y1 rsize))&lt;br /&gt;  (glut:swap-buffers))&lt;br /&gt;&lt;br /&gt;(cffi:defcallback timer :void ((value :int))&lt;br /&gt;  (declare (ignore value))&lt;br /&gt;  (when (or (&gt; x1 (- window-width rsize)) (&lt; x1 (- window-width)))&lt;br /&gt;    (setf xstep (- xstep)))&lt;br /&gt;  (when (or (&gt; y1 window-height) (&lt; y1 (- rsize window-height)))&lt;br /&gt;    (setf ystep (- ystep)))&lt;br /&gt;&lt;br /&gt;  (incf x1 xstep)&lt;br /&gt;  (incf y1 ystep)&lt;br /&gt;&lt;br /&gt;  #|&lt;br /&gt;  Check bounds. THis is in case the window is made&lt;br /&gt;  smaller while the rectangel is bouncing and the&lt;br /&gt;  rectangle suddenly finds itself outside the new&lt;br /&gt;  clipping volume&lt;br /&gt;  |#&lt;br /&gt;  (if (&gt; x1 (+ window-width (- rsize) xstep))&lt;br /&gt;      (setf x1 (- window-width rsize 1))&lt;br /&gt;      (when (&lt; x1 (- (+ window-width xstep)))&lt;br /&gt; (setf x1 (- (+ window-width 1)))))&lt;br /&gt;&lt;br /&gt;  (glut:post-redisplay)&lt;br /&gt;  (glut:timer-func 33 (cffi:callback timer) 1))&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;(cffi:defcallback change-size :void ((w :unsigned-int) (h :unsigned-int))&lt;br /&gt;&lt;br /&gt;  ;; Prevent divide by zero&lt;br /&gt;  (when (eq h 0)&lt;br /&gt;    (setf h 1))&lt;br /&gt;&lt;br /&gt;  (gl:viewport 0 0 w h)&lt;br /&gt;  (gl:matrix-mode :projection)&lt;br /&gt;  (gl:load-identity)&lt;br /&gt;  (let ((aspect-ratio (/ w h)))&lt;br /&gt;    (if (&lt;= w h)&lt;br /&gt; (gl:ortho -100 100 (/ -100 aspect-ratio) (/ 100 aspect-ratio) 1 -1)&lt;br /&gt; (gl:ortho (* -100 aspect-ratio) (* 100 aspect-ratio) -100 100 1 -1))))&lt;br /&gt;&lt;br /&gt;(defun setup-rc ()&lt;br /&gt;  (gl:clear-color 0.0 0.0 1.0 1.0))&lt;br /&gt;&lt;br /&gt;(defun bounce ()&lt;br /&gt;&lt;br /&gt;  (glut:init "SBCL")&lt;br /&gt;  (glut:init-display-mode :double :rgba)&lt;br /&gt;  (glut:create-window "Bounce")&lt;br /&gt;  (glut:init-window-size 800 600)&lt;br /&gt;  (glut:display-func (cffi:callback render-scene))&lt;br /&gt;  (glut:reshape-func (cffi:callback change-size))&lt;br /&gt;  (glut:timer-func 33 (cffi:callback timer) 1)&lt;br /&gt;  (setup-rc)&lt;br /&gt;  (glut:main-loop))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E o código original em C esta aqui:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &lt; GL/gl.h &gt;&lt;br /&gt;#include &lt; GL/glu.h &gt;&lt;br /&gt;#include &lt; GL/glut.h &gt;&lt;br /&gt;#include &lt; stdio.h &gt;&lt;br /&gt;&lt;br /&gt;GLfloat x1 = 0.0f;&lt;br /&gt;GLfloat y1 = 0.0f;&lt;br /&gt;GLfloat rsize=25;&lt;br /&gt;&lt;br /&gt;GLfloat xstep = 1.0f;&lt;br /&gt;GLfloat ystep = 1.0f;&lt;br /&gt;&lt;br /&gt;GLfloat windowWidth=100;&lt;br /&gt;GLfloat windowHeight=100;&lt;br /&gt;&lt;br /&gt;void RenderScene() {&lt;br /&gt;  glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;&lt;br /&gt;  glColor3f(1.0f,0.0f,0.0f);&lt;br /&gt;  glRectf(x1,y1,x1+rsize,y1-rsize);&lt;br /&gt;  glutSwapBuffers();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void TimerFunction(int value) {&lt;br /&gt;&lt;br /&gt;  if (x1 &gt; windowWidth-rsize || x1 &lt; -windowWidth) { &lt;br /&gt;    xstep = -xstep;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (y1 &gt; windowHeight || y1 &lt; -windowHeight + rsize) {&lt;br /&gt;    ystep = -ystep;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  x1 += xstep;&lt;br /&gt;  y1 += ystep;&lt;br /&gt;&lt;br /&gt;  // Check bounds. Tjos om case tjhe window is made smaller whie&lt;br /&gt;  // the rectangle is bouncing and the rectangle suddenly finds&lt;br /&gt;  // itself outside the new clipping volume&lt;br /&gt;  if (x1 &gt; (windowWidth-rsize + xstep))&lt;br /&gt;    x1 = windowWidth-rsize-1;&lt;br /&gt;  else&lt;br /&gt;    if (x1 &lt; -(windowWidth + xstep))&lt;br /&gt;      x1 = -windowWidth - 1;&lt;br /&gt;&lt;br /&gt;  if(y1 &gt; (windowHeight +ystep))&lt;br /&gt;    y1 = windowHeight - 1;&lt;br /&gt;  else&lt;br /&gt;    if(y1 &lt; -(windowHeight - rsize + ystep))&lt;br /&gt;      y1 = -windowHeight + rsize - 1;&lt;br /&gt;  &lt;br /&gt;  glutPostRedisplay();&lt;br /&gt;  glutTimerFunc(33,TimerFunction,1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void ChangeSize(GLsizei w,GLsizei h) {&lt;br /&gt;  GLfloat aspectRatio;&lt;br /&gt;&lt;br /&gt;  if (h==0)&lt;br /&gt;    h=1;&lt;br /&gt;&lt;br /&gt;  glViewport(0,0,w,h);&lt;br /&gt;  glMatrixMode(GL_PROJECTION);&lt;br /&gt;  glLoadIdentity();&lt;br /&gt;  aspectRatio=(GLfloat)w/(GLfloat)h;&lt;br /&gt;  &lt;br /&gt;  if (w &lt;= h)&lt;br /&gt;    glOrtho(-100.0,100.0,-100.0/aspectRatio,100.0/aspectRatio,1.0,-1.0);&lt;br /&gt;  else&lt;br /&gt;    glOrtho(-100.0*aspectRatio,100.0*aspectRatio,-100.0,100.0,1.0,-1.0);&lt;br /&gt;  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;  glLoadIdentity();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void SetupRC() {&lt;br /&gt;  glClearColor(0.0f,0.0f,1.0f,1.0f);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc,char *argv[]) {&lt;br /&gt;  glutInit(&amp;argc,argv);&lt;br /&gt;  glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);&lt;br /&gt;  glutCreateWindow("Bounce");&lt;br /&gt;  glutInitWindowSize(800,600);&lt;br /&gt;  glutDisplayFunc(RenderScene);&lt;br /&gt;  glutReshapeFunc(ChangeSize);&lt;br /&gt;  glutTimerFunc(33,TimerFunction,1);&lt;br /&gt;  SetupRC();&lt;br /&gt;  glutMainLoop();&lt;br /&gt;&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No Linux este programa é compilado com o comando:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;gcc bounce.c -o bounce -lGL -lGLU -lglut -lm&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/14325535-2235345348115557398?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/2235345348115557398/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=2235345348115557398' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/2235345348115557398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/2235345348115557398'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/10/bouncing-rectangle-opengl-demo.html' title='Bouncing Rectangle (OpenGL demo)'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-7357152015290592200</id><published>2007-09-15T07:22:00.000-07:00</published><updated>2007-09-15T07:44:25.877-07:00</updated><title type='text'>Desdefinindo coisas</title><content type='html'>Em lisp o ambiente de desenvolvimento e de execução é mesmo, permitindo que o programador crie o programa por partes, fazendo experiências em cada estágio do desenvolvimento. O problema é que a imagem fica poluída com funções e variáveis que foram abandonadas.&lt;br /&gt;&lt;br /&gt;Para se livrar de um função indesejada existe a função &lt;b&gt;fmakunbound&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defun foo (x) &lt;br /&gt;   (+ x 1))&lt;br /&gt;&lt;br /&gt;(foo 1)&lt;br /&gt;=&gt; 2&lt;br /&gt;&lt;br /&gt;(fmakunbound 'foo)&lt;br /&gt;&lt;br /&gt;(foo 1)&lt;br /&gt;=&gt; The function F is undefined.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De maneira equivalente existe a função &lt;b&gt;makunbound&lt;/b&gt; para eliminar variáveis.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(devar x 1) &lt;br /&gt;&lt;br /&gt;x&lt;br /&gt;=&gt; 1&lt;br /&gt;&lt;br /&gt;(makunbound 'x)&lt;br /&gt;&lt;br /&gt;x&lt;br /&gt;=&gt; The variable X is unbound.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pacotes também podem ser apagados, neste caso com a função &lt;b&gt;delete-package&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defpackage foo (:use :cl))&lt;br /&gt;(delete-package 'foo)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Só falta descobrir como apagar um classe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-7357152015290592200?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/7357152015290592200/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=7357152015290592200' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/7357152015290592200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/7357152015290592200'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/09/desdefinindo-coisas.html' title='Desdefinindo coisas'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-7483513195365050449</id><published>2007-09-09T12:33:00.000-07:00</published><updated>2007-10-07T18:48:02.642-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='macros'/><title type='text'>Macros Anafóricas</title><content type='html'>Imagine uma função resolve-system que retorna a solução de um sistema de equações, ou nil caso não haja solução para este sistema. Agora considere o código abaixo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(if (resolve-system system)&lt;br /&gt;     (print (result-system system))&lt;br /&gt;     (print "System without answer"))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note que resolve-system, que pode ser uma função complexa e demorara, é chamada duas vezes em seguida, ou seja, este código demora o dobro de tempo que deveria. A solução eficiente para isto é escrever o seguinte código:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(let ((answer (resolve-system system)))&lt;br /&gt;  (if answer &lt;br /&gt;      (print answer)&lt;br /&gt;      (print "System without answer")))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Porém o código acima é muito menos elegante que o anterior. Uma solução elegante para este problema de otimização é o uso de Macros Anafóricas (&lt;i&gt;anaphoric macros&lt;/i&gt;), como sugerido por Paul Graham no livro On Lisp[&lt;a href="http://www.bookshelf.jp/texi/onlisp/onlisp_15.html#Anaphoric+Macros"&gt;1&lt;/a&gt;]:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defmacro aif (test-form then-form &amp;optional else-form)&lt;br /&gt;  `(let ((it ,test-form))&lt;br /&gt;     (if it ,then-form ,else-form)))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Utilizando aif o nosso exemplo fica assim:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(aif (resolve-system system)&lt;br /&gt;     (print it)&lt;br /&gt;     (print "System without answer"))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Cuja a macro expansão é:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(let it (resolve-system system)))&lt;br /&gt;  (if it &lt;br /&gt;      (print it)&lt;br /&gt;      (print "System without answer")))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Exatamente como no código que havíamos optimizado na mão. Podemos utilizar a macro aif para definir uma série de outras macros anafóricas: awhen, awhile, acond, etc, e como queremos utilizar estas macros em diversos projetos diferentes faz todo sentido coloca-las em uma pacote próprio, por exemplo no pacote anaphoric. Porém neste momento a macro para de funcionar! Acabamos de gerar um bug extremamente sutil, que só pode ser detectado quando fizermos a macro expansão em um pacote diferente do qual a macro foi definida:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(macroexpand-1 '(aif (resolve-system system)&lt;br /&gt;                 (print it)&lt;br /&gt;                 (print "System without answer")))&lt;br /&gt;&lt;br /&gt;-&gt; (let anaphoric::it (resolve-system system)))&lt;br /&gt;    (if anaphoric::it &lt;br /&gt;        (print it)&lt;br /&gt;        (print "System without answer")))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;Notem que o símbolo it que passamos como argumento da macro esta definido no pacote atual, porém o it do let e do if foram definidos no pacote anaphoric, e portanto se referem a valores diferentes. Uma primeira solução é explicitar o pacote do símbolo it:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(aif (resolve-system system)&lt;br /&gt;     (print anaphoric::it)&lt;br /&gt;     (print "System without answer"))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Porém nós quebramos a nossa abstração, pois temos que lembrar o pacote onde aif foi definido, o que pode gerar facilmente todo o tipo de bug. Mas no lisp podemos utilizar todo o sistema de manipulação de listas para manipular o código do programa:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defun change-it-package (from)&lt;br /&gt;  (subst 'it (find-symbol "IT" *package*) form))&lt;br /&gt;&lt;br /&gt;(defmacro aif (test-form then-form &amp;optional else-form)&lt;br /&gt;  `(let ((it ,test-form))&lt;br /&gt;     (if it &lt;br /&gt;         ,(change-it-package then-form) &lt;br /&gt;         ,(change-it-package else-form))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O ponto mais difícil deste código é encontrar o símbolo it no pacote atual, para isto utilizamos a função find-symbol, e o fato da variável *packages* ter escopo dinâmico. Podemos ver que o resultado da macro expansão agora é o correto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(macroexpand-1 '(aif (resolve-system system)&lt;br /&gt;                 (print it)&lt;br /&gt;                 (print "System without answer")))&lt;br /&gt;&lt;br /&gt;-&gt; (let anaphoric::it (resolve-system system)))&lt;br /&gt;    (if anaphoric::it &lt;br /&gt;        (print anaphoric::it)&lt;br /&gt;        (print "System without answer")))&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/14325535-7483513195365050449?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/7483513195365050449/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=7483513195365050449' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/7483513195365050449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/7483513195365050449'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/09/macros-anafricas.html' title='Macros Anafóricas'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-7268528251411959832</id><published>2007-08-14T17:31:00.000-07:00</published><updated>2007-08-14T17:33:10.477-07:00</updated><title type='text'>Current Recomended Libraries</title><content type='html'>Olhem esta lista de recomendações de bibliotecas para Lisp:&lt;br /&gt;&lt;br /&gt;http://www.cliki.net/Current%20recommended%20libraries&lt;br /&gt;&lt;br /&gt;Não é muito grande, mas só tem as bibliotecas de primeira linha.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-7268528251411959832?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/7268528251411959832/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=7268528251411959832' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/7268528251411959832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/7268528251411959832'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/08/current-recomended-libraries.html' title='Current Recomended Libraries'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-783571308173376580</id><published>2007-06-25T19:17:00.001-07:00</published><updated>2007-10-07T18:46:05.582-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clim'/><category scheme='http://www.blogger.com/atom/ns#' term='user-interface'/><title type='text'>McClim</title><content type='html'>O McClim é a uma implementação free do Toolkit criado para as Lisps Machines. Nas última versão ele suporta (experimentalmente) widgets do GTK. Vejam com seus próprios olhos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(asdf-install:install :mcclim)&lt;br /&gt;(asdf:oos 'asdf:load-op :clim-gtkairo)&lt;br /&gt;(asdf:operate 'asdf:load-op :clim-examples)&lt;br /&gt;(clim-demo::demodemo)&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/14325535-783571308173376580?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/783571308173376580/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=783571308173376580' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/783571308173376580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/783571308173376580'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/06/mcclim.html' title='McClim'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-3735702019807649796</id><published>2007-06-11T18:02:00.000-07:00</published><updated>2007-10-07T18:47:34.514-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symbolic'/><category scheme='http://www.blogger.com/atom/ns#' term='mathematic'/><title type='text'>Maxima</title><content type='html'>Antes do Maple e do Mathematica havia o Macsyma, o mais avançado sistema de matemática simbólica dos anos 80, desenvolvido em Lisp, foi um dos principais motivadores para a evolução do Lisp. O sistema foi desenvolvido pelo MIT com dinheiro do Departamento de Energia, porém alguns pesquisadores resolveram ficar ricos com o programa, montaram uma empresa e se apoderaram do software. Este ato gerou dois resultados: &lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt; o código fonte do Macsyma foi quase perdido para sempre, &lt;br /&gt;&lt;li&gt; Um pesquisador chamado Richard Stallman iniciou uma cruzada contra o software proprietário.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Felizmente em 1982  William Schelter conseguiu permissão do DOE para uma versão Free Sofware do Macsyma, rebatizada de Maxima e disponível e mantida até hoje. &lt;br /&gt;&lt;br /&gt;Outro fruto do AI Lab do MIT foi o editor emacs, que em comum com Maxima possui, além da origem, a possibilidade de ser extendido em Lisp. Uma das inúmeras extenções é o imaxima, que combina o &lt;br /&gt;emacs, o maxima e o TeX, o sistema de digramação eletrônica criado pelo Donald Knuth.&lt;br /&gt;&lt;br /&gt;O resultado de todo este blah, blah, blah, pode ser resumido a esta figura:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1_1yOlN_87I/Rm3xDCSNyYI/AAAAAAAAAAM/mSOyOyXdcM4/s1600-h/imaxima.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_1_1yOlN_87I/Rm3xDCSNyYI/AAAAAAAAAAM/mSOyOyXdcM4/s320/imaxima.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5074977389571590530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Uma alternativa completamente free de software matemático, produzido pelo trabalho conjunto dos melhores programadores do século XX.&lt;br /&gt;&lt;br /&gt;O Maxima pode ser &lt;a href="http://maxima.sourceforge.net/download.shtml"&gt;baixado aqui&lt;/a&gt;, e felizmente ele funciona na &lt;a href="http://sbcl.sourceforge.net/platform-table.html"&gt;melhor implementação de Lisp disponível&lt;/a&gt;.Tendo o emacs e o Maxima basta seguir esta &lt;a href="http://members3.jcom.home.ne.jp/imaxima/Site/Set%20up%20your%20Emacs.html"&gt;receita de bolo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-3735702019807649796?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/3735702019807649796/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=3735702019807649796' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/3735702019807649796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/3735702019807649796'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/06/maxima.html' title='Maxima'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_1_1yOlN_87I/Rm3xDCSNyYI/AAAAAAAAAAM/mSOyOyXdcM4/s72-c/imaxima.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-6954202187183299137</id><published>2007-05-03T20:35:00.000-07:00</published><updated>2007-05-03T20:38:38.376-07:00</updated><title type='text'>2 Questões sobre Scheme</title><content type='html'>1) Se o Common Lisp é bloated porque todo mundo acaba criando a sua própria biblioteca de rotinas para complementar ele?&lt;br /&gt;&lt;br /&gt;2) Os sistemas de macros do schema são mais seguros mas permitem fazer anaphoric macros?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-6954202187183299137?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/6954202187183299137/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=6954202187183299137' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/6954202187183299137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/6954202187183299137'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/05/2-questes-sobre-scheme.html' title='2 Questões sobre Scheme'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-77954808033822640</id><published>2007-04-29T20:22:00.000-07:00</published><updated>2007-04-29T20:40:13.723-07:00</updated><title type='text'>Lisp no MacOS X</title><content type='html'>A grande vantagem do Mac OS é que é Unix e portanto todas as ferramentas de costume estão lá. A primeira e mais importante é o emacs, ele já vem instalado, porém somente uma versão texto. Mas existe a projeto MacPorts (antigo DarwinPorts) que permite instalar todos os programas open source com um comando. &lt;br /&gt;&lt;br /&gt;Com o MacPort dá para instalar o feijão com arroz: Mysql, Postgres, Apache2, Ruby, Rails, etc. Tem o emacs tb, mas a melhor opção é utilizar o beta do emacs22 que tem suporta nativo para o Carbon (Uma das API's gráficas do OS X).  Ok, temos emacs funcionando maravilhosamente bem.  O segundo passo é escolher qual Lisp usar. O mundo apple conta com OpenMCL, porém ele só suporta PPC e x64, bad news, só tenho um Core Duo 1 que não aceita extenção de 64 bits :-(&lt;br /&gt;&lt;br /&gt;Mas tudo bem, a minha primeira escolha de Lisp era o SBCL. A versão do sita, tanto o binário quanto a source funcionam muito bem (versão 1.0.4 e 1.0.5).  O próximo passo é instalar alguns pacotes. Primeiro os mais fáceis, cl-ppcre, split-sequence. Tudo ok. Em seguida um mais difícil hunchentoot. Primeiro problema, a CL+SSL não acha a lib ssl em /usr/lib/libssl.so, isso é porque no darwin as bibliotecas não tem terminação .so e sim .dylib. Modifiquei o CL+SSL para procurar a versão do MacPort em /opt/local/lib/libssl.dylib, tudo funciona perfeitamente. Mandei um patch para os autores da biblioteca.&lt;br /&gt;&lt;br /&gt;Segundo problema, o slime esta esquisito e o hunchentoot trava o REPL quando invocado. Tendo criar um thread e descubro que o SBCL foi configurado para unitrheads. Bad news. Lendo o arquivo INSTALL descubro como ativar as threads, deve-se criar um arquivo chamado customize-targets-features.lisp com o seguinte conteúdo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  (lambda (features)&lt;br /&gt;    (flet ((enable (x)&lt;br /&gt;             (pushnew x features))&lt;br /&gt;           (disable (x)&lt;br /&gt;             (setf features (remove x features))))&lt;br /&gt;      ;; Threading support, available only on x86/x86-64 Linux, x86 Solaris&lt;br /&gt;      ;; and x86 Mac OS X (experimental).&lt;br /&gt;      (enable :sb-thread)))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Recompilar e pronto. Beleza, tudo funcionando, porém estou vivendo no wild world do software experimental.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-77954808033822640?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/77954808033822640/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=77954808033822640' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/77954808033822640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/77954808033822640'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/04/lisp-no-macos-x.html' title='Lisp no MacOS X'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-2527241956653312671</id><published>2007-04-23T21:08:00.000-07:00</published><updated>2007-04-23T21:17:34.803-07:00</updated><title type='text'>Site novo</title><content type='html'>Registrei o domínio &lt;a href="http://www.lambdatau.com/"&gt;lambdatau.com&lt;/a&gt; e estou tentando organizar o meu conhecimento de Lisp e programação em geral (além algumas outras coisas) de uma forma mais coerente do que no blog. Não tem nada ainda muito pronto, só um pouco de texto e o layout (que é de  quase somente usar ASCII site, inclusive nas ilustrações).&lt;br /&gt;&lt;br /&gt;Na verdade eu estou fazendo esse poste para aumentar o número de links para o site e assim deixar o google feliz :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-2527241956653312671?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/2527241956653312671/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=2527241956653312671' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/2527241956653312671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/2527241956653312671'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/04/site-novo.html' title='Site novo'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-5491233306400340921</id><published>2007-04-14T20:52:00.001-07:00</published><updated>2007-04-14T20:52:42.192-07:00</updated><title type='text'>Chicken Scheme</title><content type='html'>Tai uma boa devesa do Chicken Scheme: http://lenz.unl.edu/wordpress/?p=15&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-5491233306400340921?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/5491233306400340921/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=5491233306400340921' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/5491233306400340921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/5491233306400340921'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/04/chicken-scheme.html' title='Chicken Scheme'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-8657767844540648939</id><published>2007-04-07T20:51:00.000-07:00</published><updated>2007-04-07T20:54:20.588-07:00</updated><title type='text'>C forall</title><content type='html'>Há algo de novo no reino da programação de baixo nível. Um grupo da Universidade de Waterloo (CA) esta propondo uma extenção para o C chamada de &lt;a href="http://plg.uwaterloo.ca/~cforall/"&gt;Cforall&lt;/a&gt;. Assim como o C++ foi uma extenção do C inspirada no Smalltalk o Cforall é uma extenção do C inspirada, na minha humilde opnião, no CLOS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-8657767844540648939?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/8657767844540648939/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=8657767844540648939' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/8657767844540648939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/8657767844540648939'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/04/c-forall.html' title='C forall'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-1713837979216073750</id><published>2007-04-02T22:32:00.000-07:00</published><updated>2007-04-03T11:07:32.383-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='empresas'/><category scheme='http://www.blogger.com/atom/ns#' term='Lucid Inc'/><category scheme='http://www.blogger.com/atom/ns#' term='administração'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><title type='text'>Mais sobre a Lucid Inc.</title><content type='html'>Contuando a minha pesquisa sobre a história do lisp encontrei &lt;a href="http://www.dreamsongs.com/NewFiles/PatternsOfSoftware.pdf"&gt; um conjunto de ensaio de Richar P. Gabriel&lt;/a&gt;  fundador de Lucid, inc chamado Patters Of Software. Apartir da página 175 ele conta a história da ascenção e queda da empresa. É uma história triste pois a Lucid foi criada para ser a melhor empresa de Lisp e dominar o mercado, ela contratou as melhores pessoas, o próprio Gabriel estudou 25 nas melhores escolas, foi aluno do John McCarthy em pessoa e terminou em um retumbante fracasso. A importância da Lucid em sua época pode ser medida através da preocupação de um de seus principais concorrentes, a Franz Inc, como esta relatado &lt;a href="http://www.answers.com/topic/franz-inc"&gt; neste artigo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A Lucid tinha, dinheiro, as melhores cabeças, grandes contratos, etc, mas faliu. A Franz que era o Underdog na época esta ai até  hoje e dando lucro.  Esta é um ótimo exemplo de como gerir um empresa de software, a Franz fez o que os clientes queriam e foi ganhando o seu dinheirinho enquanto que a Lucid queria criar a próxima grande revolução.&lt;br /&gt;&lt;br /&gt;Outro aspecto interessante da Lucid é que ele era uma empresa com um produto de sucesso que foi abandonado em detrimento à um novo projeto que terminou em fracasso. No caso o produto era o Lucid Lisp, que foi usado como cash cow para o projeto de um ambiente de desenvolvimento para C++, porém isso afetou a moral dos desenvolvedores e afastou os clientes que percebem a queda na qualidade do atendimento e lendidão no lançamento de novas versões. O novo projeto miraboloso se revelou um erro, mas o projeto a Lucid já havia se queimado com os clientes de Lisp.  Essa história é muito parecida com a da infocom descrita &lt;a href="http://www.vision.ime.usp.br/~lvaruzza/infocom-paper.pdf"&gt; neste paper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A última lição sobre o fracasso da Lucid é o perfil do CEO que foi contratado no fim da vida de empresa o Bob, um bussness man, menos inteligente que os desenvolvedores que ele administrava e que achava que você pode administrar uma empresa sem entender o que ela faz, algo parecido o que ocorreu com a Apple no período em que o Steve Jops esteve longe.  Além de tudo Bob era uma pessoa com caracter duvidoso, o que só acelerou a derrotada da Lucid.  Muitas fezes os Geeks relevam defeitos de pesonalidade de pessoas do mercado pois acham que o mundo dos negócios são assim mesmo e que eles não tem condições de fazer o que esses caras fazem, afinal eles são falastrões e tem "contatos", isso é um grande erro, pois em geral as pessoas que posam de bussness men são pura e simplesmente pessoas burras que decoraram um discurso pronto.&lt;br /&gt;&lt;br /&gt;Isso me faz pensar que o google acertou fortemente em duas decisões: Não chamar uma pessoa de fora para administrar a empresa e agir de maneira honesta. Agir de maneira honesta é algo que geralmente se paga pois se você é desonesto o "good will" se quebra, e mais cedo ou mais tarde a sua empresa acaba sendo abandonada por todos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-1713837979216073750?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/1713837979216073750/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=1713837979216073750' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/1713837979216073750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/1713837979216073750'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/04/mais-sobre-lucid-inc.html' title='Mais sobre a Lucid Inc.'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-4005003743473224180</id><published>2007-04-01T18:08:00.000-07:00</published><updated>2007-04-01T18:39:34.610-07:00</updated><title type='text'>Garbage Collector e Falencias.</title><content type='html'>É extremamente interrante a história de empresas que desenvolveram versões comerciais do Lisp.  A Symbolics surgiu do MIT AI lab para produzir Lisp Machines, porém a revolução dos microcomputadores tirou a vantagens que os processadores "custom made" tinham, a symbolics foi suplantada pelas empresas que fabricavam compiladores de lisp para processadores comums como a Lucid e a Franz.&lt;br /&gt;&lt;br /&gt;Porém a Lucid teve problemas de gerência e resolveu se reinvetar como uma empresa que desenvovia IDE's para C++ e abandonar o ainda lucrativo negócio do Lisp.  Com o fim das verbas fartas tanto a Lucid quanto a Symbolics sairam dos negócios. A Lucid acabou sendo comprada pela Harlequin que desenvolvia versões comerciais de linguagens de alto nível, além do Lisp eles desenvolveram versões para o ML, Dylan e PostScript.   &lt;br /&gt;&lt;br /&gt;Muitos progamadores da Symbolics e da Lucid foram contradados pela Harlequin, e  entre 1994 e 2001 houve um grupo dedicado exclusivamente ao desenvolvimento do sistema de coletor de lixo, incluindo P. Tucker Winthington, que mantinha o coletror de lixo da Symbolics.&lt;br /&gt;&lt;br /&gt;A roda da falência girou mais uma vez e a Harlequin foi comprada pela Global Graphics que estava interessada somente na implementação de PostScript deles. A parte de Dylan se tornou a Functional Objects Inc que deixou de funcionar em 2006 e o DylanWorks agora é o projeto OpenDylan. A parte de Lisp e IA se tornou a Xanalysis que opera até hoje com o LispWorks.&lt;br /&gt;&lt;br /&gt;Já o grupo de Coletores de Lixo formou uma empresa de consultoria e liberou o código do coletor de lixo da Harlequin como  o projeto open source &lt;a href="http://www.ravenbrook.com/project/mps/"&gt;MPS: Memory Pool System&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;O sistema parece ser um dos mais sofsticados que exista, ele esta descrito &lt;a href="http://www.ravenbrook.com/project/mps/doc/2002-01-30/ismm2002-paper/"&gt; neste paper&lt;/a&gt;. Os autores parecem felizes com a falências de suas antigas empresas pois agora podem mostrar para o mundo as suas idéias,  pois antes tudo que haviam desenvolvido  eram segredos industriais.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-4005003743473224180?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/4005003743473224180/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=4005003743473224180' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/4005003743473224180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/4005003743473224180'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/04/garbage-collector-e-falencias.html' title='Garbage Collector e Falencias.'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-4066051948952899750</id><published>2007-02-23T13:05:00.000-08:00</published><updated>2007-02-23T13:23:14.798-08:00</updated><title type='text'>Lisp hacks</title><content type='html'>Achei no google um site com pequenos utilitários para lisp: &lt;a href="http://www.tfeb.org/lisp/hax.html"&gt;Lisp Hacks&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Me chamou a atenção as melhorias para o defpackage, em especial o exemplo de como criar versões genéricas dos operadores artitiméticos, que é o primeiro passo para o maravilhoso mundo dos &lt;span style="font-family:courier new;"&gt;operator overloads&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Claro que  a performance vai ser afetada, mas é só colocar o seu código de &lt;span style="font-family: courier new;"&gt;number crushing&lt;/span&gt; em outro pacote e pronto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-4066051948952899750?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/4066051948952899750/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=4066051948952899750' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/4066051948952899750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/4066051948952899750'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/02/lisp-hacks.html' title='Lisp hacks'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-5647472106794628929</id><published>2007-01-24T21:30:00.000-08:00</published><updated>2007-01-24T21:46:43.555-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reiserfs'/><category scheme='http://www.blogger.com/atom/ns#' term='reposiviness'/><category scheme='http://www.blogger.com/atom/ns#' term='xfs'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='filesystem'/><category scheme='http://www.blogger.com/atom/ns#' term='change'/><title type='text'>Mudança de filesystem</title><content type='html'>Acabei de migrar o meu home de reiserfs para xfs. Fiz isso primeiro porque hoje acabei de ver um reiserfs ir para as cucuias por coisas de um único bad  block, o filesystem todo, mais de 300 GB perdidos por causa de um block defeituoso. À 2 meses atrás outra instalação também teve um problema estranho.&lt;br /&gt;&lt;br /&gt;Outro motivo para abandonar o reiserfs é que acredito que o seu desenvolvimento vai ser prejudicado depois do que &lt;a href="http://www.sfgate.com/cgi-bin/article.cgi?f=/c/a/2006/10/10/BAGERLM3RR15.DTL"&gt;aconteceu com o Hans Reiser&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mas voltando ao XFS, ele é rápido, e não estou falando de rápido do tipo: "Olha como ele se sai bem em benchmarks", é rápido no sendido de que eu estou restaurando meu backup e computador não para devido ao IO intenso, esse é melhor tipo de de velocidade para um Desktop, a que melhora a &lt;span style="font-style: italic;"&gt;responsiviness.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-5647472106794628929?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/5647472106794628929/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=5647472106794628929' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/5647472106794628929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/5647472106794628929'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/01/mudana-de-filesystem.html' title='Mudança de filesystem'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-116930450109419883</id><published>2007-01-20T06:42:00.000-08:00</published><updated>2007-01-20T06:48:21.106-08:00</updated><title type='text'>String append</title><content type='html'>Esta rolando uma discução no comp.lang.lisp sobre a maneira mais rápida de concatenar string. Foram sugeridas as três alternativas abaixo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;(defun string-append0 (&amp;rest strings)&lt;br /&gt;  (declare (optimize (speed 3) (safety 0)))&lt;br /&gt;  (apply #'concatenate 'string strings))&lt;br /&gt;&lt;br /&gt;(defun string-append1 (&amp;rest strings)&lt;br /&gt;  (declare&lt;br /&gt;   (optimize (speed 3) (safety 0)))&lt;br /&gt;  (with-output-to-string (out)&lt;br /&gt;    (loop for str in strings&lt;br /&gt;         while str&lt;br /&gt;       do (write-string str out))))&lt;br /&gt;&lt;br /&gt;(defun string-append2 (&amp;rest strings)&lt;br /&gt;  (declare&lt;br /&gt;   (optimize (speed 3) (safety 0)))&lt;br /&gt;  (let ((output (make-array 0 :adjustable t :fill-pointer 0 :element-type 'base-char)))&lt;br /&gt;    (loop for str in strings do&lt;br /&gt;         (loop for char across str do&lt;br /&gt;              (vector-push-extend char output)))&lt;br /&gt;    output))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(defun string-append (&amp;rest strings)&lt;br /&gt;  (declare&lt;br /&gt;   (optimize (speed 3) (safety 0)))&lt;br /&gt;  (loop&lt;br /&gt;     with len fixnum = (loop for str string in strings sum (length str))&lt;br /&gt;     with output = (make-array len :element-type 'base-char )&lt;br /&gt;     with  pos fixnum = -1&lt;br /&gt;&lt;br /&gt;     for str string in strings&lt;br /&gt;     while (&lt; pos (1- len))&lt;br /&gt;     do&lt;br /&gt;       (loop for char across str&lt;br /&gt;          do (setf (char output (incf pos)) char ))&lt;br /&gt;     finally (return output)))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Executei o seguinte teste para avaliar o desempenho das implementações:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(eval-when (:execute)&lt;br /&gt;  (declare (optimize ((speedy 3) (safety 0))))&lt;br /&gt;&lt;br /&gt;  ; Cria uma list com 100 strings de 30 caracteres &lt;br /&gt;  (let ((lst (loop for i from 1 to 100&lt;br /&gt;     collect&lt;br /&gt;     (make-array 30 :element-type 'base-char :initial-element #\X))))&lt;br /&gt;&lt;br /&gt;    ; Testa todas as funlções&lt;br /&gt;    (dolist (f (list #'string-append0&lt;br /&gt;       #'string-append1&lt;br /&gt;       #'string-append2&lt;br /&gt;       #'string-append))&lt;br /&gt;      (format t "Running ~a~%" f)&lt;br /&gt;      (time (loop repeat 1000 do (apply f lst))))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Rodando no SBCL 1.0.0 em um Athlon 64 obtive os seguintes resultados:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Running #&lt;FUNCTION STRING-APPEND0&gt;&lt;br /&gt;Evaluation took:&lt;br /&gt;  0.393 seconds of real time&lt;br /&gt;  0.358946 seconds of user run time&lt;br /&gt;  0.004999 seconds of system run time&lt;br /&gt;  [Run times include 0.026 seconds GC run time.]&lt;br /&gt;  0 calls to %EVAL&lt;br /&gt;  0 page faults and&lt;br /&gt;  33,662,880 bytes consed.&lt;br /&gt;Running #&lt;FUNCTION STRING-APPEND1&gt;&lt;br /&gt;Evaluation took:&lt;br /&gt;  0.742 seconds of real time&lt;br /&gt;  0.649901 seconds of user run time&lt;br /&gt;  0.008999 seconds of system run time&lt;br /&gt;  [Run times include 0.04 seconds GC run time.]&lt;br /&gt;  0 calls to %EVAL&lt;br /&gt;  0 page faults and&lt;br /&gt;  74,006,848 bytes consed.&lt;br /&gt;Running #&lt;FUNCTION STRING-APPEND2&gt;&lt;br /&gt;Evaluation took:&lt;br /&gt;  0.977 seconds of real time&lt;br /&gt;  0.666898 seconds of user run time&lt;br /&gt;  0.015997 seconds of system run time&lt;br /&gt;  [Run times include 0.041 seconds GC run time.]&lt;br /&gt;  0 calls to %EVAL&lt;br /&gt;  0 page faults and&lt;br /&gt;  10,559,808 bytes consed.&lt;br /&gt;Running #&lt;FUNCTION STRING-APPEND&gt;&lt;br /&gt;Evaluation took:&lt;br /&gt;  0.918 seconds of real time&lt;br /&gt;  0.112983 seconds of user run time&lt;br /&gt;  0.007999 seconds of system run time&lt;br /&gt;  0 calls to %EVAL&lt;br /&gt;  0 page faults and&lt;br /&gt;  4,640,224 bytes consed.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E o vencedor é STRING-APPEND, a função que utiliza o concatenate ficou em segundo lugar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-116930450109419883?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/116930450109419883/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=116930450109419883' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116930450109419883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116930450109419883'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/01/string-append.html' title='String append'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-116926253206161811</id><published>2007-01-19T18:47:00.000-08:00</published><updated>2007-01-19T19:08:52.073-08:00</updated><title type='text'>Python não é Lisp</title><content type='html'>Dentre as linguagens que eu considerava com bom Design, uma era o  python. Porém hoje eu achei um artigo explicando como que os clusures funcionan em python, e como contornar as suas dificiências: &lt;a ref="http://ivan.truemesh.com/archives/000411.html"&gt;Python Closures Pt. 2&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Depois de esse texto eu compreendi porque querem tirar o operador lambda do pyton, sem uma semantica clara para o escopo das variáveis este operador é muito pouco útil.&lt;br /&gt;&lt;br /&gt;Na minha opnião uma das grandes vantangens do Lisp é ter a semantica muito bem definida, o que evita surpresas desagradáveis, como esta do python.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-116926253206161811?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/116926253206161811/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=116926253206161811' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116926253206161811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116926253206161811'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/01/python-no-lisp.html' title='Python não é Lisp'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-116891396210405438</id><published>2007-01-15T18:13:00.000-08:00</published><updated>2007-01-15T18:19:22.410-08:00</updated><title type='text'>CLG funcionando</title><content type='html'>Ontem eu havia baixado o &lt;a href="http://www.cliki.net/clg"&gt;CLG&lt;/a&gt; do CVS, porém não funcionou. Deu um erro estranho no módulo que automaticamente exporta os simbolos do pacote GTK. Escrevi um e-mail para a lista de discussão e hoje de manhã o Espen S Johnsen, autor do CLG, me respondeu dizendo que havia consertado o erro no CVS.&lt;br /&gt;&lt;br /&gt;Mais um cvs update e fialmente consegui rodar o testgtk.lisp!!!!&lt;br /&gt;&lt;br /&gt;Rodar o CLG era um dos desafios em Lisp que eu havia me auto-imposto, de brinde veio com binding para o cairo tb. &lt;br /&gt;&lt;br /&gt;Pouco a pouco o problema de falta de bibliotecas no Lisp vai se resolvendo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-116891396210405438?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/116891396210405438/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=116891396210405438' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116891396210405438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116891396210405438'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/01/clg-funcionando.html' title='CLG funcionando'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-116861718545333018</id><published>2007-01-12T07:47:00.000-08:00</published><updated>2007-01-12T07:53:05.453-08:00</updated><title type='text'>Linux e a décima regra de Greenspun</title><content type='html'>"Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp."&lt;br /&gt;Greenspun's Tenth Rule&lt;br /&gt;&lt;br /&gt;É interssante como nos deparamos com esta regra a todo instante. Hoje estava lendo sobre problemas de inicialização de drivers no kernel do linux(&lt;a href="http://lwn.net/Articles/215235/"&gt;LWN&lt;/a&gt;), o problema é que quando ocorre uma falha no carregamento do driver, os recursos alocados tem que ser desalocados de uma maneira coerente. Por isso foi proposta uma API que administra automaticamente alocação de recursos. Interessante como que desenvolver para o kernel do linux vai se tornando cada vez mais parecido com o desenvolvimento em uma linguagem de alto-nível.&lt;br /&gt;&lt;br /&gt;Um sistema operacional feito em Lisp acaba não parecendo uma idéia tão louca quando vemos o que realmente é feito em um sistema operacional de alto-nível.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-116861718545333018?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/116861718545333018/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=116861718545333018' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116861718545333018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116861718545333018'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/01/linux-e-dcima-regra-de-greenspun.html' title='Linux e a décima regra de Greenspun'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-116770303524209118</id><published>2007-01-01T17:54:00.000-08:00</published><updated>2007-01-01T17:59:15.126-08:00</updated><title type='text'>Widgets para Lisp</title><content type='html'>Vou desenvolver uma aplicação gráfica em lisp e para isso estou escolhendo qual biblioteca de widgets utilizar. Tenho feito algumas experiências, e gostaria de compartinhar com vocês o que eu aprendi.&lt;br /&gt;&lt;br /&gt;As primeiras bibliotecas que me chamaram a atenção foram as que utilizam a biblioteca Cells do Ken Tilton. A Cells cuida da propagação de valores entre instantâncias, isso permite que o valor que seja alterado na camada view seja automaticamente propagado para o model da sua aplicação, achei interessando pois essa foi uma das coisas que eu achei mais interessante no Smalltalk. Nessa categoria temos:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;cells-gtk: Utiliza o gtk como widgets. Me parece o mais desenvolvido dos três, porém eu não consigo rodar ele no SBCL.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;celtik: Utiliza o TK como widgets, aparentemente vai ser disponibilizado junto com o Cells 3.0, atualmente tem que ser baixado via CVS&lt;/li&gt;&lt;br /&gt;&lt;li&gt;cello: Me parece o projeto mais ambicioso, pois utilza OpenGL para desenhar as widgets, é também o menos acabado.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Apesar de simpatizar com o Cells, a única widget que funcionou direto foi o LTK, esta utiliza um pipe para enviar comandos para o TK. Vale resaltar a boa documentação. Ele implementa quase toda a API do TK, porém faltam alguns aspectos da Text Widget, mas felizmente o código e claro e da para adiciona-las facilmente.&lt;br /&gt;&lt;br /&gt;Por fim eu testei a clg, outra biblioteca baseada na GTK, porém encontrei diversos problemas para compila-la.&lt;br /&gt;&lt;br /&gt;Outra opção são:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; lgtk - Aparentemente sem desenvolvimento ativo.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;McClim - Implementação livre do sistema "padrão" de widgets do Lisp.  Me parece interessante, porém meu medo é a falta de documentação e a aprência "antiquada" desta widget. Vejam este &lt;a href="http://bauhh.dyndns.org:8000/mcclim/screenshots/address-book.png"&gt;screenshot&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-116770303524209118?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/116770303524209118/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=116770303524209118' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116770303524209118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116770303524209118'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2007/01/widgets-para-lisp.html' title='Widgets para Lisp'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-116471264313560937</id><published>2006-11-28T03:16:00.000-08:00</published><updated>2006-11-28T03:26:00.346-08:00</updated><title type='text'>Ruby</title><content type='html'>Estou aprendendo ruby, e estou achando ele uma linguagem muito legal. Gosto principalmente dos codeblocks, mas é interessante que por mais features que se adiciona em uma linguagem sempre fica uma que vc gosta de fora.&lt;br /&gt;&lt;br /&gt;Algo que eu sinto muita falta é o REDUCE do lisp, veja este código em LISP:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(reduce #'max (mapcar #'parse-integer (split-sequence #Space "3 42 1")))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Não existe maneira mais elegante de splitar uma string e pegar a maior dos elementos. Ruby chega quase lá:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;"3 42 1".split(" ").map {|x| x.to_i }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Consigo splitar e transformar em inteiros, porém, para achar o máximo eu tenho que usar uma variável a mais e fazer um código muito mais deselegante:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;lst="3 42 1".split(" ").map {|x| x.to_i }&lt;br /&gt;max=-1&lt;br /&gt;lst.each do |x|&lt;br /&gt;  if (x &gt; max)&lt;br /&gt;      max = x;&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;print max,"n"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Uma pena.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-116471264313560937?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/116471264313560937/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=116471264313560937' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116471264313560937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116471264313560937'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2006/11/ruby.html' title='Ruby'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-116438740019246046</id><published>2006-11-24T08:55:00.000-08:00</published><updated>2006-11-28T03:22:36.343-08:00</updated><title type='text'>Todos as funções de um pacote.</title><content type='html'>Hoje rolou uma discussão legal na comp.lang.lisp sobre como fazer para&lt;br /&gt;listar todas as funções de um pacote, uma dúvida que eu tinha já à&lt;br /&gt;algum tempo. O resumo da discussão é o código abaixo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defun doc-pkg-fns (pkg)&lt;br /&gt;(loop with home-package = (find-package pkg)&lt;br /&gt;     for sym being each symbol of home-package&lt;br /&gt;     when (handler-case (symbol-function sym) (undefined-function () nil))&lt;br /&gt;     when (eq (symbol-package sym) home-package)&lt;br /&gt;     do (format t "~a~%~a~%~%" sym&lt;br /&gt;                (or (documentation sym 'function) ""))))&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para ver todas as funções,  com decumetação, do pacote common-lisp digite:&lt;br /&gt;&lt;br /&gt;(doc-pgn-fns (find-package :common-lisp))&lt;br /&gt;&lt;br /&gt;A discussão completa esta em: &lt;a href="http://groups.google.com/group/comp.lang.lisp/browse_thread/thread/bc78c7a40ada09bf"&gt; c.l.l&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-116438740019246046?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/116438740019246046/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=116438740019246046' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116438740019246046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/116438740019246046'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2006/11/todos-as-funes-de-um-pacote.html' title='Todos as funções de um pacote.'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-115621833243660569</id><published>2006-08-21T20:44:00.000-07:00</published><updated>2006-08-21T20:45:32.453-07:00</updated><title type='text'>Serialization</title><content type='html'>Todo o trabalho e a discussão envolvendo serialização de objetos em diversas linguagens ocorre porque as pessoas ignoram que "code is data".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-115621833243660569?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/115621833243660569/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=115621833243660569' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/115621833243660569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/115621833243660569'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2006/08/serialization.html' title='Serialization'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-114904346543729749</id><published>2006-05-30T19:38:00.000-07:00</published><updated>2006-05-30T19:44:25.446-07:00</updated><title type='text'>Continuations em Java.</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Continuation_passing_style"&gt;&lt;span style="font-style:italic;"&gt;Continuation Passing Programming&lt;/span&gt;&lt;/a&gt; é um tópico que me chama à atenção de tempos em tempos. Achei um &lt;a href="http://www-128.ibm.com/developerworks/library/j-contin.html"&gt;artigo na IBM&lt;/a&gt; que trata desse assunto para o ambiente java. A biblioteca Coccon do Apache permite programar usando continuations em java. Já tinha dado uma olhada no Coccon há uns 3 anos atrás, quando procurava uma ambiente para publicar xml's, mas na época a biblioteca estava acima da minha capacidade e me pareceu meio overkiller para oque eu queria fazer. &lt;br /&gt;&lt;br /&gt;Atualmente estou desenvolvendo para o Tapestry que tem uma abordagem de componentes, porém o uso de continuation poderia ser combinado com o uso de componentes para se fazer um ambiente muito sofisticado para desenvolvimento web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-114904346543729749?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/114904346543729749/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=114904346543729749' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/114904346543729749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/114904346543729749'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2006/05/continuations-em-java.html' title='Continuations em Java.'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-114844512823267397</id><published>2006-05-23T21:31:00.000-07:00</published><updated>2006-05-23T21:32:17.873-07:00</updated><title type='text'>Matemáticos programando</title><content type='html'>Trecho de uma entrevista com o criador do STL:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"Question:&lt;br /&gt;What is the origin of STL? Has STL been conceived to be what it is now, that is "the" C++ Standard Library, or does it come from some other project? Could you tell us a history of STL?&lt;br /&gt;&lt;br /&gt;Answer:&lt;br /&gt;In 1976, still back in the USSR, I got a very serious case of food poisoning from eating raw fish. While in the hospital, in the state of delirium, I suddenly realized that the ability to add numbers in parallel depends on the fact that addition is associative. (So, putting it simply, STL is the result of a bacterial infection.) In other words, &lt;span style="font-weight:bold;"&gt;I realized that a parallel reduction algorithm is associated with a semigroup structure type&lt;/span&gt;. That is the fundamental point: &lt;br /&gt;algorithms are defined on algebraic structures. It took me another couple of years to realize that you have to extend the notion of structure by adding complexity requirements to regular axioms. And than it took 15 years to make it work. (I am still not sure that I have been successful in getting the point across to anybody outside the small circle of my friends.) I believe that iterator theories are as central to Computer Science as theories of rings or Banach spaces are central to Mathematics. Every time I would look at an algorithm I would try to find a structure on which it is defined. So what I wanted to do was to describe algorithms generically. That's what I like to do. I can spend a month working on a well known algorithm trying to find its generic representation. So far, I have been singularly unsuccessful in explaining to people that this is an important activity. But, somehow, the result of the activity - STL - became quite successful."&lt;br /&gt;&lt;br /&gt;Matemáticos programando...&lt;br /&gt;&lt;br /&gt;O resto da entrevista esta aqui: http://www.stlport.org/resources/StepanovUSA.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-114844512823267397?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/114844512823267397/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=114844512823267397' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/114844512823267397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/114844512823267397'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2006/05/matemticos-programando.html' title='Matemáticos programando'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-114065969521662278</id><published>2006-02-22T17:54:00.000-08:00</published><updated>2006-02-22T17:54:55.300-08:00</updated><title type='text'>GO</title><content type='html'>Lisp é o GO das liguagens de programação. Ambos tem a mesma elegância na simplicidade.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-114065969521662278?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/114065969521662278/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=114065969521662278' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/114065969521662278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/114065969521662278'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2006/02/go.html' title='GO'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-113348230588496349</id><published>2005-12-01T16:06:00.000-08:00</published><updated>2005-12-01T16:11:45.913-08:00</updated><title type='text'>Aprendendo C#</title><content type='html'>Estou aprendendo C# para um trabalho. Algumas pessoas falam que C# ~ Java, mas diria que C# ~ Java + Delphi, pois o sistema de eventos e propriedades dele me lembra muito o delphi devido ao uso de "métodos" especiais e palavras reservadas para coisas que são específicas para GUIs.&lt;br /&gt;&lt;br /&gt;Lí em algum lugar que a Microsoft contratou levas inteiras de programadores da Borland, isso talvez explique a relação entre o C# e o Delphi. Alguns dizem que todo o dotNet surgiu das pessoas que saíram da Borland. Já Senti uma melhora "cultura microsoft" de desenvolvimento: eles não usam notação húngara!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-113348230588496349?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/113348230588496349/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=113348230588496349' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/113348230588496349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/113348230588496349'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2005/12/aprendendo-c.html' title='Aprendendo C#'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-113176835477622024</id><published>2005-11-11T20:05:00.000-08:00</published><updated>2005-11-11T20:10:32.500-08:00</updated><title type='text'>From comp.lang.lisp</title><content type='html'>"We are the Knights of Lambda Calculus. You must return here with a lexical closure... or else you will never pass through this code alive!"&lt;br /&gt;&lt;br /&gt;Mais informações em: &lt;a href="http://www.swiss.ai.mit.edu/~boogles/Illuminati/"&gt; Illuminati &lt;/a&gt; ou &lt;a href="http://en.wikipedia.org/wiki/Knights_of_the_Lambda_Calculus"&gt;Wikipedia&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-113176835477622024?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/113176835477622024/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=113176835477622024' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/113176835477622024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/113176835477622024'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2005/11/from-complanglisp.html' title='From comp.lang.lisp'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-112839099200465872</id><published>2005-10-03T18:50:00.000-07:00</published><updated>2006-11-28T03:29:52.110-08:00</updated><title type='text'>LispM open source.</title><content type='html'>O MIT liberou o código fonte do LispM sobre licença BSD, os arquivos &lt;a href="http://www.heeltoe.com/retro/mit/mit_cadr_lmss.html"&gt; estavam guardados em fitas de 9 trilhas &lt;/a&gt; e foram recuperados do limbo.&lt;br /&gt;&lt;br /&gt;Esse código é a base dos Lisp Machines que surgiram nos anos 80. Duas empresas vendiam computadores que executavam diretamente código em LISP, a Symbolics e a LMI, ambas fundadas por ex-hackers do MIT. Esse código tem um importância histórica muito grande, pois foi por causa de uma brica com os caras da Symbolics que o &lt;a href="http://www.gnu.org/gnu/rms-lisp.html"&gt; Richard M. Stallman iniciu a GNU. &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mais comentários podem ser encontrados &lt;a href="http://bc.tech.coop/blog/051002.html"&gt; neste blog. &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-112839099200465872?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/112839099200465872/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=112839099200465872' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112839099200465872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112839099200465872'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2005/10/lispm-open-source.html' title='LispM open source.'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-112777583506448082</id><published>2005-09-26T15:34:00.000-07:00</published><updated>2005-09-26T16:03:55.146-07:00</updated><title type='text'>Microsoft, o passado da computação</title><content type='html'>Pelo o que eu li nesse &lt;a href="http://online.wsj.com/article/0,,SB112743680328349448,00.html?mod=todays_us_page_one"&gt; artigo &lt;/a&gt;, a microsft está 20 anos no passado da engenharia de software, imersa na culura de programadores dos ugle hacks. É algo impressionante e desolador.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-112777583506448082?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/112777583506448082/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=112777583506448082' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112777583506448082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112777583506448082'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2005/09/microsoft-o-passado-da-computao.html' title='Microsoft, o passado da computação'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-112708641178764698</id><published>2005-09-18T16:25:00.000-07:00</published><updated>2005-09-18T16:36:18.570-07:00</updated><title type='text'>C# 3.0</title><content type='html'>Acabei de ler um &lt;a href="http://developers.slashdot.org/developers/05/09/18/0545217.shtml?tid=109&amp;amp;tid=8%20%20%20"&gt; artigo no slashdot &lt;/a&gt; sobre o C# 3.0. Dessa vez a Microsoft mandou bem, eles vão introduzir &lt;a href="http://en.wikipedia.org/wiki/Type_inference"&gt; type inference &lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Lisp_programming_language#Lambda_expressions"&gt; lambdas &lt;/a&gt; e  tipos anônimos  na linguagem, recursos tradicionais de LISP e ML. Quem sabe esse movimento faça com que Sun evolua realmente o Java, pois:&lt;br /&gt;&lt;br /&gt;MeuTipoComNomeMuitoLongo x = new MeuTipoComNomeMuitoLongo()&lt;br /&gt;&lt;br /&gt;É muito estúpido de digitar. Agora é esperar o pessoal do Mono implementar essas características.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-112708641178764698?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/112708641178764698/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=112708641178764698' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112708641178764698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112708641178764698'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2005/09/c-30.html' title='C# 3.0'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-112362573647941748</id><published>2005-08-09T15:12:00.000-07:00</published><updated>2005-08-09T15:15:36.486-07:00</updated><title type='text'>Java</title><content type='html'>Java é a linguagem que poderia ser descente, mas não sei porque o pessoal da sun insiste em fazer ela ser a pain in the ass por um série de bobagens.&lt;br /&gt;&lt;br /&gt;Esse &lt;a href="http://www.cabochon.com/%7Estevey/sokoban/"&gt;artigo&lt;/a&gt; expõe diversos pontos interessantes sobre as falhas do java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-112362573647941748?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/112362573647941748/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=112362573647941748' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112362573647941748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112362573647941748'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2005/08/java.html' title='Java'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-112264874619719596</id><published>2005-07-29T07:46:00.000-07:00</published><updated>2005-07-29T07:53:21.910-07:00</updated><title type='text'>Viaweb</title><content type='html'>Achei um &lt;a href="http://lib.store.yahoo.com/lib/paulgraham/bbnexcerpts.txt"&gt;texto do Paul Graham&lt;/a&gt;, na qual ele explica melhor o funcionamento da viaweb. Ele usa continuations implementadas como closures. Interessante a abordagem para criação das páginas, elas são escritas em uma linguagem chamada RHTML, que no fundo não passa de um conjunto de macros de lisp. Interessante que eles não utilizando banco de dados para aplicação, os dados são carregados na memória e armazenados como arquivos no disco.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-112264874619719596?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/112264874619719596/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=112264874619719596' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112264874619719596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112264874619719596'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2005/07/viaweb.html' title='Viaweb'/><author><name>Leonardo Varuzza</name><uri>https://profiles.google.com/106428020899659897437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-VfVeE_sAxds/AAAAAAAAAAI/AAAAAAAAAAA/ohSMK6AOy8g/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-112094617435950745</id><published>2005-07-09T12:39:00.000-07:00</published><updated>2005-07-09T14:56:14.366-07:00</updated><title type='text'>Symbolics</title><content type='html'>Interessante a estória da Symbolics, uma empresa da época romântica da industria de informática, onde cada fabricante tinha a sua própria linguagem de programação, os meninos e os homens eram separados pelo BASIC, hahhaha.&lt;br /&gt;&lt;br /&gt;O site da wikipedia é legal:&lt;br /&gt;&lt;br /&gt;http://en.wikipedia.org/wiki/Symbolics&lt;br /&gt;&lt;br /&gt;O link com a estória vista do ponto de vista do Richard Stallman também é bem interessante: &lt;br /&gt;&lt;br /&gt;http://www.gnu.org/gnu/rms-lisp.html&lt;br /&gt;&lt;br /&gt;Isso me faz pensar o que teria acontecido se o lisp tivesse se tornado a linguagem mainstream em vez do C. O C ganhou devido ao UNIX e devido à microsoft posteriormente ter adotado ele, ninguém comenta mas o DOS teve muita influência do UNIX, a microsoft inclusive teve uma versão do UNIX, o XENIX.&lt;br /&gt;&lt;br /&gt;Com o lisp teriamos programas e programadores mais preocupados com programas que funcionam do que programas que funcionem 0.1% mais rápido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-112094617435950745?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/112094617435950745/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=112094617435950745' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112094617435950745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112094617435950745'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2005/07/symbolics.html' title='Symbolics'/><author><name>Jonny Marafo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-112087473854251211</id><published>2005-07-08T19:02:00.000-07:00</published><updated>2005-07-08T19:05:38.543-07:00</updated><title type='text'>Lisp com GTK</title><content type='html'>O toolkit canonico do lisp é o CLIM, a implementalção free que existe é o McCLIM. Mas me pareceu muito old-fashion, com cara de Motif.&lt;br /&gt;&lt;br /&gt;Existem alguns bidings de GTK para lisp. O que me pareceu mais sofisticado é o Cells-GTK. Ele é baseado em um framework chamado cells que me lembrou um pouco o MVC do smalltalk, principalmente a parte de ValueHolders.&lt;br /&gt;&lt;br /&gt;Consegui rodar o demo no CMUCL. O problema que a documentação tanto do Cells-GTK quanto do Cells é muito ruim. Preciso fazer engenharia reversa nos demos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-112087473854251211?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/112087473854251211/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=112087473854251211' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112087473854251211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112087473854251211'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2005/07/lisp-com-gtk.html' title='Lisp com GTK'/><author><name>Jonny Marafo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-112087455636569531</id><published>2005-07-08T18:53:00.000-07:00</published><updated>2005-07-08T19:02:36.366-07:00</updated><title type='text'>Lisp na Web</title><content type='html'>Desenvolvimento para web é um saco. Perl não é estruturado o suficiente, java exige muita digitação e é lento. Lisp me parece uma boa solução.&lt;br /&gt;&lt;br /&gt;Existe um framework que parece ser bem sofisticado, o UncommonWeb. Dizem que ele é um framework baseado em continuations (coisa bem esotérica, digamos que é a generalização da excessões e que são utilizados para mais coisas do que somente tratar erros).&lt;br /&gt;&lt;br /&gt;Ainda não consegui fazer ele funcionar. O que eu consegui é utilizar o mod_lisp com o tbnl. Você coloca um processo lisp para rodar e o apache se comunica com ele, de maneira similar que do que se faria com o tomcat. (Não use o cl_modlisp, me pareceu muito tosco, o tbnl me pareceu muito melhor).&lt;br /&gt;&lt;br /&gt;Uma coisa que eu fiz que nem fudendo um programador de java consegue. Você roda o lisp usando um programa chamado detachtty. É um programa em C simples, similar ao nohup, ele desassocia o seu processo lisp do terminal, vc pode portanto deslogar e ele continua rodando em background. Só que o detachtty abre um file socket onde vc indicar, dai é só utilizar o programa attachtty para associar novamente o processo ao seu terminal.&lt;br /&gt;&lt;br /&gt;Ou seja vc coloca o servidor para rodar e vai embora. Se ocorrer qualquer problema é só logar nele e executar qualquer comando lisp, qualquer programa, etc. Não dá para fazer isso no tomcat.&lt;br /&gt;&lt;br /&gt;Imagina fazer um painel de controle gráfico que controla a sua aplicação WEB.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-112087455636569531?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/112087455636569531/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=112087455636569531' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112087455636569531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112087455636569531'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2005/07/lisp-na-web.html' title='Lisp na Web'/><author><name>Jonny Marafo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-112087396067269333</id><published>2005-07-08T18:49:00.000-07:00</published><updated>2005-07-08T18:52:40.673-07:00</updated><title type='text'>Utilizar o lisp como script language</title><content type='html'>Aprendi como utilizar o lisp como uma script language, tipo perl.&lt;br /&gt;&lt;br /&gt;Você coloca no inicio do seu script:&lt;br /&gt;&lt;br /&gt;#!/usr/bin/sbcl --noinform &lt;br /&gt;&lt;br /&gt;Depois modifica o .sbclrc para que ele ignore as linhas que começam com #!&lt;br /&gt;&lt;br /&gt;$ cat &gt;&gt; .sbclrc&lt;br /&gt;;;; If the first user-processable command-line argument is a filename,&lt;br /&gt;;;; disable the debugger, load the file handling shebang-line and quit.&lt;br /&gt;&lt;br /&gt;(let ((script (and (second *posix-argv*)&lt;br /&gt;     (probe-file (second *posix-argv*)))))&lt;br /&gt;  (when script&lt;br /&gt;    ;; Handle shebang-line&lt;br /&gt;    (set-dispatch-macro-character #\# #\!&lt;br /&gt;      (lambda (stream char arg)&lt;br /&gt;        (declare (ignore char arg))&lt;br /&gt;        (read-line stream)))&lt;br /&gt;    ;; Disable debugger&lt;br /&gt;    (setf *invoke-debugger-hook*&lt;br /&gt;   (lambda (condition hook)&lt;br /&gt;     (declare (ignore hook))&lt;br /&gt;     ;; Uncomment to get backtraces on errors&lt;br /&gt;     ;; (sb-debug:backtrace 20)&lt;br /&gt;     (format *error-output* "Error: ~A~%" condition)&lt;br /&gt;     (quit)))&lt;br /&gt;    (load script)&lt;br /&gt;    (quit)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dai dá para faze o hello world em lisp:&lt;br /&gt;&lt;br /&gt;#!/usr/bin/sbcl --noinform &lt;br /&gt;(format t "Hello World~%")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-112087396067269333?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/112087396067269333/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=112087396067269333' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112087396067269333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112087396067269333'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2005/07/utilizar-o-lisp-como-script-language.html' title='Utilizar o lisp como script language'/><author><name>Jonny Marafo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14325535.post-112087299470742280</id><published>2005-07-08T18:16:00.000-07:00</published><updated>2005-07-08T18:49:10.096-07:00</updated><title type='text'>Porque lisp?</title><content type='html'>O lisp sempre me atraiu, afinal é a linguagem do emacs, "The One True Editor". Outra coisa que sempre me intrigou é ouvir todos aqueles programadores fodas sempre falavam bem do lisp e eu queria entender qual a vantagem.&lt;br /&gt;&lt;br /&gt;O primeiro passo vou ler o livro "Practical Common Lisp", que está no site &lt;br /&gt;&lt;br /&gt;http://www.gigamonkeys.com/book/&lt;br /&gt;&lt;br /&gt;Ótima introdução, além de ver exemplos práticos entendi o que o lisp tem de diferente das outras linguagens: as macros. &lt;br /&gt;&lt;br /&gt;Macro em lisp é algo muito diferente das macros em C. As macros em C fazem somente substituição de texo, já as macros em lisp são programas que geram programas. Isso só é possível devido a sintaxe simples do lisp, como programas são listas eles podem ser manipulados como qualquer outro tipo de dados.&lt;br /&gt;&lt;br /&gt;Pena o lisp ser tão pouco conhecido aqui no brasil, nos falta aqui o peso de um departamento de computação como o do MIT que ensina lisp no primeiro ano da graduação.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Existem coisas que você deve usar no lisp tornam a sua vida bem mais fácil. A primeira delas é usar o debian, ele já vem com quatro implementações de lisp. Eu estou usando o SBCL e o CMUCL. Acho que o SBCL tem mais futuro, ele é mais moderno, mas algumas coisas ainda só rodam no CMUCL.&lt;br /&gt;O debian também tem diversos pacotes para o Common Lisp já empacotados.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Outra coisa, use o emacs! Ele tem um modo chamado ilisp que já vem com o debian que eu achava legal, até conhecer o SLIME. Depois que você usa ele não quer saber de nenhum outro modo de lisp.&lt;br /&gt;&lt;br /&gt;Ele não está na sarge, mas tem um repositório não oficial com ele, é só adicionar a linha abaixo no source.list:&lt;br /&gt;&lt;br /&gt;deb http://commonwerx.org/software/contrib/slime/deb ./&lt;br /&gt;&lt;br /&gt;Mas nem todas as bibliotecas estão empacotadas, para ver uma lista muito completa de pacotes vá no site do cliki, ele é uma espécie de CPAN para common lisp:&lt;br /&gt;&lt;br /&gt;http://www.cliki.net/index&lt;br /&gt;&lt;br /&gt;Em seguida aprenda como utilizar o asdf-install, que faz o mesmo trabalho do módulo CPAN do perl.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Depois de ler o "Practical Common Lisp" uma boa escolha é ler o OnLisp do Paul Graham, também está disponível de graça na rede. Nele você aprende os tópicos avançados a linguagem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14325535-112087299470742280?l=lispbr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispbr.blogspot.com/feeds/112087299470742280/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14325535&amp;postID=112087299470742280' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112087299470742280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14325535/posts/default/112087299470742280'/><link rel='alternate' type='text/html' href='http://lispbr.blogspot.com/2005/07/porque-lisp.html' title='Porque lisp?'/><author><name>Jonny Marafo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
