Estou escrevendo um livro sobre LISP e este texto é a introdução
do livro que publico aqui até mesmo para excitar algum interessado
em participar do projeto.
O primeiro capítulo é uma apresentação da linguagem e tenho como objetivo
que ao final do mesmo a leitora esteja escrevendo os seus próprios programas em
LISP.
Assim o livro se divide em duas partes, a primeira parte é um tutorial sobre a
linguagem de modo que o primeiro capítulo sirva como um rápido tutorial que
a conduza a iniciar os seus próprios programas com apoio dos demais
capítulos,
da primeira parte, que representam guia de referência sobre as primitivas do
LISP, melhor dizendo do Common LISP.
A segunda parte trata da parte avançada da linguagem incluindo programação
orientada à objeto em LISP, CLOS, que é um dos sistemas de programação orientada
a objeto, OO, para LISP.
O livro está baseado GNU CLISP 2.48 (2009-07-28)
http://clisp.cons.org/ de Bruno Haible e outros que pode ser rapidamente
instalado se você estiver usando uma distribuição Linux que seja
baseada em Debian/GNU/Linux,
com o comando
sudo apt-get install clisp
Há uma variedade bem grande de pacotes que rodam Common LISP, muitos
de natureza comercial e diversos livres como clisp. Em geral há
uma grande compatibilidade entre eles, entretanto eu não posso falar muito a
respeito uma vez que somente conheço o GNU clisp. Para ser prático,
procure um LISP que lhe esteja à mão e comece, você vai ver que não
importa muito qual seja o pacote e que este livro lhe vai servir de ajuda
mesmo que não seja clisp. Apenas clisp é de domínio público e fácil de
instalar, se você estiver usando Debian/GNU/linux ou uma distribuição que
seja baseada no Debian.
Deixe-me agora justificar porque LISP?
Quem criou LISP foi o matemático, Paul McCarthy que havia se transformado em cientista da
computação como a grande maioria dos que criaram a ciência da computação nos
anos 40 e 50. É preciso corrigir esta afirmação, ninguém faz uma coisa tão
importante sozinho, e McCarthy era o lider do grupo de pesquisas em
inteligência artificial do MIT e foi este grupo que construiu LISP.
Ao criar a linguagem, McCarthy, e seus colaboradores, deve ter se inspirado em uma
construção Matemática do tipo duma estrutura algébrica, ou talvez pensasse
na milenar construção lógica a geometria euclidiana e de fato foi uma
criação muito bem feita. LISP era um ambiente em que
existem objetos interagindo de modo
fechado, cada operação entre os objetos resultaria noutro objeto também
reconhecido pelo ambiente, exatamente como acontece numa estrutura
algébrica ou na geometria euclidiana.
Na geometria euclidiana a operação de interseção de duas retas será
uma reta ou um objeto de categoria inferior, (dimensão inferior) mas também um objeto
geométrico, um ponto ou o vazio. É assim que funciona LISP de
McCarthy, depois ele fui se humanizando...e chegou ao Common LISP.
A ideia de McCarthy é dificil de ser reproduzida, infelizmente
clisp já não entende mais a forma primitiva de LISP e não será
possível repetir a bela construção inicial.
O risco com esta descrição é de que você conclua que LISP não é para você,
até mesmo porque muito provavelmente você já terá ouvido falar desta linguagem
como alguma coisa para gente envolvida com inteligência artificial e
até mesmo é possível que já tenha escutado alguém dizer que LISP é a
linguagem de máquina da inteligência artificial.
Primeiro que tudo, em parte estas afirmações são verdadeiras, somente em
parte, porque inteligência artificial é feita com C++,
python, ou pelo menos o que se espera que seja inteligência
artificial... Um jogo seria um exemplo de construção de
inteligência artificial? certamente
sim, e a linguagem de escolha será C++ ou python, mas também
pode ser LISP. Depois, se eu não dissesse aqui o que significa LISP entre os
que falam mal da linguagem, ficaria um hiato importante na introdução. LISP
quer dizer Lots of
Insipid, Stupid Parenthesis" -
Quantidade de Parentesis Insípidos
e Idiotas - porque a marca dos blocos em LISP são parenteses enquanto que em
C++ são chaves, mas ninguém diz que C++ é um amontoado de
chaves idiotas...
A verdade é que você pode conseguir com LISP, em código muito menor,
qualquer coisa que você conseguiria fazer em qualquer outra linguagem de
programação. Se eu dissesse que é a linguagem superior a qualquer outra
linguagem, não estaria dizendo nenhuma mentira, apenas um pequeno
exageiro, porque esta linguagem melhor do que todas as outras realmente não
existe. Se você for trabalhar com bancos de dados, escolha PHP ou alguma
linguagem da família SQL, caso contrário você terá que montar todas as
estruturas estatísticas e relacionamento entre dados, mas com um pequeno
trabalho você pode montar um SQL em LISP, ou talvez mesmo já exista um
SQL feito em LISP e neste caso seria começar a partir dele.
Qualquer linguagem de programação pode crescer e ser transformada na
ferramenta que você precisa, apenas LISP cresce de forma natural e se
transforma em qualquer ferramenta facilmente!
Se você seguir em frente verá que tudo isto é verdade, mas será preciso
investir algumas horas de estudo para superar o primeiro trauma e logo
começar a ver que tem em suas mãos um instrumento de primeira qualidade.
Acho que um bom exemplo, para apresentar neste ponto,
é a definição do fatorial.
Com C++: long fatorial (long n) {
long prod = 1;
for (int x=0;x<n;x++)
prod = prod * (1 + x);
return prod; }
Com LISP(defun fatorial (n)
(let ((sum 1))
(dotimes (x n)
(setf sum (* sum (1+ x))))
sum))
(fatorial 1000)
4023872600770937735437024339230039857193748642107146325437999
1042993851239862902059204420848696940480047998861019719605863
1666872994808558901323829669944590997424504087073759918823627
7271887325197795059509952761208749754624970436014182780946464
9629105639388743788648733711918104582578364784997701247663288
9835955735432513185323958463075557409114262417474349347553428
6465766116677973966688202912073791438537195882498081268678383
7455973174613608537953452422158659320192809087829730843139284
4403281231558611036976801357304216168747609675871348312025478
5893207671691324484262361314125087802080002616831510273418279
7770478463586817016436502415369139828126481021309276124489635
9928705114964975419909342221566832572080821333186116811553615
8365469840467089756029009505376164758477284218896796462449451
6076535340819890138544248798495995331910172335555660213945039
9736280750137837615307127761926849034352625200015888535147331
6117021039681759215109077880193931781141945452572238655414610
6289218796022383897147608850627686296714667469756291123408243
9208160153780889893964518263243671616762179168909779911903754
0312746222899880051954444142820121873617459926429565817466283
0295557029902432415318161721046583203678690611726015878352075
1516284225540265170483304226143974286933061690897968482590125
4583271682264580665267699586526822728070757813918581788896522
0816434834482599326604336766017699961283186078838615027946595
5131156552036093988180612138558600301435694527224206344631797
4605946825731037900840244324384656572450144028218852524709351
9062092902313649327349756551395872055965422874977401141334696
2715422845862377387538230483865688976461927383814900140767310
4466402598994902222217659043399018860185665264850617997023561
9389701786004081188972991831102117122984590164192106888438712
1855646124960798722908519296819372388642614839657382291123125
0241866493531439701374285319266498753372189406942814341185201
5801412334482801505139969429015348307764456909907315243327828
8269864602789864321139083506217095002597389863554277196742822
2487575867657523442202075736305694988250879689281627538488633
9690995982628095612145099487170124451646126037902930912088908
6942028510640182154399457156805941872748998094254742173582401
0636774045957417851608292301353580818400969963725242305608559
0370062427124341690900415369010593398383577793941097002775347
2000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000
000000
... mas ... tente fazer isto com C++ :-)
Você encontra este exemplo aqui
http://cs.gmu.edu/~sean/lisp/LispTutorial.html
que é uma página-tutorial sobre a linguagem LISP. Lendo a página você conseguirá fazer alguns programas em LISP, mas como o autor mesmo diz, o objetivo é apenas mostrar que vale a pena o esforço de aprender a linguagem, depois você terá que pegar um bom livro sobre LISP e se aprofundar.
Surpreendente? Em C++ não daria par ir além de 13! com valor
exato. Em python em geral é possível chegar a 3000!, (ou mais) com valor exato,
e há outras linguagens em que se pode obter o fatorial, exatamente, para
grandes números inteiros, com calc é possível, também.
Em LISP isto somente depende da memória da
máquina! e algumas destas linguagens com que se pode calcular fatorial para
grandes números inteiros, foram feitas com LISP, Maxima, por exemplo.
Aliás, foi por causa do fatorial que comecei a estudar LISP. Um aluno que
me havia ouvido falar em aula da impossibilidade de ir além do fatorial de
13, em Pascal, bateu à porta do meu gabinete, e, quando eu apareci ele me
exibiu uma folha de papel cheia de números. Quando eu lhe disse: “e daí?”,
ele respondeu “750!” Eu comecei a estudar LISP! abandonei Pascal
e me tornei um LISPnick!
Fatorial é certamente um cálculo importante, está envolvido em combinações e
combinatória é uma área que já justificaria o uso de LISP.
Não seria fácil apresentar agora mais exemplos que justificassem o
esforço de superar o stress inicial com o aprendizado de uma linguagem que
tem uma sintaxe bastante diferente das linguagens de programação usuais. Mas
posso lhe garantir que você já estará convencida disto ao final do primeiro
capítulo do meu livro, mas, asseguro-a, você não precisa esperar que eu termine o livro, há ótimos tutoriais por como o que indiquei acima.
Para usar LISP é muito simples e barato mesmo! Se você rodar LINUX no seu computador, e se for baseado no Debian (como ubuntu, mynt) basta
sudo apt-get install clisp
e você tem um interpretador LISP funcionando na máquina em questão de minutos. Para instalar C++ faça
sudo apt-get install gcc
mas provavelmente já estará instalado porque é a linguagem de processamento padrão de LINUX.