Você está na página 1de 813

Pgina1

LISPCOMUM:
AGentleIntroduo
deComputaoSimblica

Pgina2

LISPCOMUM:

AGentleIntroduo

deComputaoSimblica

DavidS.Touretzky
UniversidadeCarnegieMellon

TheBenjamin/CummingsPublishingCompany,Inc.
RedwoodCity,CalifrniaFortCollins,ColoradoMenloPark,California
Reading,MassachusettsNovaIorqueDonMill,OntarioWorkingham,UK
AmsterdamBonnSydneySingapuraTquioMadridSanJuan

pgina3

PatrocinadoradoEditor:AlanApt
EditordeDesenvolvimento:MarkMcCormick
CoordenadordeProduo:JohnWalker
CpiadoEditor:StevenSorenson
TextoeCoverDesigner:MichaelRogondino
ImagemdacapaselecionadaporDavidS.Touretzky
Cover:LaGrandeVitesse,esculturadeAlexanderCalder
Copyright(c)1990porsimblicaTecnologia,Ltd.
PublicadoporTheBenjamin/CummingsPublishingCompany,Inc.
Estedocumentopodeserredistribudoemformaimpressa,eapenaspara
finseducacionais,semcustoparaodestinatrio.redistribuioem
formatoelectrnico,comoemumapginawebouumdiscodeCDROM,proibido.
Todososoutrosdireitossoreservados.Qualqueroutrousodestematerialproibida
semapermissoporescritododetentordosdireitosautorais.
Osprogramasapresentadosnestelivroforamincludasparaasua
valorinstrucional.Elesforamtestadoscomcuidado,masnoso
garantidoparaqualquerfinalidadeparticular.Aeditoranooferecequalquer
garantiasourepresentaes,nemaceitaquaisquerresponsabilidadescom
Relativamenteaosprogramas.
BibliotecadoCongressodeDadosdeCatalogaonaPublicao

Touretzky,DavidS.
LISPcomum:umaintroduosuaveparacomputaosimblica/
DavidS.Touretzky
p.cm.
Incluiondice.
ISBN0805304924
1.CommonLisp(Computerlinguagemdeprogramao)
I.Ttulo.
QA76.73.C28T681989
005.13'3 DC20
8915180
CIP
ISBN0805304924
ABCDEFGHIJKDO8932109
TheBenjamin/CummingsPublishingCompany,Inc.
390PonteParkway
RedwoodCity,Califrnia94065

page4

ParaPhileAnne

page5

Prefcio

EstelivrosobreaprenderaprogramaremLisp.Emboraamplamenteconhecidocomo
alnguaprincipaldaintelignciaartificialinvestigaodeumdosmais
reasavanadasdeinformticaLispumalinguagemexcelentepara
iniciantes.cadavezmaisalnguadeescolhaemintrodutria
cursosdeprogramaodevidoaoseuambienteamigveleinterativo,dadosricos
Textooriginalemingls:
estruturaseferramentasdesoftwarepoderosasquemesmouminiciantepodedominaremsuma
Studentstakingtheirfirstprogrammingcourse.
ordem.
Sugiraumatraduomelhor
Quandoescreviolivroqueeutinhatrstiposdeleitoremmente.Eugostariade
abordarumdecadavez.
Osalunosquefazemseuprimeirocursodeprogramao.Oestudantepoderia
serdequalquerdisciplina,decinciadacomputaoparaascinciashumanas.
Paravoc,deixemesublinharapalavrasuavenottulo.Eunoassumem
formaomatemticaantesalmdearitmtica.Mesmosevoc
nogostadematemtica,vocpodeacharquevocgostadeprogramaodecomputadores.
Eutenhoevitadoojargotcnico,ehmuitosexemplos.Tambm

vocvaiencontrarumaabundnciadeexercciosintercaladoscomotexto,ea
respostasatodaselasestoincludasnoApndiceC.
psiclogos,lingistas,cientistasdacomputaoeoutraspessoas
interessadosemIntelignciaArtificial.Comovoccomearasuainvestigaosobre
AI,vocvaiverquequasetodaainvestigaonestedomniorealizada
emLisp.AmaioriadostextosLispsoescritosexclusivamenteparacomputador
majoresdacincia,maseuteridoparaumgrandeesforoparafazerestelivro
acessvelatodos.Podeserasuaportadeentradaparaotcnico
literaturadaAI,bemcomoumarpidaintroduosuaferramentacentral.
entusiastasdecomputador.Antesdecercade1984,osdisponveisnoLisps
computadorespessoaisnoerammuitobonsdevidospequenasmemrias
dasprimeirasmquinas.Computadorespessoaisdehojemuitasvezesvm
comvriosmegabytesdeRAMeumdiscorgidocomopadro
vii

page6

viii

CommonLisp:AGentleIntroduoComputaoSimblica
equipamento.ElescorremimplementaescompletasdoCommonLisp
standard,efornecerasmesmasferramentasdealtaqualidadecomoosLispsem
universidadeelaboratriosdeinvestigaoindustrial.O''LispToolkit''
seesdestelivroirapresentloparaosrecursosavanadosdo
oambientedeprogramaoLispComumquefizerama
idiomaumaferramentatoprodutivoparaprototipagemrpidaeAI

programao.
Estevolumeatualdo''introduosuave''usaCommonLisp
aolongo.Lispvemmudandocontinuamentedesdeasuainveno30anos
atrs.Nopassado,noforamapenasosdialetosLispemmquinasdiferentes
incompatveis,masosprogramasescritosemumdialetoquemuitasvezesjnoserexecutadoem
quemesmodialetoalgunsanosmaistarde,porquealinguagemevoluiuparaforade
sobeles.Rpido,evoluoirrestritafoibenficanosprimeirosdias,
masademandaporumpadro,eventualmente,cresceu,assimLispComumfoicriado.em
Actualmente,CommonLispopadrodefactosuportadoportodososprincipais
fabricantesdecomputadores.Eleestatualmentepassandoporrefinamentoparaumfuncionrio
padro.MasLispcontinuaraevoluir,noentanto,eopadroser
seratualizadoperiodicamentepararefletirnovascontribuiespessoasfizeramao
lngua.Talvezumdessescontribuintesservoc.
DAVIDS.TOURETZKY
Pittsburgh,Pennsylvania

page7

NotaparaInstrutores

MuitotemsidoaprendidonosltimosanossobrecomoensinarLisp
eficazmenteparainiciantes:ondeelestropeameoquepodemosfazersobreisso.Dentro
Almdisso,amudanaparaCommonLisptemalteraesnecessrioemocaminho
determinadostemassoensinados,especialmentevariveis,escopoemisso.este
versodo''introduosuave''foicompletamenterevistoparaComum
Lisp,eincluivriasnovasferramentasdeensinoqueeuacreditoquevocvaiencontrar
inestimvelnasaladeaula.Deixemecompartilharcomvocsalgunsdospensamentos
portrsnovaabordagemdestelivroparaLisp.
notaogrfica
Osdoisprimeiroscaptulosusarumanotaoboxeflechagrficaparadescrever
funesprimitivasecomposiodefuno.Estanotaopermitequeosalunos
sesentirconfortvelcomaidiabsicadecomputaoeostrsfundamentais
estruturasnmeros,smbolosedadoslistas,antesabraoscomolado
questescomoasintaxedeumachamadadefunoouquandousaraspas.Apesar
lucroLisperssofisticadadaconstataodequeosprogramassodados,parao
inicianteestaumaimportantefontedeconfuso.Anotaoboxeflecha

tornaosprogramasedadosvisualmentedistinto,e,assim,eliminaamaioriasintaxe
erros.Outravantagemdestesistemadenotaoasuafaltadevariveisexplcitasa
entradasparaumafunososimplesmentesetasqueentramnadefiniodafunode
ladodefora.Desdequenohnenhumaimplementaocomputadordenotaocaixadefuno,
osdoisprimeiroscaptulossoprojetadosparaseremcobertosrapidamenteusandoapenaslpise
papel.Issotambmabrigaoestudantetemporariamentedeoutrafontede
frustraoaprendizagemamecnicadousodeumamquinareal,aedio
expresses,elidarcomodepurador.
Osleitoresqueestofamiliarizadoscomoutraslinguagensdeprogramaopodevirar
oCaptulo1,emumminutooumais,leiaoresumonofinal,eemseguida
desnatadoCaptulo2parapegarosbsicosprimitivoslistademanipulao.
ix

page8

CommonLisp:AGentleIntroduoComputaoSimblica
NoCaptulo3,oalunoapresentadoanotaoEVALpadroa
conceitosdecotaoevariveisnomeadasseguemquasequenaturalmente.Agoraeleou
elaestprontaparadescartarpapelelpisparaumcomputadordeverdade(e,provavelmente,
ansiosoparafazlo),enquantoquenoinciodocursoissopoderiatersidovisto
comtrepidao.
OUTRASCARACTERSTICAS
Trsoutrascaractersticasnicasdolivroaparecempelaprimeiraveznocaptulo3:evaltrace
notao,seesToolkitLisp,eumarepresentaogrficaabrangente

paraestruturasdedadosLisp,incluindoobjectosdefunoeaestruturainternade
smbolos.
NotaoEvaltracemostrapassoapassocomoexpressesLispsoavaliados,
comoasfunessoaplicadasaosargumentos,ecomovariveissocriadose
limite.OsdiferentespapisdeEVALeaplicar,oescopodevariveis,
eanidificaodecontornoslexicalpodemtodosserexplicadagraficamenteusandoeste
notao.Issotornaoprocessodeavaliaotransparenteparaoaluno,
descrevendooemumalinguagemvisualqueeleouelapodeselembrareusar.
AsseesLispToolkitintroduzirosvriosauxliosdeprogramaoque
Lispcomumprev,talcomodescrito,inspecionar,TRACE,STEP,e
odepurador.Htambmduasferramentasexclusivasparaestelivroseucdigofonte
surgenosapndicesAeB,eestdisponvelemdisqueteapartirdo
editor.Aprimeiraferramenta,SDRAW,desenhadiagramasdeclulascontras.partedeum
readevaldrawloopqueprovouinestimvelparaensinarosiniciantesa
raciocinarsobreasestruturascelularescontras,particularmenteasdiferenasentreCONS,
LIST,eacrescentar.Asegundaferramenta,oDTrace,umpacotederastreamentoque
geraumasadamaisdetalhadadoqueamaioriadasimplementaesdeTRACE,e
portanto,maistilparaensinarprincipiantes.
Finalmente,arepresentaogrficadedadosLispestruturasparticularmente
aestruturainternadesmboloscomoseunome,funo,valor,plist,e
pacoteclulasajudaosalunosacompreenderaverdadeiranaturezadeintrpretesLisp
edestacaasdistinesentresmbolos,funes,variveiseimpresso
nomes.
ORGANIZAODOScaptulosposteriores
OperadoresApplicativesointroduzidasnocaptulo7,ondeoalunotambm
aprendesobreencerramentoslexicais.NoCaptulo8,ashistriasdedragoqueeraum
caractersticapopulardaversoanteriorforammantidas,maselessoagora
backupcomumnovodispositivoderecursomodelosqueajudainiciantes
analisarfunesrecursivasparaextrairaessnciadoestilorecursiva.Desde

page9

XI
NotaparaInstrutores
Algunsinstrutorespreferemensinarrecursoantesapplicatives,estesdois
captulosforamescritosdemodoqueelespodemsercobertosemqualquerordem.
Olivropromoveumestilolimpo,sidelivredeefeitosdeprogramaoparao
oitoprimeiroscaptulos.Captulo9discuteI/O.Captulo10forneceumsistemaunificado
fotodeatribuioqueincluivariveiscomuns,variveisgeneralizadas,
eoperaesdesequnciadestrutivas.Captulo11abrangeiterao,eshows
comofazere*podeserusadoparaconstruirexpressesiterativossubstanciais
sematribuiesexplcitas.Captulo12introduzestruturaseCaptulo
13abrangematrizes,tabelasdehashelistasdepropriedades.Ocaptulofinal,Captulo
14,dedicadoamacrosecompilao.Eletambmexplicaadiferena
entreescopolexicaledinmico.DiagramasdeclarificaraEvaltrace
semnticademacrosevariveisespeciais.
nfasenasimplicidade
PorqueCommonLispumalinguagemtocomplexo,existemalgunslugares
ondeeuescolhiparasimplificarascoisasparamelhoratenderasnecessidadesdosiniciantes.
Porexemplo,asfunes1+e1sobanidosapartirdestelivro,porque
seusnomessomuitoconfusas.Almdisso,olivrosebaseiaquasequeexclusivamentena
EQUALporqueesteopredicadodeigualdademaistil.EQ,EQL,
Equalpe=somencionadosnasseestpicosavanados,masnousadomuito
muito.Emalgunslugaresqueeuescolhiparaescreverumafunoumpoucomenosconcisa
emvezdeapresentarumadasprimitivasmaisobscuroscomoPUSHNEW.
Eeunofazemnenhumatentativaparacobrirascaractersticasmaisavanadas,taiscomomltiplos
valoresouosistemadepacotes.
AlgumaspessoaspreferemensinarEsquemaemcursosintrodutrios,porque
muitomenordoqueLispComum.Maspodesefacilmenteensinarosubconjuntode
CommonLispqueequivalenteaoesquema,paraotamanholnguanorealmenteuma
problemaparainiciantes.Umargumentomaisconvincentequehumacerta
estilodeprogramaodoaplicativo,fazendousopesadodeencerramentoslexicais,que
podeserexpressadeformamaiselegantenasintaxeScheme.Mastambmhreas

ondeCommonLispsuperioraoEsquema,comooseuapoiopelousurio
macrosdefinidos,suaunificaoelegantedelistasevetoresemumaseqncia
tipodedados,eseuusodeargumentosparaestenderautilidadedo
funessequncia.Acombinaodeumpodertremendo,extensa
suportedofabricanteeumaacademiadeprogramaoorientadaaobjetosbuiltin
fazerCommonLisponico''foraindustrial''Lisp.Emboraestelivro
noenfatizarumaabordagemlaterallivredeefeitos,aplicativoparaprogramaocom
queafficionadosEsquemavaisesentircompletamenteemcasa,flodepuramente
EstilodeLispcomum.

page10

xii

CommonLisp:AGentleIntroduoComputaoSimblica
Estelivrofoicuidadosamenteprojetadoparaatendersnecessidadesdeincio
programadoreseestudantesdecinciadanocomputador,masoavanadoopcional
tpicosseesnofinaldecadacaptulofornecemmaterialdeenriquecimentosuficiente
paramanterointeressedosmajoresdecinciadacomputaojunioreseseniores.Para
alunosdegraduaoavanados,CommonLispdeGuyL.SteeleJr.:ALinguagem
(publicadopelaDigitalPress)seriaumcompanheirotilparaaintroduo
fornecidasaqui.Paraosiniciantes,LispComum:areferncia,porFranz,Inc.
(publicadoporAddisonWesley)umaobraderefernciamaisapropriada.

page11

Agradecimentos

Estelivrocomeouem1981comoumconjuntodenotasparaumcursodeprogramaopara
estudantesdehumanidadesdaUniversidadeCarnegieMellon.Devomuitoa
PhilMillerparaoapoioadministrativoquefezocursopossvel.Joo
McDermotteScottFahlmantambmajudoucomquestesadministrativas.
MeusegundodvidaimportanteAnneRogers,quetomousobresimesmaparaeditar
primeirosesboosdomanuscrito.
Anneeraumafonteincontrolvelde
encorajamentoseuentusiasmomanteveolivrovivopormomentosdifceis.
LorettaFerro,MariaWadlow,eSandyEschgentilmenteserviucomoteste
assuntosemminhasprimeirasexperinciaspedaggicas.Agradeotambmameusalunosna
primeirocursoLisprealparaotempoeenergiaquecolocarnele.GailKaiser,
MarkBoggs,AaronWohl,eLynnBaumeistertodosensinadosanovaLisp
cursousandominhasnotas.Seufeedbackajudouamelhorarosprojectosquesesucedem.
RichardPattis,autordeumoutrotextodeprogramaobom,eraumpoder
agentedepublicidadee,finalmente,meajudouaencontraromeuprimeiroeditor,Harper&
Linha.AbbyGellestambmajudouadivulgarolivro.NoHarper&Row,John
Willigmeensinousobrepublicaesacadmicasecomidamexicana,econtinuaaserum
bomamigo.
Aolongodaelaboraodaversoprecedenteeueramaissortede
serapoiadoporumabolsadepsgraduaodaFannieeJohnHertz
Fundao.
Em1987,Harper&RowdeixouonegcioSciencePublishingcomputador.

JohnWiley&Sonsassumiuadistribuiodaversoanterior,enquantoeu
encontrouumaeditoraparaestevolume.OlivroencontrouumnovolaremBenjamin/
CummingsgraaspacinciaedilignciadeeditorexecutivoAlanApt.
AgradeoaMarkFox,aopresidenteinterinomomentodaCarnegieGroup,Inc.,por
permissoparaincluiralgumsoftwarenovolumeatualqueeuoriginalmente
desenvolvidoporsuaempresa.Agradeotambmaoscolaboradoresquecontriburamcomo
maisvaliososconselhosemmelhorarovolumeatual:SkonaBrittain,Mike
xiii

page12

14

CommonLisp:AGentleIntroduoComputaoSimblica
Clancy,RichPattis,eDouglasDankel.Outroscomentriosteisforam
recebeudeRickWilson,SharonSalveter,TerranceBoult,DickGabriel,
JosSchreinemakerseAndrevanMeulebrouck.
CindyMadeiraajudoucomasfiguras.JosSchreinemakersfezops
copyeditreviso,eassistidacomapginamaquiagem.NahidCapellverificada
asrespostasparatodososexerccios.BrianHarrisonamamentouoLinotronic.
GilletteElvgrenIIIportadoosoftwareparavriasimplementaesLisp.
ServiostcnicosespeciaisforamfornecidasporIgnatzG.Bird.Agradeoatodos
paraasuaassistncia.
AEscoladeCinciadaComputaonaUniversidadeCarnegieMellondesdeosoberbo
instalaesdecomputadoreambienteintelectualestimulantequefezeste
trabalharpossvel.Depoisdeonzeanosaquicomoumestudantedepsgraduaoeprofessores
membro,possopensaremnenhumlugarqueeuprefeririaestar.

page13

Funesedados

1.1INTRODUO
Estecaptulocomeacomumavisogeraldosconceitosdefunoededados,
seguidoporexemplosdevriasfunesLispbuiltin.Sevocjtem
algumaprogramaoexperinciaemoutrosidiomas,vocpodefolheareste
captuloemapenasalgunsminutos.Vocverfunesaritmticas,seguidodeum
introduoaossmbolos,umdostiposdedadosfundamentaisdoLisp,epredicados,
querespondersimounoaperguntas.Quandovocpensaquejentenderamesta
material,paraleroresumonapgina26paratestarsuacompreenso.
Sevocnovoemprogramao,estecaptuloprojetadoespecificamentepara
voc.Vamoscomearporexplicaroquefuneseosdadosso.* Osdadostermo
designaasinformaes,taiscomonmeros,palavrasoulistasdecoisas.Vocpodepensar
deumafunocomoumacaixa,atravsdoqualosfluxosdedados.Afunooperasobreo
dadosdealgumaforma,eoresultadooquefluiparafora.
DepoisdecobriralgumasdasfunesincorporadasfornecidaspeloLisp,teremos
aprenderacolocarfunesexistentesemconjuntoparafazernovosaessnciada
programaodecomputadores.Vriastcnicasteisparaacriaodenovasfunes
Emseguida,serapresentados.

*Ostermostcnicoscomoesses,queaparecememnegritonotexto,sodefinidosnoglossrionapartedetrs
olivro.
1

page14

CommonLisp:AGentleIntroduoComputaoSimblica

1.2FUNESemnmeros
Provavelmenteasfunesmaisconhecidassoasfunesaritmticassimplesde
adio,subtrao,multiplicaoediviso.Aquiestcomonsrepresentamos
aadiodedoisnmeros:

3
Onomedafuno''+''.Podemosdescreveroqueestacontecendona
figuradevriasmaneiras.Dopontodevistadosdados:Osnmerosde2
e3fluxoparaafuno,eonmero5fluiparafora.Dopontode
vistadafuno:Afuno''+''recebeuosnmeros2e3,

entradas,eproduziu5comooseuresultado.Dopontodevistadoprogramador:
Nschamado(ouchamado)afuno''+''nasentradas2e3,eo
funoretornou5.Estasdiferentesformasdefalarsobrefunesedados
soequivalentesvocvaiencontrartodoselesemvrioslugaresnestelivro.
AquiestumatabeladefunesLispquefazemcoisasteiscomnmeros:
+

Adicionadoisnmeros

Subtraiosegundonmerodoprimeiro

Multiplicadoisnmeros

/
ABS

Divideoprimeironmeropelosegundo

SQRT

Raizquadradadeumnmero

Valorabsolutodeumnmero

Vejamosoutroexemplodecomoosdadosfluematravsdeumafuno.o
sadadafunodevalorabsoluto,ABS,omesmoqueasuaentrada,queexcepto
nmerosnegativossoconvertidosparapositivas.

page15

ABS

CAPTULO1Funesedados 3
Onmero4entraafunoABS,quecalculaaabsoluta
valoregeraumresultadodequatro.
1.3Trstiposdenmeros
Nestelivrovamostrabalharprincipalmentecomnmerosinteiros,quesonmerosinteiros.
CommonLispfornecemuitosoutrostiposdenmeros.Umtipoquedeveria
sabersenmerosdepontoflutuante.Umnmerodepontoflutuantesempre
escritocomumpontodecimalporexemplo,onmerodecincoseriaescrita
5.0.AfunoSQRTgeralmenteretornaumnmerodepontoflutuantecomoseuresultado,
mesmoquandoasuaentradaumnmerointeiro.

25

SQRT

Proporessoaindaumoutrotipodenmero.Emumacalculadoradebolso,umameia
devemserescritosemnotaodepontoflutuante,como0,5,masemCommonLisppodemos
Tambmescreverummeiocomoo1/2ratio.Lispcomumsimplificaautomaticamente
razesparautilizarodenominadormenorpossvelPorexemplo,asrazesde4/6,
6/9e10/15seriamtodossimplificadopara2/3.
Quandochamamosumafunoaritmticacomentradasinteiras,CommonLisp
normalmenteirproduzirumresultadointeiroouarazo.Seusarmosumamisturadenmerosinteiros
enmerosdepontoflutuante,oresultadoserumnmerodepontoflutuante:

1/2

0,5

3
6

page16

CommonLisp:AGentleIntroduoComputaoSimblica

1.4ORDEMDEENTRADASIMPORTANTE
Porconveno,quandonosreferimosao'primeiro''input'paraumafuno,queremosdizera
superiorsetaentrarcaixadefuno.A'segunda''input'oprximo
flechademaior,eassimpordiante.Aordememqueasentradassofornecidosparaumafuno
importante.Porexemplo,dividindopor82noomesmoque2dividindopor8:

1/4

2
8

Quandodividimos8por2obtemos4.Quandodividimos2por8temosa1/4ratio.
Bytheway,osrciosnoprecisasersempremenordoque1.Porexemplo:

10

5/4

EXERCCIO
1.1. Aquiestoalgumascaixasdefunocomentradasesadas.Emcadacaso,uma
itemdeinformaoestemfalta.Useseuconhecimentodaaritmticapara
preencheroitememfalta:

page17

CAPTULO1Funesedados 5

12

16
2
8

ABS

Aquiestoalgunsproblemasmaisdifceis.Euvoujogaremalgunsnegativo
nmeroseproporesapenasparatornarascoisasinteressantes.

15
9

page18

CommonLisp:AGentleIntroduoComputaoSimblica

5
1
6

1/3

5
3

ABS

1.5SMBOLOS
OssmbolossoumoutrotipodedadosemLisp.Amaioriadaspessoasencontrlosmais
interessantedoquenmeros.Smbolossotipicamentenomeadoapspalavrasemingls
(taiscomoterafeira),oufrases(porexemplo,BUFFALOar),oucomum
abreviaturas(comoSQRTpara''raizquadrada.'')Osnomesdossmbolospodemconter
praticamentequalquercombinaodeletrasenmeros,almdealgunsespeciais
caracterescomohfens.AquiestoalgunsexemplosdesmbolosLisp:
x
Zorch
BANANAS
R2D2
COMPUTADOR
LAVADORDEJANELAS
LORETTA
WarpMOTORES
ABS
DebicoFEIJES
NOACUMULADODOANObeebop
eatmesmo
antidisestablishmentarianism

page19

CAPTULO1Funesedados 7
Observequeossmbolospodemincluirdgitosemseusnomes,comoem''R2D2,''mas
issonotornlosnmeros.importantequevocsejacapazdedizera

diferenaentreosnmeros,especialmentenmerosinteirosesmbolos.
definiesdevemajudar:

Estes

nmerointeiro

Umaseqnciadedgitos''0''a''9'',opcionalmente
precedidaporumsinaldemaisoumenos.

smbolo

Qualquersequnciadeletras,nmerosepermitido
caracteresespeciaisquenoumnmero.

Assim,quatroumsmbolo,4umnmerointeiro,umnmerointeiro4,mas+umsmbolo.E
711tambmumsmbolo.
EXERCCIO
1.2. Aoladodecadaumdosseguintes,colocarum''S''seforumsmbolo,''I''sefor
uminteiro,ou''N''seforalgumoutrotipodenmero.Lembrar:
Palavraseminglspodesoarcomonmerosinteiros,masumverdadeirointeiroLispcontm
somenteosdgitos09,comumsinalopcional.
AARDVARK
87
ENCANAMENTO
123GO
1492
3,14159265358979
22/7
ZEROP
ZERO
0
12
DEZESSETE
1.6OsmbolosespeciaisTenulo
DoissmbolosLisptmsignificadosespeciaisquelhessoinerentes.Elesso:
T

Verdade,''sim''

NADA Falsidade,ovazio,''no''

page20

CommonLisp:AGentleIntroduoComputaoSimblica
TeNILsotobsicosparaLispquesevocperguntaraumLisprealmentededicado
programadorumsimounenhumapergunta,elepoderespondercomTouNILemvezde
Ingls.(''Hey,Jack,queroirparaojantar?''''NIL.Euapenascomi.'')Mais
importante,certasfunesLispresponderperguntascomTouNIL.Tal
simounofunessochamadospredicados.

1.7AlgunspredicadosSIMPLES
Umpredicadoumafunoderesponderapergunta.PredicadossadadosmboloT
quandoqueremdizersimeosmboloNILquandoqueremdizerno.Oprimeiro
predicadovamosestudaraquelequetestasesuaentradaumnmeroou
no.Elechamadonumberp(pronunciase''nmeropee,''comoem''nmero
predicado''),eparecequeisso:

numberp

CACHORRO numberp

NADA

Domesmomodo,ostestesdepredicadossymbolpseasuaentradaumsmbolo.
SymbolpretornaTquandodadoumaentradaqueumsmboloeleretornaNILpara
entradasquenososmbolos.

GATO

symbolp

page21

CAPTULO1Funesedados 9

42

symbolp

NADA

OspredicadosZEROP,EVENPeODDPtrabalharapenasemnmeros.
ZEROPretornaTseaentradaforzero.

35

ZEROP

NADA

ZEROP

ODDPretornaTsesuaentradaestranhocasocontrrio,retornaNIL.EVENPfaz
oreverso.

28

ODDP

NADA

27

ODDP

27

EVENP

NADA

page22

10

CommonLisp:AGentleIntroduoComputaoSimblica
Atagoravocjpegouaconvenodeadernciaa''P''paraum
nomedafunoparamostrarqueumpredicado.(''Hey,Jack,HUNGRYP?''''T,
Estoumorrendodefome!'')NemtodosospredicadosLispobedeceraessaregra,masamaioria.
Aquiestomaisdoispredicados:<retornaTsesuaprimeiraentradamenordoqueasua
Emsegundolugar,enquanto>retornaTseasuaprimeiraentradamaiordoqueasegunda.(Elesso
tambmanossaprimeiraexceesconvenoquepredicadonomesterminamcomum
''P'')
2

<

>

NADA

2
3

1.8OpredicadoEQUAL
EQUALumpredicadoparacompararduascoisasparaverseelessoosmesmos.
EQUALretornaTsesuasduasentradassoiguaiscasocontrrio,retornaNIL.
LispcomumtambmincluipredicadoschamadosEQ,EQLeequalpcujas

comportamentoligeiramentediferentedoqueEQUALasdiferenasnonosdizrespeito
Aqui.Paraosiniciantes,deigualodireitodeusar.

GATO
IGUAL

NADA

IGUAL

RATO

GATO
GATO

page23

CAPTULO1Funesedados 11

3
IGUAL
TRS

EXERCCIO

NADA

1.3. Preenchaoresultadodecadaclculo:
7

<

11

12

ODDP

KIRK
IGUAL
SPOCK

DOZE

numberp

4
3

<

page24

12

CommonLisp:AGentleIntroduoComputaoSimblica

ZEROP

9
IGUAL
9

1.9COLOCAOfunesemconjunto
Atagoranscobrimoscercadeumadziadasmuitasfunesconstrudoemcomum
Lisp.Estasfunesinternassochamadasdefunesprimitivas,ouprimitivas.
Fazemosnovasfunes,colocandoprimitivosjuntosdevriasmaneiras.
1.9.1DefinindoADD1
** Nsjtemosuma
Vamosdefinirumafunoqueadicionaumasuaentrada.
funoprimitivaparaadio:Afuno+iradicionardoisnmeros,
dadocomoentrada.NossafunoADD1terumniconmerocomoentrada,e
adicionarumaele.
DefiniodeADD1:

+
1

**Notaaosinstrutores:Lispcomumcontmfunesembutidas1+e1queadicionar1ousubtrair1
suaentrada,respectivamente.Masdesdequeessesnomesincomunssoquasecertoparaconfundirincio
programadores,novoureferiraelesnestelivro.

page25

CAPTULO1Funesedados 13
AgoraquensdefinimosADD1podemosusloparaadicionar1paraqualquernmeroque
gostar.NsapenasdesenharumacaixacomonomeADD1efornecerumaentrada,talcomo5:

ADD1

SeolharmosparadentrodacaixadeADD1podemosvercomoafunofunciona:
ADD1:

1.9.2DefinindoADD2
Agora,suponhaquequeremosumafunoqueadiciona2suaentrada.Poderamosdefinir
ADD2damesmamaneiraquedefinimosADD1.MasemLisphsempremais
deumamaneiraderesolverumproblemaporvezes,interessanteolharpara
soluesalternativas.Porexemplo,poderamosconstruirADD2dedoisADD1
caixas:
DefiniodeADD2:

ADD1

ADD1

page26

14

CommonLisp:AGentleIntroduoComputaoSimblica
UmavezquetenhamosdefinidoADD2,somoslivresparausloparaadicionar2paraqualquernmero.
OlhandoparaacaixadeADD2doladodefora,notemosnenhumamaneiradesaber
qualasoluofoiescolhido:

ADD2

MasseolharmosparadentrodacaixadeADD2podemosverexatamenteoqueestacontecendo.
Onmero5fluiparaaprimeiracaixadeADD1,queproduz6comoseuresultado.
A6,emseguida,correparaasegundacaixadeADD1,eseuresultado7.
ADD2:

ADD1

ADD1

Sequeremostopeeraindamaisprofundo,poderamosveracaixa+dentrodecadaADD1
box,assim:
ADD2:
ADD1:

ADD1:

+
1

page27

CAPTULO1Funesedados 15
Istotoprofundocomopodemosir.Nopodemosolhardentrodascaixas+porque+
umafunoprimitiva.
1.9.3DefinindoTWoP
Podemosusaronossonovoconhecimentoparafazernossosprpriospredicadostambm,umavez
predicadossoapenasumtipoespecialdefuno.Predicadossofunesque
retornarumresultadodeTouNIL.OpredicadoTWoPdefinidoabaixoretornaTse
suaentradaigualadois.

DefiniodeTWoP:

IGUAL
2

AlgunsexemplosdousodeTWoP:

TWoP

NADA

TWoP

EXERCCIOS
1.4. DefinirumafunoSUB2quesubtraidoisdesuaentrada.
1.5. MostracomoescreverTWoPemtermosdeZEROPeSUB2.

page28

16

CommonLisp:AGentleIntroduoComputaoSimblica
1.6. AfunoHALFretornaumnmeroqueametadedesuaentrada.exposio
ComodefinirMETADEduasmaneirasdiferentes.
1.7. EscreverumpredicadodevriosdgitosPqueretornaverdadeiroseasuaentrada
superiora9.
1.8. Oqueestafunofazparaumnmero?

1.9.4DefinindoONEMOREP
Vamostentardefinirumafunodeduasentradas.AquiestaONEMOREP
predicado,quetestaseasuaprimeiraentradaexatamenteummaiordoqueoseu
segundaentrada.
DefiniodeONEMOREP:

IGUAL

ADD1

VocvcomoONEMOREPobras?Seaprimeiraentradamaiordoqueum
asegundaentrada,aadiodeumasegundaentradaparaodevefazeradoisiguais.Dentro
Nestecaso,opredicadoIGUALvoltarT.Poroutrolado,seoprimeiro

page29

CAPTULO1Funesedados 17
deentradaparaumaONEMOREPnomaiordoqueasegundaentrada,paraasentradas
EQUALnoserigual,porissovaivoltarNIL.Exemplo:
ONEMOREP:

7
IGUAL

ADD1

Emsuamente(ouemvozalta,sevocpreferir),rastrearofluxodedadosatravs
ONEMOREPparaoexemploanterior.Vocdevedizeralgocomoisto:
''Aprimeiraentradaum7.Asegundaentrada,a6,entraADD1,quegeraum
7.Asduas7deentrarnafunoEQUAL,eumavezqueelessoiguais,eleproduz
umT.ToresultadodeONEMOREP''Aquiestoutroexemploderastrear.:
ONEMOREP:

7
IGUAL

ADD1

NADA

Paraestesegundoexemplo,vocdevedizer:''Aprimeiraentradaum7.A
segundaentrada,a3,entraADD1,quegeraa4.O7eo4entrarno

page30

18

CommonLisp:AGentleIntroduoComputaoSimblica
FunoEQUAL,eumavezqueelesnosoiguais,asadaserumNIL.NILo
resultadodeONEMOREP.''
EXERCCIOS
1.9. EscreverumaTWOMOREPpredicadoqueretornaTseasuaprimeiraentradaexatamente
doisamaisquesuasegundaentrada.UseafunoADD2emsua
definiodeTWOMOREP.
1.10. EncontrarumamaneiradeescreveropredicadoTWOMOREPusandoSUB2emvezde
ADD2.
1.11. Amdiadosdoisnmerosmetadesuasoma.EscrevaoMDIA
funo.
1.12. EscreverumpredicadomaisqueHALFPqueretornaTseasuaprimeiraentrada
maisdoquemetadedasuasegundaentrada.
1.13. Afunoaseguirretornaomesmoresultadonoimportaoquesuaentrada.
Oresultadoquevoltar?

numberp

symbolp

1.10Opredicadono
NOo'oposto''predicado':Acontecesimemnoenoemsim.Dentro
TerminologiaLisp,dadaumaentradadeT,NOretornaNIL.Dadaumaentradade
NIL,NOretornaT.Acoisainteressantesobrenoqueelepodeserconectadoa
qualqueroutropredicadoparaderivaroseuopostoporexemplo,podemosfazerum''no
igual''predicadodeNOeEQUAL,ouum'''predicado'diferentedezerode

NOeZEROP.Vamosvercomoissofeitonaprximaseo.Emprimeirolugar,alguns
exemplosdeNO:

page31

CAPTULO1Funesedados 19

NO

NADA

NADA

NO

Porconveno,NILanicamaneiradedizernoemLisp.Tudooresto
tratadascomosim.AssimNOretornanilparacadaentrada,excetoNIL.

FRED

NO

NADA

Estenoapenasumaconvenoarbitrria.Acontecequeparaserextremamentetil
tratarNILcomoanica''objeto'falso'.Vocverporqueemcaptulosposteriores.
EXERCCIO
1.14. Preenchaosresultadosdosclculosseguintes:

NADA

12

page32

NO

NO

20

CommonLisp:AGentleIntroduoComputaoSimblica

NO

NO

1.11negarumpredicado
Suponhaquensqueremosfazerumpredicadoquetestaseduascoisasnoso
equaloopostodopredicadoEQUAL.Nspodemosconstrulo,iniciandocom
EQUALefuncionandosuasadapornoparaobteroresultadooposto:
DefiniodenoEQUAL:

IGUAL

NO

PorcausadafunoNO,sempreEQUALdiria''T'',queNO
EQUALvaidizer''NIL'',esemprequeEQUALdiria''NIL'',queNO
EQUALvaidizer''T.''AquiestoalgunsexemplosdenoEQUAL.Emprimeiro
um,ossmbolosrosaeverdesodiferentes,entoEQUALgeraumNIL
enomudaparaumT.

ROSA
IGUAL
VERDE

NADA

NO

Nosegundoexemplo,rosaerosasoomesmo,portantoEQUALgeraum

T.nomudaissoparaNIL.

page33

CAPTULO1Funesedados 21

ROSA
IGUAL
ROSA

NO

NADA

EXERCCIOS
1.15. EscreverumpredicadoNOTONEPqueretornaTsesuaentradaqualquercoisa
exceptoum.
1.16. EscrevaopredicadonoPLUSPqueretornaTsesuaentradanomaior
quezero.
1,17. AlgunsdialetosanterioresLispnotinhaoEVENPprimitivaqueapenas
teveODDP.MostracomodefinirEVENPemtermosdeODDP.
1.18. SobquecondiesfazessepredicadoderetornodafunoT?

ADD1

ADD1

ZEROP

1.19. Oresultadoqueafunoabaixoproduzemquandodadaaentrada
NADA?EsobreaentradadeT?Serquetodososdadosfluematravsdestafuno
inalterados?Oresultadoproduzidoparaorutabagaentrada?

NO

NO

page34

22

CommonLisp:AGentleIntroduoComputaoSimblica

1.20. Afunodeverdadeumafunocujasentradasesadassovaloresdeverdade,
isto,verdadeiraoufalsa.NOumafunodeverdade.(Mesmoqueno
aceitaoutrosinputsalmdeTouNIL,elessepreocupasesuaentradaverdadeiraou
No.)EscrevaXOR,afunoexclusivaouverdade,queretornaTquando
umadesuasentradasNILeooutroT,masretornaNILquandoambos
sonulasouambossoT.(Dica:.Istomaisfcildoqueparece)
1.12nmerodeentradasparaumafuno
Algumasfunesrequeremumnmerofixodeentradas,comoODDP,que
aceitaexatamenteumaentradaeEQUAL,quetemexatamentedois.Masmuitos
funesaceitarumnmerovariveldeentradas.Porexemplo,aaritmtica
funes+,,*e/aceitarqualquernmerodeentradas.
2
*

30

5
Paramultiplicartrsnmeros,o*funomultiplicaosdoisprimeiros,emseguida,
multiplicaoresultadopeloterceiro,assim:

2
3

*
*

30

Quandoou/dadamaisdoqueduasentradas,oresultadoaprimeiraentrada
diminuda(oudivididas,respectivamente)pelasentradasremanescentes.

page35

CAPTULO1Funesedados 23

50
3

43

120
3
5
Ase/funessecomportardeformadiferentequandoadministradoapenasumaentrada.
Oquefaznegarsuaentrada,emoutraspalavras,elemudaosinaldo
positivoparanegativo,ouviceversa,subtraindoodezero.Quandoo/
funodadaumanicaentrada,quedivideumpeloqueaentrada,oqued
recproco.

4.0

0,25

Ocasodeduasentradasclaramenteocasodedefinioparaaaritmticabsica
funes.Enquantoelespodemaceitarmaisoumenosdeduasentradas,elesconvertem
Nessescasosainstnciasdocasodeduasentradas.Porexemplo,oacimaexposto
clculodarecprocade4.0realmenteapenasumadiviso:

page36

24

CommonLisp:AGentleIntroduoComputaoSimblica

Afuno:

0,25

4.0

1.13ERROS
Mesmoqueonossosistemadefunesmuitosimples,jpossvel
fazervriostiposdeerrosnamesma.Umerrodarumafunoerrada
tipodedados.Porexemplo,a+funopodeadicionarapenasnmerosnopodeadicionar
smbolos:

Erro!inputtypeerrado.

FRED
Outroerrodarumafunomuitopoucosoumuitosinsumos:

IGUAL

Erro!Muitopoucasentradas.

4
ODDP

Erro!Demasiadasentradas.

7
Finalmente,umerropodeocorrerporqueumafunonopodefazeroquepedidode
isto.Istooqueacontecequandosetentadividirumnmeroporzero:

page37

CAPTULO1Funesedados 25

Erro!Divisoporzero.

Aprenderareconheceroserrosumaparteimportantedaprogramao.Voc
,semdvida,obterlotesdeprticanestaarte,umavezquealgunsprogramasinformticos
sojescritocorretamentenaprimeiravez.
EXERCCIO
1.21. Oqueesterradocomcadaumadessasfunes?

ZEROP

ADD1

NO

IGUAL

symbolp

page38

26

CommonLisp:AGentleIntroduoComputaoSimblica
RESUMO
Nestecaptulonscobrimosdoistiposdedados:nmerosesmbolos.Nstambm
aprendeuvriasfunesinternasqueatuamsobreeles.
PredicadossoumaclasseespecialdefunesqueusamTeNILpararesponder

perguntassobreassuasentradas.OsmboloNILsignificafalsoeosmboloT
significaverdade.Naverdade,qualquercoisaquenosejaNILtratadacomoverdadeiraemLisp.
Afunodeveterumadefinioantesdepodermosuslo.Nspodemosfazernova
funes,colocandoosantigosjuntosdevriasmaneiras.Umparticularmentetil
combinao,utilizadamuitofrequentementenaprogramao,alimentarasadadeum
predicadoatravsdanofuncionarparaderivaroseuoposto,comooqueNO
predicadoEQUALfoiderivadodeEQUAL.
exercciosdereviso
1,22. Sotodosospredicadosfunes?Todasasfunespredicados?
1,23. Quebuiltinpredicadosapresentadasnestecaptulotmnomesquefazer
noterminamem''P''?
1,24. onmerodeumnmero?osmbolodeumsmbolo?
1,25. PorqueFALSEverdadeemLisp?
1,26. Verdadeirooufalso:(a)TodosospredicadosaceitarTouNILcomoentrada(B)todos
predicadosproduzirTouNILcomosada.
1.27. DumexemplodousodeEVENPquepoderiacausarummaltipo
errodeentrada.Dumexemploquepoderiacausarummalnumberde
errodeentradas.
FUNESabordadosnestecaptulo
Funesaritmticas:+,,*,/,ABS,SQRT.
Predicados:numberp,symbolp,ZEROP,ODDP,EVENP,<,>,
Igual,nao.

page39

CAPTULO1Funesedados 27

Tpicosavanados

Ostpicossecesavanadasnofinaldecadacaptuloforamnoacrescentou
apenasparaintroduzirmaterialdeprogramaoavanada,mastambmparamostrarcomputador
programaonasuaperspectivamatemticaelgicamaisampla.
Estassecessointeiramenteopcionais.programadoresiniciantespodemdesejar
ignorlosemsuaprimeiraviagematravsdolivro.Algunsdoscaptulosposterioresfazer,em
algunslugares,referemseaomaterialintroduzidoemseesanteriorestpicosavanados,
masessescasossoclaramentemarcadas,porissofcilparavoltarelera
seoavanadastpicosapropriadosantesdecontinuar.
1.14AHISTRIADOLISP
AsorigensdeLispvoltapara1956,quandoumareuniodepesquisadeverona
intelignciaartificialfoirealizadanoDartmouthCollege.Nareunio,John
McCarthyaprendeusobreumatcnicachamada''processamentodalistade''queAllen
Newell,JCShaweHerbertSimontinhadesenvolvido.Amaioriaprogramaoem
adcadade1950foifeitoemlinguagemassembly,umalinguagemprimitivadefinida
directamentepeloscircuitosdocomputador.Newell,ShaweSimonteve

criadoalgomaisabstrato,chamadoIPL(paraprocessamentodeinformaes
Language),quemanipulavasmboloselistas,doistiposdedadosimportantes
programaodeintelignciaartificial.MassintaxedoIPLfoisemelhantepara(equanto
akwardas)linguagemassembly.
Emoutroslugaresnadcadade1950umanovalinguagemchamadaFortranestavasendo
desenvolvido.Fortranfoiprojetadoparaotipodeclculosnumricos
quesocomunsemcomputaocientfica.permitidooprogramadorapensar
emtermosdealgbricasexpressestaiscomoA=(X+Y)*Zemvezdeescrever
instruesemlinguagemassembly.Aideiadequeosprogramadoresdevemexpressar
assuasideiasemnotaomatemticafamiliar,eocomputadordevesero
umparatraduziressasexpressesemlinguagemassembly,eraumradical
inovao.FezFortranumapoderosalinguagemdecomputaonumrica.
McCarthyqueriaconstruirumalinguagemigualmentepoderosaparasimblica
Informtica.

pgina40

28

CommonLisp:AGentleIntroduoComputaoSimblica
UmaabordagemelesugeriueraconstruiremcimadoFortran,atravsdacriaode
umconjuntodesubrotinasespeciaisparalistademanipulao.Estaideiafoiperseguidopor
HerbertGelerntnereCarlGerberichnaIBM,efoichamadoFLPL,por
FortranListaProcessamentodeLinguagem.MasoprprioMcCarthy,trabalhandoprimeiro
emDartmouthe,posteriormente,noInstitutodeTecnologiadeMassachusetts,concebido
umanovalinguagem,LISP(porProcessorlista),quebaseouseemidiasdeIPL,
Fortran,eFLPL.Aprimeiraverso,Lisp1,foidesenvolvidoparaoIBM

704computador.
Lisp1.5foioprimeirodialetoLispaseramplamenteutilizado.OLisp1,5
ManualdoProgramadorporMcCarthyetal.apareceuem1962.Em1964Lisp
estavarodandoemvriostiposdecomputadores,incluindoumasubIBM7094
SistemadetimesharingCompatveldoMITfoiassimumdosprimeirosinteractiva
linguagensdeprogramao.DigitalEquipmentCorporation(DEC)tambmdesempenhouum
papeldedestaquenahistriadoLisp.UmadasprimeirasimplementaesLispcorreu
noseuprimeirocomputador,oPDP1.
OPDP6ePDP10(maistarde
DECSYSTEM20)computadoresforamprojetadosespecificamenteparaimplementarLisp
eficientemente.
Depoisdemeadosdosanos1960,asimplementaesLispcomearamadivergir.MIT
Maclispdesenvolvido,enquantoBolt,BeranekeNewmaneaXerox
CorporationdesenvolveuconjuntamenteInterlisp.StanfordLisp1.6foiumdesdobramentodo
umaversoinicialdomaclispque,eventualmente,deuorigemaUCILisp.cadaumdos
estesdialetosalargousubstancialmenteoLisp1,5original,masfizeramno
maneirasincompatveis.
Nadcadade1970GuySteeleeGeraldSussmandefinidoumnovotipodeLisp,
chamadoEsquema,quecombinavaalgumasdasidiaselegantesdafamliaAlgol
delinguagensdeprogramaocomopoderdesintaxeededadosdoLisp
estruturas.dialetosprolongadosdeesquemacomeouemevoluo,emparalelocomo
desenvolvimentodeLisp.
Noinciodadcadade1980haviadezenasdeLispincompatveis
implementaesemexistncia,comcercademeiadziaprincipaisdialetos.UMA
projetofoiiniciado,lideradoporScottFahlman,DanielWeinreb,DavidLua,Guy
Steele,eRichardGabriel,paradefinirumCommonLispquemesclaro
melhorescaractersticasdedialetosexistentesemumtodocoerente.Aprimeiraediodo
padroCommonLispapareceuem1984umanormarevistaaparecealgum
vezem1989.CommonLisprapidamentetornouseoLispdeescolhaemambos
ambientesacadmicoseindustriais.Osoutrosdialetos,nasuamaioriamorreu,
excetoparaEsquema,quecontinuaadesfrutardeumapopularidademodestapara
aplicaeseducacionais.

page41

CAPTULO1Funesedados 29
Muitasdasideiasmaisimportantesemsistemasdeprogramaosurgiupelaprimeiravezem
conexocomLisp.Estesincluemamisturadeinterpretadoecompilado
funes,coletadelixo,chamadasdefunorecursiva,orastreiodenveldeorigeme
depuraoeeditoresdirigidapelasintaxe.HojeLispumalinguagemprincipalpara
pesquisasofisticadafuncional,orientadaaobjetos,eemparalelo
estilosdeprogramao.
ParaobterinformaesadicionaissobreahistriadoLisp,consulteosartigosde
McCarthyeGabrielcitadosnasecoLeiturasnapartedetrsdo
livro.

page42

30

CommonLisp:AGentleIntroduoComputaoSimblica

page43

listas

2.1Aslistassootipodedadosmaisverstil
Onome''Lisp''umacrnimoparaProcessorList.Mesmoqueo
linguagemamadureceuemmuitasmaneirasaolongodosanos,aslistascontinuamasuacentraldedados
digitar.Aslistassoimportantesporqueelespodemserfeitospararepresentarpraticamente
qualquercoisa:conjuntos,tabelasegrficos,eatmesmofrasesemingls.Asfunespodem
tambmserrepresentadocomolistas,masvamosguardaressetpicoparaoprximocaptulo.
2.2Oquefazerlistasparece?
Cadalistatemduasformas:umarepresentaoimpressaeuminterno.o
representaoimpressamaisconvenienteparaaspessoasausar,porque
compactoefcildedigitaremumtecladodecomputador.Arepresentaointerna

aformacomoalistarealmenteexistenamemriadocomputador.Usaremosuma
notaogrficaquandoqueremosreferirsealistasemsuaformainterna.
Nasuaformaimpressa,umalistaummontedeitensentreparnteses.
Estesitenssochamadososelementosdalista.Aquiestoalgunsexemplosde
listasescritasemnotaoparntese:
(VermelhoVerdeAzul)
(AARDVARK)
31

page44

32

CommonLisp:AGentleIntroduoComputaoSimblica
(2357111317)
(3galinhasfrancesas2rolas1PERDIZ
1RVOREDEPERA)
Arepresentaointernadelistasnoenvolveparnteses.Dentrode
memriadocomputador,aslistassoorganizadascomocadeiasdeclulascontras,oquensvamos
desenharcomocaixas.Asclulascontrassoligadosentresiporponteiros,oquensvamos
desenharcomosetas.Cadaclulatemdoisponteiroscontras.Umdelesapontasempre
aumelementodalista,comoovermelho,enquantoosoutrospontosparaosprximoscontras
clulanacadeia. * Quandodizemos''listaspodemincluirsmbolosounmeroscomo
elementos,''oqueestamosrealmentedizendoqueasclulascontraspodemconterponteirospara
smbolosounmeros,bemcomoponteirosparaoutrasclulascontras.Docomputador

**
representaointernadalista(VermelhoVerdeAzul)desenhadodestaforma:

NADA
VERMELHO

VERDE

AZUL

Olhandoparaaclulamaisdireita,vocvainotarqueacadeiadeclulascontrasterminaem
NADA.EstaumaconvenoemLisp.Podeserviolada,emalgumascircunstncias,
masamaiorpartedaslistasdetempoirterminaremNIL.Quandoalistaescritoem
notaoparntesis,oNIL,nofinaldacadeiaomitido,umavezmaispela
conveno.
EXERCCIO
2.1. Mostrarcomoalista(serounoser)seriarepresentadoem
memriadocomputadordesenhosuarepresentaocelularcontras.

*Oquecadaclulacontrasrealmente,internamente,umpequenopedaodememria,divididoemdois,suficientementegrandeparaconterdois
endereos(ponteiros)paraoutroslugaresemmemriaondeosdadosreais(comoovermelho,ouNIL,oudeoutracontras
clula)armazenado.Namaioriadoscomputadoresponteirossoquatrobytesdecomprimento,demodoquecadaclulascontrasdeoitobytes.
**Notaaosinstrutores:Seosalunosjestousandoocomputador,esteseriaumbommomentoparaintroduziro
ferramentaSDRAWaparecendonoapndice.

page45

Captulo2Listas 33
2.3LISTASDEUMELEMENTO
Umsmboloeumalistadeumelementonosoosmesmos.Considerealista
(AARDVARK)mostradoabaixorepresentadoporumacluladecontras.Umdoscontras
ponteirospontosdaclulaparaosmboloAARDVARKosoutrospontosazero.assim
vocvquealista(AARDVARK)eosmboloAARDVARKso
objetosdiferentes.Oprimeiroumaclulacontrasqueapontaparaoltimo.

NADA
AARDVARK
2.4listasaninhadas
Alistapodeconteroutraslistascomoelementos.Dadasastrslistas
(CUAZUL)
(GRAMAVERDE)
(BROWNTERRA)
podemosfazerumalistadelescolocandoosdentrodeumoutroparde
parnteses.Oresultadomostradoabaixo.Notaaimportnciadeterdois
nveisdeparnteses:Estaumalistadetrslistas,enoumalistadeseissmbolos.
((CUAZUL)(GRAMAVERDE)(BROWNTERRA))
Podemosexibirostrselementosdestalistaverticalmenteemvezde
horizontalmentesensescolhemos.Espaamentoerecuonoimporta,desdequeo
elementosprprioseaparenthesizationnosoalteradas.Porexemplo,
alistadetrslistaspoderiatersidoescritoassim:
((CUAZUL)

(GRAMAVERDE)
(BROWNTERRA))
Oprimeiroelementodestalistaainda(azulceleste).Nanotaodeclulascontras,o
listaseriaescritocomomostradoabaixo.Umavezquetemtrselementos,existem
trsclulascontrasdacadeiadenvelsuperior.Umavezquecadaelementoumalistadedois
smbolos,cadaumdospontosdeclulasdenvelsuperiorparaumacadeiadenvelmaisbaixodeduasclulascontras.

page46

34

CommonLisp:AGentleIntroduoComputaoSimblica

NADA
NADA
AZUL

CU

VERDE

NADA
GRAMA

NADA

CASTANHOTERRA

Listasquecontmoutraslistassochamadosdelistasaninhadas.Nanotaoparntesis,
umalistaaninhadatemumoumaisconjuntosdeparntesesaninhadosnoexterior
par.Nanotaodeclulascontras,umalistaaninhadatempelomenosumnveldeclulascontras
abaixodacadeiadenvelsuperior.Aslistasquenosoaninhadossochamadosdelistasplanas.Umapartamento
listatemapenasumacadeiadeclulascontrasdenvelsuperior.

Listasnemsempresouniformesnaforma.Aquiestumalistaaninhadacujoselementos
soumalista,umsmboloeumalista:
((BRAINCIRURGIES)NUNCA(SAYOOPS))
Vocpodeveropadrodeparenthesizationrefletidanaclulacontras
diagramaabaixo.
NADA
NADA
CREBRO

CIRURGIES

NUNCA

NADA
DIZER

OOPS

Qualquercoisaqueescreveremnotaoparnteseterumequivalente
Ainscriodentrodocomputadorcomoumaclulacontrasestruturaseosparnteses
equilibraradequadamente.Seelesnooequilbrio,comonaexpressomalformado
''(RED(VERDEAZUL'',ocomputadornopodefazerumacadeiadeclulascontras
correspondenteaessaexpresso.Ocomputadorrespondercomumerro
mensagemselumaexpressocomparntesesdesequilibradas.
EXERCCIOS
2.2. Qualdestessolistasdebemformado?Ouseja,quaisosquetm
devidamenteequilibradaparnteses?
(AB(C)

page47

Captulo2Listas 35
((A)(B))
AB)(CD)
(A(B(C))
(A(B(C)))
(((A)(B))(C))
2.3. Desenhearepresentaocelularcontrasdalista(PORFAVOR(BEMY)
NAMORADOS).
2.4. Oqueanotaoparntesisparaestaestruturacelularcontras?
NADA
NADA
CURVAS

SETAS

NADA
FLORES

CHOCOLATES

2.5COMPRIMENTODELISTAS
Ocomprimentodeumalistaonmerodeelementosquepossua,porexemplo,alista(HI
MOM)decomprimentodedois.Masoquesobrelistasdelistas?Quandoumalistaescritoem
notaoparntese,seuselementossoascoisasqueapareceminteriorapenasum
nveldeparnteses.Porexemplo,oselementosdalista(A(BC)D)soA,
alista(BC),eD.OsmbolosBeCnosoelesmesmos,elementos
someramentecomponentesdoelemento(BC).
Lembresequeocomputadornousarparntesesinternamente.De
pontodevistadocomputador,alista(A(BC)D)contmtrselementosporque
suarepresentaointernacontmtrsclulascontrasdenvelsuperior,comoeste:

page48

36

CommonLisp:AGentleIntroduoComputaoSimblica

NADA
UMA

NADA
B

Entovocvqueocomprimentodeumalistaindependentedacomplexidadedasua
elementos.Aslistasaseguirtodostmexatamentetrselementos,emboraem
algunscasos,oselementosso,elasprpriaslistas.Ostrselementosso
sublinhado.
(VermelhoVerdeAzul)
((CUAZUL)(GRAMAVERDE)(BROWNTERRA))
(Um(BXYZ)C)

(FOO937(GleepGlorp))
(ROY(Doispatosbrancos)((derretida)(manteiga)))
Ocomprimentofunoprimitivacalculaocomprimentodeumalista.um
deerroparadarCOMPRIMENTOumsmboloounmerocomoentrada.

page49

(ABCD)

COMPRIMENTO 4

(A(BC)D)

COMPRIMENTO 3

KUMQUAT

COMPRIMENTO Erro!Noumalista.

Captulo2Listas 37

(KUMQUAT)

COMPRIMENTO 1

EXERCCIO
2.5. Quantoselementosfazercadaumadasseguinteslistastm?
(OPENTHEDOORSPODBAYHAL)
((OPEN)(dabaadovagemDOORS)HAL)
((123)(456)(789)(101112))
((ONE)paraTodos(AND(DOIS(paramim))))
((QPS)
(7)CORAES
(6clubes)
(5diamantes)
(2Ouros))
((Pensilvnia(OESTADOKeystone))
(NEWJERSEY(GardenState))
(MASSACHUSETTS(THESTATEBAY))
(Flrida(SUNSHINESTATE))
(NEWYORK(EmpireState))
(INDIANA(THESTATEHOOSIER)))
2.6NIL:alistavazia
Umalistadezeroelementoschamadodeumalistavazia.Elanotemclulascontras.Isto
escritocomoumparvaziodeparnteses:
()
DentrodocomputadoralistavaziarepresentadapelosmboloNIL.este
umpontocomplicado:osmboloNILalistavaziaporissoqueusadoparamarcar
aextremidadedeumacadeiadeclulascontras.DesdeNILealistavaziasoidnticos,estamos
semprelivreparaescreverNILemvezde(),eviceversa.Assim(ANILB)pode

tambmserescrita(A()B).Nofaznenhumadiferenaqueimprimiuformulrioutilizado
dentrodocomputadorosdoissoamesma.

pgina50

38

CommonLisp:AGentleIntroduoComputaoSimblica
Ocomprimentodalistavaziazero.EmboraNILumsmbolo,ainda
umaentradavlidaparaCOMPRIMENTOporqueNILtambmumalista.NILanicacoisaque
umsmboloeumalista.

()

NADA

COMPRIMENTO 0

COMPRIMENTO 0

EXERCCIO
2.6. Combinarcadalistaesquerdacomumalistacorrespondentedireitapela
substituindoNILfor()semprequepossvel.Prestemuitaatenoao

nveisdeparenthesization.
()

((NADA))

(())

NADA

((()))

(NADA)

(()())

(NIL(NIL))

(()(()))

(NILNIL)

2.7IGUALDADEDELISTAS
Duaslistassoconsideradosiguaisseosseuselementoscorrespondentessoiguais.
Considereaslistas(A(BC)d)e(AB(CD))mostradosabaixo.

page51

Captulo2Listas 39

NADA
UMA

NADA
B

C
NADA

UMA

NADA
C

Estasduaslistastmomesmonmerodeelementos(trs),maselesnoso
IGUAL.Osegundoelementodoprimeiro(BC),enquantoosegundo
elementodesteltimoB.enemlistaiguala(BCD),oqualpossui
quatroelementos.Seduaslistastmdiferentesnmerosdeelementos,elesnuncaso
IGUAL.
(A(BC)D)
IGUAL

NADA

(AB(CD))

2.8PRIMEIRA,SEGUNDA,TERCEIRA,edescansar
Lispfornecefunesprimitivasparaextrairelementosdeumalista.o
funesdeprimeira,SEGUNDA,TERCEIRAeretornaroprimeiro,segundoeterceiro
elementodasuaentrada,respectivamente.

(ABCD)

PRIMEIRO

UMA

page52

40

CommonLisp:AGentleIntroduoComputaoSimblica

(ABCD)

SEGUNDO

(ABCD)

TERCEIRO

umerroparadaraessasfunesentradasquenosolistas.

KAZOO

PRIMEIRO

Erro!Noumalista.

AfunoRESTOocomplementodoPRIMEIRO:Eleretornaumalista
contendotudo,masoprimeiroelemento.

(ABCD)

DESCANSAR (BCD)

(ABCD)

DESCANSAR
(BCD)

DESCANSAR (CD)

Usandoapenasprimeiroeumoumaisrepousa,possvelconstruiranossa
versesprpriasdeSEGUNDO,terceiro,quarto,eassimpordiante.Porexemplo:

page53

Captulo2Listas 41

DefiniodeMYSEGUNDA:

DESCANSAR

PRIMEIRO

SeaentradaparaMYsegundo(PINGUINSAMOsorvetesitalianos),a
sadaRESTOfunodalista(AMORsorvetesitalianos),eosprimeiros
elementoqueoamor.

(PINGUINSAMOsorvetesitalianos)

MEUSEGUNDO

AMAR

EXERCCIOS
2.7. OquesepassadentrodacaixadeMEUSEGUNDOquandodadaaentrada
(HONKSEVOCGOSTAgansos)?
2.8. MostracomoescreverMYTERCEIRAusandoFIRSTedoisdescansos.
2.9. MostracomoescreverMYTERCEIRAusandosegundo.
2.9funesoperamemponteiros
Quandodizemosqueumobjeto,comoumalistaousmboloumaentradaparaumafuno,
estamosfalandoinformalmente.Dentrodocomputador,tudooquefeitocom
ponteiros,assimqueaentradarealparaafunonooobjetoemsi,masumponteiropara
oobjeto.Damesmaforma,oresultadoretornadoporumafunorealmenteumponteiro.
Suponha(THEBIGBopper)fornecidocomoentradaparaREST.oRESTO
receberealmenteumponteiroparaaprimeiraclulacontras.Esseponteiromostrado
abaixo,desenhadacomoumalinhaondulada.Alinhaondulado,porquealocalizaodoponteiro
noespecificado.Emoutraspalavras,elenovivedentrodequalquerclulacontraselevive
emoutraspartesdocomputador.Oscientistasdacomputaodiriaqueoponteiro
vive''numregisto''ou''napilha'',masessesdetalhesnoprecisamnospreocupar.

page54

42

CommonLisp:AGentleIntroduoComputaoSimblica

Entradaparadescansar
NADA
A

GRANDE

Bopper

OresultadoretornadoporRESTumponteiroparaasegundaclulacontras,oque
aprimeiracluladalista(BigBopper).Ondequeesseponteirovem?
ORESTOfezfoiextrairoponteirodametadedireitadosprimeiroscontras
celular,eretornaresseponteirocomoseuresultado.Assim,oresultadodoRESTumponteiro
namesmacadeiacelularcontrascomoaentradaparaREST.(Vejaafiguraabaixo).
Nohnovasclulascontrasforamcriadospordescansarquandoeleretornou(BigBopper)todos
elefezfoiextraireretornarumponteiro.
ResultadodoREST
NADA
A

GRANDE

Bopper

Nota:Nsmostramosumaclulacontrasapontandoparaanafiguraacimapara
enfatizarqueoresultadofazpartedamesmacadeiacomoaentradaparaREST.Mas
aclulacontrasqueapontaparaonofazpartedoresultadodoREST.Noh
caminhoparachegaraestacluladoponteiroretornadoporREST.(Vocnopodeseguir
osponteirosparatrs,sparaafrente).
2.10CAReCDR
Atagoravocsabequecadametadedeumconsclulaapontaparaalgumacoisa.Osdois
metadestmnomesobscuros.Ametadeesquerdachamadodecarro,eametadedireita
chamadooCDR(pronunciase''couder,''rimacom''boaer'').Estes
nomessorelquiasdosprimrdiosdacomputao,quandoLispcorreupelaprimeiravezemum
mquinachamadaIBM704.O704eratoprimitivaquenemsequertm
transistoreslousadotubosdevcuo.Cadaumdosseus''registros''foidivididoem
vrioscomponentes,dosquaisdoiseramapartedoendereoedodecrscimo

pgina55

Captulo2Listas 43
parte.Naquelapoca,onomedocarrorepresentavandicedeparteEndereo
Registrese,eCDRrepresentavandicedeparteDecrscimodeRegister.At
emboraessestermosnoseaplicamaohardwaredocomputadormoderno,CommonLisp
aindausaoCARsiglaseCDRquandoserefereaclulascontras,empartepor
razeshistricas,eemparteporqueessesnomespodemsercompostosparaformar

maislongosnomescomoCADReCDDAR,comovocverembreve.
Almdenomearasduasmetadesdeumaclulacontras,CAReCDRsotambmo
nomesdefunesLispembutidasqueretornamtudooponteiroestnocarroou
CDRmetadedaclula,respectivamente.Considerenovamentealista(THEBIG
Bopper).Quandoestalistautilizadacomoentradaparaumafuno,comoCAR,oqueo
funoreceberealmentenoaprprialista,massimumponteiroparaoprimeiro
celularcontras:
EntradaparaCAR/CDR
NADA
A

GRANDE

Bopper

CARsegueesteponteiroparachegarclulacontrasreaiseextraio
ponteirosentadonametadeCAR.EntoCARretornacomoresultadoumponteiroparaa
Osmbolo.OqueCDRvoltarquandofordadaamesmalistacomoentrada?

(THEBopperBIG)

CARRO

(THEBopperBIG)

CDR

(BigBopper)

CDRsegueoponteiroparachegarclulacontras,eextraioponteiro
sentadonametadeCDR,queeleretorna.Assim,oresultadodeCDRumponteiropara
lista(BigBopper).Apartirdesteexemplo,vocpodeverqueocarroomesmo

pgina56

44

CommonLisp:AGentleIntroduoComputaoSimblica
comodeprimeiro,eCDRomesmocomoodescanso.programadoresLispgeralmentepreferem
expressloocontrrio:aprimeiraretornaoCARdeumalista,eDESCANSO
retornaoCDR.
2.10.1OCDRdeumalistadeumnicoelemento
Vimosanteriormentequealista(AARDVARK)noamesmacoisaqueo
smboloAARDVARK.Alista(AARDVARK)separececomisso:

NADA
AARDVARK
Umavezqueumalistadecomprimentorepresentadadentrodocomputadorcomoumnicocontras
clula,oCDRdeumalistadecomprimentoalistadecomprimentozero,NIL.

(AARDVARK)

CARRO

AARDVARK

(AARDVARK)

CDR

NADA

Alista((telefonedecasa))temapenasumelemento.Lembresequeo
elementosdeumalistasoositensqueaparecemdentrodeapenasumnveldeparnteses,
emoutraspalavras,ositensapontadosporclulascontrasdenvelsuperior.((TELEFONE
HOME))separececomisso:

page57

Captulo2Listas 45

NADA
NADA
TELEFONE

CASA

UmavezqueasfunesCAReCDRextrairosrespectivosponteirosdo
primeiraclulacontrasdeumalista,ocarrode((telefonedecasa))(telefonedecasa),
eoCDRNIL.

((TELEFONEDECASA))

CARRO

(TELEFONEDECASA)

((TELEFONEDECASA))

CDR

NADA

EXERCCIOS
2.10. Desenhearepresentaocelularcontrasdalista(((telefonedecasa))),
quetemtrsnveisdeparnteses.Qualocarrodestalista?
QualoCDR?
2.11. Desenhearepresentaocelularcontrasdalista(A(portagem)((CALL))).
2.10.2CombinaesdeCAReCDR
Considerealista(FEEFIEFOEFUM),oprimeiroelementoqueFEE.o
segundoelementodestalistaoprimeirodosREST,ou,nonossonovo
terminologia,ocarrodoCDR.

page58

46

CommonLisp:AGentleIntroduoComputaoSimblica

(FEEFIEFOEFUM)

CDR

CARRO

FIE

Sevoclerosnomesdessascaixasdefunodaesquerdaparaadireita,vocvailer
''CDR''edepois''CAR.''Mas,desdeaentradaparaafunooCAR
sadadafunoCDR,dizemosemInglsqueestamosacomputao''o
CarrodoCDR''dalista,enoocontrrio.EmLisp,oCADR
funoumaabreviaturapara''oCarrodoCDR.''CADRpronunciado
''Kaeder.''

(FEEFIEFOEFUM)

CADR

FIE

OqueaconteceriasensmudamosaAeaD?OCDAR(''acoplador
funodedar'')levaoCDRdoCARdeumalista.Ocarro(FEEFIE
FOEFUM)FEEsetentarmostomaroCDRdequenstemosumamensagemdeerro.
Obviamente,CDARnofuncionaemlistasdesmbolos.Elefuncionaperfeitamentebem
emlistasdelistas,noentanto.

(FEEFIEFOEFUM)

CDAR

Erro!Noumalista.

((FEEFIE)(FOEFUM))

CDAR

(FIE)

AfunoCaddr(''kaDIHder'')retornaoterceiroelementodeumalista.
(Sevocesttendoproblemascomessesnomesestranhos,consulteapronncia
orientarnapgina48.)Maisumavez,onomeindicacomoafunofunciona:
levaocarrodoCDRdaCDRdalista.

pgina59

Captulo2Listas 47

(FEEFIEFOEFUM)

Caddr

INIMIGO

PararealmenteentendercomoCaddrfunciona,voctemquelerosComoeDs
dadireitaparaaesquerda.Comeandocomalista(FEEFIEFOEFUM),tireprimeiroa
CDR,produzindo(FIEFOEFUM).Emseguida,tomaraCDRdeque,oqued
(FUMFOE).Finalmentelevarocarro,queproduzFOE.

AquiestumaoutramaneiradeolharparaCaddr.ComececomaCDDR(''coudih
"Funoder'),quelevaoCDRdaCDR,ouorestodoREST.
ACDDRde(FEEFIEFOEFUM)(FUMFOE),eocarrodeque
INIMIGO.OCARdaCDDRoCaddr!
CommonLispfornecedefiniesinternasparatodasascombinaesdeCAR
eCDRateincluindoquatroComoeDsnonomedafuno.assim
CAADDRestembutido,masnoCAADDAR.Lispcomumtambmfornecebuilt
emdefiniesparaprimeiroatravsdcimo.
EXERCCIO
2.12. OC...NomeRfazusoLispparaafunoqueretornaaquarta
elementodeumalista?Comovocpronuncia?
2.10.3CAReCDRdelistasaninhadas
CAReCDRpodeserusadoparatirarlistasalmaninhadostofacilmentecomoosplanos.
Vamosvercomopodemosobterparaosvrioscomponentesdalistaaninhada((AZUL
CUBE)(REDPYRAMID)),queseparececomisso:

NADA
NADA
AZUL

CUBO

NADA
VERMELHOPIRMIDE

pgina60

48

CommonLisp:AGentleIntroduoComputaoSimblica

CAR/GuiaCDRPronunciada
Funo

Pronncia

Nomealternativo

CARRO
CDR

kar
couder

PRIMEIRO
DESCANSAR

CAAR
CADR
CDAR
CDDR

kaar
kaeder
coudar
couDIHder

CAAAR
CAADR
CADAR
Caddr
CDAAR
CDADR
CDDAR
CDDDR

kaaar
kaaeder
kadar
kaDIHder
coudaar
coudaeder
couDIHdar
coufezDIHder

CADDDR

kaDIHDIHder

eassimpordiante

SEGUNDO

TERCEIRO

QUARTO

pgina61

Captulo2Listas 49
OCARdestalista(cuboazul).Parachegaraoazul,devemostomara
CARROdocarro.AfunoCAAR,pronunciase''kaar,''fazisso.

((Cuboazul)(REDPYRAMID))

CAAR

AZUL

QuetalcomearcomosmboloCUBE?Colocarodedosobreosprimeiroscontras
cluladalista.SeguindooponteirodoCARdaprimeiraclulalevanosao
lista(cuboazul).SeguindooponteirodoCDRapartirdessaclulalevanosao

lista(CUBE),eseguindooponteirocarrodellevanosaosmbolo
CUBO.EntoCUBEocarrodoCDRdoCARdalista,ou,emsuma,
oCADAR(''kadar'').
Aquiestoutramaneiradepensarsobreisso.Oprimeiroelementodalistaaninhada
(AZULCUBE),demodoCUBEosegundodosprimeirosdalista.Istoo
CADRdocarro,queprecisamenteoCADAR.
Agoravamostentarchegaraosmbolovermelho.REDoprimeirodos
SEGUNDAdalista.VocjsabequeesteocarrodoCADR.
ColocarosdoisnomesjuntosproduzCAADR,quesepronuncia''kaAE
der.''Leituradadireitaparaaesquerda,colocarodedosobreaprimeiraclulaecontras
seguiroponteirodeCDR,emseguida,oponteiroCARe,emseguida,oponteiroCARRO
maisumavezvocvaiacabarnaRED.
Vamosconstruirumatabelacomospassosaseguirparachegarapirmide:
Passo

Resultado

comear

((Cuboazul)(REDPYRAMID))

C...DR

((REDPYRAMID))

C..ADR

(REDPYRAMID)

C.DADR

(PIRMIDE)

CADADR

PIRMIDE

EXERCCIOS
2.13. Anotetabelassemelhantesaoacimaparailustrarcomochegara
cadapalavranalista(((FUN))(NA)(SUN)).
2.14. OqueaconteceriasevoctentouexplicarofuncionamentodoCAADR
funonalista((cuboazul)(PirmideVermelha)atravsdaleiturado

pgina62

50

CommonLisp:AGentleIntroduoComputaoSimblica
ComoeDsdaesquerdaparaadireitaemvezdadireitaparaaesquerda?
2.15. Usandoalista((AB)(CD)(EF)),preencheraspartesausentesde
essamesa.
Funo

Resultado

CARRO

(AB)

CDDR
CADR
CDAR
B
CDDAR
UMA
CDADDR
F
2.16. OquefazerquandoCAARdadaaentrada(FREDNIL)?
2.10.4CAReCDRdeNIL
AquiestumoutrofatointeressantesobreNIL:OCAReCDRdeNILso
definidaparaserNIL.Nesteponto,provavelmentenobvioporqueestedeveser
assim.EmalgunsanteriordialetosLisperarealmenteumerroparatentarlevarocarro
ouCDRdeNIL.MasaexperinciamostraqueadefiniodoCAReCDRde
NILserNILtemconsequnciastilemdeterminadassituaesdeprogramao.
Vocveralgunsexemplosemcaptulosposteriores.

NADA

CARRO

NADA

NADA

CDR

NADA

pgina63

Captulo2Listas 51
Desdeoprimeiro,segundo,terceiroeassimpordiantesodefinidosemtermosdeCAR
eCDR,vocjsabeoquevaiacontecersevoctentarextrairumelementode
umalistaquemuitocurto,comotomaroterceiroelementodalista(DING
Aling).TERCEIROCaddr.OCDRde(DINGAling)(Aling)a
CDRde(Aling)nula,eocarrodequenula,ento:

(DINGUMLING)

TERCEIRO

NADA

EXERCCIO
2.17. Preenchaosseguintesresultadosdosclculos.

(Noafixenenhumaconta)

CARRO

(Noafixenenhumaconta)

CDR

((POSTNO)CONTAS)

(CONTAS)

pgina64

CARRO

CDR

52

CommonLisp:AGentleIntroduoComputaoSimblica

CONTAS

CARRO

(POST(semcontas))

CDR

(POST(semcontas))

CDR

NADA

CARRO

2.11CONS
AfunoCONScriaclulascontras.Levaduasentradaseretornaum
ponteiroparaumanovaclulacontrascujocarropontosdeentradaparaoprimeiroecujaCDR
apontaparaasegunda.Otermo''CONS''curtoparaconstruir.
SetentarmosexplicarCONSusandoanotaodeparnteses,podemosdizerque
CONSadicionaumelementoparaafrentedeumalista.Porexemplo,podemosadicionaro
Umsmboloparaafrentedalista(BCD):

UMA
CONS

(ABCD)

(BCD)
Outroexemplo:aadiodosmboloSINKparaalista(ounadar).

pgina65

Captulo2Listas 53

PIA
CONS

(AFUNDAROUNADAR)

(Ounadar)

AquiestumaGREETfunoqueadicionaosmboloOLparaqualquerquesejaalista
dadocomoentrada:
DefiniodeGREET:

OL
CONS

ExemplosdeGREET:

(ProfessorHiggins)

(NOPERCADOOLITTLE)

CUMPRIMENTAR(OLprofessorHiggins)

CUMPRIMENTAR(OLLSENHORITADOOLITTLE)

PararealmenteentenderoqueCONSfaz,melhorpensarsobreissousando
notaocelularcontras.CONSumafunomuitosimples:Elenosabenada
sobrea"frentedeumalista.'''(Lembrese,dentrodocomputadornoexistam
parnteses.)TodososCONSfazcriarumanovaclulacontras.Mas,seasegunda
entradaparaCONSumacadeiadeclulascontrasdecomprimenton,anovaclulairformaracabea
deumacadeiadeclulascontrasdecomprimenton+1.VejaaFigura21.Assim,mesmoqueapenasCONS
retornaumponteiroparaaclulaquecriado,noefeitoqueretornaumacadeiadeumaclulacontras
maisdoqueasuasegundaentrada.

pgina66

54

CommonLisp:AGentleIntroduoComputaoSimblica
CONScriaumanovaclulacontras:

NADA
OL

SENHORITA

DOOLITTLE

ElepreencheosponteirosCAReCDR:

NADA
OL

SENHORITA

DOOLITTLE

Eeleretornaumponteiroparaanovaclula,queagoraochefedeumaclulacontras
umacadeiamaislongadoquesegundaentradadoCONS:
ResultadodaCONS
NADA
OL

SENHORITA

Figura21CriandoumanovaclulacontrascomCONS.

DOOLITTLE

pgina67

Captulo2Listas 55
2.11.1CONSealistavazia
DesdeNILalistavazia,seusarmosCONSdeacrescentaralgoparaNILns
obterumalistadeumelemento.
FROB
CONS

(FROB)

NADA
Vocdevesercapazdeconfirmaresteresultado,olhandoparaocelularcontras
notaoparaalista(FROB).Ocarro(FROB)osmboloFROBe
aCDRde(FROB)nulo,entoCONSdeveterconstrudoalistadasentradas
FROBeNIL.

NADA

FROB
Aquiestoutroexemploquemuitosemelhante,excetoqueNILfoi
substitudoporFROB:
NADA
CONS

(NADA)

NADA
Nanotaoimpressa,consingalgoemNILequivalenteaatirar
umparextradeparntesesemtornodele.

(TELEFONEDECASA)
CONS

((TELEFONEDECASA))

NADA

pgina68

56

CommonLisp:AGentleIntroduoComputaoSimblica

2.11.2EdifcioNestedlistascomCONS
QualquermomentoaprimeiraentradaparaCONSumalistanovazia,oresultadoserumnested
lista,isto,umalistacommaisdeumnveldeclulascontras.Exemplos:
(FRED)
CONS

((FRED)egengibre)

CONS

((AGORAAHORA)

(Egengibre)

(AGORA)
(AHORA)

2.11.3CONSpossvelcriarlistasapartirdozero
Suponhaquequeremosconstruiralista(FOOBARBAZ)apartirdozero.Ns
poderiacomearadicionandoosmboloBAZparaalistavazia.Issonosda
lista(BAZ).

bAZ
CONS

(BAZ)

NADA
Ento,podemosadicionarBARemque:

BARRA
CONS
(BAZ)
Finalmente,adicioneoFOO:

(BARBAZ)

pgina69

Captulo2Listas 57

FOO
CONS

(FOOBARBAZ)

(BARBAZ)

TemosemcascatatrsCONSsjuntosparaconstruiralista(FOOBARBAZ)
doprincpio.Aquiumdiagramadacascata:

FOO
CONS

BARRA
CONS

bAZ
CONS
NADA

Sevocativaressediagramadeladovocvaiverqueelequaseidnticoao
odiagramadeclulascontrasparaalista(FOOBARBAZ).Issodevedarlheuma
pistadeporqueasclulascontraseoscontrasfuncionarcompartilhamomesmonome.
EXERCCIO
2.18. Escreverumafunoquerecebequaisquerduasentradasefazumalistadeles
usandoCONS.
2.12simetriadaCONSECARRO/CDR
HumasimetriainteressanteentreCONSeCAR/CDR.dadoalgum
Listax,sesabemosqueoCARdexeoCDRdexpudermoscontraslosjuntos
paradescobriroquex.Porexemplo,seocarrodexosmboloAeo
CDRdexalista(eiou),sabemosquexdeveseralista(AEIOU).

pgina70

58

CommonLisp:AGentleIntroduoComputaoSimblica
AsimetriaentreCONSeCAR/CDRpodeserexpressaformalmentecomo:
x=CONSde(CARdex)e(CDRdex)

Noentanto,estarelaosvlidoparaaslistasnovazias.QuandoxNIL,
oCAReCDRdextambmsonulas.Setentarmosreconstruirxporconsing
juntosseusCAReCDRpores,isto,oscontrasdeNileNILchegarmos
lista(NIL),noalistavaziaNIL.Istonodevesertomadocomosignificandoque
NILe(NIL)soidnticos,poissabemosqueelesnoso.Emvezdisso,servepara
lembramnosque,emboraNILumalista,umaformamuitoincomum.certosfatos
sobrelistasaplicamseapenasaunsnovazios,emoutraspalavras,aquelescontendopelo
menosumaclulacontras.
2.13LISTA
CriandoumalistadeumgrupodeelementosumaoperaotocomumqueLisp
temumafunobuiltinparafazerexatamenteisso.Afunolistatemqualquernmerode
entradasefazumalistadeles.Ouseja,elefazumanovacadeiacelularcontras,
terminandoemNIL,comtantasclulascomoexistementradas.Figura22demonstra
Esteprocesso.
FOO
BARRA

LISTA

(FOOBARBAZ)

bAZ
LembresequeCONSsemprefazumanicaclulanovoscontrasverificaseaadicionar
asuaprimeiraentradanalistaqueasuasegundaentrada.Afunodalista,nos
outrolado,fazumainteiramentenovacadeiadecelularcontras.Nanotaoparnteses,omesmo
parecejogarumpardeparntesesemtornodesuasentradas,pormmuitosno
estamos.OresultadodalistaSempretemmaisumnveldeparenthesizationde
tinhaqualquerentrada.

FOO

LISTA

(FOO)

pgina71

Captulo2Listas 59
LISTAalocatrsnovasclulasContras:

FOO

BARRA

bAZ

ElepreencheosponteirosCAR:

FOO

BARRA

bAZ

Emseguida,elepreencheosponteirosdeCDRparaformarumacadeia,eretornaumponteiroparao
primeiraclula:

OresultadodeLISTA
NADA
FOO

BARRA

bAZ

Figura22ComoLISTAconstriumanovalista.

pgina72

60

CommonLisp:AGentleIntroduoComputaoSimblica

(FOO)

LISTA

((FOO))

LISTArealmentefuncionaatravsdaconstruodeumanovacadeiadeclulascontras.aCAR
metadesdasclulaspontolistaentradasrecebidas.Oresultadodalistaum
Ponteiroparaaprimeiraclulanacadeia.ExemplosdeLISTA:

FOO
LISTA

(Foobar)

LISTA

(SUNNIL)

LISTA

((FROB))

LISTA

(A(BC)D)

LISTA

(NADA)

BARRA

SOL
NADA

(FROB)

UMA
(BC)
D

NADA

Aquiestumafunochamadadeixarescaparquelevaduasentradaseusalosparapreencher
osespaosembrancoemumafraseconstrudacomLIST.

pgina73

Captulo2Listas 61

Definiodedeixarescapar:

UMA

LISTA

Exemplodedeixarescapar:

MIKE
blurt

(MikeumNERD)

NERD
VamosolharnovamenteparaadiferenaentreCONSeLIST.CONSmarcas
umanicaclulacontras.LISTAfazumanovalistadecadeiadeclulascontrasforapormmuitos
entradasquerecebe.

ZORT
CONS

(ZORT)

NADA

ZORT
LISTA

(ZORTNIL)

NADA

CAPAZ
CONS

(ABLEBAKERCHARLIE)

(BAKERCHARLIE)

pgina74

62

CommonLisp:AGentleIntroduoComputaoSimblica

CAPAZ
LISTA

(ABLE(BAKERCHARLIE))

(BAKERCHARLIE)

Outramaneiradeentenderlistapensarnelecomoseexpandindoemum

cascatadecaixascontras,damesmaformacomoumachamadaparaumafunoaritmticacomo''+
de2,3,7,e12''seexpandeparaumacascatadechamadasparaaversodeduasentradasde
+.Ento,oquerealmentesepassadentrodalistaprimitivo,dadaumaexpressocomo

COCKATOO
LISTA

(REVISOCOCKATOO)

REVISO
quevriaschamadasemcascataparaCONSsofeitas:
dentroLISTA

COCKATOO
CONS

REVISO
CONS
NADA

(REVISOCOCKATOO)

pgina75

Captulo2Listas 63
EXERCCIO
2.19. Preenchaosseguintesresultadosdosclculos.
FRED
E

LISTA

WILMA

FRED
LISTA
(EWilma)

FRED
CONS
(EWilma)

NADA
CONS
NADA

NADA
LISTA

NADA

2.14substituindooprimeiroelementodeumalista
SuponhaquedesejasubstituiroprimeiroelementodeumalistacomosmboloQUE.
Afunodedescansopodeserusadoparaobterasublistaparaalmdoprimeiroelemento
entopodemosusarCONSparaadicionarosmboloQUEparaafrentedoquesublista.
VamoschamaranossafunoDIZQUE.

pgina76

64

CommonLisp:AGentleIntroduoComputaoSimblica

DefiniodeSAYOQUE:

OQUE
CONS

DESCANSAR

AquiestumexemplodeSAYOQUE:

(TIREUMCOCHILO)

DIZEROQUE

(WHATANAP)

Orestodo(tirarumcochilo)(ANAP).ConsingosmboloQUE
emqueproduz(WHATANAP).
Comovocpodeveragora,apalavraWHATfunonorealmentesubstituirqualquer
partedalista.Oqueelefazgerarumanovalista,fazendoumanovaclulacontras
cujospontosdeCDRmeiodeumaporodalistavelha.AentradaparaSayWHAT
Eoresultadoeleretornasomostradosabaixo.
Entrada

Resultado

NADA

LEVAR
UMA
OQUE

SESTA

pgina77

Captulo2Listas 65
EXERCCIOS
2.20. Queresultadossoretornadospeloseguinte?

NADA

LISTA

T
LISTA
NADA

T
CONS
NADA

(T)
CONS
NADA

(Emumaorelhae)
LISTA
(Foraosoutros)

(Emumaorelhae)
CONS
(Foraosoutros)

pgina78

66

CommonLisp:AGentleIntroduoComputaoSimblica
2.21. Escreverumafunoquelevaquatroentradaseretornaumdoiselementosaninhados
Lista.Oprimeiroelementodeveserumalistadasduasprimeirasentradas,eo
segundoelementodeumalistadasltimasduasentradas.
2.22. SuponhaquensqueramosfazerumafunochamadaDuoCONSqueacrescentaram
doiselementosparaafrentedeumalista.LembresequeasCONSregulares
funoadicionaapenasumelementodeumalista.DuoCONSseriaum
funodetrsentradas.Porexemplo,seasentradasforamosmbolo
PATRICK,osmboloSeymour,ealista(MARVIN),DUO
CONSvoltariaalista(PATRICKSEYMOURMARVIN).exposio
comoescreverafunoDUOCONS.
2.23. DOISMAISPROFUNDAumafunoqueenvolveasuaentradacomdoisnveisde

parnteses.DOISmaisprofundadoMOO((MOO)).DOISmaisprofundode
(BOWWOW)(((BOWWOW))).MostracomoescreverDOIS
DEEPERusandoLIST.EscreveroutraversousandoCONS.
2.24. ObuiltinfunoLispseriaextrairoNOITEsmbolodo
lista(((BOM))((NOITE)))?
2.15PREDICATESLISTA
OpredicadolistpretornaTsesuaentradaumalista.ListpretornaNILpara
nolistas.

PONTO

(Umpontoatempo)

listp

NADA

listp

OpredicadoCONSPretornaTsesuaentradaumaclulacontras.CONSP
quaseomesmoquelistpadiferenaestnoseutratamentodeNIL.NILum
lista,masnoumaclulacontras.

pgina79

Captulo2Listas 67

NADA

NADA

listp

CONSP

NADA

OpredicadoATOMretornaTsesuaentradaoutracoisasenoumacons
clula.ATOMeCONSPsoopostosquandoumretornaT,aoutrasempre
retornaNIL.

18

GOLFE

(FUROEMUM)

TOMO

TOMO

TOMO

NADA

Apalavra''tomo''vemdogregoatomos,quesignificaindivisvel.

Nmerosesmbolossoatmica,porqueelesnopodemserdesmontadas.
listasnovaziasnosoatmicas:FIRSTeRESTOdesmontlos.
OpredicadoNULLretornaTsesuaentradanulo.Oseucomportamentoomesmo
comooNOpredicado.Porconveno,osprogramadoresLispnoreservarpara
operaeslgicas:mudanaverdadeiraparafalsaefalsaparaverdadeira.ElesusamNULL
quandoelesqueremtestarsealistaestvazia.

pgina80

68

CommonLisp:AGentleIntroduoComputaoSimblica
RESUMO
EstecaptulointroduziuotipodedadosmaisverstilemLisp:listas.listastm
tantoumimpressoseumarepresentaointerna.Elespodemconternmeros,
smbolos,ououtraslistascomoelementos.
PodemostomarlistasparaalmusandoCAReCDR(''primeiro''e''descanso'')ecoloc
losjuntamentecomCONSoulista.AfunoCOMPRIMENTOcontao
nmerodeelementosemumalista,queomesmoqueonmerodecontrasdenvelsuperior
clulas.
OspontosimportantessobreCAReCDRso:
CAReCDRaceitarapenaslistascomoentrada.
PRIMEIROedescansosoasmesmasqueCAReCDR.
SegundaeTerceirasoasmesmasqueCADReCaddr.

CommonLispfornecefunesRbuiltinC...paratodos
combinaesdeCAReCDRateincluindoquatrocomoe
Ds.
OsmboloNILtemvriaspropriedadesinteressantes:
NILumsmbolo.anicamaneiradedizer''no''ou''falso''em
Lisp.
NILumalista.alistavaziaSeucomprimentozero.
NILonicoobjetoLispqueumsmboloeumalista.
NILmarcaofimdeumacadeiadeclulascontras.Quandoaslistassoimpressosem
notaoparntesis,osNILnofinaldascadeiassoomitidospor
conveno.
NILe()sonotaesintercambiveisparaomesmoobjeto.
OCAReCDRdeNILestoaserdefinidoNIL.
exercciosdereviso
2.25. Porqueasclulascontraseoscontrasfuncionarcompartilhamomesmonome?
2.26. Oqueessasduasfunesfazemquandodadaaentrada(ABC)?

pgina81

Captulo2Listas 69

CDR

COMPRIMENTO

COMPRIMENTO

CDR

2.27. Quandoquearepresentaointernadeumalistaenvolvermaisclulascontras
doquealistatemelementos?
2.28. UsandoapenasCAReCDR,possvelescreverumafunoqueretorna
oltimoelementodeumalista,noimportaquantotempoalista?Explicar.
FUNESabordadosnestecaptulo
funesdelista:primeiro,segundo,terceiro,quarto,REST,CAR,CDR,
CONS,LIST,COMPRIMENTO.
ComposiesdeCAReCDR:CADR,Caddr,eassimpordiante.
Predicados:listp,CONSP,ATOM,NULL.

pgina82

70

CommonLisp:AGentleIntroduoComputaoSimblica

Tpicosavanados

2.16ARITHMETICUnriocomlistas
Aslistaspodemserusadasparafazerunrio(''umabase'')aritmtica.Nestesistema,
osnmerossorepresentadosporlistasdesmbolostally,comoasmarcasdeumprisioneiro
podefazernaparededesuacelapararegistrarapassagemdotempo.Onmero
1estrepresentadoporumacontagem,onmero2porduascontagens,eassimpordiante.Nspodemos
representam0denenhumacontagens.Novamosconsiderarnmerosnegativos.

VamosusarXcomonossosmbolocontagem.Podemosanotarosnmerosunrioscomolistas
deXs:
0representadocomoNIL
1estrepresentadocomo(X)
2estrepresentadocomo(XX)
3estrepresentadocomo(XXX)
Tendodefinidonmerosunriosemtermosdelistas,podemosproceder
investigaroquefunesefeitoslistademanipulaosobreeles.Oresto
funosubtrai1emunrio,assimcomoumafunoSUB1definidosusandoseria
tomar1longedeuminteirocomum.Vamossubtrair1de3:

(XXX)

DESCANSAR (XX)

Subtraindo1apartirde1yields0:

pgina83

Captulo2Listas 71

(X)

DESCANSAR NADA

Massubtrair1de0rendimento0,no1.Lembresequeonossounrio
esquemadenmerosfoidefinidoparainteirosnonegativos.

NADA

DESCANSAR NADA

AfunoCOMPRIMENTOconvertenmerosunriosparainteirosregulares.Aqui
umainstnciadeCOMPRIMENTOoperandononmerounrio(XXXX):

(XXXX)

COMPRIMENTO 4

Nemtodasasfunesdelistaprimitivostraduziremaritmticaunriointeressante
funes.Afunodocarrono,porexemplo.Noentanto,possvel
paraescrevernossasprpriasfunesnoprimitivosqueexecutamoperaesunriasteis.
EXERCCIOS
2.29. EscreverumafunounrioADD1queaumentaumnmerounrioporum.
2.30. OquefazafunoCDDRfazerparanmerosunrios?
2.31. EscreverumpredicadounrioZEROP.
2.32. EscreverumpredicadounrioGREATERP,anlogoao>predicado
emnmeroscomuns.
2.33. CARpodeservistocomoumpredicadoemnmerosunrios.Aoinvsde
retornandoTouNIL,carrovoltaXouNIL.LembresequeXouqualquer

outroobjetonoNILtomadocomoverdadeemLisp.Queperguntasobreum
nmerounriofazrespostaCAR?

pgina84

72

CommonLisp:AGentleIntroduoComputaoSimblica

2.17ESTRUTURASnonlistCONS
UmaboalistaumacadeiadeclulascontrasterminandoemNIL.Aconvenoomitir
esteNILaoescreverlistasemnotaoparntese,assimqueaestruturaabaixo
escrita(ABC).

NADA
UMA

Existemoutrostiposdeestruturasdeclulasquenosoconslistasadequadas,
porquesuascadeiasnoterminamemNIL.Comopodeaestruturaabaixodoser
representadonanotaodeparnteses?

UMA

Aoimprimirumalistananotaoparntesis,Lispcomeaimprimindoumaesquerda
parnteseseguidoportodososelementos,separadosporespaos.Ento,sealista
terminaemNIL,Lispimprimeumparntesedireito.SenoterminaremNIL,antes
imprimiroparntesedireitoLispimprimeumespao,umponto,umoutroespao,e
otomoqueterminaacadeia.Alistaacima,oqualchamadoumalistapontilhada
emvezdeumalistaadequada,estescritoassim:
(ABC.D)
Atagora,anicamaneiraquetemosparaproduzirumaestruturacelularcontrasqueno
fimemNILusarCONS.

UMA
CONS

(A.B)

B
OresultadodasCONSdeAeBchamadodeparpontilhada.Estescrito

pgina85

Captulo2Listas 73

(.AB)nanotaoparntesis,aomesmotempoemnotaocelularcontrasquetemestaaparncia:
B
UMA
UmparpontilhadaumanicaclulacontrascujaCDRnoNIL.Alistapontilhada
(.ABC)contmduasclulascontras,econstrudodaseguintemaneira:
UMA
CONS

(AB.C)

B
CONS
C
Emcontrasnotaocelular,(.ABC)separececomisso:

C
UMA

EmboraLISTAmuitasvezesumaferramentamaisconvenientedoqueCONSpara
construodelistas,afunoLISTspodecriarlistasapropriadas,poissempre
constriumacadeiaqueterminaemNIL.ParalistaspontilhadasdeveserutilizadoCONS.
EXERCCIOS
2.34. EscrevaumaexpressoenvolvendochamadasemcascataparaCONSparaconstruiro
listapontilhada(ABC.D).
2.35. Desenharalistapontilhada((A.B)(C.D))emnotaocelularcontras.Escreverum
expressoparaconstruirestalista.

pgina86

74

CommonLisp:AGentleIntroduoComputaoSimblica

2.18LISTASCIRCULARES
listaspontilhadaspodeparecerumpoucoestranho,masasestruturasaindamaisestranhassopossveis.
Porexemplo,aquiestumalistacircular:

UMA

Seocomputadortentouexibirestalistanoformulrioimpresso,umdosvrios
coisaspodeacontecer,dependendodadefiniodecertosparmetrosdaimpressora
queserdiscutidomaistarde.Ocomputadorpodeentraremumloopinfinito.ou
podetentarimprimirpartedalista,usandoreticncias(trspontos),comoem:
(ABCABCAB...)
Estamaneiradeescreveralistaincorreto,porquesugerequealista
contmmaisdedezelementos,quandonaverdadeelecontmapenastrs.
Lispcomumforneceumamaneiracompletamentecorretaparaimprimircircular

estruturas,usandoalgochamado''sharpigualanotao'',baseadono#
(Signsharp)personagem.Essencialmente,paraescreverestruturascircularesprecisamosdeumamaneira
paraatribuirumaetiquetaaumaclulacontrasparaquepossamosreferiraelemaistarde.(Porexemplo,em
alistacircularacima,oCDRdaterceiraclulacontrasremeteparaoprimeiro
celular.)Vamosusarinteirosparartuloseanotao#n=rotularumobjeto.
Vamosescrever#n#parasereferiraoobjetomaistarde,naexpresso.Alistaacima
portanto,escritodestaforma:
#1=(ABC.#1#)
EXERCCIO
2.36. Provarporcontradioqueestalistanopodeserconstrudousandoapenas
CONS.DICA:Pensesobreaordememqueasclulassocriadas.
Umaestruturaaindamaisdesvianteamostradaabaixo,emqueocarrodeum
pontoscelularescontrasdiretamentedevoltaparaaprpriaclula.

pgina87

Captulo2Listas 75

UMA

Seocomputadortentouimprimiressaestrutura,elepodeacabarimprimindouminfinito
sriedeparntesesesquerda.Mas,seaimpressorainstrudoausarsharpigual
notao,alistairiaimprimirdestaforma:
#1=(#1#.A)
2,19COMPRIMENTODEESTRUTURASnonlistCONS
Ocomprimentodeumalistaonmerodeclulascontrasdenvelsuperiornacadeia.
Portanto,ocomprimentode(ABC.D)3,4.noomesmocomprimentoqueo
cadeia(ABC),quetambmpodeserescrito(ABC.NIL).

(ABC.D)

COMPRIMENTO 3

Selhefordadaumalistacircular,como#1=(ABC.#1#)comoentrada,comprimento
noretornaumvaloremtudo.Namaioriadasimplementaeselevaientraremuminfinito
loop.

pgina88

76

CommonLisp:AGentleIntroduoComputaoSimblica

pgina89

EVALNotation

3.1INTRODUO
AntesdeavanaraindamaisemnossoestudodoLisp,devemosmudarparaummais
notaoflexvel,chamadodenotaoEVAL.Emvezdeusarcaixaspararepresentar
funes,usaremoslistas.notaoBoxfcildeler,masanotaoEVAL
temvriasvantagens:
Conceitosdeprogramaoquesodemasiadosofisticadoparaexpressarnacaixa
notaopodemserexpressasemnotaoEVAL.
notaoEVALfcildedigitaremumtecladodecomputadorcaixa
notaono.
Dopontodevistamatemtico,oquerepresentafuncionacomo
listascomunsumacoisaelegantedefazer,porqueentopodemosusar
exactamenteamesmanotaoparafunescomoparaosdados.
EmLisp,asfunessodados,enotaoEVALnospermiteescrever
funesqueaceitamoutrasfunescomoentradas.Vamosexploraresta
possibilidadeaindamaisnocaptulo7.
DepoisdeterdominadoanotaoEVAL,vocvaisabermaisde
oquevocprecisaparacomearaconversaremLispcomumcomputador.

77

pgina90

78

CommonLisp:AGentleIntroduoComputaoSimblica

3.2afunoeval
AfunoEVALocoraodoLisp.OtrabalhodeEVALavaliarLisp
expressesparacalcularoseuresultado.Amaioriadasexpressesconsistemdeumafuno
seguidoporumconjuntodeentradas.SedermosEVALaexpresso(+23),por
exemplo,elevaiinvocarafunobuiltin+nasentradas2e3,e+vai
voltar5.Porisso,dizemqueaexpresso(+23)avaliaa5.

(2+3)

EVAL

Apartirdeagora,emvezdedesenharumacaixadeEVALvamosusarapenasumaseta.
Oexemploanteriorserescritoassim:
(+23)5
Quandoqueremosserumpoucomaisdetalhado,vamosusarumasetadeduaspontas:
(2+3)
5
Equandoqueremosmostraromximodedetalhespossvel,vamosutilizarumperododetrs
setadecabea,comoeste:

(2+3)
Digite+comentradas2e3
Oresultadode+5
Ossignificadosdaslinhasfinasegrossasserexplicadomaistarde.Aquiesto
maisalgunsexemplosdeexpressesemnotaoEVAL:
(+16)7
(oddp(+16))t
(*3(+16))21
(/(*211)(1+6))22/7

pgina91

79
CAPTULO3EVALNotation
3.3EVALNOTATIONpodefazernadaBOXNOTATIONPODEFAZER
Deveriaserbvioquequalquerexpressoqueescreveremnotaocaixatambmpodeser
escritoemnotaoEVAL.Aexpresso
3

*
5

6
podemserrepresentadosemnotaocomoEVAL
(*3(+65))
Domesmomodo,aexpressodanotaoEVAL
(Not(iguala56))
representadonanotaocaixacomo

5
IGUAL

NO

6
VocpodenotarqueanotaoEVALapareceparaleremfrentecaixa
notao,emoutraspalavras,sevocleraexpressodanotaoquadroacimacomo
''Cinco,seis,,NOT,EQUAL''acorrespondenteexpressodanotaoEVAL
l''NOTEQUAL,cinco,seis.''Nanotaocaixadeversodoclculo
comeanadireitaparaaesquerdaefluxos.EmEVALnotaoasentradasparaa
funosoprocessadasesquerdaparaadireita,masdesdequeasexpressessoaninhados,
Avaliaorealmentecomeacomaexpressomaisntimaefluiparafora,
fazendoaordemdechamadasdefunonesteexemplodireitaparaaesquerda.

pgina92

80

CommonLisp:AGentleIntroduoComputaoSimblica

3.4regrasdeavaliaodefinirocomportamentodoEVAL
EVALfuncionaseguindoumconjuntoderegrasdeavaliao.Umaregraqueosnmeros
ealgunsoutrosobjetosso''autoavaliao'',oquesignificaqueelesavaliama
simesmos.OssmbolosespeciaisTeniltambmavaliamasimesmos.
2323
tt
nilnil
RegradeavaliaoparaNmeros,T,eNIL:nmeroseossmbolosT
eNIL,avaliamparasimesmos.
Htambmumaregraparaavaliarlistas.Oprimeiroelementodeumalistaespecifica
umafunoaserchamadaosrestanteselementossoosunevaluatedargumentospara
afuno.Estesargumentosdevemseravaliados,deesquerdaparaadireita,para
determinarasentradasparaafuno.Porexemplo,paraavaliaraexpresso
(ODDP(+16)),aprimeiracoisaquedevemosfazeravaliaroargumentodeODDP:o
lista(+16).Parafazerisso,comearporavaliarosargumentospara+.1avalia
a1,e6avaliaa6.Agoranspodemoschamarafuno+comessesinputs
evoltaroresultado7.A7,emseguida,servecomoentradaparaODDP,que
retornaT.
RegradeavaliaoparaListas:Oprimeiroelementodalistaespecificaum
funoaserchamada.Osrestanteselementosespecificarargumentosparao
funo.Afunochamadacomosargumentosavaliados.

Odiagramaaseguir,chamadoumdiagramaevaltrace,mostracomoa
avaliaodo(ODDP(+16))temlugar.Observequeprocededeavaliao
apartirdaexpressoaninhadointerior,(1+6),paraaexpressoexterior,ODDP.este
qualidadeinteriorexteriorareflectidanaformadediagramaevaltrace.

pgina93

81
CAPTULO3EVALNotation
(Oddp(1+6))
(1+6)
1avaliaa1
6avaliaa6
Digite+comentradas1e6
Oresultadode+7
DigiteODDPcomentrada7
OresultadodeODDPT

Aquiestoutroexemplodosargumentosparaumafunosendoavaliada
antesqueafunochamada:umevaltraceparaaexpresso(EQUAL(+75)
(*28)):
(Equivalente(7+5)(*28))
(7+5)
7avaliaa7
5avaliaa5
Digite+comentradas7e5
Oresultadode+12
(*28)
2avaliaa2
8avaliaa8
Digite*comentradas2e8
Resultadoda*16
DigiteEQUALcomentradasde12e16
ResultadodaEQUALNIL
EXERCCIOS
3.1. Oquefaz(NOT(EQUAL3(ABS3)))avaliara?
3.2. EscrevaumaexpressoemnotaoEVALparaadicionar8a12edividiro
resultadopor2.
3.3. Vocpodeenquadrarumnmeromultiplicandooporsis.Escreverum
expressoemnotaoEVALparaadicionaroquadradode3eoquadradode4.
3.4. Desenheumdiagramaevaltraceparacadaumadasseguintesexpresses.
(82)

pgina94

82

CommonLisp:AGentleIntroduoComputaoSimblica
(Not(oddp4))
(>(*25)9)
(No(igual5(+14)))

3,5definirfunesnoEVALNOTATION
Nanotaocaixadensdefinimosumafuno,mostrandooquesepassavanointeriordo
caixa.Asentradasparaafunoforamrepresentadoscomosetas,NanotaoEVAL
usamoslistasparadefinirfunes,ereferemseaargumentosdafunode
dandolhesnomes.Podemoscitarasentradasparafunesdenotaoboxtambm,por
escreveronomeaoladodasetacomoeste:
Definiodemdia:
x
y

/
2.0

AfunomdiadefinidananotaoEVALdestaforma:
(Mdiadefun(xy)

(/(+Xy)2.0))
Defunumtipoespecialdefuno,chamadadefunomacro,quefaz
noavaliaseusargumentos.Portanto,elesnotmdesercitado.defun
utilizadoparadefiniroutrasfunes.AprimeiraentradaparaDefunonomedo
funoaserdefinida.Asegundaentradaalistadeargumentos:Especificao
nomesafunoirusarparasereferiraseusargumentos.Asentradasrestantespara
Defundefinirocorpodafuno:'.Dentrodacaixa'oqueacontece''por
Apropsito,Defunsignificadebemdivertidoco.

pgina95

83
CAPTULO3EVALNotation
DepoisdedigitaradefiniodafunoparaMDIAno
computador,vocpodechamarMDIAusandoanotaoEVAL.Quandovocdigita
(Mdiade68),porexemplo,usaemmdia6comoovalorparaXe8como
ovalorparaY.Oresultado,naturalmente,de7,0.
AquiestoutroexemplodedefiniodefunocomDefun:
(Defunquadrado(n)(*nn))
Onomedafunoquadrado.Alistadeargumentos(N),oquesignificaque
aceitaumargumentoquesereferecomoN.Ocorpodafunoa
expresso(*NN).Ocaminhocertoparaleremvozaltadefinio(ouemseu
cabea):''DefunQUADRADOdeN,NvezesN.''
Quasequalquersmbolo,excetoTouNILpodeservircomoonomedeumargumento.

X,YeNsocomumenteusados,masBOZOouARTICHOKEtambmfaria
trabalho.Funessomaislegveisquandoosseusnomesdeargumentossignificaria
algumacoisa.Umafunoqueocustototalcalculadodeumaordemdemercadoria
podenomearseusargumentosquantidade,preoemanuseiodecarga.
(Defundecustototal(quantidadedepreomanuseamentodecarga)
(+(*Preoquantidade)manuseamentodecarga))
EXERCCIOS
3.5. Escreverdefiniesparaametade,CUBEeONEMOREPusandodefun.
(AfunoCUBEdeveterumnmeroncomoentradaeretornarn 3.)
3.6. DefinirumPYTHAGfunoquelevaduasentradas,xey,eretorna
araizquadradadex 2 +y2.VocpodereconhecerestecomoPitgorasde
frmulaparacalcularocomprimentodahipotenusadeumtringulorectngulo
dadooscomprimentosdosoutrosdoislados.(PYTHAG34)deveretornar
5.0.
3.7. Definirumafunomilhasporgaloquetemtrsentradas,chamada
INICIALODOMETERREADING,FINALODOMETERREADING,
elitrosconsumidos,ecalculaonmerodemilhas
viajouporgalodegs.
3.8. ComovocdefiniriaQUADRADOemnotaobox?

pgina96

84

CommonLisp:AGentleIntroduoComputaoSimblica

3.6VARIVEIS
* VamosconsideraroMDIA
Umavarivelumlugarondeosdadossoarmazenados.
funcionarnovamente.QuandochamamosMDIA,Lispcriaduasnovasvariveispara
realizarasentradasdemodoqueaexpressonocorpopodereferirseaelespelonome.
OsnomesdasvariveissoXeY.importantedistinguiraqui
entreasvariveisesmbolos.Asvariveisnososmbolossovariveis
nomeadoporsmbolos.Asfunestambmsonomeadosporsmbolos.
Ovalordeumavarivelsoosdadosquedetm.Quandoavaliamos(MDIA
37),LispcriavariveisnomeadasXeYeatribuilhesosvalores3e
7,respectivamente.Nocorpodamdia,osmboloXrefereseaoprimeiro
variveleosmboloYrefereseaosegundo.Essasvariveispodemunicamenteser
referenciadanointeriordocorpoforadamdia,elessoinacessveis.Do
claro,ossmbolosXeYaindaexistemforadamdia,masnoofazem
tmosmesmossignificadoscomoforaquetemdentro.Odiagramaevaltrace
abaixomostracomoAVERAGEcalculaoseuresultado.
(Mdiade37)
3avaliadocomotrs
7avaliaa7
DigiteMDIAcomentradas3e7
criarvarivelX,comvalor3
criarvarivelY,comovalor7
(/(+Xy)2.0)
(+Xy)
Xavaliaa3
Yavaliaa7
10
2,0a2,0avalia
5
ResultadodaMDIAde5,0

*Esteusodotermo''varivel''peculiaraprogramaodecomputadores.Emmatemtica,avarivelum
notaoparaumaquantidadedesconhecida,noumlugarfsiconamemriadocomputador.Masestesdoissignificadosso
noforemincompatveis,umavezqueasentradasparaumafunosodefactoquantidadesdesconhecidasnomomentoemqueafunoest
definiram.

pgina97

85
CAPTULO3EVALNotation
Agoraeupossoexplicarosignificadodassetasgrossasefinas.Asetafina
conectaumaexpressocomoseuvalor.Veja,porexemplo,queovalorde
aexpresso(+XY)10.Umasetagrossautilizadoparamostraraentradaem
corpodeumafunoesadadoqueocorpo.Dentrodombitodaespessura
arrowvamosmostraroquesepassadentrodocorpo.NocorpodaMDIA,
variveissocriadaseexpressessoavaliadas.Nsnopodemosverointeriordo
corposde+ou/porqueelessoprimitivos,portanto,nohmuitosentidoemusarum
setagrossaparaessasfunes,emboranspoderamos,sequisssemosmostraroseu
entradaesada.Parafunesdefinidaspelousurio,comomdia,comearcomumafina
asetaquemostraaexpressogerarachamadadefuno,eanexaraeleum
setagrossamostrandoaentradaesadadocorpo.Asintaxeabstrata
paraestetipodeexibio:
(Funoarg1...argn)

avaliarosargumentos
Entrenafunocomentradas(argumentosavaliados)
criarvariveisparaarmazenarasentradas
corpodafuno
valordocorpo
Resultadodafuno(valor)
notaoEvaltraceflexvel:podemossuprimirdetalhesquandoforocaso,
taiscomonomostrandocorposdefuno.Outraformadesimplificarumevaltrace
paranoexibiraavaliaodosnmeros,umavezquesempreavaliara
simesmos.svezesagentetambmvaiomitiraavaliaodossmbolos.Aquiest
umevaltracedeONEMOREPusandoumbastantebreveformato:
(Onemorep76)
DigiteONEMOREPcomentradas7e6
criarvarivelX,comovalor7
criarvarivelY,comvalor6
(Igualx(y+1))
(Y+1)
7
T
OresultadodeONEMOREPT

pgina98

86

CommonLisp:AGentleIntroduoComputaoSimblica

3.7AVALIAOSMBOLOS
Osnomesumafunousaparaosseusargumentossoindependentesdosnomesqualquer
outrafunoutiliza.DuasfunescomomeioeQUADRADOpodetanto
chamarseuargumentoN,masquandoNapareceemmeiaspodesereferir
entradadomeioquenotemrelaocomousodeNnapraa.
AregraEVALusaparaavaliarsmbolossimples:
RegradeavaliaoparaSmbolos:Umsmboloavaliadacomoovalordo
varivelqueserefere.
Foradosrgosdemeioequadrado,osmboloNreferese
varivelglobalchamadoN.Umavarivelglobalumquenoestassociadocom
qualquerfuno.PIumexemplodeumavarivelglobalqueconstrudoparaComum
Lisp.
pi3,14159
Informalmente,osprogramadoresLisp,porvezes,falardeavaliarvariveis.
Elespodemdizer''variveisavaliadascomoseusvalores.''Oqueelesrealmentequeremdizer
queumsmboloavaliadocomoovalordavarivelreferesea.Desdeento
PodehavermuitasvariveisnomeadasN,qualdelesvoccomeadependedeondeo
smboloNaparece.SeeleaparecedentrodocorpodeSQUARE,voccomeaa
varivelquecontmaentradaparaquadrados.Seeleseestendeparaforadequalquer
funo,voccomeaomundialN.varivelchamada
Lispvaireclamarsevocperguntarparaovalordeumavarivelquenofoi
** Para
atribudoumvalor.Nsnosreferimosaissocomoum''errovarivelnoatribuda.''
exemplo,nohbuiltinvarivelchamadaberinjelaemCommonLisp.
AvaliandoosmboloBERINJELAcausaumerrovarivelnoatribudo,
Amenos,claro,vocavalilodentrodocorpodealgumafunoquechama
umadesuasentradasberinjela.
berinjelaErro!Varivelnoatribudaberinjela.
TambmnohnenhumavarivelbuiltinchamadoNemLispcomum,demodoavaliarN
foradocorpodaHALFouquadradofarcomqueomesmoerro.

**Amaioriadoslivroschamamissodeumdesacopladodeerrovarivel,masesteumartefatohistricoenorealmenteapropriado
paraCommonLisp.SeguindoumasugestodeRobertWilensky,usamosotermo''noatribudo''emseulugar.
Istodiscutidomaisadiantenaseco5.10.

pgina99

87
CAPTULO3EVALNotation
3.8OusodesmboloselistasDADOS
SuponhaquequeremoschamarEQUALsobreossmbolosKirkeSpock.nacaixa
notaoissofoifcil,porqueossmboloselistasforamsempretratadoscomodados.
Mas,emEVALsmbolosdenotaosousadosparavariveisdenome,porisso,sensescrevemos
(SpockKirkiguais)
Lispvopensarqueestamosatentarcompararovalordavarivelglobal
chamadoKIRKcomovalordavarivelglobalchamadaSPOCK.Desdequens
noderamquaisquervaloresparaestasvariveis,issoircausarumerro:
(SpockKirkiguais)Erro!KIRKvarivelnoatribuda.
Oquerealmentequeremosfazercompararosprpriossmbolos.Podemosdizer
LispparatratarKirkeSpockcomodadosemvezderefernciascomovariveisde
colocandoumacitaoantesdecadaum.
('Kirk'Spockiguais)nil

PorqueossmbolosTenilavaliamparasimesmos,elesnoprecisamser
cotadoparausloscomodados.Amaioriadosoutrossmbolosfazer,noentanto.
(Kirklista'JamesT')(JamesKirk),t
Sesmbolossousadoscomodadosemumadefiniodefuno,ousopassadoscomo
entradasquandoafunochamada,elesdevemserarredondadasparaimpediravaliao.
(Defunenigma(xy)
(Listade'porqu''machado'como'ay))
(enigma'corvo'escrivaninha)
(Porqueumcorvocomoumaescrivaninha)
Aslistastambmprecisamsercotadoparausloscomodadoscasocontrrio,Lispvaitentar
avalilos,oquenormalmenteresultaemum"erro"Funoindefinida''.
(Primeiro(nscelebraremosestasverdades))
Erro!WEindefinidofuno.
(first'(nscelebraremosestasverdades))ns
Regradeavaliaoparaobjetoscotados:Umobjetocitadoavaliaa
objetoemsi,semacitao.

pgina100

88

CommonLisp:AGentleIntroduoComputaoSimblica

Aquiestomaisalgunsexemplosdadiferenaentreacotaoeno
citandoumalista:
Erro!MEUfunoindefinida.

(terceiro(minhatiaMaria))
(terceiro'(minhatiaMaria))mary
(+12)3
'(1+2)(1+2)
(oddp(+12))t
(oddp'(1+2))

Erro!tipodeentradaerradoODDP.

OerronoltimoexemploocorreporqueODDPchamadocomalista
(1+2)comoentrada.Citandoimpediualistadeseravaliada.ODDP
nopodeaceitarlistascomoentradaselespodeaceitarnmeros.
Agoravamosverumevaltracedeumaexpressoenvolvendocitaes:
(Comprimento(cons'peixe'(carnedefrango)))
(Cons'peixe'(carnedefrango))
"Peixeavaliaapescar
'(Carnedefrango)avaliapara(frangoCARNE)
DigiteCONScomentradasFISHe(frangoCARNE)
ResultadodaCONS(FISHCARNEDEFRANGO)
InserirComprimentocomaentrada(FISHCARNEDEFRANGO)
ResultadodaCOMPRIMENTO3
3.9OPROBLEMADAMisquoting
fcilparaprogramadoresiniciantesLispaficarconfusosobrecotaese
quercolocaraspasnolugarerradooudeixlosparaondeelessonecessrios.
AsmensagensdeerroLispdsoumaboadicasobreoquedeuerrado.A
unassignederrofunovarivelouindefinidogeralmenteindicaqueumacitao
foideixadodefora:

(listade'a'bc)

Erro!Cvarivelnoatribuda.

pgina101

89
CAPTULO3EVALNotation

(listade'a'b'c)(abc)
('a(bc)contras)

Erro!funoindefinidaB.

(cons'a'(bc))(abc)
Poroutrolado,errosdeentradadotipoerradoouresultadosengraadospodeseruma
indicaodequeumacitaofoicolocadanoqualelenopertence.
(+10'(52))

Erro!Tipodeentradaerrado+.

(+10(52))13
(Listade'buy'(*2734)'bagels)
(comprar(*2734)bagels)
(Listade'buy(*2734)'bagels)
(compra918bagels)
Quandocitarumalista,acitaodeveirforadalistaparaimpedirquealista

deseravaliada.Secolocarmosacitaodentrodalista,EVALvaitentar
avaliaralistaeumerroresultar:
('foo'bar'baz)

Erro!"FunoindefinidaFOO.

'(foobarbaz)(foobarbaz)
3.10trsmaneirasdefazerlistas
NstemostrsmaneirasdefazerlistasusandoanotaoEVAL.Podemosescreveralista
diretamente,usandoumacitaoparaevitarasuaavaliao,comoesta:
'(foobarbaz)(foobarbaz)
OupodemosusarLISTouCONSparaconstruiralistaapartirdeelementosindividuais.Ese
usamosestemtodo,devemoscitarcadaargumentoparaafuno:
(listade'foo'bar'baz)(foobarbaz)
(cons'foo'(barbaz))(foobarbaz)
Umavantagemdaconstruodeumalistaseapartirdeelementosindividuaisquealguns
oselementospodesercalculado,emvezdedirectamenteespecificada.

pgina102

90

CommonLisp:AGentleIntroduoComputaoSimblica

(Listade33'quadrado'(*3333))
(33quadrado1.089)
Secitarumalista,nadadentrodelavaiseavaliou:
'(33quadrado(33*33))
(33quadrado(*3333))
Vimosvriasmaneirascoisaspodemdarerradoseascotaesnosousados
corretamentequandoconstruodeumalista:
Erro!FOOvarivelnoatribuda.

(listadefoobarbaz)
(foobarbaz)

Erro!FOOindefinidofuno.

('foo'bar'baz)

Erro!"FunoindefinidaFOO.

EXERCCIOS
3.9. Asseguintesexpressesavaliarsemerros.Anoteo
resultados.
(Cons5(lista67))
(Cons5'(lista67))
(Lista3'de9'd(93))
(+(Comprimento"(1foo2moo))
(Terceiro'(1foo2moo)))
(Descanso"(conscurtoparaconstruo))
3.10. Asexpressesaseguirtodososresultaremerros.Anoteotipode
erroqueocorre,explicarcomooerrosurgiu(porexemplo,falta
citaes,citaesnolugarerrado),ecorrigiraexpressomudando
apenasasaspas.
(Terceiro(araposamarrom))
(Lista2e2so4)
(+1'(comprimento(listatttt)))
(Patrickcontras(SeymourMarvin))
(Patrickcontras(listaSeymourMarvin))

pgina103

91
CAPTULO3EVALNotation
3.11. Definirumpredicadochamadamaislongaquequelevaduaslistascomoentrada
eretornaTseaprimeiralistamaislongodoqueosegundo.
3.12. EscreverumaADDLENGTHfunoquelevaumalistacomoentradaeretornaum
novalistacomocomprimentodaentradaadicionadonapartedafrentedomesmo.Seo
entrada(MOOGOOGAIPAN),asadadeveser(GOO4MOO
GAIPAN).Oqueoresultadode(ADDLENGTH(ADDLENGTH'(A
BC)))?
3.13. Estudarestadefiniodefuno:
(Defuncallup(receptordechamadas)
(Listade'receptorOl"isto"
chamadachamador'))
Quantosargumentosqueestafunorequer?Quaissoosnomes
dosargumentos?
Qualoresultadode(CALLUP'FRED
"WANDA)?
3.14. AquiumavariaosobreafunochamarUPapartirdoanterior
problema.Qualoresultadode(CRANKCALL"WANDA"FRED)?
(Defunmanivelacall(receptordechamadas)
"(Olreceptorchamadadechamada))

3.11quatromaneirasdemistifiqueAFUNO
ComeandousuriosdenotaoEVALsvezestmproblemasdeescrita
sintaticamentedefiniesdefunocorreta.Vamosdarumaolhadadepertoumaadequada
definioparaoINTROfuno:
(Defunintroduo(xy)(listax'this'y))
(Livingstoneintro'Stanley')
(StanleyesteLivingstone)
ObservequealistaargumentodeINTROconsistededoissmbolos,XeY,com
nemcitaesnemparntesesemtornodeles,easvariveisXeYnoso
citadoouentreparntesesnocorpo,tambm.
Aprimeiramaneirademistifiqueumafunocolocaralgodiferentedeplancie,
smbolossemadornosnalistadeargumentosdafuno.Secolocaraspasouextra
nveisdeparntesesnalistadeargumentos,afunonofuncionar.iniciantes
svezessotentadosafazerissoquandoescreverumafunoqueser
chamadodeumalista,emvezdeumsmbolocomoentrada.Estesempreumerro.

pgina104

92

CommonLisp:AGentleIntroduoComputaoSimblica
(Defunintroduo('x'y)
(Listax'this'y))

listadeargumentosruim

(Defunintroduo((x)(y))
(Listax'this'y))

listadeargumentosruim

Asegundamaneirademistifiqueumafunocolocarentreparnteses
variveisemqueaparecemnocorpo.Apenaschamadasdefunodeveter
parntesesemtornodeles.Colocandoparntesisemtornodeumavarivelcausarum
indefinidoerrofuno:
(Defunintroduo(xy)(lista(x)"isto"(y)))
(Livingstoneintro'Stanley')

Erro!funoindefinidaX.
Aterceiramaneirademistifiqueumafunocitarumavarivel.smbolosdevem
serdeixadosemaspasquandosereferemavariveis.Aquiestumexemplodoque
acontecequandovariveissocotados:
(Defunintroduo(xy)(listade'x'this''y))
(Livingstoneintro'Stanley')(xestey)
Aquartaformademistifiqueumafunoadenocitaralgoque
devesercitado.NafunoINTRODUO,ossmbolosXeYsovariveis
masissoeestno.Senocitarissoeest,umaunassigned
resultadosdeerrovarivel.
(Defunintroduo(xy)(listaxestey))
(Livingstoneintro'Stanley')

Erro!Estavarivelnoatribuda.
3,12maissobreasvariveis
EmLisp,umafunocriavariveisautomaticamentequandoinvocadoeles
(Geralmente)desaparecemquandoafunoretorna.Considereaduplafuno,
oquecriaumavarivelchamadaNcadavezquechamlo:
(Defundupla(n)(*n2))
Foradadupla,osmboloNrefereseaomundialvarivelchamada
N.AvarivelglobalNnofoiatribudoqualquervalor,demodoavaliarN
resultaemumerro.

pgina105

93
CAPTULO3EVALNotation

nErro!Nvarivelnoatribuda.
Suponhaquensavaliamos(DOUBLE3).DentroDUPLO,osmboloNreferese
aumavarivelrecmcriadaquedetmaentradaparaduplo,noglobal
N.varivelOdiagramaevaltraceabaixoilustraisso.
(Duplo3)
DigiteDUPLOcomentrada3
criarNvarivelcomvalor3
(*2N)
Navaliaa3
6
Resultadodaduplade6
Sechamarmosdobrarnovamente,porexemplo,(DOUBLE8),umnovoemfolha
varivelchamadaNsercriadocomumvalorde8.Foradaduplada
nomearNaindasereferevarivelNglobal,queaindanotemnenhumvalor.
Agoravamostentarumexemplocomduasvariveis.Aquiestumadefiniopara
QUADRUPLEemtermosdeDUPLO:
(Defunquadruple(n)(casal(duplon)))
AmbosduplosequdruploschamarasuaentradaN.Suponhaquensavaliamos
aexpresso(Qudruplo5)comonodiagramanapginaseguinte.Quando
entramosQudruplo,LispcriaumnovoNvarivelcomvalorde5e

avaliaaexpresso(DOUBLE(NDOUBLE)).Oqueacontecequando
Doublecallcomentradade5?DUPLOcriaseuprprioNvarivel,vinculadoa
asuaprpriaentrada,que5.Ocorpodaduplaavaliaa10.Agorans
avaliaram(DOUBLEN),paraquepossamosutilizaresseresultadoparaavaliar(DOUBLE
(NDUPLO)).DUPLOchamadonovamente,destavezcomentradade10,porissocria
aindaumaoutravarivelchamadaN,ligaoa10,eavalia(*N2).Depoisde
DUPLOretorna20,qudruplosretorna20comoseuresultado,eacabamos
devoltaaomaisaltonvelnovamente,ondeonomeNreferesevarivelglobalN,ainda
semvaloratribudo.

pgina106

94

CommonLisp:AGentleIntroduoComputaoSimblica
(Quadruple5)
Digitequdruplocomentrada5
criarNvarivel,comovalorde5
(Casal(duplon))
(Doublen)

DigiteDUPLOcomentradade5
criarNvarivel,comovalorde5
(*2N)
10
Resultadodaduplade10
DigiteDUPLOcomentradade10
criarNvarivel,comovalorde10
(*2N)
20
Resultadodaduplade20
ResultadodaQUADRUPLEde20
EXERCCIOS
3.15. Considereaseguintefuno,prestandomuitaatenoparaasaspas:
(Defunscrabble(palavra)
(Listadepalavras''a'palavra))
Osmbolopalavrausadadeduasmaneirasdiferentesnestafuno.oque
soeles?Qualoresultadode(AARDVARK'SCRABBLE)?Oque
oresultadode('palavrascrabble)?
3.16. Aquiestumverdadeiroconfunde:
(Defunfantoche(Larrymoeencaracolados)
(ListadeLarry(listade"moeencaracolados)encaracolado'Larry))
Oquefazoseguinteavaliadacomo?Elavaiajudaraescreveroque
valorcadavarivelobrigadoae,claro,menteasaspas!
(Fantoche"moe"encaracolado"Larry)
3.17. PorquenopodemossmbolosespeciaisTouNILserusadocomovariveisemum
definiodefuno?(ConsiderearegradeavaliaoparaTeNILcontra
aregraparaavaliarsmboloscomuns.)

pgina107

95
CAPTULO3EVALNotation
RESUMO
NestecaptuloaprendemosnotaoEVAL,quepermiteexpressesparaser
representadacomolistas.AslistassointerpretadospelafunoEVALdeacordocomum
builtinconjuntoderegrasdeavaliao.Asregrasdeavaliaoqueaprendemosforam:
Osnmerossoautoavaliao,oquesignificaqueavaliamparasimesmos.
EntofaaTeNIL.
Aoavaliarumalista,oprimeiroelementoespecificaumafunopara
chamar,eosrestanteselementosespecificarseusargumentos.o
argumentossoavaliadosdaesquerdaparaadireitaparaobterosinsumosque
sopassadosparaafuno.
Ossmbolosqueaparecememqualquerlugarqueoprimeiroelementodeumalista
sointerpretadoscomorefernciasdevariveis.Umsmboloavaliaa
valordasTInomesdevariveis.Exatamentequalvarivelumsmbolo
referindosedependedocontextoemqueapareceosmbolo.
Variveisquenoforamatribudosvalorescausa''noatribudo
''errosvariveisquandoosmboloavaliada.
Umalistacitadaousmboloavaliaasimesmo,semacitao.
Umalistadeformulrio(defunfunctionname(argumentodalista)afunodocorpo)
defineumafuno.Defunumtipoespecialdefunosuasentradasno
tmdesercitado.listadeargumentosdafunoumalistadesmbolosquedo
nomessentradasdafuno.Dentrodocorpodafuno,asvariveis
quemantenhaasentradasdafunopodeserreferidoporessessmbolos.
exercciosdereviso

3.18. CiteduasvantagensdenotaoEVALmaisdenotaobox.
3.19. Avaliecadaumdosseguinteslistas.Sealistaprovocaumerro,digaoque
oerro.Casocontrrio,escrevaoresultadodaavaliao.
(cons'uvas'(daira))
(Listadet''nonulo)
(First'(listaalcesganso))
(Primeiro(gansolista'Moose'))
('Home('contrasdoce'home))

page108

96

CommonLisp:AGentleIntroduoComputaoSimblica
3,20. Aquiestumafunomistrio:
(Defunmistrio(x)
(Lista(segundox)(primeirox)))
Oresultadoouerroproduzidoatravsdaavaliaodecadaumdosseguintes?
(Mistrio"(ursodanarino))
(Mistriourso'dana')

(Mistrio"(zowie))
(Mistrio(listade"primeira"segundo))
3.21. Oqueesterradocomcadaumadasseguintesdefiniesdefunes?
(Defunfalar(xy)(lista'all'x''y))
(Falardefun(x)(y)(lista'allx'y))
(Defunfalar((x)(y))(listadetodos"x'y))
FUNESabordadosnestecaptulo
Oavaliador:EVAL.
funodemacroparadefinirnovasfunes:Defun.

Lispnocomputador

Parabns!Tendofeitoissocomsucessoatravsdetodaalpisepapel
trabalho,horadevocaprenderausarLispemumcomputadorreal.
Infelizmente,eunopossolhedarumaintroduodetalhadaexistemmuitos
tiposdecomputadoresemuitasimplementaesdoCommonLispfor
queparaserprtico.Vocpodequerergastaralgunsminutosolhandoatravs
manuaisdousurioparaocomputadoreLispaplicaoquevocvaiusar.
Umaabordagemmelhorseriaparafalarcomalgumquejestfamiliarizadocom
suamquina.

pgina109

97
CAPTULO3EVALNotation
LISP3,13FUNCIONAMENTO
AprimeiracoisaquevocprecisasabercomoiniciarLispemseucomputador.
Sevoctiversortevocpodesimplesmentedigitar"lnguapresa"epressioneateclaEnter,masvocpode
temquedigitaralgomaiscomplicado.QuandoLispinicializado,eleimprimeuma
mensagemdesaudao.Cadaaplicaotemseuprprioestilodesaudao,masum
mensagemtpicaalgocomoisto:
CMUCommonLispM2.8(29Mar89)
HemlockM3.0(29Mar89),CompilerM1.7(29Mar89)
Enviarrelatriosdeerroseperguntasparaclica.
>
Ocarter''>''queapareceapsasaudaochamadodealtonvel
pronta.EleindicaqueLispestesperandoporvocdigitealgumacoisa.Alguns
Lispsusarumcaracterepromptdiferentemuitosusam''*''(umasterisco).
AprximacoisaquevocprecisasaberqueoscaracteresdecontroleseuLisp
usa,especificamente:
Comovocapagarumcaractere:pressionandoDeleteBackspace,ou
algumaoutrachave?
Comovocjogarforaumalinhadeentradaparaquevocpossacomeardenovo?Dentro
algunsLispsvocpodedescartarumalinhaantesdebaterretornodigitandoum
ControlU.(EnquantomantmpressionadaateclaControl,primaa''U''
chave.)OutrosLispsusarumpersonagemdiferente.
Qualocarter''abortar''quevocrecebedevoltaparaodenvelsuperior
pronto?MuitosLispsusarControlGouControlCparaestafinalidade.
Enquantoestamosnoassuntodecaracteresespeciais,lembresequeoscomputadores
semprefornecemchavesseparadasparaaletra''O''eodgito''0'',eparaa

letra''l''eodgito''1.''emmquinasdeescreverconvencionaisbomparadigitar
''O''para''0''ou''l''para''1'',masquandovocfalaaumcomputador,vocdeveser
Certifiquesedeusarocaracterecorretoparaoquevocquerdizer.
Finalmente,vocprecisadescobrircomosairdeLispquandovocestfeito.
AmaioriadosLispsexigemquevocdigitealgocomo(SAIR)ou(EXIT)parasair.
svezes,umcaracteredefimdearquivocomoControlDtambmirfuncionar.

pgina110

98

CommonLisp:AGentleIntroduoComputaoSimblica

3.14OLEIAEVALPRINTLOOP
UmcomputadorcomoLispsecomportamuitocomoumacalculadoradebolso.Elelum
expressoquevocdigitanoteclado,avalialo(usandoEVAL),e
imprimeoresultadonatela.Emseguida,eleimprimeoutroprompteesperaporvoc
paradigitaraexpressoseguinte.Esteprocessochamadodeumloopdeleituraevalprint.
Aquiestumdilogodeamostracomumcomputadoremqueeudefinirumafunoe
emseguida,usaressafuno.Nesteexemplo,odigitoapareceapso''>''em
minsculasarespostadocomputadoremletrasmaisculas.NemtodososLispsseguiresta

convenes,masmuitosfazem.
>(Praadefun(n)(*nn))
QUADRADO

Primeiroeudefinirquadrados.
Computadoraceitaaminhadefinio.

>(Quadrado4)
16

Tentequadrado4.
Computadorimprimearesposta.

>(Praa5)
25

Tenteemquadraturacomoutronmero.
Elefuncionamuitobem.

>(Praa123456789)
15241578750190521

Quadradodeumnmerogrande...
eobterumresultadorealmentegrande.

3.15recuperaodeerros
Umacoisamuitoimportanteparaaprendernestemomentocomoserecuperardeerros.
Primeirovamosconsiderarerrosdedigitao.Sedepoisdeentrarumalongaexpressopercebo
Eufizumerrodedigitaopertodocomeo,eupodequererjogarforao
expressointeiraecomeardenovo.NaminhaLisp,amaneiradefazerissoescrever
ControleGparavoltaraopromptdenvelsuperior.Aquiestumexemplo:
>(Defunadd87((n))
(+N^G
Abortado.

DemasiadosparntesesaoredordoN.
EntoeupressioneControlGparaabortar.

>(Add87defun(n)
(N+87))
ADD87

Destavezeudigitoucorretamente.

Umproblemamaiscomumumaexpressoquedigitadocorretamente,mas
resultaemumerrodeavaliao.Tentandoadicionarumnmeroeumsmboloum
exemplo.Quandoocorreumerrodeavaliao,Lispimprimeumamensagemdeerroe
colocavocemumtipodiferentedeloopdeentrada.Emvezdefalarcomodenvelsuperior
readevalprintloop,agoravocestfalandocomodepuradorlerevalprint

pgina111

99
CAPTULO3EVALNotation
loop.VamosaprenderausarodepuradornoCaptulo8.Porenquanto,tudooquevoc
precisasabercomosairdodepuradoredevoltaaonvelsuperior.Nomeu
Lisp,ControlGopersonagemabortquemesaidodepuradore
devoltaaonvelsuperior.
>(+1'foo)
Erronafuno+.
argumentodetipoerrado,FOO,
deveriatersidodotipoNUMBER.

Estaexpressocausaumerro.
Lispreclama.

Debug(tipoHforhelp)
0]^L
Abortado.

Ipousarnodepurador.
DigiteControlGparasair.

>

Voltaraomaisaltonvelnovamente.

SevocdefinirumafunonoLispeelenofuncionar,vocpoderedefinilae
tentenovamente.Vocpoderedefinirumafunotofrequentementecomovocgostaapenasaltima
definioretida.Oexemploaseguirilustraissoetambmmostra
quevocpodebaterderetornoemqualquerpontoemumaexpressosemnenhumefeitonegativo.Isto
porqueasexpressessolistasseuespaamentoerecuoarbitrria.
>(Introdefun(xy)
(ListaXy))
INTRO

INTROmaldefinida!Semaspas.

>(IntroLivingstone"Stanley")TestandoafunoINTRO.
ErronafunoINTRO.
varivelnoatribudos:ESTE.
Debug(tipoHforhelp)
0]^L
Abortado.

Ipousarnodepuradornovamente.
DigiteControlGparasair.

>(Introdefun(xy)

RedefinirINTROcorretamente.

(Listax'this'y))
INTRO
>(IntroLivingstone"Stanley")testlonovamente.
(STANLEYESTELIVINGSTONE)Agoraelefunciona.
TenhacertezaquevocnousenomescomoCONS,+oulistaparaoseuprprio
funesemLispestessoosnomesdefunesembutidas.redefinindoestes
funespodemcausarumerrode''fatal'',casoemquevocterquedeixarLisp
ecomeartudodenovo,etodasasfunesquevocdefiniuanteriormenteseroperdidos.

pgina112

100

CommonLisp:AGentleIntroduoComputaoSimblica

ToolkitLisp:ED

AsseesLispToolkitaparecemnesteesubsequentescaptulos
apresentlosferramentasimportantesdoambientedeprogramaoLisp.
Algumasdessasferramentas,comoeditoresespecficosdoidioma,formatadoresdoprograma,
edepuradoresdenveldefonte,estodisponveishojeparaoutraslnguas,maseles
apareceupelaprimeiravezemLisp.OutrasferramentaspermanecemnicaparaLisp,edoisdeles,
SDRAWeDTrace,soexclusivasparaestelivro.Aslistagensdeorigemparaambos

aparecememumapndice.
AferramentaqueircobrirprimeirooeditorLisp.AnormaCommonLisp
noespecificaquetipodeeditordeveserfornecidocomumLisp
implementao,porissonopossodizerexatamentecomofuncionaoseueditor.Maseuposso
dizeralgosobreeditoresLispemgeral,porqueelassodiferentesdas
editoresdetextocomuns,eporissovocdevetomarotempoparaaprenderausar
sejaqualforoseueditorLispfornece.
OserrosqueocorremmaisfrequentementeemLISPsoerrosentreparnteses.isto
,portanto,quaseimperativoparaempregaralgumtipodecontagemouoemparelhamento
dispositivoparaverificarparntesestodavezqueumafunoalterado.
ElaineGord,''NotassobreadepuraodeprogramasLISP,''1964.
Acitaoacimafoiescritah25anos,quandoosprogramasLispforamdigitados
emcartesperfurados.Hoje,claro,usamoseditoresinterativos.editoresLisp
nosoeditoresdetextocomuns:Eles''entender''asintaxedeprogramasLisp.
Naminhamquina,semprequeeuescrevaumparntesedireito,oeditorpiscao
correspondentedeixouparnteseparamim.Issomeimpededefazeruma
''Erroentreparnteses''aoentrarexpressesLisp.Outradasminhas
postosdetrabalhodoeditorautomaticamentetravessocadalinhacomoeudigitlo.Seumafuno
definiolevavriaslinhas,serrecuadoemumformatolimpoearrumado
quefcildeler.
AlgunsdosprimeiroslivrosLispforamescritasantesquealgumpensouem
recuandosistematicamenteprogramasparatornloslegveis.Umprogramaque
teriasidoescritodestaformanaquelapoca:
(Defunlongafuno(algunslist)(cons
(Terceirosomelista)(lista(segundoalguns,lista)
(Quartosomelista)(primeiraalgunslist))))

pgina113

101
CAPTULO3EVALNotation
hojeseriamautomaticamenterecuadoparaestaaparncia:
(Defunlongafuno(algunslist)
(Cons(terceirosomelista)
(Lista(segundoalguns,lista)
(Quartosomelista)
(Primeiraalgunslist))))
HmaisduascoisasumbomeditorLispfornece.Umdelesumfcil
maneiradeavaliarexpressesduranteaedio.Vocpodeposicionarocursor(ou
mouse)sobreumadefiniodefuno,bateualgumasteclas,equeadefiniodefuno
seroavaliadassemnuncasairdoeditor.Asegundacoisaqueumbom
editorforneceacessorpidoadocumentaoonline.Seeuquiservero
documentaoparaqualquerfunoLispouvarivel,eupossochamlocomapenasalguns
teclas.Oeditortambmfornecedocumentaoonlinesobresimesmo.
AnormaCommonLispespecificaainterfaceentreumLisp
implementaoeoeditorqueeleproporciona.Ainterfaceumafunochamada
ED.Typing(ED),quandonotopodenveldecircuitodeleituraevalprintfazcomquevoc
entrarnoeditor,masmuitosLispstambmoferecemmaneirasmaisrpidas,comodigitandoum
personagemcomoControlE.
possvelfornecerargumentosparaEDparacausloparaeditarumdeterminado
funcionarouarquivodefunes,masnovamosentraremdetalhesaqui.geralmentemaisfcil
apenasparaentrarnoeditoremprimeirolugar,emseguida,usaroscomandosdoeditorparachamar
sejaoqueforsobreoqualvocdesejatrabalhar.

Exerccioteclado

exercciosdetecladosoprojetosdeprogramaomodestasquevocpoderesolverenquanto
sentadoemumcomputador.(Noentanto,esteprimeiroexercciodetecladoapenasuma

coleodepequenosproblemasnorelacionados,umavezquenocobrimososuficiente
aindaLispparafazeralgomaisambicioso.)Antesdetentarumteclado
exerccioquevocdeveterumaslidacompreensodomaterialnessecaptulo
esercapazdelidarcomosexercciosregularmenteincludosl.

page114

102

CommonLisp:AGentleIntroduoComputaoSimblica
EXERCCIO
3.22. Osexercciosaseguirpodemserfeitasemqualquerordem.Oquemaisimportante
quevocsesentirconfortvelcomousodocomputador.Vocnotemque
resolvertodosestesproblemassintaselivreparaexperimentareimprovisarsobre
oseuprpriosequiser.
uma.SaibacomoexecutarLispnoseucomputador,einicilo.
b.Paracadaexpressoaseguir,anoteoquevocachaque
avaliaaouquetipodeerroqueircausar.Emseguida,tenteono
computadorever.
(+35)
(3+5)

(+3(56))
(+3(*56))
'(Manhaomeiodianoite)
('Dia'domeiodianoite')
(Listade"manh"meiodia"noite)
(Nilautomveis)
(+3foo)
(+3'foo)
c.AquiestumexemplodoMyFunfuno,umafunoestranhade
duasentradas.
(MyFunbeta'alpha')(BETA(alfa))
EscreverMyFun.Testeasuafunoparatercertezadequefunciona
corretamente.
d.EscreverumaFIRSTPpredicadoqueretornaTseseuprimeiroargumento(a
smbolo)igualaoprimeiroelementodosegundoargumento(umalista).
Ouseja,('FOO'FIRSTP(FOOBARBAZ))deveretornar
T.('BOING'FIRSTP(FOOBARBAZ))deveretornarNIL.

pgina115

103
CAPTULO3EVALNotation
e.EscreverumafunoMIDADD1queadiciona1paraoelementodomeiodeum
listadetrselementos. Porexemplo,(MIDADD1'(Take2
Cookies))deveretornaralista(Take3cookies).Nota:Voc
sonopermitidofazerMIDADD1umafunodetrsentradas.isto
temdeterumanicaentradaqueumalistadetrselementos.
f.EscreverumafunoFTOCqueconverteumatemperaturade
FahrenheitparaCelsius.Afrmulaparafazeraconverso:
AtemperaturaCelsius=[5(temperaturaFahrenheit32)]/9.Ir
nosentidooposto,afrmula:temperatura=Fahrenheit
(9/5temperaturaCelsius)+32.
g.Oqueesterradocomestafuno?Oque(FOO5)fazer?
(Defunfoo(x)(1+(zeropx)))

Tpicosavanados

3.16funessemargumentos
Suponhaquequeriaescreverumafunoquemultiplica85por97.Observeque
estafunononecessitadeinsumoselefazseuclculoutilizandoapenas
Constantesprespecificados.Umavezqueafunonotemqualquerentrada,quandons
escreverasuadefinio,eleterumvaziolistadeargumentos.Alistavazia,de
Naturalmente,nulo.VamosdefinirestafunocomonomeTEST:
(Testedefun()(*8597))
Depoisdefazerisso,vemosque
(teste)8245

(teste1)Erro!Muitosargumentos.

pgina116

104

CommonLisp:AGentleIntroduoComputaoSimblica
TESTumafuno,porissotemosdecolocarparntesesemtornodeleparachamlo.Sens
omitilos,osmboloTESTinterpretadocomoumarefernciaaumavarivel.
testeErro!TESTvarivelindependente.

3.17AQUOTEFUNOESPECIAL
CITAESumafunoespecial:Suaentradanosejaavaliada.Acitao
funoespecialsimplesmenteretornaasuaentrada.Porexemplo:
(citaofoo)foo
(citao(Olmundo))(Olmundo)
AsprimeirasversesdoLispusadoCITAESemvezdeumapstrofoparaindicarque
algoquenodeveseravaliada.Isto,ondeiramosescrever
(Cons'up'(parabaixoparaoslados))

DeestiloantigoprogramadoresLispiriaescrever
(Cons(citaoup)(citao(parabaixoparaoslados)))
sistemasLispmodernosusamoapstrofocomoabreviaoparaCITAES.
Internamente,noentanto,elesconvertemoapstrofoparacitar.Nspodemos
demonstrarqueissoaconteceusandovriascitaes.Aprimeiracitao
arrancadapeloprocessodeavaliao,masqualquercotaesextraspermanecem.
'foofoo
''foo'footambmescrito(citaofoo)
(listafoo'citao')(citaofoo)tambmescrito'foo
(first''foo)Citao
(repouso''foo)(foo)
(comprimento''foo)2
DependendodaversodoLispseucomputadorexecuta,vocpode
ocasionalmenteverpropostaporescritoparaforaemvezdenasuaformaabreviada,a
apstrofo.

pgina117

105
CAPTULO3EVALNotation

3.18ESTRUTURAINTERNADESMBOLOS
Atagoranestelivroquetemosvindoadesenharsmbolos,escrevendoseusnomes.
MassmbolosLispComumsoobjetosrealmentecompostos,oquesignificaque
tervriaspartesparaeles.Conceitualmente,umsmboloumblocodecincopontos,
umadasquaisapontaparaarepresentaodonomedosmbolo.Osoutros
serdefinidomaistarde.AestruturainternadosmboloFREDparece
esta:
nome

"FRED"

O''FRED''queapareceacimaentreaspaschamadodecadeia.
Stringssosequnciasdecaractereselesserocobertosmaiscompletamentenocaptulo
9.Poragorabastaobservarqueascordassousadosparaarmazenarosnomesde
smbolosumsmboloeseunomesorealmenteduascoisasdiferentes.
Algunssmbolos,comoCONSou+,sousadosparanomearbuiltinfunesLisp.
OsCONSsmbolotemumapontadornoseucelularfunoaum'cdigo'compilado
objeto''querepresentaasinstruesemlinguagemdemquinaparaacriaodenovos
clulascontras.
nome
funo

"contras"
compilado
CONS
Funo

QuandodesenharexpressesLisptaiscomo(EQUAL35),comocadeiasdeclulascontras,
quenormalmenteescreverapenasonomedosmboloemvezdemostrarasuainterno
estrutura:

pgina118

106

CommonLisp:AGentleIntroduoComputaoSimblica

NADA
IGUAL

Massensescolhemos,podemosmostrarmaisdetalhes,nocasodeaexpressoque
(EQUAL35)separececomisso:
NADA
3
nome
funo

"IGUAL"
compilado
IGUAL
Funo

Podemosextrairosvrioscomponentesdeumsmbolousandoembutido
funesLispcomunscomoSMBOLOnomeesmbolofuno.
Odilogoaseguirilustraissovocvaiveralgoligeiramentediferentese
vocexperimentlonoseucomputador,masaidiabsicaamesma.
>(Smboloname'iguais)
"IGUAL"
>(Smbolofuno'iguais)
#<CompiladofunoIGUAL{60463B0}>
3,19LAMBDANOTATION
notaolambdafoicriadoporAlonzoChurch,ummatemticodePrinceton
Universidade.Igrejaqueriaumaformaclara,inequvocaparadescreverfunes,
suasentradas,eosclculosquedesempenham.Emnotaodelambda,um
funoqueadiciona3aumnmeroseriaescritocomomostradoabaixooa

pgina119

107
CAPTULO3EVALNotation

Letragregalambda:.X(+x3).
JohnMcCarthy,ocriadordoLisp,foialunodeIgreja.Ele
adotadanotaodaIgrejaparaespecificarfunes.OequivalenteLispde
oannimofunox.(3+x)alista
(Lambda(X)(X+3))
Afunof(x,y)=y+3x 2 seriaescrita(x,y).(3x+y2)Emlambda
notao.EmLispestescrito
(Lambda(XY)(+(*3X)(*aa)))
Comovocpodever,asintaxedeexpresseslambdaemLispsemelhanteaode
notaodaigreja,eaindamaissemelhanteaodefun.MasaocontrriodeDefun,
LambdanoumafunoummarcadortratadosespecialmentepeloEVAL.Bem
sabermaissobreexpresseslambdanocaptulo7.
OtrabalhodeDefunassociarnomescomfunes.Aodigitarumnovo
definiodefuno,como,porsemestre,existemdoistiposdenomenclaturaquevo
em.Astring"MEIAS"nomesosmboloeosmbolonomesmetadedo
funo.Nodiagramaabaixo,vocpodeveronomedacluladeapontarHALF
paraacadeia"HALF".Seuspontosdeclulasfunoaumobjetodefunoquea
verdadeirafuno.Exatamenteoqueesteobjetodefunoparecedependedequal
implementaodeCommonLispquevocestusando,mascomoodiagramaindica,
hprovavelmenteumaexpressolambdaemalgumlugar.
nome
funo

"METADE"
Funo
Objeto
(Lambda(N)(N/2))

Claro,aexpressolambdaapenasumalistaconstrudoapartirdeclulascontras.
Ecadaumdossmbolosnaexpressolambda,taiscomoNe/,realmenteum
blocodecincoponteiros.Desdeosmbolo/nomesafunodediviso,ele
contmumponteiroparaumobjetodefunobuiltinparaarealizaodediviso.Assim,
indiretamente,pontosdemeiaparaafunodedivisodebuiltin.Figura31mostra
essesdetalhes.

pgina120

108

CommonLisp:AGentleIntroduoComputaoSimblica

"METADE"

nome

Funo
Objeto

funo

NADA
LAMBDA

NADA
N

NADA
N

nome
funo

"/"
compilado
/
Funo

Figura31Arepresentaointernademeio.

pgina121

109
CAPTULO3EVALNotation
EXERCCIO
3.23. EscrevacadaumadasseguintesfunesnanotaolambdadaIgreja:

DUPLO,SQUARE,ONEMOREP.
3,20escopodevariveis
Ombitodeaplicaodeumavarivelaregionaqualpodeserreferenciada.Para
exemplo,avarivelNquecontmaentradaparaHALFtemummbitolimitado
corpodemeio.OutraformadeexprimiristoparadizerqueavarivelN
locaisametade.Asvariveisglobaistmalcanceilimitadoelespodemser
referenciadoemqualquerlugar.
Emumdiagramaevaltrace,ombitodeumavarivellocaldelimitadopela
setagrossacontendoacriaodessavarivel.Foradasetagrossa
avarivelnopodeserreferenciado.Oprogramaaseguirilustraisso.
(Defunpai(n)
(Criana(+n2)))
(Defuncriana(p)
(Listadenp))
Esteprogramaestemerro.PaichamaCRIANAdepoisdecriarumlocalde
N.varivelVamosverondeestoproblema:
(Progenitor3)
Digitepaicomentrada3
criarNvariveis,comvalor3
(Criana(+n2))
(N+2)
5
Digitecrianacomentrada5
CriarPvarivel,comovalorde5
(Listadenp)
n
Erro!Nvarivelnoatribuda.
setasgrossasemdiagramasevaltraceretratamlimitesdeescopo.Oescopode
Npailimitadaaocorpodopai.Dentrodocorpodacriana
humarefernciaaN.MasnohNlocalparacrianas,eumavezqueocorpo

pgina122

110

CommonLisp:AGentleIntroduoComputaoSimblica
dacrianacercadaporumasetagrossa,nopodemosreferiraoNem
PAIdel.Assim,oNaparecenocorpodacrianainterpretada
comoumarefernciaparaoNglobal,quenotenhasidoatribudoumvalor.Dans
receberumerrovarivelnoatribuda.
EXERCCIO
3,24. Suponhaquensdefinimosasseguintesfunes:
(Defunalfa(x)
(Bravo(+x2)(Charliex1)))
(Defunbravo(yz)(*yz))
(Defuncharlie(yx)(yx))
Suponhaqueagoraavaliar(ALPHA3).Mostraracriaoresultantee
usodevariveisX,YeZ,desenhandoumdiagramaevaltrace.

3,21EVALeaplicar
EVALumafunoprimitivaLisp.CadausodeEVALdumnvelde
avaliao.
'(2+2)(2+2)

(eval'(+22))4
'''boing''boing
(eval'''boing)'boing
(eval(eval'''boing)boing
(eval(eval(eval'''boing)))
Erro!BOINGvarivelnoatribuda.
'(lista'*96))(lista'*96)
(eval'(lista'*96))(*96)
(eval(eval'(lista'*96)))54

pgina123

111
CAPTULO3EVALNotation
NsnovamosusarEVALexplicitamenteemnenhumdosprogramasqueescrevemos,masns
fazerusoimplcitodequeotempotodo.Vocpodepensarnocomputadorcomoum
manifestaofsicadeEVAL.QuandoeleexecutadoLisp,tudooquevocdigita
avaliada.
APLICARtambmumafunoprimitivaLisp.APLICARlevaumafunoeuma

listadeobjetoscomoentrada.Eleinvocaafunoespecificadacomessesobjetoscomo
suasentradas.Oprimeiroargumentoaaplicardevesercitadocom#'emvezde
umacotaoordinria#'amaneiracorretaparacitarfunesfornecidascomoentradas
paraoutrasfunes.Istoserexplicadoemmaispormenornocaptulo7.
(aplicar#'+'(23))5
(aplicar#"igual"(1217))nil
OsobjetosAPLICARpassaparaafunosonoavaliadaprimeiro.No
seguinteexemplo,osobjetossoumsmboloeumalista.Avaliandoquero
smbolocomooualista(Vocgosta)causariaumerro.
(Aplicar'contras'#(como(vocgosta)))
(comoquiser)
EVALeaplicarsorelacionadosunsaosoutros.Umexercciopopularemmais
textosLispavanadosenvolveaescritadecadafunoemtermosdooutro.
EXERCCIO
3.25. Oquecadaumadasseguintesexpressessoavaliadascomo?
(Listade'contrastnil)
(eval(lista'contrastnil))
(eval(eval(lista'contrastnil)))
(Aplicar'contras'#(tnil))
(Nileval)
(Listade'nileval)
(Eval(lista'evalnil))

pgina124

112

CommonLisp:AGentleIntroduoComputaoSimblica
FunesdescritasTPICOSAVANADOS
funoEVALrelacionados:APLICAR.
EVAL(usadoexplicitamente).
Funoespecial:CITAES.

pgina125

condicionais

4.1INTRODUO
Atomadadedecisoumapartefundamentaldacomputaotodososprogramasnotriviais
tomardecises.Nestecaptulo,vamosestudarumpoucoatomadadedecisoespecial
funes,chamadascondicionais,queescolhemseuresultado,deentreumconjuntode
alternativascombasenovalordeumaoumaismanifestaesdepredicado.(UMA
expressodepredicadoumaexpressocujovalorinterpretadocomoum
''verdadeirooufalso.'')
Condicionaispermitemquefunesvariamseucomportamentoparadiferentestiposde
insumos.Desdepodemosconstruirnossasprpriasexpressesdepredicadoparacontrolarestes
condicionais,podemosescreverfunesquetomamdecisesarbitrariamentecomplexas.
4.2ASEFUNOESPECIAL
IFomaissimplesLispcondicional.Condicionaissosempremacrosouespecial
funes, * paraqueseusargumentosnoseavaliadaautomaticamente.defun
ecitaessoduasoutrasfunesqueestudamoscomestapropriedade.
funescomuns,como+econtras,sempreavaliarosseusargumentos.

*EstaterminologiafoisugeridoporRobertWilensky.Adistinoentre''macro''funese
''Funes'especiais'explicadonoCaptulo14poragoravocpodepensarnelescomoomesmo.
113

pgina126

114

CommonLisp:AGentleIntroduoComputaoSimblica
AfunoespecialIFrecebetrsargumentos:umteste,umverdadeiroparte,eum
falsoparte.Seotesteforverdadeiro,SEdevolveovalordaverdadeirapartes.Seoteste
false,eleignoraoverdadeiropartesesimovalordapartefalsa.Aqui
soalgunsexemplos.
(if(oddp1)"estranho"mesmo)estranho
(if(oddp2)"estranho"mesmo)mesmo
(set'testeraverdadeiro"testsefalso)
testeratrue
(senulo'testeraverdadeiro"testsefalso)
testsefalso
(if(symbolp'foo)(*55)(+55))25
(Se(symbolp1)(5*5)(+55))10
VamosusarIFparaconstruirumafunoqueassumeovalorabsolutodeum
nmero.Osvaloresabsolutossosemprenonegativo.Paranmerosnegativosdo
valorabsolutoanegaodonmeroparanmerospositivosezero,o
valorabsolutoonmerosi.Istolevaaumadefiniosimplesparaminha
ABS,afunodevalorabsoluto.(ChamamosafunoMYABS,emvezde
ABSporquejexisteumafunoABSconstrudoparaLispComumns
NoquerointerferircomqualquerumadasfunesinternasdoLisp.)
(Defunmyabs(x)
(Se(<x0)(x)x))
ApartedetestedoIFaexpresso(<X0).Seotesteforavaliadacomo
verdade,overdadeiropartes,(X),seravaliadaevoltaranegaodoX.Se
otesteavaliaafalsa,oquesignificaqueXzerooupositivo,opartefalsada

SEseravaliada.OpartesfalsaapenasX,demodoqueaentradaparaMYABSser
retornadainalteradanestecaso.Aquiestcomovocdeveestarlendoa
definiodeMYABS:''DefunMYABSdeX:IF(<X0),emseguida,menosX
outraX.''Aspalavras''depois''e''else''naverdadenoaparecemnafuno,
masmentalmenteinserilospodeajudaraesclarecerafunoemsuamente.
>(Meuabs5)
5

Truepartelevaanegao.

>(Meuabs5)
5

Falsoparteretornaonmeroinalterado.

pgina127

Captulo4Conditionals 115
Aquiestoutrafunodetomadadedecisessimples.SMBOLOtesteretorna
umamensageminformandoseasuaentradaumsmbolo.
(Defunsmboloteste(x)
(If(symbolpx)(listade"simx''a'smbolo)
(Listade"nox''no'a'smbolo)))
Quandovoclerestadefiniodefunoparasimesmo,vocdeveleroIF
partecomo''SesymbolpdeXento...else....''
>(Smbolotest'rutabaga)
(YESrutabagaUMSMBOLO)

Avaliartrueparte.

>(Smboloteste12345)
(NO12345noumsmbolo)

Avaliarfalsoparte.

IFpodeserdadaduasentradas,emvezdetrs,casoemqueelesecomportacomose
suaterceiraentrada(apartedefalse)eramosmboloNIL.
(set'feliz)feliz
(senulo'happy)nil
EXERCCIOS
4.1. EscreverumafunoMAKEMESMOquefazcomqueumnmeromparatmesmopor
adicionandoumaele.SeaentradaparaFAAMESMOjmesmo,quedeveria
serretornadainalterada.
4.2. EscreverumafunoAINDAquefazcomqueumnmeropositivomaior,
adicionandoumaele,eumnmeronegativomenorsubtraindoumde
isto.Oqueasuafunodefazersedadoonmero0?
4.3. LembresedafunoprimitivaNO:EleretornaNILparaumaentradaverdadeirae
Tparaumfalso.SuponhaLispnotinhaumNOprimitivo.exposio
comoescreverNOusandoapenasIFeconstantes(houtrasfunes).Ligar
suafunoMYNOT.
4.4. EscreverumafunoDECIDIDOquelevadoisnmeroscomoentradae
fazumalistadelesemordemcrescente.(Pedidos34)deveretornar
alista(34).(Pedidos43)tambmdeveretornar(3e4),emoutraspalavras,
asprimeiraesegundaentradasdevemaparecernaordeminversaquandooprimeiro
maiordoqueosegundo.

pgina128

116

CommonLisp:AGentleIntroduoComputaoSimblica

4.3OMACROCOND
CONDacondicionalLispclssico.Asuaentradaconstitudoporqualquernmerode
testeeconsequentesclusulas.AformageraldeumaexpressoCONDser
descritonoCaptulo5,masumaformaligeiramentesimplificada:
(COND(teste1consequente1)
(Teste2consequente2)
(Teste3consequente3)
....
(TesteNconsequenten))
AquiestcomoCONDfunciona:Elapassaporasclusulassequencialmente.Seo
partedetestedeumaclusulaavaliadacomoverdadeira,CONDavaliaaconsequentepartee
retornaoseuvalornoconsideranenhummaisclusulas.Seotesteforavaliadacomo
falsa,CONDignoraoconsequenteparteeexaminaaprximaclusula.Seisso
passaportodasasclusulassemencontrarnenhumcujotesteforverdadeiro,CONS
retornaNIL.
VamosusarCONDescreverumafunoCOMPARARquecomparadois
nmeros.Seosnmerosforemiguais,COMPARARvaidizer''nmerossoos
mesmo''Seoprimeironmeromenordoqueosegundo,elevaidizer''primeiro
menor''Seoprimeironmeromaiordoqueosegundo,elevaidizer''primeiro
maior.''CadacasotratadoporumaclusulaCONDseparado.
(Defuncomparar(xy)
(Cond((igualxy)"nmerossothemesmo)
((<Xy)'primeiramenor)
((>Xy)"primeiromaior)))
DumaolhadanoCOND.umalistadequatroelementos,ondeoprimeiro
elementoosmboloCONDeosrestantestrselementossoteste
consequentesclusulas.Aprimeiraclusulaumalistadedoiselementoscujoprimeiroelemento
aexpresso(EQUALXY).Estaapartedetestedaclusula.o
segundoelemento,aconsequenteparte,osmbolocitou'NMEROSso

OMESMO.
AquiestoalgunsexemplosdafunoCOMPARE:
(compare35)deprimeiramenor
(compare72)deprimeiramaior
(compare44)nmerosothemesmo

page129

Captulo4Conditionals 117
EXERCCIO
4.5. Paracadaumadasseguinteschamadasparacomparar,escreva''1'',''2''ou''3''
paraindicarqualaclusuladoCONDterumpredicadoque
avaliaaverdade.
(Comparar91)
(Comparar(2+2)5)
(Compare6(*23))
CONDeIFsofunessemelhantes.CONDpodeaparecermaisverstil
umavezqueaceitaqualquernmerodeclusulas,mashumamaneiradefazeramesmacoisa
comIFsaninhados.Istoexplicadomaisadiantenestecaptulo.

4.4UTILIZARTcomoumteste
UmdostruquesparautilizaodoCONDincluirumaclusuladaforma
(Consequentet)
OtesteTsempreverdadeiro,entoseCONDnuncachegaaestaclusula,garantido
paraavaliaraconsequente.Nscolocamosestaclusulanofinalparaqueeleser
atingiuapenasseostestesdetodasasclusulasanterioresfalhar.Exemplo:Aseguir
devolveopasemqueumadeterminadacidade.Seafunonofaz
conhecerumacidadeparticular,eleretornaosmboloDESCONHECIDO.
(Defunonde(x)
('Paris)'cond((iguaisxFrana)
(('London)'iguaisxInglaterra)
(('Beijing)'iguaisxchina)
(T'desconhecido)))
NotesequealtimaclusuladoCONDcomeacomT.Senenhumadasopes
anteriorclusulastmtestesqueretornamverdade,altimaclusulaseralcanadoe
afunoretornarDESCONHECIDO.
(ondeest"londres)inglaterra
(ondeest"beijing)china
(ondeest"Hackensack)desconhecido
LembresequeaformageraldeumaexpressoIF

pgina130

118

CommonLisp:AGentleIntroduoComputaoSimblica
(TesteIFtruepartefalsoparte)
PodemostraduzirqualquerexpressoIFemumaexpressoCONDusandodois
clusulas:
(COND(testetrueparte)
(Tfalsoparte))
EXERCCIO
4.6. EscreverumaversodafunovalorabsolutoMYABSusandoCOND
emvezdeIF.

4,5DOISMAISEXEMPLOSDECOND
Aquiestoutrafuno,chamadaEMFATIZAM,quemudaaprimeirapalavradeum
frasede''boa''para''grande'',oude''ruim''para''horrvel'',eretornao
frasemodificada:
(Defunenfatizar(x)
(Cond((igual(primeirox)'bom)(cons'grande(restantex)))
((Igual(primeirox)'bad)(cons'terrvel(restantex)))))
Vamostomarcomoexemploafrase(BOMhistriademistrio).oque
acontecedentroEMFATIZAM?AvarivelXatribudoovalor(BOM
MISTRIODAHISTRIA)eCONDcomeaapassarpelotesteeconsequente
clusulas.Aprimeira:
((Igual(primeirox)'bom)(cons'grande(restantex)))
Desde(PRIMEIROX)avaliadacomoboa,apartedetestedapresenteclusulaverdadeira.
Aconsequenteparte,emseguida,constriumanovalistaapartirdosmboloGREATe
Orestodaentrada,eissoqueafunoretorna:
(Enfatizar'(boahistriademistrio))
(histriagrandemistrio)
Agora,suponhaquenstentamosenfatizar(histriademistrioMEDIOCRE).
AprimeiraclusulacomparamedocreparaBOMeretornaNIL.Nasprximas

comparamedocreparaBADetambmretornaNIL.AgoraCONDfoiexecutado
declusulas,paraqueeleretornaNIL.Portanto,NILoresultadoda
funodedestacar:
(enfatizar"(histriademistriomedocre))nil
EsequisermosEnfatizepararetornaraentradaoriginal,emvezdeNIL

page131

Captulo4Conditionals 119
quandonoconseguedescobrircomoenfatizarisso?NssimplesmenteusaroTasteste
truque,demonstradonoEMPHASIZE2funo:
(Defunemphasize2(x)
(Cond((igual(primeirox)'bom)(cons'grande(restantex)))
((Igual(primeirox)'bad)(cons'terrvel(restantex)))
(TX)))
SeoCONDatingealtimaclusula,otesteTgarantidaparaavaliara
verdadeiroeaentrada,X,devolvido.
(emphasize2'(bomdia))(grandedia)
(emphasize2'(maudia))(diaterrvel)
(emphasize2'(longodia))(longodia)
Aquiumclculofunoquelevatrsentradas.Seaprimeiraentradaest

osmbolodesomade,afunoretornaasomadosegundoeterceiro
insumos.SeeleosmboloPRODUTOSDE,afunoretornaoprodutode
asegundaeterceiraentradas.Casocontrrio,eleretornaalista(queno
CALCULAR).
(Defuncomputao(opxy)
(Cond((igualop'sumof)(+xy))
((Igualop"produtoof)(*xy))
(T"(quenocomputa))))
AquiestoalgunsexemplosdafunoCOMPUTE:
(computao'sumof37)10
(compute"produtode24)8
(Computar'Zorchde31)
(quenocomputa)
4.6CONDeparntesesERROS
errosparntesepodejogarestragoscomexpressesCOND.AmaioriaCOND
clusulascomearcomexatamentedoisparnteses.Aprimeiramarcaoinciode
aclusula,easegundamarcaoinciodotestedaclusula.Para
exemplo,nafunoONDEEST,apartedetestedaprimeiraclusulaa
expresso

pgina132

120

CommonLisp:AGentleIntroduoComputaoSimblica
(PARISEQUALX')
demodoqueaprpriaclusulaparece
((PARISEQUALX')...)
Seapartedetestedeumaclusulaapenasumsmbolo,noumachamadaparaumafuno,entoo
clusuladevecomearcomumnicoparntese.NotequeemONDEESTo
clusulacomTcomootestecomeacomapenasumparntese.
AquiestodoisdoserrosparntesemaiscomunsfeitascomCOND.
Primeiro,suponhaquedeixarumparnteseparaforadeumaclusulaCOND.Oqueseria
acontecer?
(Cond(iguaisx'Paris'Frana)
(...)
(...)
(T'desconhecido))
AprimeiraclusuladoCONDcomeacomapenasumparnteseesquerdo,emvez
dedois.Comoresultado,apartedetestedapresenteclusulaapenasosmboloEQUAL.
Quandootesteavaliado,EQUALircausarumerrovarivelnoatribuda.
Poroutrolado,considereoqueacontecequandomuitosparntesesso
usava:
(Cond((...)'Frana)
((...)'Inglaterra)
((...)'China)
((T'desconhecido)))
SeXtemovalorHACKENSACK,vamosalcanaraquartaCOND
clusula.Devidopresenadeumparextradeparntesesnodispositivo,o
teste(DESCONHECIDOT')emvezdesimplesmenteT.Tnoumafuno,porissoesteteste
irgerarumerrofunoindefinida.
EXERCCIOS
4.7. Paracadaumadasseguintesexpressescond,dizerseo
parenthesizationestcorretaouincorreta.Seestivererrado,explicarondeo
errosesitua.
(Cond(symbolpx)'smbolo
(T'noasmbolo))

(Cond((symbolpx)'smbolo)
(T'noasmbolo))

pgina133

Captulo4Conditionals 121
(Cond((symbolpx)('smbolo))
(T'noasmbolo))
(Cond((symbolpx)'smbolo)
((T'noasmbolo)))
4.8. EscreverEMPHASIZE3,quecomoEMPHASIZE2masacrescentaosmbolo
MUITOnalistaseelanosabecomoenfatizarisso.Para
exemplo,EMPHASIZE3de(longodia)deveproduzir(MUITO
LONGODIA).OquefazEMPHASIZE3de(DIAMUITOLONGA)
produzir?
4.9. Digiteoseguintedefiniodefunosuspeita:
(Defuntornarmpar(x)
(Cond(TX)
((No(oddpx))(+1x))))
Oqueesterradocomestafuno?Experimenteafunodosnmeros
3,4,e2.Reescrevloparaqueelefuncionacorretamente.

4.10. EscreverumarestringirfunoquelevatrsentradaschamadosX,MAX,
eMIN.SeXformenorqueMIN,eledevevoltarminSeXmaior
doqueMAX,eledeveretornarMAX.Casocontrrio,umavezqueXentreMIN
eMAX,eledeveretornarX.(Restringir35050)deveretornar3.
(Restringir925050)deveretornar50.Escreverumaversousando
CONDeoutrousandoIFsaninhados.
4.11. EscreverumaFIRSTZEROfunoquelevaumalistadetrsnmeroscomoentrada
eretornaumapalavra(umdos''emprimeirolugar,''''segundo,''''emterceirolugar,''ou''none'')
indicandoondeoprimeirozeroaparecenalista.
Exemplo:
(FIRSTZERO'(304))deveretornarsegundo.Oqueacontecesevoc
tentarchamarFIRSTZEROcomtrsnmerosdiferentesemvezdeumalistade
trsnmeros,comoem(30FIRSTZERO4)?
4.12. Escreverumciclofunoqueciclicamentecontade1a99.CICLO
chamadocomumaentradade1deveretornar2,comumaentradade2deve
deretorno3,comumaentradade3deveretornar4,eassimpordiante.Comumconsumode
99,ociclodeveretornar1.Essaapartecclica.Notente
resolverissocomclusulas99COND!
4.13. EscreverHOWCOMPUTEfunoqueainversadaCLCULO
funodescritaanteriormente.HOWCOMPUTElevatrsnmeros
comoentradaedescobreoqueaoperaoiriaproduziroterceiroda
Osdoisprimeiros.(HOWCOMPUTE347)deveretornarSUMDE.

pgina134

122

CommonLisp:AGentleIntroduoComputaoSimblica

(HOWCOMPUTE3412)deveretornarPRODUTOSDE.
HOWCOMPUTEdeveretornaralista(BATEME),senopuderencontrarum
relaoentreosdoisprimeiroseaterceiraentradas.sugeriralgum
meiosparaestenderHOWCOMPUTE.
4.7OANDANDoumacros
Ns,muitasvezes,precisaconstruirpredicadoscomplexosdesdeassimples.o
ANDeORmacrostornarissopossvel.Antesdedarasregrasprecisaspara
avaliarANDeOR,vamosapenasolharumexemplo.Suponhaquensqueremosum
predicadoparaospequenos(nomaisdoquedoisdgitos)nmerosmparespositivos.Nspodemos
usareexpressaressaconjunodecondiessimples:
(Defunpequenopositiveoddp(x)
(E(<x100)
(>X0)
(Oddpx)))
OusuponhaquequeremosumGTESTfunoquelevadoisnmeroscomoentrada
eretornaotSeoprimeiromaiordoqueosegundo,ouumdeles
zero.Estascondiesformamumconjuntodisjuntivaapenasumprecisadeserverdadeiropara
GTESTpararetornarT.ouforutilizadoparadisjuno.
(Defungtest(xy)
(Ou(>xy)
(Zeropx)
(Zeropy)))
ComoCOND,ANDeORsomacros:elespodemaceitarqualquernmerode
clusulas,eelesnoavaliamseusargumentosemprimeirolugar.ParaANDeOR,
noentanto,asclusulassosimplesmentetesta,notestareconsequentespares.
4.8AvaliaoeEOU
ANDeORtmsignificadosligeiramentediferentesemLispdoqueemlgicaou
emingls.Aregraprecisadeavaliaoe:Avaliaraclusulas
deumavez.SeumaclusularetornaNIL,pararevoltarNILcasocontrrio,vparao
oprximo.Setodasasclusulasproduzirresultadosnonula,devolverovalordaltima
clusula.Exemplos:
(eniltt)nil

pgina135

Captulo4Conditionals 123

(e'georgenil'harry)nil
(e'george'fred'harry)harry
(e12345)5
AregraparaavaliarOR:Avaliarasclusulasdeumdecadavez.Seum
clusularetornaalgodiferentedeNIL,parareretornaressevalordeoutraforma
irparaaprximaclusula,ouretornarNILsenenhumsodeixados.
(ouniltt)t
(ou'georgenil'harry)george
(ou'george'fred'harry)george
(ounil'fred'harry)fred
EXERCCIO
4.14. Queresultadosasseguintesexpressesproduzir?Leiao
regrasdeavaliaoparaANDeORcuidadosamenteantesderesponder.

(E'taxa'inimigofie')
(Ou"taxa"inimigofie')
(Ounil'nilinimigo)
(E'taxa'nilfi)
(E(igual'abc'abc)'sim)
(Ou(igual'abc'abc)'sim)
PREDICATESCOMPLEXOS4.9CONSTRUO
AfunoHOWALIKEcomparadoisnmerosdevriasmaneirasdiferentespara
verdequeformaelessosemelhantes.Eleusaeconstruirpredicadoscomplexos
comopartedeumaclusulaCOND:

pgina136

124

CommonLisp:AGentleIntroduoComputaoSimblica
(Defuncomoalike(ab)

(Cond((abigual)'omesmo)
((E(oddpa)(oddpb))"tantompar)
((E(no(oddpa))(no(oddpb)))
'Tanto,mesmo)
((E(<a0)(<b0))'tantonegativo)
(T'noalike)))
(comotanto77)omesmo
(comoalike35)tantoetantos
(comotanto23)tantonegativo
(comotanto58)noalike
OpredicadoSAMESIGNusaumacombinaodeANDeORparatestarse
suasduasentradastmomesmosinal:
(Defunmesmosinal(xy)
(Ou(e(zeropx)(yzerop))
(E(<x0)(<y0))
(E(>X0)(>y0))))
SAMESIGNretornaTsequalquerumadasentradasparaORretornaT.Cadaumadelas
entradasumaexpressoAND.OsprimeirosumtestaseXigualazeroeY
zero,osegundotestaseXnegativoeYnegativo,eoterceiro
testaseXpositivoeYpositivo.Exemplos:
(mesmosinal00)t
(mesmosinal34)t
(mesmosinal34)t
(mesmosinal34)nil
EXERCCIOS
4.15. EscreverumpredicadochamadoGEQqueretornaTsesuaprimeiraentradamaior
queouigualasuasegundaentrada.
4.16. Escreverumafunoquepraasumnmeroseformparepositivo,dobra
loseeleestranhoenegativo,edeoutraformadivideonmeropor2.
4.17. EscreverumpredicadoqueretornaTseaprimeiraentradasejameninooumenina

pgina137

Captulo4Conditionals 125
easegundaentradacriana,ouaprimeiraentradaumhomemou
MulhereasegundaentradaADULTO.
4.18. EscrevaumafunoparaatuarcomorbitronojogoRockTesouraPapel.Dentro
Nestejogo,cadajogadorescolheumdosRocha,TesouraouPapele,emseguida
ambososjogadoresdizeroqueelesescolheram.Rock''Tesoura'breaks',entoseo
primeirojogadorescolheRockeassegundaspicaretasTesoura,oprimeirojogador
vitrias.''Cortes'tesoura'PapelePapel'Rock'covers''.Seambos
jogadoresescolhemamesmacoisa,umempate.Afunodereproduodevetomar
duasentradas,cadaumadasquaisouROCK,tesouras,oupapel,e
devolverumdossmbolosdeprimeiraWINS,osegundoWINS,ouempate.
Exemplos:(PLAYTESOURA'Rock')deveretornarprimeiraWINS.
(PLAYtesouradepapel)deveretornarsegundaWINS.
4.10PorqueeEOUSOcondicionais
PorqueANDeORclassificadocomocondicionaisemvezdefunesregulares?
Arazoqueelesnosoobrigadosaavaliarcadaclusula.Sealgumadasclusulas
deumeretornaNILouqualquerclusuladeumoudevolvenoNIL,nenhumdos
clusulasseguintes,seavaliada.Estapropriedadepodeservalioso,porquens
podeterdepararavaliaoparaevitarerrosquedeoutromodoocorrem.Para
exemplo,considereopredicadoPOSNUMP:

(Defunposnump(x)
(E(numberpx)(pluspx)))
POSNUMPretornaTsesuaentradaumnmeroepositivo.Abuiltin
PLUSPpredicadopodeserusadoparadizerseumnmeropositivo,massePLUSP
usadoemoutracoisaquenoumnmero,elesinalizaum''inputtipoerrado''deerro,
porissoimportanteparagarantirqueaentradaparaPOSNUMPumnmeroantes
invocandoPLUSP.Seaentradanoumnmero,nodevemoschamarPLUSP.
AquiestumaversoincorretadoPOSNUMP:
(Defundefeituosoposnump(x)
(E(pluspx)(numberpx)))
SeFAULTYPOSNUMPchamadonosmboloFREDemvezdeum
nmero,aprimeiracoisaquefazverificarseFredmaiorque0,oqueprovoca
umerrodeentradatipoerrado.Noentanto,seafunoderegularPOSNUMP
chamadocomentradaFRED,opredicadonumberpretornaNIL,entoE
retornaNILsemnuncachamarPLUSP.

pgina138

126

CommonLisp:AGentleIntroduoComputaoSimblica

4.11condicionaisCOMPATVEIS
FunesqueusamANDeORtambmpodemserimplementadasusandoCOND,ouse,

eviceversa.LembresedadefiniodePOSNUMP:
(Defunposnump(x)
(E(numberpX)(>X0)))
AquiestumaversodoPOSNUMPescritocomIF,emvezdeE:
(Defunposnump2(x)
(Se(numberpX)(>X0)nil))
EstaversodetestesparaumnmeroPOSNUMPemprimeirolugar,eseacondio
bemsucedido,overdadeiropartedoIFavalia(>X0).Seonmerodetestefalhar,o
falsopartedoIFNIL.Seguiraavaliaodafunoempapelcom
insumoscomoFRED,7e2paraentendermelhorcomoelefunciona.Aquioutra
versodoPOSNUMP,destavezusandoCOND:
(Defunposnump3(x)
(Cond((numberpx)(>x0))
(Tnil)))
Vamosolharparaumoutrousodecondicionais.Estaaversooriginaldo
ONDEEST,usandoCOND:
(Defunonde(x)
('Paris)'cond((iguaisxFrana)
(('London)'iguaisxInglaterra)
(('Beijing)'iguaisxchina)
(T'desconhecido)))
EsteCONDtemquatroclusulas.PodemosescreverONDEESTUSANDOseemvez
deCOND,colocandotrsFIjuntos.Umatalconstruochamadoumaninhadase.
(Defunonde2(x)
(If(iguaisx'Paris)'france
(If(iguaisx'London)"inglaterra
(If('Beijing)'iguaisxchina
'desconhecido))))
SuponhaquenschamamosONDEIS2comaentradadePequim.Comooevaltrace
mostra,avarivellocalXatribudoovalordeBeijing,eocorpoest
avaliada.OcorpodoONDEIS2umsolteiro,secujotesteverificaseX
igualaParis.No,portanto,oIFavaliaseufalsoparte.Opartesfalso
TambmumFIetesteverificadesteIFseXigualaLondres.No,
demodoqueoIFavaliaseuprpriofalsoparteaindaoutroIF.EsteterceiroIFtestaseX

pgina139

Captulo4Conditionals 127
igualaPequim,que,porisso,asuaverdadeiraparteavaliaparaaChina.o
terceiroIFretornaChina,queagoraovalordapartefalsadasegunda
Seassimfor,retornaChina,queagoraovalordapartefalsadaprimeiraIF
porissoretornaChinatambm.Oresultado(ONDEIS2BEIJING')
CHINA.
(Onde2beijing")
DigiteONDEIS2comaentradaBEIJING
criarvarivelX,comovalorBEIJING
(If(parisiguais'x)...)
(Parisiguais'x)
NADA
(If(londresiguais'x)...)
(Londresiguais'x)
NADA
(If('Beijing)'iguaisxchina'desconhecido)
(Beijingiguais'x)
T
'China
CHINA
CHINA
CHINA
CHINA

ResultadodaONDEIS2CHINA
PodemosescreveroutraversodoONDEESTusandoANDeOR.este
versoutilizaumesquemadedoisnveissimplesemvezdomaiscomplexo
maternaisnecessriosparaIF.
(Defunonde3(x)
(Ou(e('Paris)'iguaisxFrana)
(E('London)'iguaisxInglaterra)
(E('Beijing)'iguaisxchina)
'desconhecido))
Vamosavaliar(ONDEIS3'LONDON).XobrigadoaLondrese
OucomeaapassarporsuasclusulasprocurandoumquenoNIL.Oprimeiro
clusulaumaexpressoANDEavalia(igualX'Paris)erecebeum
resultadoNIL,entoEdesisteeretornaNIL.OUsemovesobreasuasegunda
clusula.EstatambmumaexpressoAND(LONDONEQUALX')retornaT,demodo

pgina140

128

CommonLisp:AGentleIntroduoComputaoSimblica
Esemovesobreasuaprximaclusula.'INGLATERRAavaliaaInglaterra
Eficousemclusulas,entoeleretornaovalordaltima.desdeOR
encontrouumaclusuladenonula,ou,agoraretornaInglaterra.
DesdeIF,COND,ANDe/ousocondicionaisintercambiveis,vocpode
perguntoporqueLisptemmaisdeum.umaquestodeconvenincia.IFa

maisfcildeusarparafunessimplescomovalorabsoluto.ANDeORsobons
paraescreverpredicadoscomplexoscomopequenosPOSITIVOODDP.COND
maisfcildeusarquandohmuitostestes,comoemONDEecomotanto.
Escolhendoocondicionalcertaparaotrabalhopartedaartedaprogramao.
EXERCCIOS
4.19. Mostracomoescreveraexpresso(Exyzw)usandoCOND
emvezdeE.Emseguida,mostrarcomoescrevlousandoIFsaninhadosemvezde
E.
4.20. EscreverumaversodafunoCOMPARARusandoSeemvezdeCOND.
TambmescreverumaversousandoANDeOR.
4.21. EscreverversesdafunoGTESTusandoIFeCOND.
4,22. UseCONDparaescreverumBOILINGPpredicadoquetemduasentradas,
TEMPeescala,eretornaTseatemperaturaestacimado
pontodeebuliodaguanaescalaespecificada.Seaescala
Fahrenheit,opontodeebulio212grausSeCelsius,a
pontodeebuliode100graus.EscrevatambmversesusandoIFe
E/OUemvezdeCOND.
4.23. AONDEESTfunotemquatroclusulasCOND,entoondeIS2
precisadetrsIFsaninhados.SuponhaONDEESTteveoitoclusulasCOND.
QuantasFIseriaONDEIS2necessidade?QuantasRUPfaria
ONDESEENCONTRA3necessidade?QuantasANDsqueserianecessrio?
RESUMO
Condicionaispermitemqueocomputadorparatomardecisesquecontrolamseucomportamento.
IFumsimplescondicionalsuasintaxe(IFcondioverdadeirapartesfalsoparte).
COND,acondiomaisgeral,levaumconjuntodetestareconsequente
clusulascomoentradaeavaliaatestesdeumdecadavezatencontrarumverdadeiro.isto
emseguida,retornaovalordaconsequentedessaclusula.Senenhumdostestesso
verdade,CONDretornaNIL.
ANDeORsotambmcondicionais.Eavaliaclusulasdeumdecadavez
atqueumdelesretornaNIL,queemseguida,retorna.Setodasasclusulas
avaliaraverdade,eretornaovalordaltima.ORavaliaclusulas

pgina141

Captulo4Conditionals 129
atqueumvalordiferentedezeroencontrado,eretornaessevalor.Setodasasclusulas
avaliarparaNIL,ORretornanil.ANDeORnosoconsideradospredicados
porqueelesnosofunescomuns.
UmtruquedeprogramaotilaoescreverexpressesCONDcolocarum
listadeformulrio(Tconsequente)comoaclusulafinaldoCOND.UmavezqueotesteT
sempreverdadeiro,aclusulaservecomoumtipodecasocatchallqueser
avaliadasquandoostestesdetodasasclusulasanterioressofalsas.
Umacaractersticaimportantedecondicionaisasuacapacidadedenoavaliartodos
suasentradas.Issonospermiteevitarerros,protegendoumaexpressosensvel
comexpressesdepredicadosquepodemcausaraavaliaodeparar.condicionaispode
fazerissoporqueelessooumacrosoufunesespeciais,enoordinria
funes.
exercciosdereviso
4.24. Porquesocondicionaisimportante?
4.25. Oquefazsefazersedadoduasentradasemvezdetrs?
4.26. CONDpodeaceitarqualquernmerodeclusulas,masselevanomximotrs
insumos.ComoentoquequalquerfunoenvolvendoCONDpodeser
reescritoparausarIFemvezdisso?
4.27. OquefazoretornoCONDsedadohclusulas,emoutraspalavras,oquefaz
(COND)avaliara?
4.28. NsgeralmentepodereescreverumIFcomoumacombinaodeePlusORpor
Seguindoesteesquemasimples:Substitua(IFtesteverdadeirofalsoparteparte)
comaexpressoequivalente(OR(ANDverdadeirotesteparte)falsoparte).
Masesseesquemanoparaaexpresso(IF(ODDP5)(EVENP7)

'FOO).Porquefalham?Sugerirumaformamaissofisticadadereescrever
IFcomoumacombinaodeoperadoresANDeORquenofalham.
FUNESabordadosnestecaptulo
Condicionais:se,cond,AND,OR.
Predicado:PLUSP.

pgina142

130

CommonLisp:AGentleIntroduoComputaoSimblica

ToolkitLisp:PASSO

PASSOumaferramentaquelhepermitedeformainterativapassoatravsdaavaliaodeumLisp
expressodemodoquevocpodevertudooqueacontece.usadoprincipalmentepara

expressodemodoquevocpodevertudooqueacontece.usadoprincipalmentepara
** maspodetambmser
depurao(encontrareeliminarerrosemprogramas),
tilparaaprendersobrenovasfunesespeciaiscomocondicionais.
CadaimplementaodeCommonLispfornecesuaprpriaversodeste
ferramentaapenasonomefoipadronizado.Amaioriadossteppersaceitarumaletra
comandosdizendolhesoquefazeremcadaiterao,comocontinuaraaumentar,
procedercomaavaliaosempisar,digiteodepurador,eassimpordiante.
Stepperssosupostamentepararesponderauma''?'',Imprimindoumalistadecomandosque
Compreendo.Nestelivro,vamosutilizarapenasumcomando,''n'',parairparaaprxima
passodaavaliao.
PorqueSTEPummacro,suaentradanodevesercitado.Aquiestum
exemplodousodePASSO.
>(Passo(if(oddp5)'sim'no))
(IF(ODDP5)"SIM"NO):n
(ODDP5):N
5=5
T
'YES=SIM
SIM
SIM

PercorrendooIF...
Oteste(ODDP5).
5avaliaasimesmo.
ODDPretornaT.
Atrueparte'YES.
OIFretornaYES.

AquiestumexemplomaisdetalhadousandoMYABS,anossaprpriaversoda
funodevalorabsoluto.Afunodeblocoespecialqueaparecena
sadapassopodeserignorado.AlgumasimplementaesLispcolocarumaformadebloco
emtornodocorpodecadadefiniodefunoemoutrasimplementaes,esta
formulrioestimplcitoenoaparecenapasso.

**Otermo''depurao''surgiuapartirdeumincidentenosprimrdiosdacomputao,quandooscomputadoresforamconstrudos
deinterruptoreselectromecnicoschamadosrels.comportamentoerradoemumamquinaverificouseserdevidoaum
traaterficadopresoemumdosrels,impedindoodefazerumaboaconexoeltrica.
Aremoodo''bug''corrigiuoproblema.

pgina143

Captulo4Conditionals 131
>(Defunmyabs(x)
(Se(<x0)(x)x))
MYABS
>(Passo(meuabs5))
ChamadaMYABScom5deentrada.
(MYABS5):n
5=5
(BlocoMYABS(IF(<X0)(X)X)):n
PercorrendooIF.
(IF(<X0)(X)X):n
Oteste(<X0).
(<X0):N
X=5
X5.
0=0
0avaliaasimesmo.
T
O<pred.retornaT.
Atrueparte(X).
(X):N
X5.
X=5
Afunoretorna5.
5
OIFretorna5.
5
Oblocoretorna5.
5
MYABSretorna5.
5
5
AsadadoPASSOsemelhanteaumdiagramadeevaltrace,semassetas.
Aquiumdiagramaevaltracede(MYABS5)paracomparao.
(Myabs5)
5Avaliaa5
DigiteMYABScomentradade5
criarvarX=5
(Se(<x0)(x)x)
(<X0)
Xavaliaa5

0avaliadocomo0
T
(x)
Xavaliaa5
5
5
ResultadodaMYABSde5

pgina144

132

CommonLisp:AGentleIntroduoComputaoSimblica

Tpicosavanados

4.12funesbooleanas

Funesbooleanassofunescujasentradasesadassovaloresdeverdade,
ousejaTouNIL.Jencontroufunesbooleanassoba
nomearfunesdeverdadeemcaptulosanteriores.Otermo''booleano''vemde
GeorgeBoole,ummatemticoInglsdosculoXIX.Algicabooleana
usadoshojeparadescreverocomportamentodamaioriadoscircuitosdecomputador.
Noentanto,outronomeparafunesbooleanasfuneslgicas,umavezqueelesusam
osvaloreslgicosverdadeiroefalso.VamosdefinirumadeduasentradaslgicoE
funo:
(Defunlgicoe(xy)(eXYT))
Estafunocomumdiferedoemacroemvriosaspectos.
Emprimeirolugar,comojobservado,deveserdadaexatamenteduasentradas.Esteummenor
ponto,porquepodemossempreninhoouemcascatavriosdelesdelidarcommais
insumos.Emsegundolugar,lgicoeretornaapenasosvaloreslgicosTounulo,
nadamais.
(elgico'Tweet'trama)t
(e'Tweet'trama)trama
OmaisimportantedetudoofatodequeLGICOEnoumamacro:
nopodecontrolarounoosseusargumentosseavaliou.Nasequncia
exemplo,aexpresso(ODDP'FRED)fazcomqueumerrodelgicoE
masnoparae,porcausaenuncaavaliaasegundaclusula.
(e(numberp'fred)(oddp'fred))nil
(Lgicoe(numberp'fred)(oddp'fred))
Erro!FREDtipoerradodeentradaparaODDP.
funesbooleanassomaissimplesdoquecondicionais.funesbooleanasemLisp

pgina145

Captulo4Conditionals 133
correspondemaoscircuitosbooleanosemeletrnica:Elessoaprimitivalgica
operaesapartirdoqualconstrudocircuitosdocomputador.
EXERCCIOS
4.29. EscreverversesdolgicoEusandoIFeCONDemvezde
E.
4.30. EscreverlgicoOR.CertifiquesequeretornaapenasTouNILparaseuresultado.
4.31. NOumacondicional?umafunobooleana?Vocprecisaescreverum
LGICOnofuncionar?
4.13tabelasdeverdade
Tabelasdeverdadesoumaformaconvenientededescreverfunesbooleanas.Para
descreverumafunocomumatabelaverdade,nssimplesmenteconsiderar,porsuavezcada
possvelcombinaodeTeNILcomoentradaseanoteoresultadodo
funodeveproduzir.AquiestatabelaverdadeparaNOT:
x
T
NADA

(NOTx)
NADA
T

AquiestatabelaverdadeparaElgico.Umavezqueestafunotemdois
2 =4linhas.
entradas,cadaumdosquaistemdoisvalorespossveis,atabelatem2
x
T
T
NADA
NADA
EXERCCIOS

y
T
NADA
T
NADA

(LgicoExy)
T
NADA
NADA
NADA

EXERCCIOS
4.32. ConstruirumatabelaverdadeparaORlgico.
4.33. ImagineumafunolgicaSEquefuncionacomoIFfaz,excetoque
semprelevaexatamentetrsentradasesuassadassolimitadasaTou
NADA.Quantaslinhasestoemsuatabeladeverdade?
4.34. AnoteatabelaverdadeparaLGICOIF.

pgina146

134

CommonLisp:AGentleIntroduoComputaoSimblica

4.14oteoremadeDeMorgan
TeoremadeDeMorgandizrespeitopermutabilidadedeANDeOR.Ese
voctemumadessasfunesPlusnovocsemprepodeconstruiroutro.
AquioTeoremadeDeMorgandeclarouduasmaneirasdiferentes:
(EXY)=(no(ou(nox)(noY)))
(OuXY)=(no(e(nox)(noY)))
Essasequaesparecemmuitocomplicado,entodeixemetambmafirmamelesemIngls.
Aprimeiraequaodizque,seXeYsoverdadeiras,entonoXfalsanemY
falso.Asegundaequaodizque,seXouYverdadeira,entoXeY
nopodemserambasfalsas.Asverseseminglsparecerbvio,masvocacredita

asequaes?Vamostestlos.
(DefunDeMorgane(xy)
(No(ou(nox)(noY))))
(DefunDeMorganor(xy)
(No(e(nox)(noY))))
(lgicoett)t
(DeMorganett)t
(lgicoetnil)nil
(DeMorganetnil)nil
(lgicooutnil)t
(DeMorganoutnil)t
(oulgicanilnil)nil
(DeMorgan,ounilnil)nil
Issonofoiumtestecompletodasequaesvocestconvidadoatestar
osrestantescasossimesmo.
TeoremadeDeMorganprovouaequivalnciadalgicaAND
eORfunes.SerqueelamantenhaporLispdecondicionalANDeORfunes
tambm?Noexatamente.OusodeNOTsduplossignificaqueaverdadeiraarbitrria
insumoscomoFOOseralteradoparaovalorverdadeirocannicaTnasada,porisso,

pgina147

Captulo4Conditionals 135
NestesentidoTeoremadeDeMorgannosesustenta.
(e'foo'bar)bar
(no(ou(no'foo)(no'bar)))t
Noentanto,oTeoremadeDeMorgansepreservarapropriedadecondicionalde
ANDeOR.Ouseja,clusulasque(EXY)iriaavaliartambmseria
avaliadaspor(not(OR(NOTx)(NOY))),eclusulasqueegostaria
noavaliamnoseriaavaliadapelaoutraexpresso.Exemplo:
(e(numberp'fred)(plusp'fred))nil
(No(ou(no(numberp'fred))
(Not(plusp'fred))))

nil

TeoremadeDeMorganespeciallytilparasimplificarexpresses
envolvendocombinaescomplexasdepredicados.Considereestafuno:
(Defuncomplicadapredicado(xy)
(No(e(evenpx)(yevenp))))
Ocorpopodeserconvertidoparaumouescrevendo:
(Ou(no(evenpx))(no(evenpy)))
DesdeEVENPoopostodoODDP,obtemos:
(Defunsimplificadopredicado(xy)
(Ou(oddpx)(yoddp)))
EXERCCIOS
4,35. AnoteasequaesDeMorganparaasversesdetrsdeentradado
ANDeOR.
4.36. AfunoNAND(NANDcurtoparaNoE)muitocomumente
encontradosemcircuitosdocomputador.AquiestumadefiniodeNAND.Escreva
parabaixosuatabeladeverdade.
(DefunNAND(xy)(no(exy)))
4.37. NANDchamadodelgicacompletafunoporquenspodemos

construirtodasasoutrasfunesbooleanasapartirdevriascombinaesde
NAND.Porexemplo,aquiestumaversodoNOchamadoNOT2
contructeddeNAND:
(Defunnot2(x)(NANDXX))

pgina148

136

CommonLisp:AGentleIntroduoComputaoSimblica
ConstruirversesdeElgicoelgicoOR,colocando
NANDsjuntos.VocterqueusarmaisdeumNANDemcada
caso.
4.38. ConsidereafunoNOR(abreviaodeNotOR).vocpodeescreververses
deNOT,lgicoE,NANDeORlgico,colocando
NORsjuntos?
4.39. lgicoelogicamentecompletarocaminhoNANDeNORso?

pgina149

Variveiseefeitossecundrios

5.1INTRODUO
Estecaptulovailhedarumamelhorcompreensodosdiferentestiposde
variveisquepodemapareceremprogramasdeLisp,comoasvariveissocriados,e
comoseusvalorespodemmudaraolongodotempo.Lispcomummaissofisticado
aesterespeitodoquedialetosLispanteriores.Tambmvamosfalarsobreosefeitoscolaterais,
quesoaesdeumafunotomadiferentederetornarumvalor.alterandoo
valordeumavarivelumtipodeefeitocolateral.
5.2variveislocaiseglobais
Cadavariveltemummbitodeaplicao,quearegionaqualpodeserreferenciada.
Atagora,asnicasvariveisquetemosvistosoosqueaparecememumafunode
listadeargumentos.Desdeoseumbitorestritoparaocorpodafuno,eles
sochamadosdevariveislocais.Vejaesteexemplo:
(Defundupla(n)(*n2))
Todavezquenschamamosdeduplafuno,umanovavarivellocalchamadaN
criado.Dentrodocorpodadupla,onomeNrefereseaessavarivel.

Foradadupla,nopodemosnosreferirvarivelemtodos,porquesomos
foradoseumbito.Emoutraspalavras,onomeNtemumsignificadodiferentefora
dadupladoquenointerior.
137

pgina150

138

CommonLisp:AGentleIntroduoComputaoSimblica
(Defundupla(n)(*n2))
(double5)10
nErro!Nvarivelnoatribuda.
AvarivelnoatribudaNreferidonamensagemdeerroacimanoa
Nlocal,criadoporDOUBLE.umaoutravarivel,quenoumlocalpara
qualquerfunoespecfica.Porestarazo,conhecidacomoumavarivelglobal.
PorqueavarivelglobalNinicialmentenotemvalor(''noligado,''emidosos
terminologia),teremosumerrovarivelnoatribudaquandodigiteNnotop
nveldolaceteleituraevalprint.Seolharmosparaaevaltracede(DOUBLE5),o
distinoentreosdoissignificadosdoNtornaseaparente:
avarivelNmundialnotemvalor
(Double5)
DigiteDUPLOcomentradade5
criar(local)varivelN,comovalorde5

(*2N)
Navaliaa5
10
Resultadodaduplade10
avarivelglobalNaindanotemvalor
PodehaverapenasumavarivelglobalchamadaN,maspodehavermuitos
variveislocaiscomestenomeporquecadaresideemumlxicodiferente
contexto.
5.3SETFatribuiumvaloraumavarivel
AfunoSETFmacroatribuiumvaloraumavarivel.Seavarivelj
temumvalor,onovovalorsubstituioantigo.AquiestumexemplodeSETF
atribuirumvaloraumavarivelglobale,maistardemudandooseuvalor.
VOGAISinicialmentenotemnenhumvalor.
>vogais
Erro:vogaisvarivelnoatribuda.
>(Vogaissetf'(aeiou))
(AEIOU)

SETFdvogaisa
valor.

pgina151

139
CAPTULO5variveiseefeitossecundrios

>(vogaiscomprimento)
5

AgorapodemosusarVOGAIS
emexpressesLisp.

>(vogaisdescanso)
(Eiou)
>vogais
(AEIOU)
>(vogaissetf
'(aeiouesvezesy))Dvogaisumanova
(AEIOUesvezesY)
>(Repouso(vogaisdescanso))
(IOUesvezesY)

Seuvalornoalterado.

valor.
Useonovovalor.

OprimeiroargumentodeSETFonomedeumavarivelSETFno
avaliaresteargumento.(Elepodefazerissoporqueumafunomacro).A
Osegundoargumentoovalorparaoqualavariveldefinidaesteargumento
avaliada.OvalorretornadoporSETFovaloraquesedefinao
varivel.
Asvariveisglobaissoteisparaseapegaravaloresdemodoquenotemque
continuamenteescrevlos.Exemplo:
>(Setflongalista'(abcdefghi))
(ABCDEFGHI)
>(Cabeasetf(primeirolongalista))
UMA
>(Setfcauda(descansarlongalista))
(BCDEFGHI)
>(Conscabeacauda)
(ABCDEFGHI)
>(Iguallongalista(conscabeacauda))
T
>(Cabeacaudalista)
(Um(BCDEFGHI))
Cabea,cauda,edelongalistasotodasasvariveisglobais.

pgina152

140

CommonLisp:AGentleIntroduoComputaoSimblica

5.4EFEITOSCOLATERAIS
FunescomunscomoCARe+soteisapenasporcausadosvaloresque
Retorna.Outrasfunessoteisprincipalmentedevidoaosseusefeitossecundrios.
efeitocolateraldoSETFqueelealteraovalordeumavarivel.Esteefeitosecundrio
muitomaisimportantedoqueovalorsetfretornos.Defuntambmchamada
puramenteparaseuefeitocolateral:Eledefineumanovafuno.Ovalorretornadopor
Defunonomedafunodefiniu.
Outrafunocomumefeitocolateralaleatria,CommonLispdealeatrio
geradordenmeros.(Randomn)devolveumnmeroescolhidoaleatoriamente,apartirde
dezeroat(masnoincluindo)n.Senumnmerointeiro,aleatrioretornaum
integerseumnmerodepontoflutuante,Randomretornaumpontoflutuante
nmero.
>(Aleatrio5)
3
>(Aleatrio5)
1
>(Aleatrio5.0)

2,32459
>(Aleatrio5.0)
4,94179
efeitocolateraldaRandomescondidodousurio.Elemudaosvaloresde
algumasvariveisdentrodogeradordenmerosaleatrios,permitindoqueproduzaum
diferentedenmerosaleatrioscadavezquechamado.
AfunoSETFpodealterarovalordequalquervarivel,localouglobal.
NestelivrousaremosSETFapenasemvariveisglobais,porquebom
estilodeprogramaoparaevitaraalteraoosvaloresdasvariveislocais.Masapenaspara
mostramqueissopodeserfeito,aquiestumexemploondeumafunoalteraa
valordeumavarivellocal,P.Observequeestafunotemduasformas
(expresses)emseucorpo.Quandoumcorpodafunocontmmaisdoqueumaforma,
avaliatodoselesedevolveovalordoltimo.
(Defunpobresdeestilo(p)
(SetfP(P+5))
(Listade"resultado"p))
>(Mstyle8)
(RESULTADO13)

pgina153

141
CAPTULO5variveiseefeitossecundrios
>(Mstyle42)
(RESULTADO47)

(RESULTADO47)
>p
Erro!Pvarivelnoatribuda
DentroPOBRESTYLEosmboloPrefereseaumavarivellocal,demodoSETF
alteraovalordestavarivellocal.APvarivelglobalnoafectadapela
oSETF.Emevaltracenotao,aatribuiomostradocomoumefeitocolateralde
aformaSETFaninhadosdentrodocorpodemSTYLE.Voctambmpodever
queoresultadodestaformanodevolvidopormSTYLE,porqueno
altimaformanocorpo.
(Mstyle8)
DigitePOBREestilocomentradade8
criarPvarivel,comvalorde8
(SetfP(P+5))
(P+5)
Pavaliaa8
13
Pparadefinir13
13
(Listade"resultado"p)
Pavaliaa13
(RESULTADO13)
ResultadodemSTYLE(RESULTADO13)
5.5ODEIXEFUNOESPECIAL
Atagora,asnicasvariveislocaisquevimosforamaquelescriadospelotelefone
funesdefinidaspelousurio,comoaduplaoumdio.Outraformade
criarumavarivellocalcomafunoespecialLET.Porexemplo,umavez
amdiadedoisnmerosmetadesuasoma,podemosquererusarumlocalde
chamadaSUMvariveldentrodenossafunoMDIA.PodemosusarLETpara
criarestavarivellocaledarlheovalorinicialdesejado.Emseguida,noorganismo
doformulrioLET,podemoscalcularamdia.
(Mdiadefun(xy)
(Vamos((soma(+xy)))
(Listadexy'mdia'(/soma2,0))))

pgina154

142

CommonLisp:AGentleIntroduoComputaoSimblica
>(Mdia37)
(37mdiade5,0)
OcaminhocertoparalerumformulrioLETtaiscomo
(Vamos((x2)
(Aardvarky'))
(Listadexy))
querdizer''SejaX2,eYAARDVARKretorno(LISTAXY).''A
sintaxegeraldoLET:
(LET((var1valor1)
(Var2valor2)
...
(Varnvalorn))
corpo)
OprimeiroargumentoparaLETumalistadeparesdevalorvarivel.Onvalor
formassoavaliados,entonvariveislocaissocriadasparamanterosresultados,
Finalmente,asformasnocorpodoLETsoavaliadas.Aquiestumevaltracede
achamadaparamdia.
(Mdiade37)
DigiteMDIAcomentradas3e7
criarvarivelX,comvalor3

criarvarivelY,comovalor7
(deixei...)
(+Xy)
10
EntrarnocorpoLET
criarSUMvarivel,comovalorde10
(Listadexy'mdia'(/soma2))
Xavaliaa3
Yavaliaa7
(/Soma2,0)
SUMavaliaa10
5
(37mdiade5,0)
ResultadodaLET(37mdiade5,0)
Resultadodamdia(37mdiade5,0)

pgina155

143
CAPTULO5variveiseefeitossecundrios
VamosnosconcentrarsobreoquesepassadentrodocorpodoLET.Ointeriordeespessura
setacomoeixooco,quemarcaocorpoLETnaevaltrace
diagrama,indicaqueoLETcriaoseuprpriocontextolexicaldentrodo

contextolexicalnamdia.AoavaliarocorpoLET,EVALpode
veratravsdoeixoocosvariveisXlocaleYqueMDIA
criado.SeaflechadoLETtinhasidoslidocomoAVERAGEde,emvezde
ocoqueseriaumlimiteescopo:EVALnoseriacapazdever
atravsdelaquandoprocuravariveis.Nessecaso,quandoseavaliaa
expresso(LISTAXYetc.)nocorpoLET,EVALteriaatingidoolimite
esaltarimediatamenteparaocontextolexicalglobalparaprocurarummundial
varivelchamadaXouY.Issonoseria,obviamente,produziroresultadopretendido
provavelmentecausarumerrovarivelnoatribuda.
AquiestumexemplodousoLETparacriarduasvariveislocaisaomesmotempo.
(Defuninterruptorbilling(x)
(Vamos((estrela(primeirox))
(Coestrela(terceirax)))
(Coestrelalist'acompanhado'porestrela)))
>(Switchbilling"(fredegengibre))
(GengibreACOMPANHADOSDEFRED)
AquiestumevaltracemostrandoexatamentecomoLETcriaasvariveislocais
STARecoestrela.Notesequeasduasformasdevalor,(primeiraX)e(TERCEIRA
X),soambosavaliadosantesdequaisquervariveislocaissocriadas.
(Switchfaturamento'(fredegengibre))
IntroduzirSWITCHfaturamentocomentrada(FREDegengibre)
criarvarivelX,comovalor(FREDegengibre)
(deixei...)
(PrimeiraX)
FRED
(Terceirox)
GENGIBRE
EntrarnocorpoLET
criarestrelavarivel,comvalorFRED
criarvarivelcoestrela,comovalorGINGER
(Coestrelalist'acompanhado'porestrela)
(GengibreACOMPANHADOSDEFRED)
ResultadodaLET(gengibreACOMPANHADOSDEFRED)
ResultadodaSWITCHfaturamento(gengibreACOMPANHADOSDEFRED)

pgina156

144

CommonLisp:AGentleIntroduoComputaoSimblica
EXERCCIO
5.1. ReescreverafunoPOBREestiloparacriarumnovoQvarivellocalusando
DEIXE,emvezdeusarSETFparamudarP.Chamadasuanovafuno
BOMESTILO.

5.6OLET*FUNOESPECIAL
OLET*funoespecialsemelhanteparapermitirque,anoserquecriaolocal,
variveisdeumdecadavez,emvezdeumasvez.Portanto,aprimeiravarivellocal
inseresenocontextolexicalnaqualovalordasegundavarivel
calculado,eassimpordiante.Estamaneiradecriarvariveislocaistilquandoum
queratribuirnomesaosvriospassosintermediriosemumlongocomputao.
Porexemplo,suponhaquequeremosumafunoquecalculaavariaopercentual
nopreodewidgetsdadasosantigosenovospreoscomoentrada.nossafuno
devecalcularadiferenaentreosdoispreos,emseguida,dividiresse
diferenapelopreoantigoparaobteramudanaproporcionalnopreo,e,emseguida,
quemultiplicarpor100paraobterapercentagemdealterao.Nspodemosusarasvariveislocais
chamadoDIFF,proporo,eporcentagemdemanteressesvalores.Ns
usarLET*emvezdeLET,porqueestasvariveisdevemsercriadasumaauma
tempo,umavezquecadadependedoseuantecessor.
(Defunpreochange(oldnovo)
(Vamos*((diff(novaidade))
(Proporo(/diffdeidade))

(Percentagem(*proporo100,0)))
(Listade"widgets"alterado"porporcentagem
'porcento)))
>(Preodemudanade1.251.35)
(WidgetsMUDOUPORCENTO8.0)
UmevaltracedopreoCHANGEmostracomoLET*criaoseulocalde
variveis.Notequeaexpresso(NEWOLD)ocorrenolxico
contextoquecontmapenasasvariveislocaisnovoseantigos.Aexpresso(/
DIFFOLD)ocorreemumcontextolexicalaninhadaemqueoDIFFvarivellocal
tambmdefinida.Eaexpresso(*PROPORO100,0)ocorrenuma
contextomaisprofundamenteaninhada,contendoOLD,NEW,DIFF,e
PROPORO.Ocorpodaforma*LETavaliadaemumcontexto
contendotodasestasvariveismaispercentual.

pgina157

145
CAPTULO5variveiseefeitossecundrios
(Preodemudanade1.251.35)
DigitePREOCHANGEcomentradas1,25e1,35
criarOLDvarivel,comovalorde1,25
criarnovavarivel,comovalorde1,35
(deixei*...)

(novovelho)
0,10
criarDIFFvarivel,comovalorde0,10
(/Diffdeidade)
0,08
criarproporesvariveis,comovalorde0,08
(*Proporo100,0)
8
criarpercentualvarivel,comovalorde8,0
(Listade'mudou'porporcentagem"porcento)
(Alteradode8,0PORCENTO)
ResultadodaLET*(ALTERADOPELA8,0PORCENTO)
ResultadodopreoCHANGE(ALTERADOPELA8,0PORCENTO)
UmerrodeprogramaocomumusarDEIXEquandoLET*necessria.
ConsidereaseguintefunoFAULTYSIZERANGE.ElausaMAXe
MINparaencontraramaioremenordeumgrupodenmeros.MAXeMIN
soconstrudosparaLispComumambosaceitarumaoumaisentradas.oadicional
1.0argumentopara/usadoparaforaroresultadoserumnmerodepontoflutuante
emvezdeumaproporo.
(Defundefeituososizerange(xyz)
(Vamos((maior(mxxyz))
(Menor(XYZmin))
(R(/maiormenor1,0)))
("Fator"listader)))
>(Defeituososizegama35874)
Erronafunogamadedimenses:
Maiorvarivelnoatribuda.
Oproblemaqueaexpresso(/MAIORMENOR1.0)estsendo
avaliadanumcontextolexicaisquenoincluiessasvariveis.portanto
osmbolomaiordelesinterpretadocomoumarefernciaaumavarivelglobal,que
nome.Istoprontamenteaparentenumevaltrace.

pgina158

146

CommonLisp:AGentleIntroduoComputaoSimblica
(Defeituososizegama35874)
DigiteFAULTYSIZEGAMAcomentradasde35,87e4
criarvariveisX,YeZ,comvaloresde35,87e4
(deixei...)
(XYZmax)
87
(Minxyz)
4
(/Maiormenor1.0)
Erro!Maiorvarivelnoatribuda.
OproblemaresolvidoporsubstituiodoLETcomumlet*:
(Defuncorretosizerange(xyz)
(Vamos*((maior(mxxyz))
(Menor(XYZmin))
(R(/maiormenor1,0)))
("Fator"listader)))
OevaltracedaCORRETOSIZEGAMAmostraque(/MAIOR
MENOR1.0)avaliadanocontextolexicalcontendovariveislocais
MAIOReMENOR,comosepretendia.
(Corretosizegama35874)
DigiteCORRETOSIZEGAMAcomentradasde35,87e4
criarvariveisX,YeZ,comvaloresde35,87e4
(deixei*...)
(XYZmax)

87
criarmaiorvarivel,comovalorde87
(Minxyz)
4
criarvarivelMENOR,comvalor4
(/Maiormenor1.0)
21.75
criarvarivelR,comovalor21.75
("Fator"listader)
(FACTORDE21.75)
ResultadodaLET*(FACTORDE21.75)
ResultadodaCORRETOSIZEGAMA(FACTORDE21.75)

pgina159

147
CAPTULO5variveiseefeitossecundrios
NosedeixeenganarporesteexemploempensarqueLET*devesersempre
utilizadonolugardeLet.HalgumassituaesemqueLETanicacorreta
escolha,masnovamosentraremdetalhesaqui.Estilisticamente,melhorusar
DEIXEdedeixar*semprequepossvel,porqueissoindicaparaquemlo
programaquenoexistemdependnciasentreasvariveisquesolocais
sendocriado.Programascompoucasdependnciassomaisfceisdeentender.
5.7OsefeitossecundriospodemCAUSARPROBLEMAS

melhorparaevitarefeitoscolateraisemseusprogramassemprequepossvel.Aquiestum
exemplo,ondeosefeitoscolateraisdaRandomcausarumerro.Suponhaquensqueremosum
funoquesimulaumsorteio.AmaiorpartedotempoquedeveretornarCABEAS
oucoroa,masumavezemumgrandequandoeledeveretornarEDGE,indicandoquea
moedadesembarcouemsuabordaemvezdeumadesuasduasfaces.Aquiestcomovamosfazlo:
Escolhaumnmeroaleatriode0at(masnoincluindo)101.Seonmerofor
nafaixade0a49,quevaivoltarcabeas.Senafaixade51a100,nsvamos
voltarcaudas.Seeleexatamenteiguala50,vamosvoltarEDGE.
(Defuncoincombug()
(Cond((<(aleatrio101)50)"cabeas)
((>(Aleatrio101)50)'caudas)
((Igual(aleatrio101)50)'edge)))
>(Coincombug)
CABEAS
>(Coincombug)
TAILS
>(Coincombug)
TAILS
>(Coincombug)
NADA
PorqueafunoretornarNIL?Obugquensestamosavaliandoa
expresso(Random101)attrsvezesporchamadadefuno.supor
naprimeiraclusulaCOND(Random101)retorna65istofazcomqueoprimeiroteste
falso.NasegundaclusulaCONSvoltamosaavaliar(Random101)
suponhaquedestavezeleretorna35,oquetornaasegundafalsateste.Noterceiro
clusula,suponha(Random101)retornaalgodiferentede50istofaz
oterceirotestefalso.CONDficousemclusulas,entoeleretornaNIL.

pgina160

148

CommonLisp:AGentleIntroduoComputaoSimblica
Acorreoparaessebugsimples:UseLETparamanterovalorde(Random
101)emumavarivellocal,porisso,stemosqueavaliaraexpressoumavez.
Almdisso,podemosomitiroensaioigual,umavezqueseosdoisprimeirostestesfalharemsabemos
queoresultadodevetersidoexatamenteiguala50.*
(Defunfairmoeda()
(Vamos((lance(aleatrio101)))
(Cond((<atirar50)"cabeas)
((>Atirar50)'caudas)
(T'borda))))
RESUMO
Umavarivelglobalparaumafuno,senofoicriadoporessafuno.Local
variveistmmbitolimitadoformaquelhescriado,porexemplo,a
variveisnalistadeargumentosdafunosolocaisparaessafuno,eo
variveiscriadoporLEToudeixar*solocaisparaseuscorpos.Asvariveisglobais
soassimchamadosporqueelestmescopoglobalelesnosolocaiscomqualqueruma
funo.
SETFumafunomacroqueatribuiumvaloraumavarivel,oualterao
valorseelejtemum.Esteefeitosecundrio,chamado''atribuio'',oque
fazSETFtil.
Quandovriasexpressesaparecememumcorpodafunooudeixaroudeixar*
corpo,ovalordaltimaexpressodevolvido.Asoutrasexpressesso
stilparaosseusefeitossecundrios.
exercciosdereviso
5.2. Oqueumefeitosecundrio?
5.3. Oqueadiferenaentreumavarivellocaleglobal?
5.4. PorSETFdeveserumafunomacro,emvezdeumafunoregular?

5.5. Soletelet*equivalentequandovocsestcriandoumlocalde
varivel?

*EliminandootesteEQUALdaCOINCOMBUGnoteriacorrigidooerro,masteria
feitosossintomasmaissubtil:OvalorBORDAseriaretornadacercade25%dotempo,emvezde
apenas1%.

pgina161

149
CAPTULO5variveiseefeitossecundrios
FUNESabordadosnestecaptulo
funomacroparaatribuio:SETF.
Funesespeciaisparaacriaodevariveislocais:Vamos,DEIXE*.

ToolkitLisp:documentaoeAPROPOS

AmaioriadasimplementaesLispcomunsincluemdocumentaoonlineparacada
builtinfunoevarivel.Umaformadeacederaestadocumentaoestcom
afunoDOCUMENTAO,queretornaumstringdedocumentao.
>(Funodocumentao'contras')
"(CONSXY)retornaumalistacomxcomoocarro
eycomoocdr."
>(Documentao'*impressodecomprimento*'varivel)
"*PRINTdecomprimento*determinaquantoselementospara
imprimiremcadanveldeumalista.IlimitadoseNIL".
Osprogramadoresnoutilizarafunodedocumentaomuitofrequentemente,
embora,porquehmaneirasmaisrpidasparaacessaradocumentaoonlineatravsdo
editorseuLispfornece.Naminhamquina,porexemplo,quandoeuapontaro
domouseemumsmboloepressioneControlMetaShiftS,adocumentaoparaque
funoouvarivelexibidoemumajanelapopup.
Vocpodeincluircordasdedocumentaonasfunesquevocescreve,tambm.
Elesdevemsercolocadosimediatamenteapsalistadeargumentosaochamar
Defun.
(Mdiadefun(xy)
"Retornaamdia(valormdio)dosseusdois
"entradas.
(/(+Xy)2.0))
>(Funodocumentao"mdio")
"Retornaamdia(valormdio)dosseusdois
"entradas.

pgina162

150

CommonLisp:AGentleIntroduoComputaoSimblica
Fornecendocordasdedocumentaoparaasfunesquevocescrevebom
prticadeprogramao.Eletambmajudaaoutraspessoasparausarseusprogramas,umavezque
documentaoonlineestsempredisponvelsemprequeprecisardeajuda.
Outramaneiradedocumentarumprogramaatravsdainclusodecomentriosnoarquivo.
ComentriosemprogramasLispdeveserprecedidoporumpontoevrgula.Sempreque
Lispencontraumpontoevrgulaaocarregarumprograma,eledescartao
pontoevrgulaetudoparaadireitadeleatoprximoretornodecarro.
Comentriosbeneficiarapenasossereshumanosquesedoaotrabalhodeexaminara
programaelessoignoradospeloLispenofazempartedalinha
documentao.Maselessoteisporquepodemfornecermaisdemorado
informaodoqueumacadeiadedocumentao.Elestambmpodemsermaisespecfico,para
exemplo,explicandoumaouduasdaslinhasmaissubtisdeumafuno.
Porconveno,oscomentriosLispapareceremumdostrslocais.Comentrios
queaparecedireitadeumalinhacomeacomumpontoevrgula.Comentriosdentrodeum
funoqueocupamumalinhaporsissoprecedidospordoispontoevrgula.
Comentriosquecomeamnamargemesquerda,aparecendoforadeumafuno
definio,soprecedidosportrspontosevrgulas.AlgunseditorestravessoLisp
comentriosautomaticamentecombasenonmerodepontosevrgulasqueelescontm.A
exemplodetodosostrsestilosdecomentrioseguinte.
FunoparacalculardeEinsteinE=mc

(Defuneinstein(m)
(Vamos((c300.000,0))velocidadedaluznokm/seg.
Eaenergia
mamassa
(*MCC)))
OutrafontetildedocumentaoAPROPOS.Dizlheo
nomesdetodosossmbolosquecontmumacadeiaespecificada.Porexemplo,suponhaquevoc
querencontrartodasasfunesevariveisembutidosquecontm"TOTAL"em
onomedeles.VocpodefazerissocomAPROPOS:
>(Apropsito"TOTAL""USURIO")

ARRAYTOTALSIZE(funo)
ARRAYTOTALSIZELIMIT,constante,valor:134217727
VemosquehumafunoLispcomumincorporadochamadoARRAY
TOTALsize,eumaconstantechamadaARRAYTOTALSIZELIMITembutido.
(Aconstanteumavarivelcujovalorvocnotempermissoparamudar.PItambm
umaconstante).

pgina163

151
CAPTULO5variveiseefeitossecundrios
OsegundoargumentoparaAPROPOSchamadodenomedopacote.Voc
sempredeveusarastring"USURIO"(tudoemmaisculas)paraosegundoargumento
casocontrrioAPROPOSpodemostrarlhelotesdeLispaplicaoespecfica
funesemoutrospacotesquevocnoseimportadesabernadasobre.
OspacotessoumadascaractersticasmaisobscurasdeCommonLispenovai
serabordadosnestelivro.

Exerccioteclado

EXERCCIO
5.6. Esteexercciotecladosobredados.Vamoscomearcomumafunopara
jogueumdadoeacabarcomumprogramaparajogardados.Tenhacertezade
incluirumaseqnciadedocumentaoparacadafunoquevocescreve.
uma.EscreverumafunoLANCEDIEqueretornaumnmeroaleatriode1
a6,inclusive.Lembreseque(Random6)vaiescolhernmeros
de0a5.LANCEDIEnoprecisadeinsumos,demodoqueoseuargumento
listadeveserNIL.
b.EscreverumafunoLANCEDICEquelanadoisdadoseretornaum
listadedoisnmeros:ovalordaprimeiramatrizeovalordo
segundo.Vamoschamarestalistaa''lance''.Porexemplo,(THROW
DICE)podedevolveroarremesso(35),indicandoqueoprimeirodadoera
a3easegundaa5.
c.Jogandodoisunschamadode''olhosdecobra''doisseischamado
''Vages.''WritepredicadosSerpenteolhoPevagesP
quetomarumlancecomoentradaeretornarTseolanceiguala(11)
ou(66),respectivamente.
d.Emjogarcraps,oprimeirolancededadoscrucial.Umlancede7
ou11umavitriaimediata.Umlancede2,3ou12umaperdainstantnea
(regrasdecasinoamericano).EscreverpredicadosIMEDIATOWINPe
IMEDIATOPERDAPparadetectaressascondies.Cadaumdevedaruma
joguecomoentrada.

pgina164

152

CommonLisp:AGentleIntroduoComputaoSimblica
e.EscreverumafunoSAYthrowquelevaumlancecomoentradae
retornaouasomadosdoisdadosouosmbolodosnakeeyes
ouvagesseasomafor2ou12.(SAYLANCE'(34))deve
retornar7.(SAYLANCE'(66))deveretornarvages.
f.Sevocnoganharouperdernoprimeirolancededados,ovalor
jogoutornaseseu'ponto',''queserexplicadoembreve.
Escreverumafuno(CRAPS),queproduzoseguintetipode
comportamento.Suasoluodevefazerusodasfunesquevocescreveu
nospassosanteriores.
>(craps)
(LANCE1AND1Snakeyesvocperde)
>(craps)
(LANCE3e47VOCWIN)
>(craps)
(JOGUE2e4seuponto6)
g.Umavezqueumpontofoiestabelecido,voccontinuajogandoosdados
atquevocquerganhar,fazendoopontonovamenteouperderjogandoum
7.EscrevaafunoTRYporpontoquesimulaestaparteda
ojogo,comosesegue:
>(Experimenteaponto6)
(LANCE3e58JOGARNOVAMENTE)
>(Experimenteaponto6)
(LANCE5e16VOCWIN)
>(craps)
(JOGUE3e6seuponto9)
>(Experimenteaponto9)
(LANCE6e17vocperde)

pgina165

153
CAPTULO5variveiseefeitossecundrios

Tpicosavanados

5.8SMBOLOSEclulasdevalor
Recordeseque,internamente,umsmbolocompostoporcincocomponentes.Osdois
quejvimosatagorasoclulasnomeeafunodosmbolo.Umterceirocomponente
decadasmboloacluladevalor.Eleapontaparaovalordavarivelglobal
chamadoporessesmbolo.Porexemplo,seototalvarivelglobaltema

valor12,entoaestruturainternadosmboloTOTALseriasemelhante
esta:
nome

"TOTAL"

valor

12

Damesmaforma,seopeixevarivelglobaltemovalortruta,aestrutura
ficariaassim:
nome

"PEIXE"

valor
nome

pgina166

"TRUTA"

154

CommonLisp:AGentleIntroduoComputaoSimblica
OssmbolosTenilavaliamparasimesmos,porqueassuasclulasdevalor
apontarparasiprprios.Emoutraspalavras,Tonomedeumavarivelglobalcuja
valorpassaaserosmboloTvalordoNILosmboloNIL.o
estruturainternadestessmbolosenvolveumacircularidade,comomostrado:

nome

"T"

valor

nome

"NADA"

valor

Umsmbolopodeserusadoparanomearmuitasvariveis,masapenasumdestespode
serglobal.Emoutraspalavras,apenasumpodeexistirnocontextolexicalglobal.
Acluladevalorreservadoparaessavarivel.Todasasoutrasvariveisdevemexistir
emcontextoslocais,eseusvaloresresidememalgumlugarquenosejaosmbolode
cluladevalor.OLispcomumnoespecificarexatamenteondeosvaloresdelocais
variveissoarmazenadasosdetalhessodeixadosataimplementao.
Porqueossmbolostmclulasdefunoevalorseparados,podemosteruma
** Porexemplo,sedeua
variveleumafunocomomesmonome.
CARvarivelglobalovalordaRollsRoyce,osmbolodoautomvelficaria
comoisso:
nome

"CARRO"

valor

ROLLSROYCE

funo

compilado
CARRO
Funo

CommonLISPdeterminaseumsmbolorefereseaumafunoouum
varivelcombasenocontextoemqueelaaparece.Seumsmboloaparececomoo

**IssonopossvelnodialetoEsquemadeLisp,quearmazenaasfunesevaloresdevariveisnamesma
clula.

pgina167

155
CAPTULO5variveiseefeitossecundrios
primeiroelementodeumalistaqueestaseravaliado,eletratadocomoumnomedefuno.Dentro
outroscontextos,tratadacomoumnomedevarivel.Ento(CAR'(ABC))chamaa
funoCAR,queretornaA.Mas(LIST'A'NEWCAR)fazrefernciaao
CARvarivelglobaleproduzoresultado(UMNOVORollsRoyce).
5.9DISTINGUINDOLOCALDEvariveisglobais
Atagoradeveficarclaroqueossmbolosnosovariveiselesservemcomonomes
paravariveis(eparafunestambm.)Exatamentequalvarivelumsmboloreferese
paradependedocontextoemqueelaaparece.Noexemploabaixo,h
duasvariveisnomeadasX.AvarivelglobalXtemovalor57.Avarivel
Xquelocalparanewvarobrigadoatudooqueaentradaparanewvar.
(Setfx57)
(Defunnewvar(x)
('Value'listade'x'x))

>x
57
>(Newvarwhoopie')
(ValordexWHOOPIE)
>x
57
DentronewvaronomedeXrefereseavarivellocalX,queo
funocriadoeatribudoovalorWHOOPIE.Foradafuno,X
refereseavarivelglobal,cujovalor57.Aclulavalordosmbolo
Xapontapara57otempotodonewvardavarivellocalXarmazenado
outrolugar.Umdiagramaevaltraceilustraarelaoentreo
doisXs:

pgina168

156

CommonLisp:AGentleIntroduoComputaoSimblica

avarivelglobalXtemovalor57
(Whoopienewvar')
DigitenewvarcomWHOOPIEentrada
criar(local)varivelX,comovalorWHOOPIE
('Value'listade'x'x)
XavaliaaWHOOPIE
(ValordexWHOOPIE)
Resultadodanewvar(valordexWHOOPIE)
avarivelglobalXaindatemovalorde57
AregraparaavaliarosmboloXnocorpodenewvarcomearem
contextolexicalatualeirparafora,procuradeumavarivelcomo
nomedado.UmavezqueexisteumavarivelchamadaX,noactualcontexto,asua
valor,WHOOPIE,usado.EVALnoolhaparaoX.varivelglobal
Aregranaverdadeumpoucomaiscomplexodoqueeste.EVALsemoveparafora
apartirdocontextolexicalatualsomenteatencontrarumavarivelcomessenomeou
atingeumalinhadeespessura,oqueindicaofimdoambientelexical.Noultimo
caso,nopodesemoverparaforamaiselespodeverificaravarivelglobal
comessenome.Issoexplicaoseguinteexemplo:
(Setfum100)
(Defunf(a)
(ListaA(g(+a1))))
(Defung(b)
(Listaab))
>(F3)
(3(1004))
Nesteexemplo,criamosumavarivelglobalchamadaAcomvalor100.
QuandochamamosF,elecriaumavarivellocalchamadaA,comovalor3,eemseguida
chamaafunocontextolexicaldeG.GindependentedoFda.(Cadafuno
definidocomDefuntemoseuprpriocontextolexicalindependente.)No
evaltrace,alinhagrossaquedenotaocontextodeLumabarreira:Nenhumvariveis
quecriaFsovisveisdentroG.Assim,nocorpodeL,umavezquenohlocais
varivelchamadaA,EVALbatenabarreira.AocorrnciadeAnoorganismo
portanto,tratadacomoumarefernciaparaavarivelglobalA.

pgina169

157
CAPTULO5variveiseefeitossecundrios
avarivelglobalAtemovalor100
(F3)
DigiteFcomentrada3
criar(local)varivelA,comvalor3
(ListaA(g(+a1)))
Umavaliaa3
(G(+A1))
(+A1)
4
DigiteGcomentrada4
criar(local)avarivelB,comvalor4
(Listaab)
Umavaliaa100
Bavaliaa4
(1004)
OresultadodeG(1004)
(3(1004))
OresultadodeF(3(1004))

avarivelglobalAaindatemovalor100
5.10vinculativo,delimitaodombito,ECESSO
PorqueCommonLispevoluramapartirdeantigosdialetosLisp,menossofisticados,ele
herdouterminologiaqueemalgunscasosnoseencaixa.Estelivro
esforaseporutilizarapenascorretoeterminologiaambgua,masparacompatibilidade
comoutroslivroseacomunidadeemgeralLisp,voudivagarporumaseo
eexplicarosvriosusoseabusosdotermo''ligao''.
Porrazeshistricas,variveisquetmvaloresestoaserdito''obrigado''
evariveissemvalorestoaserdito''noligado.''Enquantoestelivrofala
sobre''dasvariveisnoatribudo''erros,amensagemdeerromaisLisp
implementaesproduzem''varivelindependente.''
Oprocessodecriaodeumanovavariveledandolheumvalorchamado
''Ligao''.Seavarivelaparecenalistadeargumentosdafuno,eleditoser
criadopor''ligaolambda.''SeeleaparecenalistadevariveisdeumLETou
DEIXE*forma,dizseasercriadopor''DEIXEvinculativo.''Essesusosde
''Ligao''nosoincorretashoje.UmespecialistaemLisppoderiamuitobemdizerquens

pgina170

158

CommonLisp:AGentleIntroduoComputaoSimblica
curouobugnoCOINCOMBUG''porLETvinculativoumavarivelparaovalor

de(Random101).''
MasLispersdosvelhostempossemetememproblemasterminolgicaquandoeles
tentarfalarsobrealigaodevariveisdeformasquenosoverdadeirasparalexically
escopoLisps.Enquantovariveispossuemescopolxicoporpadro,CommonLisp
tambmforneceumaoutradisciplinadeescopo,chamadoescopodinmico,quens
Novouentrarematocaptulo14.escopodinmicofoiopadronamaioria
dialetosanterioresLisp,comexceodeSchemeeT.''Limite''nonecesssarily
significa''temumvalor''paraasvariveiscomescopodefinidodeformadinmica,porquepossvel
paratalvarivelaserligado,masnotmvalor.
ReferindosesfunesFeGnasecoanterior,emtempodeidade
Lispersdiria''osmboloAobrigadoa3porF.''Issonoadequada
lngua,sevocestfalandosobreLispComum.Smbolosnuncasopresos
nicasvariveispodemservinculados.EnohnenhumanicavariveldenominadaAh
sodois.MesmoenquantovarivellocaldaFAestnaexistncia,oAglobalpodeser
referenciadaporfunestaiscomoGcujocontextolexicalestforadocorpode
F.ParaexpressarafraseofensivanacorretaLispcomum,devesedizer
''FligaumavarivellocalAa3.''

pgina171

Estruturasdedadosdelista

6.1INTRODUO
Estecaptuloapresentamaisfuneslistademanipulao,emostracomoaslistas
soutilizadosparaimplementaressasoutrasestruturasdedadoscomoconjuntos,mesaservores.
Lispcomumoferecemuitasfunesinternasquesuportamessasestruturasdedados.
EsteumdospontosfortesdoLispemcomparaocomoutraslnguas.ALisp

programadorpodeconcentrarseimediatamentesobreoproblemaqueeleouelaquer
resolver.UmprogramadorPascalouCconfrontadoscomomesmoproblemadeveprimeiropassar
offeimplementarpartesdeumsistemaLisplike,comoprimitivaslistavinculada,
estruturasdedadossimblicos,umalocadordearmazenamento,eassimpordiante,antesdecomearatrabalhar
sobreoproblemareal.
Aabordagemquetomamosparalistasnestecaptuloumpoucomais
sofisticadodoquenoCaptulo2.VamosdiscutirnosoquevriosLisp
funesprimitivasfazer,mastambmcomoelesfuncionamdentro.Empreparaoparaisso,
vocpodequererreveradiscussodenotaodeparpontilhadonaseco2.17.
Sevocnotiversidolerostpicossecesavanadas,tudobemApenasv
eleraseo2,17agora.

159

pgina172

160

CommonLisp:AGentleIntroduoComputaoSimblica

6.2PARENTHESISVS.NOTATIONNOTATIONCONSCELL
Escrevendolistasemnotaoparntesisconveniente,maspodeserenganosa.

Listasnanotaoparntesisaparecemsimtrica:Elescomeamcomumaesquerda
parnteseeelesacabamcomumcaminhocerto.Podeseesperar,portanto,o
CONSfuncionarparatratarosseusargumentosdeformasimtrica.SeCONSpodeadicionarum
smbolofrentedeumalistadaseguinteforma:
('w'(xyz)contras)(wxyz)
porquenopodeadicionarumsmboloaofinaldeumalista?Iniciantesquetentamissoso
surpreendidocomoresultado:
(cons'(ABC)'d)((ABC).d)
Nohnenhumarazoparaveraextremidadeesquerdadeumalistacomofundamentalmentediferente
daextremidadedireitasemantivermosparntesenotao.Masamudanaparacontras
notaodeclulasrevelaadiferenacrucial:Aslistassocadeiasdesentidonicode
ponteiros.fcildeadicionarumelementoparaafrentedeumalista,porqueoquensestamos
realmentefazendocriarumanovaclulacontrascujospontoscdrlistaexistente.Ese
asentradasparaCONSsoWe(XYZ),oresultadoserumanovaclulacujocarro
apontaparaWecujocdrpontosvelhacadeia(XYZ),comomostradoabaixo.
Apesardenormalmenteexibiroresultadocomo(WXYZ),tambmpodemosescreverem
notaodepontocomo(W.(XYZ)).
Resultado

SegundaentradaparaCONS
NADA
W

PrimeiraentradaparaCONS
Quandonscontras(ABC)emD,ocarrodanovaclulaqueapontaparao
listaantiga(ABC)ospontosdeCDRparaosmboloD.Oresultadonormalmenteescrito
((ABC).D),queparecedecididamenteestranhonanotaoparntesis.Oponto
necessrioporqueacadeiadeclulascontrasterminaemumtomoquenosejaNIL.emcontras
notaoclulaaestruturaseparececomisso:

pgina173

161
CAPTULO6EstruturasListadedados

Resultado

segundaentrada
D

primeiraentrada
NADA
UMA

Nohmaneiradirectaparaadicionarumelementoparaofimdeumalistasimplesmentepela
criandoumanovacluladesvantagens,porqueofimdalistaoriginaljaponta
NADA.tcnicasmaissofisticadasdeveserusado.Umadelasa
demonstradanaprximaseo.
6.3AFUNOAPPEND
APPENDlevaduaslistascomoentradaeleretornaumalistacontendotodososelementosde
*
aprimeiralista,seguidosportodososelementosdosegundo.
>(Acrescentar'(amigosromanos)"(econterrneos))
(amigosromanoseconterrneos)
>(Acrescentar'(LMNO)'(PQR))

(LMNOPQR)
Seumadasentradasparaanexaralistavazia,oresultadoserigual
aoutraentrada.AnexandoNILaumalistacomoaadiodezeroaumnmero.
>(Acrescente"(chuveirosdeabril)nil)
(chuvasdeabril)
>(Anexarnil"(tragaFloresdeMaio))
(TragaFloresdeMaio)
>(Anexarnilnil)
NADA

*Notaaosinstrutores:ParasimplificaraprximadiscussodecomoAPPENDfunciona,considerarapenaso
casodeduasentradas.EmLispcomum,APPENDpodeaceitarqualquernmerodeentradas.

pgina174

162

CommonLisp:AGentleIntroduoComputaoSimblica
APPENDfuncionaemlistasaninhadastambm.Elesolhaparaonvelsuperiordecada
cadeiacelularcontras,paraqueelenoperceberseumalistaestaninhadoouno.
>(Anexar'((1um)(b2))'((C3)(4d)))
((A1)(B2)(C3)(4D))
OAPPENDnoalterarovalordequalquervariveloumodificarqualquerexistentes

clulascontras.Porestarazo,chamadoumnodestrutivafuno.
>(Setfque"(apenasobem))
(Apenasobem)
>(Acrescentarque"(morrerjovem))
(APENASOSBONSMORREMJOVENS)
>quem
(Apenasobem)

OvalordaOMSmantmseinalterado.

APPENDpodeaparecerparatratarsuasduasentradassimetricamente,masestaapenas
umailusocausadapelousodenotaodeparnteses.APPENDtrataseusdois
entradasdeformabastantediferente.Quandoacrescentaralista(ABC)paraalista(DE),
APPENDcpiasdaprimeiraentrada,masnoosegundo.Issotornaocdrdaltima
cluladopontodecpiaparaasegundaentrada,eretornaumponteiroparaacpia,enquanto
mostradonaFigura61.
EstadescriodecomoAPPENDrealmentefuncionatambmexplicaporqueum
deerroparaaprimeiraentradaparaanexaraserumnolista,masesttudobemseosegundo
entradaumnolista.
(acrescentar'a'(BCD))Erro!Anoumalista.
(acrescentar'(WXY)'z)(WXY.Z)
APPENDquercopiarasclulascontrasquecompemasuaprimeiraentrada.Nopode
quandoaprimeiraentradaA,poisquenoumalista,demodoquesinalizaumerro.Mas
quandoanexamos(WXY)paraZ,APPENDpodecopiarasuaprimeiraentradaefazero
CDRdoltimopontodeclulaparaasegundaentrada,demodoquenotmdesinalizarum
erro.Nestecaso,asegundaentradaZemvezdeumalista,demodoaaparnciaderesultados
estranho,porqueacadeiadeclulascontrasnoterminaemNIL.
Voltemosagoraparaoproblemadeadicionarumelementoparaofimdeumalista.
Seprimeirofazerumalistadoelemento,podemosresolveresseproblemausando
ACRESCENTAR.
(acrescentar'(ABC)"(d))(ABCD)

pgina175

163
CAPTULO6EstruturasListadedados

primeiraentrada
NADA

segundaentrada

UMA

C
NADA

ResultadodaAPPEND

UMA

Figura61Oresultadodeanexao(ABC)para(DE).

pgina176

164

CommonLisp:AGentleIntroduoComputaoSimblica
(Defunadicionartoend(XE)
"AdicionaelementoEatofinaldalistaX."
(Anexarx(listae)))
(addtoend'(ABC)'d)(ABCD)

6.4CONScomparar,LIST,eanexar

BeginninngLispersmuitasvezestmdificuldadeemdistinguirentreCONS,LIST,
eacrescentar,umavezquetodasastrsfunessousadosparaconstruirestruturasdelista.Aqui
umabreverevisodoquecadafunofazequandoeledeveserusado:
CONScriaumanovaclulacontras.Elefrequentementeusadoparaadicionarum
elementoparaafrentedeumalista.
LISTAfaznovaslistasaoaceitarumnmeroarbitrriodeentradas
econstruodeumacadeiadeclulascontrasqueterminamemNIL.Ocarrodecada
Ospontosdeclulasparaaentradacorrespondente.
APPENDacrescentalistasjuntos,copiandosuaprimeiraentradae
fazendoaCDRdaltimacluladopontoparaasegundacpia
entrada.umerroparaaprimeiraentradaparaanexaraserumnolista.
Agoravamostentaralgunsexemplosparacomparao.Primeiro,considereocaso
ondeaprimeiraentradaumsmboloeasegundaentradadeumalista:
>(Cons'arroz'(efeijo))
(ARROZEFEIJO)
>(Listade'arroz'(efeijo))
(ARROZEFEIJO))
>(Anexar'arroz'(efeijo))
Erro:arroznoumalista.
Emseguida,vamosveroqueacontecequandoambasasentradassolistas:
>(Cons"(aquihoje)'(idoamanh))
((AQUIHOJE)GoneTomorrow)
>(List'(aquihoje)'(idoamanh))
((AQUIHOJE)(IDOAMANH))
>(Acrescentar'(aquihoje)'(idoamanh))
(AMANHAQUIIDAHOJE)

pgina177

165
CAPTULO6EstruturasListadedados
Finalmente,vamostentarfazeraprimeiraentradadeumalistaeasegundaentradadeumsmbolo.
Esteocasomaisdifcildecompreendervocdevepensaremtermosdeclulascontras
emvezdeparntesesepontos.
>(cons"(comer)'Joes)
((EATAT).JOES)
>(Lista"(comer)'Joes)
((EATJOESAT))
>(Acrescente"(comer)'Joes)
(EATAT.JOES)
ParadesenvolversuasintuiessobreCONS,lista,eacrescentar,tente
osexemplosacima,utilizandoaferramentaSDRAWdescritonoToolkitLisp
seodestecaptulo.SDRAWdesenhadiagramasdeclulascontras.
6.5maisfunesemlistas
Lispfornecemuitasfunessimplesparaoperaremlistas.Nsj
CONSdiscutidos,lista,anexarecomprimento.Agoravamoscobrir
Inversa,NTH,NTHCDR,LAST,eremover.Algumasdessasfunes
devecopiarsuaprimeiraentrada,enquantooutrosnotm.Vejasevocpodedescobrir
arazoparaisto.
6.5.1REVERSA
REVERSEretornaareversodeumalista.
>(Reverso'(um,dois,trs,quatroecinco))
(Cinco,quatro,trs,doisONE)

>(Reverso'(live))
(MAL)
>(Reverso"aovivo)
Erro:tipodeentradaerrada.
>(Reverse'((minhasuperviso)
(Oerro)
(Negligncia)))
((HISNEGLIGNCIA)(SEUTOLICE)(MYSUPERVISO))

pgina178

166

CommonLisp:AGentleIntroduoComputaoSimblica
ObservequeInverteapenasonvelsuperiordeumalista.Issono
reverteroselementosindividuaisdeumalistadelistas.Outropontosobre
REVERSEqueelenofuncionaemsmbolos.REVERSOdalista(AOVIVO)
dalista(MAL),masemsentidoinversodosmbolovivodumaerrada
Tipodeerrodeentrada.
ComoAPPEND,inversonodestrutiva.Elecopiasuaentradaemvezde
modificlo.
>(Votosetf"(parateremanter))
(TERESEGURAR)

>(Votoinversa)
(ESPERAPARAETEMQUE)
>voto
(TERESEGURAR)
PodemosusarREVERSOparaadicionarumelementoparaofimdeumalista,comosesegue.
SuponhaquensqueremosadicionarDparaofinaldalista(ABC).Oreverso(AB
C)(CBA).Sens,consDemquenscomeamos(DCBA).Emseguida,invertendoo
resultadodaCONSd(ABCD).
(Defunadicionartoend(xy)
(Reverso(consy(reversox))))
(addtoend'(ABC)'d)(ABCD)
Agoravocsabeduasformasdeadicionarumelementoaofinaldeumalista.o
soluoAPPENDconsideradaumestilomelhordoqueodobroREVERSA
soluo,porqueesteltimofazduascpiasdalista.APPENDmais
eficiente.AsquestesdeeficinciasodiscutidosemumTpicosAvanados
seconofimdestecaptulo.
6.5.2NTHeNTHCDR
AfunoNTHCDRretornaonthcdrsucessivadeumalista.Clarose
tomamosdezerocdrsficamoscomaprprialista.Setomarmosumdemasiadoscdrs,
vamosacabarcomotomoqueterminaacadeiadeclulascontras,oquegeralmente
NADA.
(nthcdr0'(ABC))(abc)
(nthcdr1'(ABC))(bc)

pgina179

167
CAPTULO6EstruturasListadedados

(nthcdr2'(ABC))(c)
(nthcdr3'(ABC))nil
Usodosvaloresmaioresdoque3nocauseumerronssimplesmenteobteromesmo
resultarcomoparaa3.EstaumadasconsequnciasdefazerocdrdeNILser
NADA.
(nthcdr4'(ABC))nil
(nthcdr5'(ABC))nil
Noentanto,sealistaterminaemumtomodiferentedezero,comirlongedemais
NTHCDRcausarumerro.
(nthcdr2'(abc.d))(c.d)
(nthcdr3'(abc.d))d
(nthcdr4'(abc.d))Erro!Dnoumalista.
AfunoNTHlevaocarrodoNTHCDRdeumalista.
(Defunensima(nx)
"RetornaoensimoelementodalistaX,
contandoapartirde0."
(Carro(nxnthcdr)))
Desde(NTHCDR0x)alistax,(NTH0x)oprimeiroelemento.
Portanto,(NTH1x)osegundo,eassimpordiante.
(ensima0'(ABC))uma
(ensima1'(ABC))b
(ensima2'(ABC))c
(ensima3'(ABC))nil

Aconvenodenumeraocoisasdezeroemvezdeumusado
todoCommonLisp.Vocvaiencontrlonovamentequandodiscutimos
arraysnoCaptulo13.
EXERCCIOS
6.1. Porqueque(NTH4'(ABC))igualazero?
6.2. Qualovalorde(NTH3'(ABC.D)),eporqu?

pgina180

168

CommonLisp:AGentleIntroduoComputaoSimblica
6.5.3LAST
LTIMASretornaoltimocontrasdeclulasdeumalista,emoutraspalavras,aclulacujocarroest
ltimoelementodalista.Pordefinio,oCDRdestaclulaumtomodeoutraforma
noseriaaltimacluladalista.Sealistaestivervazia,oltimoapenasretornos
NADA.
(ltima"(tudoperdoado))(perdoado)
(ltimanil)nil
(ltima'(abc.d))(c.d)
(ltimo'nuncamais)Erro!NEVERMOREnoumalista.

EXERCCIOS
6.3. Qualovalorde(LAST'(ROSEBUD))?
6.4. Qualovalorde(LAST'((ABC))),eporqu?
6.5.4REMOVE
RemoverRemoveumitemdeumalista.Normalmente,eleremovetodasasocorrncias
doitem,emboraexistammaneirasdedizerissoapenaspararemoveralguns(vera
seoTpicosAvanados).OresultadoretornadoporRemoverumanovalista,
semositensexcludos.
(remover'a'(banana))(BNN)
(remover1'(314159))(3459)
REMOVEumafunonodestrutivos.Issonomudaquaisquervariveisou
clulascontrasaoremoverelementosdeumalista.REMOVEconstriseuresultadofora
clulascontrasdefrescos,copiando(departes)alista.
>(Setffeitio'(abracadabra))
(ABRACADABRA)
>(Remover"umfeitio)
(BRCDBR)
>feitio
(ABRACADABRA)

pgina181

169
CAPTULO6EstruturasListadedados
Atabelaaseguirdevemajudloalembrarqualcopiarfunessua
entradaequaisno.APPEND,reverso,eremoverretornarumnovo
contrascadeiadeclulaquenoestcontidoemsuaentrada,entoelesdevemcopiarseu
entradaparaproduziranovacorrente.FunescomoNTHCDR,NTHe
LTIMAretornarumponteiroparaalgumcomponentedesuaentrada.Elesnoprecisam
copiarqualquercoisaporque,pordefinio,oobjetoexatoqueelesqueremvoltar
jexiste.
Funo

Cpiasasuaentrada?

ACRESCENTAR
REVERSO
NTHCDR
NTH
LTIMO
REMOVER

sim(execeptparaaltimaentrada)
sim
no
no
no
sim(apenasasegundaentrada)

EXERCCIOS
6.5. Escrevaumaexpressoparadefiniralinhadevarivelgloballista(ROSES
SORED).Emseguida,escrevaoquecadaumadasseguintesexpresses
avaliaa:
(Linhainversa)
(Primeira(ltimalinha))
(1linhaensima)
(Reverso(linhainversa))
(Anexarline(lista(primeiralinha)))
(Anexar(ltimalinha)Linha)
(Lista(primeiralinha)(ltimalinha))
(Cons(ltimalinha)Linha)

(Remover'soalinha)
(Anexarlinha'(violetassoazuis))
6.6. UseafunoLASTparaescreverumafunochamadaLASTELEMENT
queretornaoltimoelementodeumalista,emvezdaltimaclulacontras.Escreva

pgina182

170

CommonLisp:AGentleIntroduoComputaoSimblica
outraversodoLASTELEMENTusandoReversevezde
LTIMO.EscreveroutraversousandoNTHecomprimento.
6.7. UseRETROCESSOparaescreverumafunoladoaLASTqueretornao
seguinteltimoelementodeumalista.EscreveroutraversousandoNTH.
6.8. EscreverumafunoMYBUTLASTqueretornaumalistacomoltimoelemento
removido.(MYBUTLAST'(Asrosassovermelhas))deveretornaralista
(Asrosasso).(MYBUTLAST'(GAGA))deveretornar(GAG).
6.9. Qualafunoprimitivafazoseguintereduzira?
(Defunmistrio(x)(primeira(ltima(xreverso))))
6.10. Umpalindromeumasequnciaquelasmesmasparaafrentee
paratrs.Alista(ABCDCBA)umpalndromo(Abcabc)
no.EscreverumaPALINDROMEPfunoqueretornaTsesuaentradaum
palndromo.

6.11. EscreverumafunoMAKEpalndromoquefazumpalndromofora
deumalista,porexemplo,umavez(voceeu)comoentrada,eledeveretornar
(Voceeueuevoc).
6.6LISTAScomoconjuntos
Umconjuntoumacoleodesordenadadeitens.Cadaitemapareceapenasumavezno
conjunto.Algunsconjuntostpicossooconjuntodediasdasemana,oconjuntodeinteiros(um
conjuntoinfinito),eoconjuntodepessoasemHackensack,NewJersey,quetinha
espagueteparaojantarnanoitepassada.
Osconjuntosso,semdvida,umadasestruturasdedadosmaisteissepodeconstruir
apartirdelistas.Asoperaesbsicasdeajusteestotestandoseumitemummembrodeumconjunto
tomandoaunio,interseco,edefinirdiferena(tambmchamadodesubtraoset)
dedoisconjuntosetestarseumconjuntoumsubconjuntodeoutro.AsfunesLisp
Portodasestasoperaessodescritosnassubsecesseguintes.
6.6.1MEMBRO
OpredicadoMEMBROverificaseumitemummembrodeumalista.Seo
itemforencontradonalista,asublistaquecomeacomesseitemdevolvido.
CasocontrrioNILretornado.MEMBROnuncaretornaT,maspelatradio
contadocomoumpredicado,porqueovalorqueeleretornanoNIL(datrue)se
esomenteseoitemestnalista.

pgina183

171
CAPTULO6EstruturasListadedados
>(Setfpatos'(hueydeweylouie))Criarumconjuntodepatos.
(HUEYDEWEYLOUIE)
>(Membrodo"patosHuey)
(HUEYDEWEYLOUIE)

Hueyumpato?
ResultadonoNIL:sim.

>(Membrodo"patosDewey)
(DEWEYLOUIE)

Deweyumpato?
ResultadonoNIL:sim.

>(Membrodo"patosLouie)
(LOUIE)

Louieumpato?
ResultadonoNIL:sim.

>(patosmembro'mickey)
NADA

Mickeyumpato?
NIL:no.

NoprimeirodialetodoLisp,membroretornadoapenasTouNIL.Mas
aspessoasdecidiramqueterMEMBROdevolverosublistaquecomeacoma
artigoprocuradotornouumafunomuitomaistil.Estaextensoconsistente
comomembrodeserumpredicado,porqueasublistacomzerodeelementos
tambmanicamaneiradedizer''falsa.''
AquiestumexemplodeporquetilparaMEMBROpararetornarumasublista.
OpredicadoBEFOREPretornaumvalorverdadeirosexaparecemaiscedodoqueyno
listal.
(Defunbeforep(xil)
"RetornaverdadeiroseXapareceantesdeYemL"
(Membroy(membroxl)))
>(Beforep'no'aquem
"(Nopergunteporquemossinosdobram))
(Quemossinosdobram)
>(Beforep'ti'pedgios'(elesdobramporti))
NADA
EXERCCIO
6.12. OMEMBROtemquecopiarasuaentradaparaproduzirseuresultado?Explicar
oseuraciocnio.

pgina184

172

CommonLisp:AGentleIntroduoComputaoSimblica
6.6.2INTERSECTION
AfunoINTERSECTIONlevaainterseodedoisconjuntoseretornaum
listadeitensqueaparecemnasambososconjuntos.Aordemexataemqueelementosaparecem
noresultadoindefinidoquepodemvariardeumaimplementaoLisppara
outro.Ordemnoimportanteparaconjuntosdequalquermaneirasosprprioselementos
importam.
>(Interseco"(fredJooMaria)
'(Suemaryfred))
(FREDMARY)
>(Interseco'(asdfg)
'(Vwsra))
(COMO)
>(Interseco'(foobarbaz)
'(Bletchgorpxam))
NADA

Seumalistacontmvriosocorrnciadeumitem,elenoumverdadeiroset.
definirfunesLispcomuns,taiscomocruzamentoeUNIONpodelidarcom
listasquenosoconjuntos,masseoresultadocontmduplicatasouno
indefinido,epodevariarentreimplementaes.
EXERCCIOS
6.13. QualoresultadodeumconjuntodeinterseocomNIL?
6.14. Qualoresultadodeumconjuntodeinterseocomelemesmo?
6.15. PodemosusarMEMBROparaescreverumpredicadoqueretornaumvalorverdadeiroseum
frasecontmapalavra''do''.
(Defuncontmop(enviada)
(Membro'oenviado))
Suponhamosque,emvezquerumpredicadoCONTMARTIGOPque
retornaumvalorverdadeiroseumasentenacontmqualquerartigo,taiscomo''o''
''Um''ou''um''.
Escreverumaversodestepredicadousando
INTERSEO.EscreveroutraversousandoMembroeOR.
vocpoderesolveresteproblemacomeemvezdeOR?

pgina185

173
CAPTULO6EstruturasListadedados

6.6.3UNIO
AfunoUNIOretornaauniodedoisconjuntos,emoutraspalavras,umalistade
itensqueaparecememambososset.Seumitemapareceemambososconjuntos,serainda
aparecerapenasumaveznoresultado.Aordemexataemdeitensnoresultado
indefinida(esemimportncia)paraconjuntos.
>(Unio"(dedobraomo)
'(Pernapdedodedodop))
(DEDODOPDEMOARMTOEFOOT)
>(Unio"(fredJooMaria)
'(Suemaryfred))
(FREDJooMariaSUE)
>(Unio"(asdfg)
'(Vwsra))
(ASDFGVWR)
EXERCCIOS
6.16. OqueauniodeumconjuntocomNIL?
6.17. Oqueauniodeumconjuntocomoprprio?
6.18. EscreverumafunoADDVOGAISquelevaumconjuntodeletrascomoentradae
adicionaasvogais(AEIOU)paraoconjunto.Porexemplo,chamarADD
VOGAISnoset(XAEZ)deveproduziroconjunto(XAEZIO
L),comexcepodequeaordemexactadoselementosnoresultado
semimportncia.
6.6.4SETDIFERENA
AfunoSETDIFERENAexecutasubtraodefinida.Eleretornaoque
esquerdadoprimeiroconjunto,quandooselementosdosegundoconjuntotmsidoremovido.
Maisumavez,aordemdoselementosnoresultadoindefinido.
>(Setdiferena"(alphabravocharliedelta)
"(Bravocharlie))
(ALPHADELTA)
>(Setdiferena"(alphabravocharliedelta)
'(Foxtrotalphaecho))

(BRAVOCHARLIEDELTA)

pgina186

174

CommonLisp:AGentleIntroduoComputaoSimblica
>(Setdiferena"(alphabravo)"(bravoalfa))
NADA
Aocontrriodeunioeinterseco,setdiferenanouma
funosimtrica.Switchingsuasprimeiraesegundaentradasgeralmenteresultanuma
conjuntodiferentesendoproduzidocomosada.
(Line1setf'(todasascoisascommoderao))
(Line2setf'(moderaonadefesadaliberdade
hvirtude))
>(Line2line1setdiferena)
(TODASASCOISAS)
>(Linha1line2setdiferena)
(Defesadaliberdadenovirtude)
EXERCCIOS
6.19. QuaissoosresultadosdousoNILcomoentradaparasetDIFERENA?
6.20. QualdassuasduasentradassepeDIFERENAprecisacopiar?Qual
entradanuncaprecisasercopiado?Expliqueseuraciocnio.

6.6.5subsetp
OpredicadosubsetpretornaTseumconjuntoestcontidoemoutro,naoutra
palavras,setodososelementosdoprimeiroconjuntoumelementodosegundoset.
(subsetp'(ai)'(aeiou))t
(subsetp'(ax)'(aeiou))nil
EXERCCIO
6.21. Seoconjuntodexumsubconjuntodoconjuntoy,emseguida,subtraindoydexdevedeixaro
conjuntovazio.EscreverMYsubsetp,umaversodopredicadosubsetp
queretornaTseasuaprimeiraentradaumsubconjuntodasuasegundaentrada.
EXERCCIOSconjuntogeral
6.22. SuponhaqueavarivelAglobalestligadalistadeSOAP(gua).
Oquevaiseroresultadodecadaumadasseguintesexpresses?

pgina187

175
CAPTULO6EstruturasListadedados
(Unioa'(semrdiosabo))

(Intersecoa(revertera))
(Setdiferenaa'(pararparagua))
(Aasetdiferena)
(Membrodo"saboa)
(Membro'agua)
(Membrodo"panoa)
6,23. Acardinalidadedeumconjuntoonmerodeelementosqueelecontm.oque
Lispprimitivadeterminaacardinalidadedeumconjunto?
6.24. Osconjuntossoditoserigual,casocontenhamexactamenteosmesmoselementos.
Ordemnoimportaemumconjunto,demodoqueosconjuntos(VermelhoVerdeAzul)e
(VerdeAzulVermelho)soconsideradosiguais.Noentanto,aEQUAL
Opredicadonoconsiderlosiguais,porquetrataloscomolistas,
nocomoconjuntos.EscreverumpredicadoSETEQUALqueretornaTseduascoisas
soiguaiscomoconjuntos.(Sugesto:Sedoisconjuntossoiguais,ento,cadaumumsubconjuntode
ooutro.)
6,25. UmconjuntoXumsubconjuntodeumconjuntoY,seXumsubconjuntodeY,masnoigual
aY.Assim,(AC)umsubconjuntoprpriode(CAB).(ABC)umsubconjuntode
(CAB),masnoumsubconjuntoadequadodomesmo.Faaobomsubsetp
predicado,queretornaTsesuaprimeiraentradaumsubconjuntoprpriodesua
segundaentrada.
6.7ProgramaocomSETS
Aquiestumexemplodecomoresolverumproblemadeprogramaomodestausando
conjuntos.Oproblemaescreverumafunoqueadicionaumttulodenome,transformando
''JohnDoe''para''Mr.JohnDoe''ou''JaneDoe''para''Ms.JaneDoe.''Se
umnomejtemumttulo,essettulodevesermantido,masseelenotiverum,
vamostentardeterminarosexodoprimeironomeparaqueoapropriado
ttulopodeseratribudo.
Pararesolverumproblemacomoeste,devemosdividilaempedaosmenores.
Vamoscomearcomaquestodesaberseumnometemumttuloouno.Vejacomo
nsescreverumafunopararesponderaessapergunta:

pgina188

176

CommonLisp:AGentleIntroduoComputaoSimblica
(Defuntitledp(nome)
(Membro(nome)'(msmrpercaMRS)))
>(Titledp'(JaneDoe))
NADA

''Jane''noumttulo.

>(Titledp'(msJaneDoe))
(MSSENHORITAMRS)

''Ms.''estnoconjuntodettulos.

Oprximopassoescreverfunesparadescobrirseumapalavraummachoou
nomeprpriofeminino.Usaremosapenasalgunsexemplosdecadatipodenomepara
manteroexemplobreve.
(masculinoprimeironomessetf
"(JohnKimRichardsfredgeorge))
(fmeaprimeironomessetf
'(Janemarywandabarbarakim))
(Defunmalep(nome)
(E(nomedomembroprimeirosnomesmasculina)
(Not(nomedomembrofemininoprimeirosnomes))))
(Defunfemalep(nome)
(E(nomefemininomembroprimeironomes)
(Not(nomedomembroprimeirosnomesmasculina))))

>(Malep'richard)
T

''Richard''estnoconjuntodemachos.

>(Malep'barbara)
NADA

''Barbara''noumnomemasculino.

>(Femalep'barbara)
T

''Barbara''umnomefeminino.

>(Malep'Kim)
NADA

''Kim''podeserdosexomasculinooudosexofeminino,
porissonoexclusivamentemasculina.

AgorapodemosescreverafunoDTITLEqueadicionaumttuloparaumnome.
Claro,nssiradicionarumttulo,seonomenotiveruma.Seo
primeironomenoreconhecidocomohomemoumulher,vamosjogarpeloseguroeutilizar"Mr.
ouMs."

pgina189

177
CAPTULO6EstruturasListadedados
(Defundarttulo(nome)
"Retornaumnomecomumttuloapropriadona
afrente."
(Cond((nometitledp)name)

((Malep(nome))(nomemr'contras))
((Femalep(nome))(nomems'contras))
(T(acrescentar'(nomedoSenhorouSenhora)))))
>(Dartitle'(missJaneAdams))Jtemumttulo.
(SenhoritaJaneAdams)
>(Dartitle"(JohnQpblico))
(PUBLICMRJOHNQ)

nomemasculinoUntitled.

>(Dartitle"(BarbaraSmith))
(MSBARBARASMITH)

nomefemininoUntitled.

>(Dartitle'(KimJohnson))
(MROUMSKIMJOHNSON)

Untitled,esexo
ambgua.

Ascaractersticasimportantesnesteexemploso(1)quebrarumproblemaparabaixo
empequenasfunessimples,e(2)escreveretestarasfunesdeumdecada
Tempo.UmavezquetivemosaTITLEDP,MALEPepredicadosFEMALEP
escrita,Dttulofoifcildeescrever.
Decomporumproblemaemsubproblemasumahabilidadeimportante.
programadoresexperientesmuitasvezespodemverimediatamenteaformacomoumproblemabreaks
emsubdiviseslgicas,masiniciantesdevemconstruirasuaintuio
atravsdaprtica.
Aquiestomaisalgumascoisasquepodemosfazercomessaslistasdenomes.o
funesabaixonotomarnenhumaentradas,peloqueasualistadeargumentosnulo.
(Defunambguosnomesdegnero()
(interseomachofmeanomesnomes))
(ambguosnomesdegnero)(Kim)
(Defunoriginalmachonames()
(ajustedediferenadesexomasculinonomesfemininosnomes))
(Nomesexclusivamenteporhomens)
(johnrichardfredgeorge)
Atagora,todososconjuntosquejvimosnestecaptulocontinhaapenassmbolose
nmeros.Tambmmuitofciltrabalharcomconjuntosdelistas,masumtruquenecessria

pgina190

178

CommonLisp:AGentleIntroduoComputaoSimblica
utilizarfunescomoMEMBRO,unio,interseoeassimpordianteemconjuntos
delistas.Vejaadiscussosobreo:palavrachaveTESTnosTpicosAvanados
seo.
MINITECLADODEEXERCCIO
6.26. Nsestamosindoparaescreverumprogramaquecomparaasdescriesdosdois
objetosedizquantosrecursosqueelestmemcomum.o
descriesserrepresentadacomoumalistadecaractersticas,comosmbolo
CONTRAasepararoprimeiroobjectoapartirdasegunda.Assim,quandoumadada
listacomo
(Grandeversuscubovermelhobrilhante
pequenapirmidedequatroladosvermelhobrilhante)
oprogramairrespondercom(2caractersticascomuns).Nsvamos
comporesteprogramaapartirdevriaspequenasfunesquevocvaiescrever
etestarumdecadavez.
uma.Escreverumafunonoladodireitoqueretornatodososrecursosparao
direitodaCONTRAasmbolo.Noladodireitodalistaapresentadaacima
deveretornar(PequenosbrilhantesREDPYRAMIDdequatrolados).
Dica:lembresequeafunodemembroretornaointeiro
subListcomeandocomoitemparaoqualvocestprocurando.Testeoseu
funoparasecertificardequefuncionacorretamente.
b.Escreverumafunodoladoesquerdoqueretornatodososrecursosesquerda
doCONTRAa.Vocnopodeusarotruquemembrodiretamenteparaumpresente,

masvocpodeuslosevocfizeralgoparaalistapelaprimeiravez.
c.EscreverumafunoCOUNTcomumqueretornaonmerode
caracterizaosladosesquerdoedireitodaentradatmemcomum.
d.Escreverafunoprincipal,comparar,quelevaumalistaderecursos
descrevemdoisobjectos,comumaCONTRAaentreelas,erelatao
nmeroderecursosqueelestmemcomum.COMPARARdeveretornar
umalistadeformulrio(ncaractersticascomuns).
e.Experimenteaexpresso
(Compare"(cuboversusmetalvermelhopequeno
plsticovermelhopequenocubo))
Vocdeveobter(3)caractersticascomunscomooresultado.

pgina191

179
CAPTULO6EstruturasListadedados
6.8LISTASASTABELAS
Astabelassooutraestruturamuitotilquenspodemosconstruirapartirdelistas.Umamesa,ou
listadeassociao(umalistaparaoshort),umalistadelistas.Cadalistachamadadeentrada,
eocarrodecadaentradaasuachave.Umatabeladecincopalavrasinglesaseseus
equivalentesfrancesesmostradoabaixo.Atabelacontmcincoentradasaschaves

soaspalavrasemingls.
(palavrassetf
'((Umun)
(Doisdeux)
(Trstrois)
(Quatroquatre)
(Cincocinq)))
6.8.1ASSOC
AfunoASSOColhaparaumaentradaemumatabela,dadaasuachave.Aquiesto
algunsexemplos.
('assoctrspalavras)(trstrois)
('assocquatropalavras)(quatroquatre)
(assoc"seispalavras)nil
ASSOCpassapelamesadeumaentradadecadavezatencontrarumachaveque
correspondechaveparaaqualeleestembuscaeleretornaessaentrada.SeASSOC
nopodeencontrarachavenatabela,eleretornaNIL.
ObservequequandoASSOCnoencontrarumaentradacomachavedada,ovalor
eleretornaaentradainteira.Sequeremosapenasapalavrafrancsenoo
Todaentrada,podemostomarosegundoelementodoresultadodaASSOC.
(Defuntranslate(x)
(Segundo(assocxpalavras)))
(traduzir"um)un
(traduzir"cinco)cinq
(traduzir"seis)nil

pgina192

180

CommonLisp:AGentleIntroduoComputaoSimblica
EXERCCIO
6.27. DeveAssocserconsideradoumpredicadomesmoqueelenuncaretorna
T?
6.8.2RASSOC
RASSOCcomoASSOC,excetoqueeleolhaparaocdrdecadaelementodo
tabelaemvezdocarro.(Onomesignifica''ASSOCreversa.'')Parausar
RASSOCcomsmboloscomochaves,atabeladeveserumalistadeparesdepontilhadas,como
esta:
(sonssetf
'((Vaca.Moo)
(Porco.Oink)
(Cat.Miau)
(Co.Trama)
(Pssaro.Twittar)))
(rassoc'tramasoa)(co.trama)
(assoc"soaco)(co.trama)
AmbosASSOCeRASSOCretornoassimqueencontraraprimeiracorrespondncia
entradadatabelaorestodalistanopesquisado.
EXERCCIO
6.28. DefinaoPRODUTOvarivelglobalparaestalista:
((Ma.Fruta)

(Aipo.Veggie)
(Banana.Fruta)
(Alface.Veggie))
Agoraanoteosresultadosdasseguintesexpresses:
(Assoc'ProduodeBanana)
(Rassoc"produzirfrutos)
(Assoc"produziralface)
(Rassoc"produzirveggie)

pgina193

181
CAPTULO6EstruturasListadedados
6.9PROGRAMAOCOMQUADROS
AquiestoutroexemplodousodeASSOC.Vamoscriarumatabelade
objectoseassuasdescries,ondeasdescriessosemelhantesaosdo
ltimaminiexerccioteclado.Nsvamosarmazenaratabeladedescriesnomundial
COISASvariveis.Atabelatemestaaparncia:
((Cuboverdegrandeobject1brilhante)
(Cubovermelhopequenoobject2maantemetal)

(Cubovermelhopequenoobject3maanteplstico)
(Pequenocubodemetalazulmaanteobject4)
(Pequenapirmidevermelhabrilhanteobject5dequatrolados)
(Spheregrandeobject6verde))
Agoravamosdesenvolverfunesparanosdizeremquequalidadesdoisobjetosdiferentes.
Comeamosporescreverumafunochamadadescriopararecuperaro
descriodeumobjeto:
(Descriodefun(x)
(Repouso(assocxcoisas)))
(descrio'object3)
(Cubodeplsticomaantepequenavermelho)
Asdiferenasentreosdoisobjectossooquequerpropriedadesaparecemna
Descriodoprimeiromasnoosegundo,ouadescriodasegunda,mas
nooprimeiro.Otermotcnicoparaissodefinidoexclusivoou.Humbuiltin
CommonLispfunoparacalcularisso.
(Diferenasdefun(xy)
(Setouexclusivo(descriox)
(Descrioy)))
(diferenas"object2'object3)
(Plsticometal)
Object2metal,masobject3deplstico,demodoqueometaleoplsticoso
propriedadesnocomumaambos.Podemosclassificaraspropriedadesdeacordocomo
tipodequalidadeaquesereferem.Aquiestumatabela,representadacomoumalistade
parespontilhadas:
(Qualidadedatabelasetf
'((grande
(pequeno
(vermelho
(verde

.tamanho)
.tamanho)
.cor)
.cor)

pgina194

182

CommonLisp:AGentleIntroduoComputaoSimblica
(azul
.cor)
(brilhante
.brilho)
(enfadonho
.brilho)
(metal
.material)
(plstico
.material)
(cubo
.forma)
(esfera
.forma)
(pirmide
.forma)
(Dequatrolados.Forma)))
Podemosusaressatabelacomopartedeumafunoquenosdaqualidadedeumdeterminado
propriedadereferesea:
(Qualidadedefun(x)
(Cdr(assocxqualidadetable)))
(vermelhoqualidade")cor
(qualidade'grande)tamanho
Usandodiferenasequalidade,nspodemosescreverumafunoparanosdizer
umaqualidadequediferenteentreumpardeobjectos.
(Defunqualidadediferena(xy)
(Qualidade(primeiro(diferenasXY))))
(Qualidadediferena"object2'object3)
materiais
(Qualidadediferena"object1'object6)
forma
(Qualidadediferena"object2'object4)
cor

Esequisssemosumalistadetodasasdiferenasdequalidadeemvezdeapenaso
primeiro?Precisaramosdealgumcaminhoapercorrerapartirdeumalistadediferenascomo(RED
AZULMETALPLASTIC)paraumalistadequalidadescorrespondentes(COR
CORMATERIALMATERIAL),eentoteramosdeeliminar
duplicarelementos.Aprimeirapartepodeserrealizadocomsublis,que
discutidonaseoTpicosavanados.
(Object4diferenas"object3')
(plsticoazulmetalvermelho)

pgina195

183
CAPTULO6EstruturasListadedados
>(Qualidadetablesublis
(Object4diferenas"object3'))
(CorMATERIALMATERIAL)
Agoratudooquetemosafazereliminarentradasduplicadasnoresultado.Comum
LispforneceumafunochamadaRemoveDUPLICATESparaestafinalidade.
(Contrastedefun(xy)
(Removerduplicatas
(Sublismesadequalidade(diferenasXY))))
(contraste'object3'object4)(materialdecor)
EXERCCIOS

EXERCCIOS
6.29. OquevoltaLispprimitivosonmerodeentradasemumatabela?
6,30. FaaumatabelachamadaLIVROSdecincolivroseseusautores.Oprimeiro
entradapodeser(WAREPEACELEOTOLSTOY).
6.31. EscreverafunodaOMSescreveuquelevaonomedeumlivrocomo
deentradaeretornaoautordolivro.
6.32. Suponhaquefazemos(LIVROSsetf(reversoLIVROS)),quereverte
aordempelaqualoscincolivrosaparecemnatabela.Qualsero
functionQUEMESCREVEUfazeragora?
6.33. SuponhaquequeriaumafunoWHATescreveuquetomoudeumautor
nomearcomoentradaedevolveuottulodeumdeseuslivros.Poderia
criamosessafunousandoASSOCeatabelaatual?Seno,
comoqueamesatemqueserdiferente?
6.34. Aquiestumatabeladeestadosealgumasdesuascidades,armazenadonomundial
ATLASvariveis:
((PensilvniaPittsburgh)
(NewjerseyNewark)
(PensilvniaJohnstown)
(Columbo)
(NewjerseyPrinceton)
(Trentonnewjersey))
Suponhaquequeriaencontrartodasascidadesumdeterminadoestadocontm.ASSOC
retornasomenteoprimeiroitemcomumachavecorrespondente,nemtodasessasentradas,demodo
paraesteASSOCtabelanopoderesolveronossoproblema.Redesenharatabelapara
ASSOCquepodeserutilizadocomxito.

pgina196

184

CommonLisp:AGentleIntroduoComputaoSimblica
MINITECLADODEEXERCCIO
6.35. Nesteproblemavamossimularocomportamentodeumaformamuitosimplesdeesprito
criatura,NerdusAmericanis(tambmconhecidocomoComputerusHackerus).
Estacriaturatemapenascincoestados:dormir,comer,esperaparaa
Computador,programao,edepurao.Seucomportamentocclica:depois
eledormeelesemprecome,depoisqueelecomeelesempreesperaporumcomputadore
assimpordiante,atqueapsadepuraoelevaivoltarparadormirporumtempo.
uma.Otipodeestruturadedadosseriatilpararepresentaro
conexoentreumestadoeseusucessor?Escrevertaldedados
estruturaparaociclodecincoestadosdadoacima,earmazenloemummundial
varivelchamadaNERDMEMBROS.
b.EscreverumaNERDUSfunoquelevaonomedeumestadocomoentrada
eusaaestruturadedadosconcebidoparadeterminaroprximoestado
acriaturaestarem.(dormirNERDUS')deveretornar
Comer,porexemplo.(DEBUGGINGNERDUS')deveretornar
DORMINDO.
c.Qualoresultadode(NERDUS'JOGARGUITAR)?
d.QuandoNerdusAmericanisingeremuitosestimulantes(cafena
overdose),elepradedormir.
Depoisdeterminaradepurao,
imediatamentepassaaafirmarquecome.EscreverumafunoSLEEPLESS
NERDquefuncionacomoNERDUSexcetoquenuncadorme.Seu
funodevesereferirvarivelglobalNERDMembros,talcomo
NERDUSfaz.
e.ExpondoNerdusAmericanisavaloresextremosdequmica
estimulantesproduzumcomportamentopatolgico.Emvezdeumaformaordenada
avanarparaoprximoestado,acriaturaavanadoisestados.Para
exemplo,elevaideComerdiretamenteaprogramaoe,apartir
lparadormir.EscreverumafunoNERDONcafenaque
exibeestapatologiaincomum.Suafunodeveutilizaramesma
mesacomoNERDUS.

f.SeumNerddecafenaestactualmenteaprogramao,comomuitosestados
serquevaiterquepassarporantesdeserdepurao?
RESUMO
Aslistassoumtipodedadosimportantesemseuprpriodireito,masemLispelessoainda
maisimportante,porqueelessoutilizadosparaimplementarasestruturasdedados,taisoutros
comoconjuntosetabelas.

pgina197

185
CAPTULO6EstruturasListadedados
Comovimosnominiexercciosdeteclado,amaneiraderesolverqualquernontrivial
problemadeprogramaodividiroproblemaempartesmenores,maismanejveis
peas.Issofeitoporescreveretestarvriasfunessimples,emseguida,
combinandoosparaproduzirumasoluoparaoproblemaprincipal.
exercciosdereviso
6.36. Escrevaumafunoparatrocaroprimeiroeltimoelementosdequalquerlista.(TROCA
PRIMEIROLAST'(vocnopodecompraroamor))deveretornar(AMOR
NopodecomprarVOC).
6,37. Rodarparaaesquerdaerodarparaadireitasofunesquegiramo
elementosdeumalista.(Rodarparaaesquerda"(ABCDE))retorna(BCDE
A),enquantoqueosretornosrodarparaadireita(EABCD).Escrevaestes
funes.

6.38. DumexemplodedoisconjuntosXeYtalque(SETDIFERENAX
Y)iguala(SETDIFERENAYX).Tambmdarumexemplonoqual
asdiferenasajustadossonoiguais.
6.39. Lembresedosistemaaritmticounriodesenvolvidanostpicosavanados
seodafunoCaptulo2.Oquelistarealizaaadiounria?
6.40. Mostrarcomotransformaralista(ABCD)emumatabelaparaquea
funoASSOCusandoatabeladomesmoresultadoqueMEMBRO
usandoalista.
FUNESabordadosnestecaptulo
funesdelista:Acrescentar,reverso,NTH,NTHCDR,LAST,REMOVE.
Definirfunes:unio,interseo,setDIFERENA,SET
EXCLUSIVEOR,MEMBRO,subsetp,removerduplicatas.
funesdetabela:ASSOC,RASSOC.

pgina198

186

CommonLisp:AGentleIntroduoComputaoSimblica

ToolkitLisp:SDRAW

SDRAWumaferramentaparadesenhocontrascelularrepresentaesdelistas.Nofazparte
dopadroCommonLispeledefinidonoApndiceA.Hvrios
verses.AversototalmenteporttilserexecutadoemqualquerCommonLisp
implementaoeledesenhadiagramasdeclulascontrasusandocaracteresordinrios,assim:
>(Sdraw'(alpha(bravo)charlie))
[*|*]>[*|*]>[*|*]>NIL
|
|
|
v
v
v
ALFA
[*|*]>NIL
CHARLIE
|
v
BRAVO
Htambmumnmerodeversesgrficas,disponvelemdisqueteapartirde
editor,queextrairclulascontrasesetasusandoasfunesgrficas.Eles
olharmuitomaisagradveldessaforma.UmaversogrficautilizaCLX,oCommonLisp
interfacecomosistemaXWindow.SeoseucomputadornoforexecutadoX
Windows,vocnosercapazdeusarestaverso,masseoseuLispfornece
algumaoutrainstalaodeelementosgrficos,deveserfcildeseadaptarSDRAWparauslo.
OutraferramentatilafunoSDRAWLOOP,quefuncionacomoumaleitura
loopdeevalprint,excetoeledesenhaoresultado,bemcomoimprimilo.SDRAW
LOOPpedeaintroduocomastring''S>.''Aquiestumexemplo.

pgina199

187
CAPTULO6EstruturasListadedados
>(Sdrawcircular)
DigitequalquerexpressoLisp,ou(abort)parasair.
S>(cons"(avesnotem)'narizes)
[*|*]>NARIZES
|
v
[*|*]>[*|*]>[*|*]>NIL
|
|
|
v
v
v
AVES
NO
TER
Resultado:((AVESNOTEM)narizes.)

S>(acrescente"(eles)'(tmbicos))
[*|*]>[*|*]>[*|*]>NIL
|
|
|
v
v
v
ELES
TER
BICOS
Resultado:(elestmbicos)

S>(abortar)
UmaterceirafunofornecidapeloprogramaSDRAWchamadorabisco.isto
umaversointerativadoSDRAWquepermitequevoc''crawlemtornode''umalista
tomandocarrossucessivaseCDRs,backup,ouvoltaraoincio.

pgina200

188

CommonLisp:AGentleIntroduoComputaoSimblica

Exerccioteclado

NesteexercciotecladovamosescreveralgumasrotinasparamoverRobbieo
robotemtornodeumacasa.OmapadacasaaparecenaFigura62.Robbie
podemoverseemqualquerdasquatrodirees:norte,sul,lesteouoeste.

Figura62MapoftheHouse.
Olayoutdacasadescritoemumatabelachamadaquartos,comum
elementoparacadasala:
((saladeestar...)

(Noandardecimaquarto...)
(saladejantar...)
(cozinha...)

pgina201

189
CAPTULO6EstruturasListadedados
(Despensa...)
(Nopisotrreoquarto...)
(Backescadas...)
(Frontescadas...)
(Biblioteca...))
AentradaparacadaquartoporsuavezumatabelalistandoasinstruesqueRobbie
podeviajardequeasalaeondeeleacabaparacadadireo.ointeiro
tabelamostradonaFigura63.Oprimeiroelementodatabela:
(saladeestar
(Frontescadasnorte)
(Saladejantarsul)
(Cozinhaleste))
SeRobbieestavamnasaladeestar,indoparaonorteolevariaparaafrente
escadas,indoparaosulirialevloparaasaladejantar,eindoparaolesteiria
levloparaacozinha.Umavezquenohnadacoletadosparaoeste,assumimosque
humaparedel,entoRobbienopodeviajarparaooesteapartirdasaladeestar.
EXERCCIO

6.41. Seatabeladequartosjestarmazenadonocomputadorparavoc,coloqueo
arquivoqueacontm.Seno,vocterquedigitaramesaemcomoeleaparece
naFigura63.Sevocgosta,tente(salasSDRAW)ou(rabisco
Quartos)paravisualizaratabelacomoumaestruturacelularcontras.
uma.Escreverumafunoescolhasquelevaonomedeumasalacomoentrada
eretornaatabeladedirecesadmissveisRobbiepodelevarde
naquelasala.Porexemplo,(DESPENSA'ESCOLHAS)deveretornara
lista((NORTHCOZINHA)(WESTsaladejantar)).Testeoseu
funcionarparagarantirqueeleretornaoresultadocorreto.
b.Escreverumolharfunoquelevaduasentradas,umadireoeuma
quarto,edizondeRobbieiriaacabarseelemudousenesse
direodaquelequarto.
Porexemplo,('NORTHOLHAR
'DESPENSA)deveretornarcozinha.(DESPENSAOLHAR"Ocidente")
deveretornarsaladejantar.
(DESPENSAOLHAR"Sul")
deveretornarNIL.DICA:Afunodeescolhasserouminstrumentotil
blocodeconstruo.
c.NsvamosusaroLOCvarivelglobalparaarmazenaralocalizaodoRobbie.
Digiteumaexpressoparadefinirsualocalizaoparaseradespensa.o
seguintefunodeveserusadasemprequevocquisermudarasua
localizao.

pgina202

190

CommonLisp:AGentleIntroduoComputaoSimblica

(DefunsetRobbielocation(lugar)
"MoveRobbieparaLUGAR,definindo
LOCvarivel".
(Lugarlocsetf))
d.EscreverumafunoComoMuitosescolhasquedizquantas
escolhasRobbietemparaondemoverparaaprxima.Suafunodeve
consulteoLOCvarivelglobalparaencontrarasualocalizaoactual.Seele
nadespensa,(ComoMuitosESCOLHAS)deveretornar2.
e.EscreverumaUPSTAIRSPpredicadoqueretornaTsesuaentradaum
localizaonoandardecima.(Abibliotecaeoquartonoandardecimasoanica
doislocaisnoandardecima.)EscrevaumaONSTAIRSPpredicadoqueretorna
TsesuaentradaouFRONTescadasouBACKescadas.
f.OndeestRobbie?EscreverumafunodehentradaschamadosWHEREque
dizondeRobbie.Seeleestnabiblioteca,(WHERE)devedizer
(ROBBIEestlemcimadabiblioteca).Seeleestno
cozinha,eledevedizer(ROBBIEestlembaixoNO
COZINHA).Seeleestnaescadadafrente,eledevedizer(ROBBIEIS
NOFRONTescadas).
g.EscreverumaMOVIMENTOfunoquerecebeumaentrada,umadireo,emovese
Robbienessadireo.MOVIMENTOdevefazerusodoolhar
funoquevocescreveuanteriormente,edevechamarSETROBBIE
LOCALIZAOparamovlo.SeRobbienopodemoversenoespecificado
direoumamensagemapropriadadeveserdevolvido.Porexemplo,
SeRobbieestnadespensa,(MOVE'SOUTH)deveretornar
algocomo(AI!ROBBIEbateremumaparede).(MOVER
'Norte)devemudaralocalizaodeRobbieeretornar(ROBBIEIS
Lembaixonacozinha).
h.Apartirdadespensa,tomarRobbieparaabibliotecaatravsdavolta
escadas.Emseguida,levloparaacozinha,masnolevloatravsdo
quartoandardebaixonocaminho.

pgina203

191
CAPTULO6EstruturasListadedados

(quartossetf
'((saladeestar

(Frontescadasnorte)
(Saladejantarsul)
(Cozinhaleste))

(Noandarsuperiorquarto(bibliotecaoeste)
(Frontescadassul))
(saladejantar

(SaladeestardoNorte)
(Despensaleste)
(Oesteandardebaixoquarto))

(cozinha

(Saladeestaroeste)
(Copasul))

(despensa

(Cozinhanorte)

(Saladejantaroeste))
(Nopisotrreoquarto(Nortedevoltaescadas)
(Saladejantarleste))
(backescadas

(Sulandardebaixoquartos)
(Bibliotecanorte))

(frontescadas

(Noandardecimaquartosnorte)
(Saladeestarsul))

(biblioteca

(Noandardecimaquartoleste)
(Sulbackescadas))))

Figura63TableofRooms.

pgina204

192

CommonLisp:AGentleIntroduoComputaoSimblica

Tpicosavanados

6.10RVORES
rvoressolistasaninhadas.Todasasfunescobertasatagoraoperamnonvelsuperior
deumalistaelesnoolharparaqualquermaisdaestruturadoqueisso.Lisptambm
incluialgumasfunesqueoperamemtodaaestruturadalista.Duasdestas
soSUBSTesublis.Nocaptulo8,vamosescrevermuitasmaisfunesque
operaremrvores.
6.10.1SUBST
AfunoSUBSTsubstituiumitemparaoutrosemprequeaparecena
umalista.Levatrsentradascujaordemcomonafrase''substitutoxparayem
z.''AquiestumexemplodesubstituindoFREDparaBillemumadeterminadalista:
>(Contadesubst'fred'
'(Contajonesmeenviouumdiscriminada
contaparaospneus))
(FREDJONESmeenviouumdiscriminada
FREDparaospneus)
Seosmbolosendoprocuradonoapareceremtudonalista,retornosSUBST
alistaoriginalinalterado.
>(Subst'bill'fred'(manteragrama))
(NOPISENAGRAMA)
>(Subst'on'off'(manteragrama))
(MANTERNAGRAMA)
SUBSTolhaparatodaaestruturadalista,noapenasodenvelsuperior
elementos.

pgina205

193
CAPTULO6EstruturasListadedados
>(Subst'a'a
'((Umchapeleiro)(alebre)e(adormouse)))
((OHATTER)(alebre)E(oRato))
6.10.2sublis
Subliscomosubst,excetoqueelepodefazermuitassubstituies
simultaneamente.Aprimeiraentradaparasublisumatabelacujasentradassopontilhadas
pares.Asegundaentradaalistanaqualassubstituiesdevemserfeitas.
>(Sublis'((rosas.Violetas)(vermelho.Blue))
'(rosassovermelhas))
(VIOLETASSOAZUIS)
(palavraspontilhadosetf
'((Um.Un)
(Duas.Deux)
(Trs.Trois)
(Quatro.Quatre)
(Cinco.Cinq)))
>(sublispalavraspontilhadas'(trsumquatroumcinco))
(CINQQUATREUNTROISONU)

EXERCCIO
6.42. EscreverumafunochamadaROYALWEquemudaacadaocorrnciade
osmboloIemumalistaparaosmboloWE.Chamaressafunonalista
(SedescobrirLISPtereiomaiorprazer)deveretornaralista(IF
NSAPRENDEMOSLISPteremosomaiorprazer).
6.11eficinciadasoperaesLISTA
Noinciodocaptulo,falamossobrecomoaslistasaparecemsimtricaem
parntesenotao,maselesrealmentenoso.Outramaneiraessaassimetria
mostrasenavelocidadeouaeficinciadedeterminadasoperaesrelativa.Para
exemplo,trivialparaextrairoprimeiroelementodeumalista,masdispendioso
extrairaltima.Aoextrairoprimeiroelemento,comeamoscomumponteiropara
aprimeiraclulacontrasAprimeirafunoapenastemdeobteroponteirodo
carrodessaclulaedevolvlo.Encontraroltimoelementodalistaenvolvemuito

pgina206

194

CommonLisp:AGentleIntroduoComputaoSimblica
maistrabalho,porqueanicamaneiradeobtloseguiracadeiadeponteiros
apartirdaprimeiraclulaatchegarmosaumaclulacujocdrumtomo.Sentopode
olharmosnocarro.Sealistaoriginalmuitolongo,podedemorarumpoucopara
encontraraltimaclulapor''cdringparabaixonalista'',comochamado.

Computadorespodeseguircadeiasdecemmilcontrasclulasoumaisem
bemmenosdeumsegundo,entovocterquenormalmentenonotaradiferenadevelocidade
entreoprimeiroeltimo,sevocestchamandolosdaleituradenvelsuperior
loopdeevalprint.Massevocescreverumgrandeprogramaqueenvolvemuitoslista
operaes,adiferenaserperceptvel.
Outrofactorqueafectaavelocidadedeumafunoaquantidadequeconsing
faz.Acriaodenovasclulascontraslevatempo,etambmencheocomputadorde
memria.Eventualmente,algumasdestasclulasserodescartados,masaindatomar
espao.EmalgumasimplementaesLisp,amemriapodesetornarcompletamentecheio
comclulascontrasinteis,casoemqueamquinadeveparartemporariamentee
executarumacoletadelixo.Quantomaisconsingumafunofaz,mais
frequentesascoletasdelixo.Vamoscompararaeficinciadestesdois
versesdeADDTOEND:
(Defunadicionartoend1(xy)
(Anexarx(listay)))
(Defunadicionartoend2(xy)
(Reverso(consy(reversox))))
Suponhamosqueaprimeiraentradaparaessasfunesumalistadenelementos.ADICIONAR
FIM1cpiasnaprimeiraentradautilizandoAPPEND,quetachaslistacontendo
asegundaentradaparaaextremidade.Elacriaassimumtotaldenumclulascontras.ADICIONAR
TOEND2comeainvertendosuaprimeiraentrada,quecriannovasclulascontras
Emseguida,eleconsesasegundaentradaparaisso,oquefazcomqueumanovaclulafinalmente
inverteoresultado,quefazumoutronnovasclulas1.Entoadicioneaponta2
criaumtotalden+1+(n+1)clulascontra,dosquaisoltimoN1formamo
resultado.Aoutran+1sojogadosforalogodepoisqueelessocriadoseles
tornarse''lixo.''Claramente,ADDTOEND1afunomaiseficiente,
umavezquecriamenosclulascontras.
6.12estruturacompartilhada
Duaslistassodisseparacompartilharestruturaseelestmclulascontrasemcomum.listas
quesodigitadosapartirdotecladonuncavaicompartilharaestrutura,porqueLEIA
constritodasaslistasquevapartirdeclulascontrasfrescos.MasousodeCAR,CDR,e

pgina207

195
CAPTULO6EstruturasListadedados
CONSpossvelcriarlistasquefazemestruturaacionria.Porexemplo,nspodemos
fazerXeYaponteparalistasquecompartilhamalgumaestrutura,fazendooseguinte:
>(Setfx'(ABC))
(ABC)
>(Setfy(d'contras(cdrx)))
(DBC)
OvalordeX(ABC)eovalordeY(DBC).Aslistascompartilhar
amesmaestruturacelularcontraspara(BC),comoaseguirindica.apartilha
aconteceporquensconstrumosYapartirde(CDRX).Setivssemosdissesimplesmente(SETF
Y'(DBC)),nenhumaestruturaseriacompartilhadocomX.
x
NADA

UMA
y

B
D

6.13AIGUALDADEDEOBJETOS

EmLisp,smbolossonicos,oquesignificaquepodeserapenasumsmbolono
** Cadaobjetonamemriatemum
memriadocomputadorcomumdeterminadonome.
localizaonumerada,chamadodeendereo.Desdeumsmboloexisteemumslugar
namemria,smbolostmendereosnicos.Entonalista(TEMPODEPOIS
TIME),asduasocorrnciasdosmbolotempodevereferirseamesma
endereo.NopodehaverdoissmbolosseparadoschamadosTIME.

**Notaaosinstrutores:Estamosassumindoqueapenasospacotespadroestopresentes,enoexistam
smbolosuninterned.Essesdetalhesnovaiinteressaroinciolisper.

pgina208

196

CommonLisp:AGentleIntroduoComputaoSimblica

NADA
DEPOISDE

nome

"TEMPO"

Listas,poroutrolado,nosonicos.Podemosfacilmenteterdoisdiferentes
listas(ABC)simplesmentefazendoduascadeiasdeclulascontrasseparadas.Ossmbolosa
qualopontodeduaslistassernica,masaslistasemsinoser.
IstosignificaqueafunoEQUALnosepodecompararlistas,comparandoas
endereos,porque(ABC)e(ABC)soiguais,mesmoqueelessodistintos
cadeiasdeclulascontras.portanto,igualcomparaelementolistasporelemento.Seo
elementoscorrespondentesdeduaslistassoiguais,entoaslistassoelesprprios
consideradosiguais.
>(Setfx1(listade'a'b'c))
(ABC)

Faaumalistafresca(ABC).

>(Setfx2(listade'a'b'c))
(ABC)

Faaoutralista(ABC).

>(X1x2igual)
T

Aslistassoiguais.

Sequeremosdizersedoisponteirosapontamparaomesmoobjeto,devemos
compararseusendereos.OpredicadoEQ(pronunciase''eek'')fazisso.
AslistassoEQunsaosoutrosapenassetiveremomesmoendereopornenhumelemento
comparaoelementofeito.
>(X1x2eq)
NADA

AsduaslistasnosoEQ.

pgina209

197
CAPTULO6EstruturasListadedados
>(Zsetfx1)
(ABC)

AgoraZapontaparaamesmalistaqueX1.

>(Zeqx1)
T

EntoZeX1soEQ.

>(Eqz'(ABC))
NADA

Estaslistastmendereosdiferentes.

>(Igualz'(ABC))
T

Maselestmosmesmoselementos.

AfunoEQmaisrpidodoqueafunoEQUALporqueEQtemapenas
paracompararumendereocontraoutroendereo,Considerandoqueaigualdadetemqueprimeiro
testeseassuasentradasforemlistas,eseassimfor,devecompararcadaelementodeumcontra
oelementocorrespondentedooutro.Devidosuamaioreficincia,
programadorescostumamusarEQvezdeEQUALquandoossmbolosestosendo
comparao.ElesnocostumamusarEQemlistas,amenosqueelesqueremdizer
seduascontrasasclulassoasmesmas.
OsnmerostmdiferentesrepresentaesinternasemdiferentessistemasLisp.
Emalgumasimplementaescadanmerotemumendereoexclusivo,enquantoqueemoutros
issonoverdade.PortantoEQnuncadeveserusadoparacompararnmeros.
OpredicadoEQLumavarianteligeiramentemaisgeraldeEQ.elecompara
osendereosdeobjectoscomoEQfaz,exceptoqueparadoisnmerosdamesma
digite(porexemplo,ambosinteiros),eleircompararseusvaloresemvezdisso.
NmerosdediferentestiposnosoEQL,mesmoseosseusvaloressoosmesmos.
(EQL'foo'foo)t

(EQL33)t
(EQL33.0)nil

Tiposdiferentes.

EQLo''padro''ComparaodepredicadoemCommonLisp.Funes
taiscomoMembroeASSOCquecontmtestesimplcitosdeigualdadedefazlas
usandoEQLamenosqueditoparausaralgumoutropredicado.
Paracompararosnmerosdetiposdiferentes,haindaumoutroigualdade
predicadochamados=.Estepredicadoaformamaiseficienteparacomparardois
nmeros.umerroparadarlhequalqueroutrotipodeentrada.
(=33,0)t
(='Foo'foo)Erro!FOOnoumnmero.

pgina210

198

CommonLisp:AGentleIntroduoComputaoSimblica
Finalmente,opredicadoequalpsemelhanteaEQUAL,masemalgumasmaneiras
maisliberal.Umexemploestignorandodistinesdecasoemcordas.
(igual"foobar""FooBAR")nil
(equalp"foobar""FooBAR")t
Iniciantessofrequentementeconfundidospelaprofusodetestesdeigualdadeno
Lispcomum.Eurecomendoesquecertodosestesespecializada
funeslembresedoispedaosdeconselhos.Primeiro,useEQUAL:Elefazoque

vocquer.Emsegundolugar,lembresequefunesinternas,comomembroe
ASSOC,queenvolvemtestesimplcitosdeigualdade,useEQLporpadro,para
razesdeeficincia.Issosignificaqueelesnovocompararlistascorretamente,amenos
vocdigaaelesparausarumpredicadodeigualdadediferente.Aprximaseoexplica
comofazerisso.Pararesumir:
EQotestemaisrpidoigualdade:Comparaendereos.especialistasusar
loparacompararsmbolosrapidamente,eparatestarseduasclulascontras
sofisicamenteomesmoobjeto.Nodeveserusadoparacomparar
nmeros.
EQLcomoEQ,excetoquepodecompararcomseguranaosnmerosdomesmo
tipo,comodoisinteirosoudoisnmerosdepontoflutuante.o
defaulttestedeigualdadeemCommonLisp.
EQUALopredicadoiniciantesdevemusar.Elecomparalistas
elementoporelementocasocontrrio,elefuncionacomoEQL.
equalpmaisliberaldoqueEQUAL:Eleignoradistinesdecaso
emcordas,entreoutrascoisas.
=aformamaiseficienteparacompararnmeros,eanicamaneira
compararosnmerosdetiposdiferentes,taiscomo3e3,0.eles
aceitanmeros.
6.14argumentos
MuitasfunesCommonLispquetrabalhamemlistaspodetomarextra,opcional
argumentoschamadosargumentos.Porexemplo,afunoremove
recebeumargumentoopcionalchamado:COUNTquelhedizquantasinstnciasde
oitempararemover.
(Textosetf'(bananapanda))

pgina211

199
CAPTULO6EstruturasListadedados
>(Remover"umtexto)
(BNNPND)

RemovatodasasComo.

>(Remover"umtexto:contagem3)
(BNNPANDA)

Remover3Como.

Removatambmaceitaum:palavrachaveFROMEND.SeovalorfornoNIL,
REMOVERentocomeaapartirdofimdalista,emvezdeapartirdoincio.
Ento,pararemoverosdoisltimosComonalista,podemosescrever:
>(Remover"umtexto:contagem2:definalt)
(BANANAPND)
Apalavrachaveumtipoespecialdesmbolocujonomesempreprecedidopor
doispontos.Ossmbolosdecontageme:COUNTnosoosmesmoselesso
diferentesobjectosenoEQparaooutro. *** Palavraschavesempreavaliara
se,entoelesnoprecisamestarentreaspas.umerroparatentarmudaro
valordeumapalavrachave.OpredicadoKEYWORDPretornaTsesuaentradaum
palavrachave.
:contagem:contagem
(symbolp:count)t
(igual:contagem'contam)nil
(contagemkeywordp')nil
(keywordp:count)t
Outrafunoquelevaargumentosmembro.Normalmente,
MEMBROusaEQLparatestarseumitemapareceemumconjunto.EQLfuncionar
corretamenteparaambosossmbolosenmeros.Massuponhaqueonossoconjuntocontmlistas?
Nessecaso,devemosusarEQUALparaotestedeigualdade,ouentoMEMBRO
novaiencontraroitemqueestamosprocurando:

(cartessetf
'((3clubes)(5diamantes)(psace)))
(cartesdemembro'(5diamantes))nil
(segundascartas)(cincodiamantes)

***
Mesmoqueestessmbolostmomesmonome,elesexistememdiferentespacotes''''eassimsodistintos.

pgina212

200

CommonLisp:AGentleIntroduoComputaoSimblica

(EQL(segundocarto)'(5diamantes))nil
(iguais(segundocarto)"(5)diamantes)t
A:testeapalavrachavepodeserusadocomomembroparaespecificarumdiferente
funoparaotestedeigualdade.Nsescrevemos#'EQUALparacitarespecialmentea
funoparausocomoumaentradaaomembro.
>(Membro'(5diamantes)Cartes:teste#'iguais)
((5diamantes)(ACEPS))
Todasasfunesdelistaqueincluemtestesdeigualdadeaceitarum:palavrachaveTEST
argumento.REMOVEoutroexemplo.Nopoderemover(5diamantes)

apartirdecartes,amenosquedigaREMOVERusarEQUALporseutestedeigualdade.
>(Remove'(5)diamantescartes)
((3clubes)(5diamantes)(ACEPS))
>(Remove'(5diamantes)cartes:test#'iguais)
((3clubes)(ACEPS))
Outrasfunesqueaceitamuma:palavrachavedetestesoUNIO,
INTERSECTION,setDIFERENA,ASSOC,RASSOC,SUBSTe
Sublis.ParadescobrirquaispalavraschaveAfunoaceita,utilizeoonline
documentao.umerroparafornecerumapalavrachaveparaumafunoquenoest
esperandoqueapalavrachave.
>(Remove'(psace)cartes:razo"msorte)
Erro!:Razoumargumentopalavrachaveinvlida
remover.
FunesdescritasTPICOSAVANADOS
funesTree:SUBST,sublis.
Funesadicionaisdeigualdade:EQ,EQL,equalp,=.
predicadopalavrachave:KEYWORDP.

pgina213

ProgramaoApplicative

7.1INTRODUO
Ostrsestilosdeprogramaovamosabordarnestelivrosoaplicativa
programao,recursividadeeiterao.Muitosinstrutorespreferemensinar
recursoemprimeirolugar,maseuacreditoqueaprogramaoaplicativoomaisfcilpara
iniciantesparaaprender.Paraacomodartodososgostos,captulos7e8tm
sidofeitaindependentequepodesercobertaporqualquerordem.
programaodeaplicativobaseadonaideiadequeasfunessodedados,apenas
comosmboloselistassodados,porissodevesercapazdepassarfunescomo
entradasparaoutrasfunes,etambmretornamfunescomovalores.oaplicativo
operadoresqueestudaremosnestecaptulosofunesquerecebemoutrafuno
comoentradaeaplicloaoselementosdeumalistadevriasmaneiras.estesoperadores
sotodosconstrudosapartirdeumafunoprimitivaconhecidacomofuncall.NoAvanada
secodetpicosqueiremosescrevernossoprpriooperadordoaplicativo,etambmescreveruma
funoqueconstrieretornanovasfunes.

7.2funcall
Funcallchamaumafunoemalgumasentradas.Podemosusarfuncallparachamar
OscontrasfuncionarnasentradasAeBcomoeste:
(funcall#'contras'a'b)(a.b)
201

pgina214

202

CommonLisp:AGentleIntroduoComputaoSimblica
A#'(ou''Citaoafiada'')notaoamaneiracorretadecitarumafuno
emCommonLisp.SevocquiserveroqueosCONSfunopareceem
suaimplementao,tenteoseguinteexemploemsuaLisp:
>(conssetffn'#)
#<FunoCompiladoCONS{6041410}>
>fn
#<FunoCompiladoCONS{6041410}>
>(Tipodefn)
COMPILADAFUNO
>(Funcallfn'c'd)
(C.D)

OvalordavariveldeFNumobjectofuno.TYPEDOSmostraqueo
objetodotipoCOMPILADAFUNO.Entovocvqueasfunese
smbolosnosoosmesmos.OsmboloCONSservecomoonomedo
CONSfuncionar,masnoafunoreal.Orelacionamentoentre
funeseossmbolosquelhesnomeexplicadoemTpicosAvanados
seco3.18.
Notesequeapenasasfunescomunspodemsercitadoscom#'.umerro
Citandoumafunomacrooufunoespecialdestamaneira,ouparacitarumsmbolocom
#'Seessesmbolononomearumafuno.
>#'Se
Erro:senoumafunocomum.
>#'nabos
Erro:Nabosumafunoindefinida.
7.3OOPERADORmapcar
Mapcarooperadordoaplicativo,utilizadocommaisfrequncia.Aplicaseuma
funcionaracadaelementodeumalista,umdecadavez,eretornaumalistadosresultados.
Suponhaquetenhaescritoumafunodeenquadrarumniconmero.Porsis,este
funonopodeenquadrarumalistadenmeros,porque*nofuncionaemlistas.
(Defunquadrado(n)(*nn))
(quadrado3)9

pgina215

203
CAPTULO7ApplicativeProgramao

(quadrado"(12345))Erro!Tipodeentradaerrado*.
Commapcarpodemosaplicarquadradosparacadaelementodalista
individualmente.ParapassarafunoQUADRADOcomoumaentradaparamapcar,ns
Citaoloporescrito'#quadrados.
>(mapcar#"quadrado"(12345))
(1941625)
>(mapcar#"quadrado"(3835210))
(9649254100)
Aquiestumadescriogrficadooperadormapcar.Comovocpodever,
cadaelementodalistadeentradamapeadoparaumacorrespondenteindependentemente
elementonasada.

Quandomapcarusadoemumalistadecomprimenton,alistaresultantetambmtem
exatamentenelementos.Portanto,semapcarusadonalistavazia,oresultadoa
listavazia.
(mapcar#"quadrado"())nil
7,4manipulaodetabelasCOMmapcar
SuponhaquedefinirasPALAVRASvarivelglobalparaumatabeladeInglseFrancs
palavras:
(palavrassetf
'((Umun)
(Doisdeux)

(Trstrois)
(Quatroquatre)
(Cincocinq)))

pgina216

204

CommonLisp:AGentleIntroduoComputaoSimblica
Podemosrealizarvriasmanipulaesteisnestatabelacommapcar.
Podemosextrairaspalavrasemingls,tendooprimeirocomponentedecadatabela
entrada:
>(primeiraspalavrasmapcar'#)
(UMDOISTRSQUATROCINCO)
Podemosextrairaspalavrasfrancesas,tendoosegundocomponentedecada
entrada:
>(segundopalavrasmapcar'#)
(DEUXTROISQUATRECINQONU)
PodemoscriarumdicionrioFrancsInglsdaqueleInglsFrancspela
revertendocadaelementodatabela:
>(palavrasreversamapcar'#)
((ONUONE)
(DEUXDOIS)

(TROISTRS)
(QUATREQUATRO)
(CINQcinco))
Dadaumafunodetraduo,definidadeacordocomASSOC,podemostraduzira
seqnciadedgitosinglsparaumasriedeosfranceses:
(Defuntranslate(x)
(Segundo(assocxpalavras)))
>(Mapcar#"traduzir"(trsumquatroumcinco))
(CINQQUATREUNTROISONU)
Almmapcar,existemvriosoutrosoperadoresaplicativasconstrudospara
Lispcomum.Muitosmaissodefinidospelosprogramadorescomoelessonecessrios,
usandofuncall.
EXERCCIOS
7.1. EscreverumafunoADD1queadicionaumasuaentrada.Emseguida,escreverum
expressoparaadicionarumparacadaelementodalista(13579).
7.2. DeixeavarivelDAILYPLANETmundialconteraseguintetabela:
((Olsenjimmy123764535cubreprter)
(Kentclark089526787reprter)
(Pistalois951261438reprter)
(BrancoeditorPerry355167439))

pgina217

205
CAPTULO7ApplicativeProgramao
Cadaentradadatabelaconsisteemumapelido,umnome,umaseguranasocial
nmeroeumcargo.Usemapcarnestatabelaparaextrairumalistade
nmerosdeseguranasocial.
7.3. EscrevaumaexpressoparaaplicaropredicadoZEROPacadaelemento
alista(2034056).ArespostaquevocrecebedeveserumalistadeTse
NIL.
7.4. Suponhaquequeremosresolverumproblemasemelhanteaoanterior,mas
emvezdetestarseumelementozero,queremostestarseele
maiordoquecinco.Nsnopodemosusar>diretamenteparaisso,porque>um
funodeduasentradasMapcarsirdarlheumaentrada.exposio
comoprimeiraescrevendoumafunodeentradachamadaSUPERIORACINCO
Pajudaria.
7,5expresseslambda
Hduasmaneirasdeespecificarafunoaserutilizadosporumaplicativo
operador.AprimeiramaneiradefinirafunocomDefuneespecifique
lopor"#nome,comotemosvindoafazer.Asegundamaneirapassarafuno
definiodiretamente.Issofeitoporescritoumalistachamadaumaexpressolambda.
Porexemplo,aseguinteexpressolambdacalculaoquadradodasua
entrada:
(Lambda(N)(*nn))
Umavezqueasexpresseslambdasofunes,quepodeserpassadodirectamentepara
Mapcarcitandoloscom#'.Issopoupaotrabalhodeescreverum
Defunseparadoantesdechamarmapcar.
>(Mapcar#'(lambda(N)(*nn))'(12345))
(1941625)
AsexpresseslambdasemelhanteaoDEFUNs,excetoqueafuno
nomeestausenteeapalavraLAMBDAapareceemvezdedefun.Mas
expresseslambdasorealmentefunessemnome.Lambdanoumamacro
oufunoespecialquetemdeseravaliado,comodefun.Pelocontrrio,ummarcador
quedizque''estalistarepresentaumafuno.''
Asexpresseslambdasoespecialmenteteisparaasntesedeumaentrada
funesdefunesrelacionadasdeduasentradas.Porexemplo,suponhaque

queriamultiplicarcadaelementodeumalistade10.Podemossertentadosa
escreveralgocomo:

pgina218

206

CommonLisp:AGentleIntroduoComputaoSimblica
(Mapcar#'*'(12345))
Masondeesto10deveriair?O*funoprecisadeduasentradas,mas
Mapcarsvaidarlheum.Amaneiracorretaderesolveresteproblema
escreverumaexpressolambdadeumaentradaquemultiplicaasuaentradaem10.
Ento,podemosalimentaraexpressolambdaparamapcar.
>(Mapcar#'(lambda(N)(N*10))'(12345))
(1020304050)
Aquioutroexemplodautilizaodemapcarjuntamentecomumlambda
expresso.Vamostransformarcadaelementodeumalistadenomesemumalista(HI
Lnome).
>(Mapcar#'(lambda(x)(listade'oi'hx))
'(Joefredwanda))
((HILJOE)(HILFRED)(HILWANDA))
Sevocdigitarumaexpressolambdacotadoanvelsuperior,oresultadoqueobtm
voltadependedaimplementaoLispparticularquevocestusando.poderia
parecidocomqualquerumdosseguintes:

>(Lambda(N)(N*10))
Erro:IndefinidofunoLAMBDA.

Noseesqueadecitlo!

>#'(Lambda(N)(N*10))
(Lambda(N)(N*10))
>#'(Lambda(N)(N*10))
#<Interpretadofunes3515162>
>#'(Lambda(N)(N*10))
#<Lexicalfechamento{7142156}>
Aolongodestelivrovamosnosreferiraosobjetosvocvoltardeum
#'(...LAMBDA)expressocomofechamentoslexicais.Elesserodiscutidosem
maisdetalhesnaseoTpicosavanados.
EXERCCIOS
7.5. Escreverumaexpressolambdaparasubtrairsetedeumnmero.
7.6. EscreverumaexpressolambdaqueretornaTsesuaentradaTouNIL,mas
NILparaqualqueroutraentrada.
7.7. Escreverumafunoquelevaumalistacomo(UPDOWNUPUP)e
"Vira"cadaelemento,retornando(PARABAIXOPARACIMAPARABAIXOPARABAIXO).Seu

pgina219

207
CAPTULO7ApplicativeProgramao

funodeveincluirumaexpressolambdaquesabecomoviraruma
elementoindividual,almdeumoperadoraplicativoparafazerissoacada
elementodalista.
7.6AFINDseooperador
ENCONTRARSEoutrooperadoraplicativo.SevocderFINDIFumpredicadoe
umalistacomoentrada,elevaiencontraroprimeiroelementodalistadaqualopredicado
retornaverdadeiro(qualquervalornoNIL).ENCONTRARSEretornaesseelemento.
>(Encontrarse#'oddp'(246789))
7
>(Encontrarse#'(lambda(x)(>x3))
'(246789))
4
AquiestumadescriogrficadoqueFINDSEfaz:

???

Senenhumelementosatisfazeropredicado,ENCONTRARSEretornaNIL.
(encontrarse#'oddp'(2468))nil
7.7ASSOCescrevendocomFINDIF
ASSOCprocuraporumaentradadatabelacomumachaveespecificada.Nspodemosescreverumasimples
versodoASSOCqueusaENCONTRARSEparapesquisarnatabela.
(Defunmyassoc(tabeladechave)
(Encontrarse#'(lambda(entrada)
(Igualchave(primeiraentrada)))
mesa))

pgina220

208

CommonLisp:AGentleIntroduoComputaoSimblica

('myassocduaspalavras)(DOISDEUX)
Aexpressolambda(naverdade,umfecholexical)queMYASSOCpassa
paraENCONTRARSEtomaumaentradadetabelataiscomo(ONEONU)comoentrada.EleretornaTseo
primeiroelementodeentradacorrespondechavedequeaprimeiraentradaparaMYDES.
ENCONTRARSEchamaofechamentoemcadaentradanatabela,atencontrarumque
fazcomqueofechoderetornoT.
Notequeaexpresso(EQUALCHAVE(primeiraentrada))queaparece
nocorpodaexpressolambdarefereseaduasvariveis.ENTRADAlocal
paraaexpressolambda,masKEYno.KEYlocalparaMYASSOC.este
ilustraumpontoimportantesobreexpresseslambda:Dentrodocorpodeum
expressolambdaquenospodereferenciarsuasvariveislocais,podemostambm
refernciaaquaisquervariveislocaisdafunoquecontmaexpressolambda.
EXERCCIOS
7.8. Escreverumafunoquelevaduasentradas,XeK,eretornaaprimeira
nmeronalistaXqueaproximadamenteigualaK.Vamosdizerque''maisoumenos
igual''significanadamenosdoqueK10enomaisdoqueK+10.
7.9. EscreverumafunoFINDaninhadaqueretornaoprimeiroelementodeumalista
queemsimesmoumalistanoNIL.

MINITECLADODEEXERCCIO
7.10. Nesteexerccio,vamosescreverumprogramadetransposiodeumacanodeuma
chaveparaoutro.Demodoamanipularasnotasdeformamaiseficiente,queser
traduzilosemnmeros.Aquiacorrespondnciaentreasnotas
enmerosparaumaescaladeumaoitava:
C
1=
CSHARP=2
D
=3
DSHARP=4
E
=5
F
=6

FSHARP=7
G
8=
GSHARP=9
UMA
=10
ASHARP=11
B
=12

uma.Faaumatabelapararepresentarestainformao.Armazenloemummundial
varivelchamadaNOTATABLE.
b.Escreverumafunochamadanmerosquelevaumalistadenotascomoentrada
eretornaalistacorrespondentedenmeros.(Nmeros'(EDC
DEEE))deveretornar(5133555).Estalistarepresentaoprimeiro
setenotasde''MaryHadaLittleLamb.''

pgina221

209
CAPTULO7ApplicativeProgramao
c.EscreverumafunochamadaNOTASquelevaumalistadenmeroscomoentrada
eretornaalistacorrespondentedenotas.(Notas"(531355

5))deveretornar(EDCDEEE).Dica:DesdeNOTATABLE
chaveadopornota,ASSOCnopodeprocurarnmerosnamesmanempode
RASSOC,umavezqueoselementossolistas,enoparespontilhadas.Escrevaoseu
funoprpriamesadebuscaparaprocurarNOTATABLEpelonmero
emvezdenota.
d.Avisoqueasnotaseosnmerossoinversosmtuos:
ParaXumalistadenotas:
X=(Notas(nmerosx))
ParaXumalistadenmeros:
X=(Nmeros(NOTASX))
Oquepodeserditosobre(Notes(NotasX))e(NMEROS
(NMEROSX))?
e.Paratransporumapeademsicapornpassosmeio,comeamosadicionando
ovalornparacadanotanapea.EscreverumafunochamadaRAISE
quelevaumnmeroNeumalistadenmeroscomoentradaelevantacada
nmeronalistapelovalorn.(AUMENTAR5'(5313555))deve
retorno(10868101010),que''MaryHadaLittleLamb''
transpostacincomeiopassosdachavedeCparaaclavedeF.
f.svezes,quandoaumentarovalordeumanota,podemosaumentlodireito
paraaprximaoitava.Porexemplo,selevantaraCEGtrade
representadosnalistade(158)paraachavedeFporadiodecinco
cadanota,obtemos(61013),ouFAC.AquianotaC,representada
pelonmero13,umaoitavaacimadonormalC,representadapela
1.EscrevaumafunochamadaNORMALIZEquelevaumalistadenmeros
comoentradae''normaliza''parafazlosestarentre1e12.
Umnmeromaiordoque12deveter12subtradodeleuma
nmeromenordoque112deveteradicionadoaele.(NORMALIZE'(6
1013))deveretornar(6101).
g.EscreverumaTRANSPOSEfunoquelevaumnmeroneumamsicacomo
entradaeretornaacanotranspostapornpassosmeia.
(Transpor5'(EDCDEEE))deveretornar(AGFGAAA).
Suasoluodeveassumiradisponibilidadedosnmeros,
NOTAS,aumento,enormalizarfunes.tentetransposio
''MaryHadaLittleLamb''por11semitons.Oqueacontecese
voctransplapor12semitons?Comocercade1passosmeia?

pgina222

210

CommonLisp:AGentleIntroduoComputaoSimblica

7.8REMOVERSEERETIRARSENO
REMOVERSEoutrooperadoraplicativoquelevaumpredicadocomoentrada.
REMOVERSEremovetodosositensdeumalistaquesatisfazemopredicado,e
retornaumalistadoquesobrou.
>(Removese#'numberp'(2para1venda))
(VENDA)
>(Removese#'oddp'(1234567))
(246)
AquiestumadescriogrficadoREMOVESE:

????

Suponhaquequeremosencontrartodososelementospositivosemumalistadenmeros.o
predicadotestaPLUSPseumnmeromaiordoquezero.Parainverterosentidode

estepredicadoqueembrulharumNOemtornodeleusandoumaexpressolambda,comomostrado
nasequncia.Depoisderemovertodososelementosquesatisfazem(NOT(PLUSP
x)),oquenosrestasooselementospositivos.
>(Removese#'(lambda(x)(not(pluspx)))
'(2046810))
(2610)
OoperadorremoversenosejautilizadomaisfrequentementedoqueREMOVE
ESE.ElefuncionaexatamentecomoREMOVEIF,excetoautomaticamenteinverteosentidode
opredicado.Issosignificaqueosnicositensqueseroremovidossoaquelesparaos
qualopredicadoretornaNIL.EntoREMOVERSENOretornaumalistadetodos
ositensquesatisfazemopredicado.Assim,seescolhermosPLUSPcomoo
predicado,RETIRESENOvaiencontrartodososnmerospositivosemumalista.
>(Removeseno'plusp'#(2046810))
(2610)
>(Removeseno'oddp'#(2046810))
NADA

pgina223

211
CAPTULO7ApplicativeProgramao
AquiestoalgunsexemplosadicionaisdeREMOVEIFNOT:
>(Removeseno#'(lambda(x)(>x3))
'(2468421))
(4684)

>(Removesenonumberp'#
'(3mas4peraseameixas2pequenos))
(342)
>(Removesenosymbolp'#
'(3mas4peraseameixas2pequenos))
(perasdasmasEAMEIXASpouco)
Aquiestumafuno,contagemdezeros,quecontaquantoszerosaparecemem
umalistadenmeros.Elefazissoportomarosubconjuntodoselementosdalistaqueso
zero,e,emseguida,tendoocomprimentodoresultado.
(removerseno'zerop'#(3400950))(000)
(Defuncontagemdezeros(x)
(Comprimento(removerseno#'zeropx)))
(countzeros'(3400950))3
(countzeros'(1063038))2
(countzeros'(00000))5
(countzeros"(12345))0
EXERCCIOS
7.11. Escrevaumafunoparaescolheressesnmerosemumalistaquesomaioresdoque
umemenosdoquecinco.
7,12. Escrevaumafunoquecontaquantasvezesapalavra''a''aparece
emumafrase.
7,13. Escreverumafunoquepegaapartirdeumalistadelistasaquelesdeexatamentecomprimento
dois.
7.14. AquiestumaversodoSETDIFERENAescritocomREMOVESE:
(Defunmysetdiff(xy)
(Removese#'(lambda(e)(membroey))
x))

pgina224

212

CommonLisp:AGentleIntroduoComputaoSimblica
Mostrarcomoasfunesdeinterseoeuniopodeserescrito
usandoRemoveIFouremovaIFNOT.
MINITECLADODEEXERCCIO
7.15. Nesteexercciotecladovamosmanipularcartasdejogarcom
operadoresaplicativas.Umcartoserrepresentadoporumalistadeformulrio(classificao
suit),porexemplo,(ACEPS)ou(2clubes).Amoser
representadoporumalistadecartes.
uma.EscreverasfunesRANKeSUITquedevolverovalorenaipede
umcarto,respectivamente.(RANK"(2clubes))deveretornar2,e
(SUIT"(2clubes))deveretornarclubes.
b.DefiniravarivelglobalMYmoparaaseguintemodecartes:
((3coraes)
(5clubes)
(2diamantes)
(4diamantes)
(psace))
AgoraescreverumafunoCOUNTSUITquelevaduasentradas,umternoe
umamodecartas,eretornaonmerodecartespertencentesaesse
terno.(COUNTSUIT"DIAMANTESMYHAND)deveretornar2.
c.Definirascoresvarivelglobalparaatabelaaseguir:
((clubespreto)
(diamantesvermelhos)

(Coraovermelho)
(pspreto))
AgoraescreverumafunoCORDE,queusaascoresdatabelapara
recuperaracordeumcarto.(CORDE'(2clubes))deve
voltarPRETO.(CORDE'(6CORAES))deveretornarRED.
d.EscreverumafunoPRIMEIROREDqueretornaoprimeirocartodeumamo
quedeumternovermelho,ounilsenenhum.
e.EscreverumafunoBLACKCARDSqueretornaumalistadetodososnegros
cartesemumamo.
f.EscrevaumafunoqueRANKSquelevaduasentradas,umternoeuma
lado,eretornaasfileirasdetodasasplacasquepertencemaesseterno.
(DiamantesdequefileirasMEUmo)deveretornaralista
(24).(WhatRANKS',SPADESMYHAND)deveretornara

pgina225

213
CAPTULO7ApplicativeProgramao
.list(ACE)Dica:Primeiroextrairtodasascartasdonaipeespecificado,
emseguida,usarumoutrooperadorparaobterasfileirasdessescartes.
g.DefiniravarivelglobalALLfileirasparaalista
(2345678910jackrainhareiace)
Emseguida,escrevaumpredicadodemaiorRANKPquerecebedoiscartescomo

entradaeretornaverdadeiroseoprimeirocartotemumaclassificaomaiselevadadoquea
segundo.Dica:olharparaopredicadoBEFOREPnapgina171do
Captulo6.
h.EscreverumafunodealtaCARDqueretornaocartomaisbemclassificado
emumamo.Dica:UmamaneiraderesolverissousarFINDIFparaprocurarum
listadefileiras(ordenadodealtoabaixo)paraencontraropostomaisaltoque
Aparecenamo.Emseguida,useASSOCnamoparapegarocarto
comessaclassificao.OutrasoluoseriausarREDUZIR(definida
naprximaseo)paraescolhervriasvezesacartamaisaltadecadapar.
7.9AREDUZIROPERADOR
REDUZIRumoperadoraplicativaquereduzoselementosdeumalistanuma
resultadonico.REDUZIRrecebeumafunoeumalistacomoentrada,masaocontrriodo
outrosoperadoresquejvimos,reduzadeveserdadaumafunoqueaceita
duasentradas.Exemplo:Parasomarumalistadenmeroscomreduz,usamos+
comoafunodereduo.
(reduzir#'+'(123))6
(reduzir#'+'(109876))40
(reduzir#'+'(5))5
(reduzir#'+nil)0
Damesmaforma,amultiplicarseummontedenmerosemconjunto,usamos*comoo
reduzindofuno:
(reduzir#'*'(245))40
(reduzir#'*'(3407))0
(reduzir#'*'(8))8

pgina226

214

CommonLisp:AGentleIntroduoComputaoSimblica
Nstambmpodeaplicarareduodelistasdelistas.Paratransformarumatabelaemumum
listadenvel,usamosAPPENDcomofunoreduzir:
>(Reduzir#'anexar
'((Umun)(doisdeux)(trstrois)))
(ONEUNDOISTRSDEUXTROIS)
AquiestumadescriogrficadoREDUZIR:

EXERCCIOS
7.16. Suponhamosquetemosumalistadeconjuntos((ABC)(CDA)(FBD)(G))quens
queriaentraremcolapsoemumgrandeconjunto.SeusarmosAPPENDparaonosso
reduzindofuno,oresultadonoserumverdadeiroconjunto,porquealgunselementos
aparecemaisdeumavez.Oquereduzindofunodeveserusada
aoinvs?
7.17. Escreverumafunoque,dadaumalistadelistas,retornaocomprimentototaldetodos
aslistas.Esteproblemapodeserresolvidodeduasmaneirasdiferentes.
7,18. (REDUZIR#'+NIL)retorna0,mas(REDUZIR#'*NIL)retorna1.
Porquevocachaqueisso?

7,10CADA
CADAlevaumpredicadoeumalistacomoentrada.DevolveT,senoexistenenhumelemento
quefazcomqueopredicadopararetornarfalso.Exemplos:
>(#'Cadanumberp'(12345))
T
>(Acada#'numberp"(12ABC5))
NADA

pgina227

215
CAPTULO7ApplicativeProgramao
>(Cada#'(lambda(X)(>X0))'(12345))
T
>(Todosos#'(lambda(x)(>x0))"(12345))
NADA
SetodochamadocomNILcomoseusegundoargumento,elesimplesmenteretornaT,
umavezquealistavazianotemelementosquepoderiamnosatisfaamopredicado.
>(Cada"#oddpnil)
T

>(Evenpnilcada'#)
T
CADAtambmpodeoperaremvriaslistas,dadoumpredicadoqueaceita
mltiplasentradas.
>(Cada#'>'(10203040)'(151123))
T
Umavezque10maiordoque1,20maiordoque5,30ouiguala11,40emaior
de23,CADAretornaT.
EXERCCIOS
7.19. EscreverumafunoALLODDqueretornaTsecadaelementodeumalistade
nmerosestranho.
7,20. EscreverumafunoNONEODDqueretornaTsecadaelementodeumalistade
nmerosnoestranho.
7,21. EscreverumafunonotodoODDqueretornaTsenotodososelementosde
umalistadenmerosestranho.
7,22. EscreverumafunonoNONEODDqueretornaTsenoforocaso
queumalistadenmerosnocontmelementosestranhos.
7,23. Sotodososquatrodasfunesacimadistintosumdooutro,ouesto
algunsdelesomesmo?Vocpodepensaremmelhoresnomesparaaltima
dois?
RESUMO
Applicativeoperadoressofunesqueseaplicamaoutrasfunesdedados
estruturas.Hmuitosoperadoresaplicativaspossveis,apenasalgunsdosquais
soconstrudosparaLisp.programadoresavanadosLispfazerosseusprpriosoperadores
semprequeprecisamdenovos.

pgina228

216

CommonLisp:AGentleIntroduoComputaoSimblica
Mapcaraplicaumafunoacadaelementodeumalistaeretornaumalistade
osresultados.FINDseaspesquisasumalistaeretornaoprimeiroelementoquesatisfazuma
predicado.REMOVERSEremovetodososelementosdeumalistaquesatisfazemuma
predicado,entoalistaeleretornacontmapenasoselementosquenopreencham
isto.RemoveIFnosejautilizadomaisfrequentementedoqueREMOVERSE.eleretorna
todososelementosquefazemsatisfazeropredicado,terretiradoaquelesqueno
satisfazla.CADAretornaTsomentesecadaelementodeumalistasatisfazuma
predicado.REDUZIRusaumafunodereduoparareduziralistaparaumnicovalor.
exercciosdereviso
7.24. Oqueumoperadoraplicativo?
7.25. Porquesoexpresseslambdatil?possvelfazersemeles?
7.26. MostracomoescreverENCONTRARSEdadaREMOVESENO.
7.27. MostracomoescreverCADAdadaREMOVEIF.
7.28. ElaborarumadescriogrficaparaooperadorCADA.
FUNESabordadosnestecaptulo
operadoresApplicative:mapcar,ENCONTRARSE,RETIRESE,RETIREIF
NO,REDUZIR,CADA.

ToolkitLisp:TRACEeDTrace

AmacroTRACEusadoparaassistirafunesespecficas,comosochamadose
comoelesretornam.Comcadachamadaquevocverosargumentosparaafuno
quandoafunoretornavocverosvaloresderetorno.cadaLisp
aplicaotemseuprprioestiloparaaexibiodeinformaesderastreamento.o
exemploabaixotpico:
(Defunmetade(N)(N*0,5))
(Mdiadefun(xy)
(+(MetadeX)(meioY)))

pgina229

217
CAPTULO7ApplicativeProgramao
>(Rastrearametadedamdia)
(MDIAMETADE)
>(Mdia37)
0:(MDIA37)
1:(MEIA3)
1:1,5devolvido
1:(HALF7)
1:3,5devolvido
0:5,0devolvido
5
SevocchamarTRACEsemargumentos,eleretornaalistadetodosrastreada

funes.
>(Trao)
(MDIAMETADE)
Amacrountracedesligaorastreioparaumaoumaisfunes.Desde
UntraceumafunomacrocomoTRACE,osseusargumentosnodeveser
citado.
>(HALFuntrace)
(METADE)
Chamandountracesemargumentosuntracestodosatualmenterastreada
funes.
>(Untrace)
(MDIA)
Norestantedestelivro,vamosutilizarumformatomaisdetalhadorastreamento
mostraquecadavarivelnalistadeargumentos,juntamentecomovalorparaoqual
limite.Porexemplo:
>(Mdia37)
EnterMDIA
|
X=3
|
Y=7
|EnterHALF
||
N=3
|
\HALFdevolvidos1,5
|EnterHALF
||
N=7
|
\HALFdevolvidos3,5
\MDIAvoltou5.0
5

pgina230

218

CommonLisp:AGentleIntroduoComputaoSimblica
SeTRACEdoseuLispnoessedetalhada,nosedesespere,vocpodeusaromeu.
chamadooDTrace,ealistacompletadoprogramadadoemumapndiceno
finaldolivro.Esteestilodetraoespecialmentetilquandoorastreamento
funescomvriasentradas,emaisaindaquandoasentradassolongas,
possivelmenteaninhadas,listas.
(Defunadicionartoend(xy)
(Anexarx(listay)))
(Defunrepeatprimeiro(frase)
(Addtoendfrase(primeirafrase)))
>(Dtraceadicionarendrepeatprimeiro)
(ADDTOENDREPEATFIRST)
>(Repitafirst"(paraquemossinosdobram))
EnterREPETIRPRIMEIRO
|
FRASE=(paraquemosSinosDobram)
|EnterADDTOEND
||
X=(PorQuemosSinosDobram)
||
Y=PARA
|
\ADDTOENDdevolvido
|
(ParaquemosSinosDobramFOR)
\REPEATPRIMEIROdevolvido
(ParaquemosSinosDobramFOR)
(ParaquemosSinosDobramFOR)
DUNTRACEdesfazoefeitodoDTrace.Notentetraarumafuno
tantocomTRACEeDTraceaomesmotempo:Vocpodeobtermuitoestranho
resultados.
PodemosusaroDTraceparaobservarocomportamentodosoperadoresaplicativascomo
ENCONTRARSE.VamostraarafunoODDPedepoisusarODDPcomoumaentradapara
ENCONTRARSE.
(Defunencontrarprimeirompar(x)
(Encontrarse#'oddpx))

>(Dtraceencontrarprimeiroestranhaoddp)
(FINDprimeiroODDODDP)

pgina231

219
CAPTULO7ApplicativeProgramao
>(Encontrarprimeiroodd'(24678))
EnterENCONTRARprimeiroODD
|
X=(24678)
|EnterODDP
||
NMERO=2
|
\ODDPdevolvidoNIL
|EnterODDP
||
NMERO=4
|
\ODDPdevolvidoNIL
|EnterODDP
||
NMERO=6
|
\ODDPdevolvidoNIL
|EnterODDP
||
NMERO=7
|
\TODDPdevolvido

7 \FINDprimeiroODDretornou7
IssotrazumltimopontosobreousodeTRACEeDTrace.
Emborapossamserutilizadospararastrearcomfunesinternas,taiscomoODDP,este
svezesacabaporserperigoso.Evitetraandoomaisfundamental
builtinfunescomoEVAL,CONS,e+.Casocontrrio,seuLisppode
acabaremumloopinfinito,evocvaiterqueabandonloecomeardenovo.

Exerccioteclado

Nesteexercciotecladovamosdesenvolverumsistemapararepresentaroconhecimento
sobre'cenas''blocosmundiais,taiscomoFigura71.Afirmaessobreosobjetos
emumacenasorepresentadoscomotriplosdeforma(blocodevalordeatributo).Aquiesto
algumasafirmaessobreosatributosdoblocoB2:
(TijoloformaB2)
(B2corvermelha)
(B2tamanhopequeno)
(B2suportaB1)
(B2esquerdadoB3)
Umacoleo(emoutraspalavras,umalista)deafirmaeschamadodebancodedados.

pgina232

220

CommonLisp:AGentleIntroduoComputaoSimblica

Figura71Umacenamundialblocostpico.
Dadaumabasededadosquedescreveosblocosnafigura,podeseescreverafuno
responderaperguntascomo:''QualacordoblocoB2?''ou''Oquebloqueia
apoiarblocoB1?''Pararesponderaessasperguntas,vamosusarumafunochamada
umcorrespondentepadroparaprocurarobancodedadosparans.Porexemplo,paradescobriro
cordoblocoB2,usamosopadro(B2COLOR?).
>(Fetch'(corb2?))
((B2CORVERMELHA))
ParaencontraroquebloqueiaapoiarB1,usamosopadro(APOIAB1?):
>(Fetch'(?Suportab1))
((B2APOIAB1)(B3APOIAB1))
FETCHretornaestasafirmaesdobancodedadosquecorrespondemaumdeterminado
padro.Deveserevidenteapartirdosexemplosanterioresqueumpadroum
triplo,comoumaafirmao,comalgunsdosseuselementossubstitudosporpontosdeinterrogao.
AFigura72mostraalgunspadresesuasinterpretaesinglesas.
Umpontodeinterrogaoemumpadrosignificaqualquervalorpodeigualarnessaposio.
Assim,opadro(CORB2?)Podecoincidircomafirmaescomo(CORB2

VERMELHO),(B2CORVERDE),(B2CORAZUL),eassimpordiante.Eunoposso
combinaraafirmao(B1corvermelha),porqueoprimeiroelementoda
padroosmboloB2,aopassoqueoprimeiroelementodaafirmaoB1.

pgina233

221
CAPTULO7ApplicativeProgramao
Padro

InterpretaoIngls

(Corb1?)

Qualacorb1?

(?corvermelha)

Quebloqueiasovermelhos?

(B1corvermelha)

b1conhecidoporservermelho?

(B1?B2)

Querelaob1paraB2?

(B1?)

Oquesesabesobreb1?

(?Suportes?)

Querelaesdeapoioexiste?

(?B1)

OblocosestorelacionadoscomB1?

(???)

Oqueestnobancodedados?

Figura72Algunspadresesuasinterpretaes.
EXERCCIO
7.29. Seobancodedadosblocosjestarmazenadonocomputadorparavoc,carga
oarquivoqueacontm.Seno,vocterquedigitarotextocomoeleaparecena
Figura73.Salveobancodedadosnobancodedadosvarivelglobal.
uma.EscreverumafunoMATCHelementoquelevadoissmboloscomo
insumos.Seosdoissoiguais,ouseosegundoumpontodeinterrogao,
MATCHELEMENTdeveretornarT.Casocontrrio,eledeveretornar
NADA.Assim(MATCHELEMENT'RED'RED)e(correspondncia
ELEMENT'RED'?)DeveretornarT,mas(MATCHELEMENT
'RED'AZUL)deveretornarNIL.Verifiqueseoseuobrasdefuno
corretamenteantesdeprosseguir.
b.EscreverumafunoMATCHTRIPLEquelevaumaafirmaoeuma
padrocomoentrada,eretornaTseaafirmaocorrespondeaopadro.
Ambasasentradasserlistasdetrselementos.(MATCHTRIPLE'(B2
CORVERMELHA) '(CORB2?))
deveretornar
T.(MATCHTRIPLE'(B2CORVERMELHA)'(B1CORVERDE))
deveretornarNIL.DICA:UseMATCHELEMENTcomoumedifcio
quadra.
c.EscreverafunoBUSCARquelevaumpadrocomoentradaeretorna
todasasafirmaesfeitasnobancodedadosquecorrespondemaopadro.Lembresedisso

pgina234

222

CommonLisp:AGentleIntroduoComputaoSimblica
DATABASEumavarivelglobal.(Fetch'(CORB2?))
deveretornar((B2CORVERMELHA)),e(Fetch'(?APOIA
B1))deveretornar((B2APOIAB1)(B3APOIAB1)).
d.Useoesforocompadresquevocconstruirsearesponder
seguintesperguntas.QueformablocoB4?Queblocosso
tijolos?QuerelaoB2blocoemblocoB3?Listeacorde
cadabloco.QuefatossoconhecidossobreblocoB4?
e.Escreverumafunoquelevaumnomedeblococomoentradaeretornaum
padropedindoacordobloco.Porexemplo,dadaaentrada
B3,asuafunodeveretornaralista(B3COLOR?).
f.EscreverumafunoSUPPORTERSquelevaumaentrada,umbloco,e
retornaumalistadosblocosqueosuportam.(B1deadeptos)
deveretornaralista(B3B2).Suafunodevefuncionarpor
aconstruodeumpadrocontendoonomedobloco,usandoesse
padrocomoentradaparabuscar,emseguida,extrairosnomesdeblocos
apartirdalistaresultantedeafirmaes.
g.EscreverumpredicadoSUPPCUBEquelevaumblococomoentradae
devolveverdadeiroseoblocosuportadoporumcubo.(B4SUPPCUBE')
deveretornarumvalorverdadeiro(SUPPcubo'B1)nodeveporque
B1suportadoportijolos,masnocubos.Dica:Useoresultadodo
APOIADORESfuncionarcomoumpontodepartida.
h.VamosescreverumafunoqueretornaoDESCRIO
descriodeumbloco.(DESCRIOB2")irretornar(SHAPE
TIJOLOCORVERMELHATAMANHOPEQUENOAPOIAB1esquerdado
B3).Faremosissoemetapas.Emprimeirolugar,escreverumafunoDESC1que
levaumblococomoentradaeretornatodasasafirmaesquetratemdaquela
quadra.(B6DESC1')deveretornar((B6SHAPETIJOLO)(B6
Corroxa)(SIZEB6GRANDE)).
Eu.EscreverumafunoDesc2deumaentradaquechamaDESC1etiras
onomedoblocoforadecadaelementodoresultado.(B6Desc2')deve
devolveralista((SHAPETIJOLO)(corroxa)(SIZE
GRANDE)).
j.EscreverafunoDESCRIO.Deveterumaentrada,chamar
Desc2,emesclaralistaresultantedelistasemumanicalista.
('DESCRIOB6)deveretornar(cordetijoloSHAPE

TAMANHOROXOGRANDE).

pgina235

223
CAPTULO7ApplicativeProgramao
k.QualadescriodoblocoB1?DoblocoB4?
eu.BlocoB1feitademadeira,masblocoB2,feitodeplstico.Como
Comovocadicionaressasinformaesaobancodedados?

(Bancodedadossetf
'((FormadetijoloB1)
(Corverdeb1)
(B1tamanhopequeno)
(B1suportadoporb2)
(B1suportadoporb3)
(TijoloformaB2)
(B2corvermelha)
(B2tamanhopequeno)
(B2suportaB1)
(B2esquerdadoB3)
(Tijoloformab3)
(B3corvermelha)
(B3tamanhopequeno)

(B3suportaB1)
(B3comdireitodeb2)
(PirmideB4)
(CorazulB4)
(B4tamanhogrande)
(B4suportadoporB5)
(CuboformaB5)
(Corverdeb5)
(B5tamanhogrande)
(B5suportaB4)
(TijoloformaB6)
(CorB6roxo)
(TamanhograndeB6)))
Figura73Obancodedadosdeblocos.

pgina236

224

CommonLisp:AGentleIntroduoComputaoSimblica

Tpicosavanados

7,11OPERACIONALONvriaslistasde
Noinciodestecaptulousamosmapcarparaaplicarumoneentrada
funoparaoselementosdeumalista.Mapcarnorestritaaumaentrada
funes,noentanto.Dadaumafunodenentradas,mapcarirmapearlosobre
nlistas.Porexemplo,dadaumalistadepessoaseumalistadepostosdetrabalho,podemosusar
Mapcarcomumafunodeduasentradasparaemparelharcadapessoacomumtrabalho:
>(Mapcar#'(lambda(xy)(listax'recebey))
'(Dianefredwilmageorge)
'(Job4job3job2job1))
((FREDGETSJOB1)
(WILMAGETSjob2)
(Georgecomeajob3)
(DianetenhaJOB4))
Mapcaratravessaasduaslistasemparalelo,tendoumelementode
cadaemcadapasso.Seumalistamaiscurtodoqueooutro,quandoseinterrompemapcar
atingeofimdalistamaiscurta.
Outroexemplodeoperaremmltiplaslistasoproblemadeadicionar
duaslistasdenmerospares:
>(Mapcar#'+'(12345)'(60708090100))
(61728394105)
>(Mapcar#'+'(132)'(1020304050))
(112233)
EXERCCIO
7.30. LembreseodicionrioInglsFrancstemosarmazenadonavarivelglobal
PALAVRASanteriormentenocaptulo.Dadoestedicionriomaisalistaou
correspondentespalavrasespanholas(UNODOSTRESQUATROCINCO),

pgina237

225
CAPTULO7ApplicativeProgramao
escrevaumaexpressopararetornarumdicionriotrilnge.Aprimeiraentradade
odicionriodeveser(ONEUNONU).
7.12AFUNODEFUNOESPECIAL
Assimcomo'umatalhoparaafunoespecialCITAES,#'umaabreviaoparao
FUNOfunoespecial.EscrevendoCONS'#,portanto,equivalentea
escrita(CONS)funo.
CITAESsempreretornaseuargumentonoavaliada,masafunofuncionaum
poucodiferente.Eleretornaainterpretaofuncionaldoseuunevaluated
argumento.Seoargumentoforumsmbolo,quegeralmenteretornaocontedodo
celularfunodosmbolo.Muitasvezesistoumobjetocdigocompilado.
>'contras
CONS
>#'contras
#<FunoCompiladoCONS6041410>
Poroutrolado,seoargumentodafunoumaexpressolambda,
Oresultadogeralmenteumfecholexical.

>#'(Lambda(X)(X+2))
#<Lexicalfechamento3471524>
Oresultadoretornadopelafunosemprealgumtipodeobjetodefuno.
Essesobjetossoumaformadedados,assimcomosmboloselistas.Porexemplo,ns
podearmazenlasemvariveis.Nstambmpodemoschamlos,usandofuncallou
APLICAR.(AplicarfoidiscutidonaSeo3.21TpicosAvanados).
>(SetfG#'(lambda(X)(X10*)))
#<Lexicalfechamento41653824>
>(Funcallg12)
120
OvalordavarivelGumfecholexical,queumafuno.masG
emsinoonomedequalquerfunoseescreveu(G12)quegostariadeobteruma
errofunoindefinida.

pgina238

226

CommonLisp:AGentleIntroduoComputaoSimblica

7.13argumentosaosoperadoresaplicativo

Algunsoperadoresdoaplicativo,taiscomoFINDIF,RETIRESE,RETIREIF
NO,ereduzir,aceitarargumentosopcionais.Porexemplo,a
:DEFINALpalavrachave,sefordadoumvalordiferentedezero,fazcomquealistaaser
processadasdadireitaparaaesquerda.
>(Encontrarse#'oddp'(23456))Encontreoprimeironmerompar.
3
>(Encontrarse#'oddp'(23456)
:Apartirdetfim)
5

Encontraroltimonmerompar.

A:palavrachaveFROMFINALparticularmenteinteressantecomREDUZIRisto
fazcomqueoselementosparaserreduzidodedireitaparaaesquerda,emvezdahabitualesquerdaparaa
certo.
>(Reduzir'contras'#(ABCDE))
((((A.B).C).D).E)
>(Reduzir'contras'#(ABCDE):definalt)
(ABCD.E)
REMOVERSEeremovaIFNOTtambmaceitarum:palavrachaveCOUNTque
especificaonmeromximodeelementosaserremovidos.Vejaalinha
documentaoouomanualderefernciaLispComumparaalistacompletade
argumentosaceitosporumafunoparticular.MapcareCADA
noaceitaargumentosdepalavraschaveelesaceitamumnmerovariveldelistas
aoinvs.
7,14AbordandoeENCERRAMENTOSlexicais
LembreseoexemploMYASSOCdaseo7.7.Umavezqueolambda
expressopassadoparaENCONTRARSEechamadodedentrodocorpodeFINDIF,
comopossvelparaqueeleconsulteasvariveislocaisdeMYASSOC?Porque
loincapazdeverasvariveislocais,sehouver,deFINDIFemsi?
(Defunmyassoc(tabeladechave)
(Encontrarse#'(lambda(entrada)
(Igualchave(primeiraentrada)))
mesa))

pgina239

227
CAPTULO7ApplicativeProgramao

('myassocduaspalavras)(DOISDEUX)
Emprimeirolugar,importantelembrarqueoquepassadoparaFINDsenoa
expressolambdacru,massimumfechamentolexicalcriadoporFUNO
(abreviadocomo#').Ofecholembraseuambientelxico.No
diagramaseguinteevaltrace,umasetavazadamostraolimitembitoda
corpodofecho.Umarcoliganestasetaparaoalcancefronteiraparaasua
contextopai,ocorpodeMYASSOC.
('Myassocduaspalavras)
DigiteMYASSOCcomduasentradase((OneUN)...)
criarCHAVEvarivel,comvalordedois
CREATETABLEvarivel,comovalorde((ONEONU)...)
(Encontrarse#'...tabela)
EnterENCONTRARSEcomentradas#<Lexicalfechamento...>e((ONEONU)...)
Digite#<Lexicalfechamento5172264>comentrada(OneUN)
criarentradavarivel,comovalor(OneUN)
(Igualchave(primeiraentrada))
avaliachaveparaTWO
(Primeiraentrada)
UM
NADA

OresultadodofechamentolexicalNIL
Digite#<Lexicalfechamento5172264>comaentrada(doisDEUX)
criarentradavarivel,comovalor(doisDEUX)
(Igualchave(primeiraentrada))
avaliachaveparaTWO
(Primeiraentrada)
DOIS
T
OresultadodofechamentolxicoT
ResultadodaFINDIF(DOISDEUX)
ResultadodaMYASSOC(DOISDEUX)
Aregradeescopoparatampasquequalquervarivelnolocalparaoencerramento
olhouparacimanocontextodopaidoencerramento.Cadacontextolexicaltemumpai
contexto.Aslinhasslidasgrossastemosvindoautilizarparaoscorposdefunescomo
MYASSOCeENCONTRARSEdenotamcontextoslexicaiscujopaioglobal

pgina240

228

CommonLisp:AGentleIntroduoComputaoSimblica
contexto.porissoquequandoEVALatingeumadessaslinhasgrossasaoolhar
seumavarivel,eleimediatamenteprocuraumavarivelglobalcomonome.
SuponhamosqueescreveuumafunoFAULTYASSOCquesubstituiuolambda
expressocomumafunochamadaAJUDANTEindependente:

(Defunhelper(entrada)
(Igualchave(primeiraentrada)))
(Defundefeituosoassoc(tabeladechave)
(Encontrarse#'tabelaauxiliar))
DesdeAJUDANTEdefinidaaomaisaltonvel,oseucontextolexicalpaioglobal
contexto,nocontextodeFAULTYASSOC.Porisso,nosercapazdesereferir
avariveislocaisdeFAULTYASSOC.Oevaltraceabaixoilustraesta.
('Defeituosoassocduaspalavras)
DigiteFAULTYASSOCcomduasentradase((OneUN)...)
criarCHAVEvarivel,comvalordedois
CREATETABLEvarivel,comovalorde((ONEONU)...)
(Encontrarse#'tabelaauxiliar)
DigiteENCONTRARSEcomentradas#<funoauxiliar>e((ONEONU)...)
Digite#<funoauxiliar>comentrada(OneUN)
criarentradavarivel,comovalor(OneUN)
(Igualchave(primeiraentrada))
CHAVE
Erro!varivelnoatribudaKEY.
DentroFAULTYASSOC,aexpresso'#AJUDANTEavaliaaum
funodeobjeto,queencontramseaschamadasusandofuncall.Dentrodocorpode
AJUDANTEumarefernciaaumavariveldenominadaKEY.DesdeKEYnolocalpara
Ajudante,EVALtentaencontraralgumcontextolexicalpaiquecontmeste
varivel.MasHelpercontextolexicalglobalcomoseucontextome,ento
EVALnopodeverachavequelocalparaMYASSOC.Emvezdisso,procurauma
varivelglobalchamadaKEY.Oresultadoumamensagemdeerro:''CHAVE
varivelnoatribuda.''

pgina241

229
CAPTULO7ApplicativeProgramao
7,15escreverumaplicativoOPERADOR
Usandofuncall,podemosescrevernossoprpriooperadoraplicativoquelevaum
funocomoentrada.NossooperadorserchamadoINALIENVEISemdireitos.isto
aplicaseasuaentradaparaumadeterminadalista,elaboradaapartirdaDeclaraoAmericanados
Independncia.
(Defuninalienveisdedireitos(fn)
(Fnfuncall
'(Liberdadevidaebuscadafelicidade)))
>(Comprimentodedireitosinalienveis'#)
7
>(Reversedireitosinalienveis'#)
(FELICIDADEDEEXERCCIODALIBERDADEELIFE)
>(Direitosinalienveis#'primeiro)
VIDA
>(Restodedireitosinalienveis'#)
(LIBERDADEEabuscadafelicidade)
umerrochamarINALIENVEISDIREITOSemalgoquenoum
funo,porquefuncallrequerumafunocomosuaprimeiraentrada.
>(inalienveisdosdireitos5)
Erro!5noumafuno.
AentradaparaINALIENVEISemdireitosdeveserumafunoquepodelevarum

AentradaparaINALIENVEISemdireitosdeveserumafunoquepodelevarum
listanicacomoseuargumento.NsnopodemosusarafunoCONScomoumaentrada
porqueCONSrequerdoisargumentos.
>(consdireitosinalienveis'#)
Erro!CONSrequerduasentradas,masstemum.
Noentanto,podemosusarCONSdentrodeumaexpressolambdaquelevaaum
argumento,assim:
>(direitosinalienveis
#'(Lambda(x)(cons"altox)))
(VIDAALTAliberdadeeabuscadafelicidade)

pgina242

230

CommonLisp:AGentleIntroduoComputaoSimblica

7.16funesquefazemFUNES
possvelescreverumafunocujovaloroutrafuno.Suponhaquens
querofazerumafunoqueretornaverdadeiroseasuaentradamaiordoqueumdeterminado
nmeroN.Nspodemosfazerestafunoatravsdaconstruodeumaexpressolambda
querefereseaN,eretornandoqueexpressolambda:

(Defuntornarmaiorquepredicado(n)
#'(Lambda(X)(>xn)))
OvalorretornadoporMAKEmaiorquepredicadoserum
encerramentolexical.Podemosarmazenarestevaloremalgumlugar,oupasslocomoum
argumentoparafuncallouqualqueroperadordeaplicativo.
>(Setfpred(makemaiorquepredicado3))
#<Lexicalfechamento7315225>
(funcallpred2)nil
(funcallpred5)t
(encontrarsepred'(23456789))4
FunesdescritasTPICOSAVANADOS
Funoespecialparafunescitando:FUNO.

pgina243

recurso

8.1INTRODUO
Porquealgunsinstrutorespreferemensinararecursividadecomooprimeirocontroledegrande
estrutura,estecaptuloeoanteriorpodeserensinadaemqualquerordem.
Elessoindependentes.
Recursividadeumadasidiasmaisfundamentaisebonitasnocomputador
Cincia.Umafunoditoser''recursiva''seelechamaasimesmo.recursiva
estruturadecontroleotemaprincipaldestecaptulo,mastambmvamosdarumaolhada
emestruturasdedadosrecursivasnaseoTpicosavanados.oinsight
necessrioreconheceranaturezarecursivademuitosproblemaslevaumpoucode
prticaparadesenvolver,masumavezquevoc''obtlo'',vocvaisesurpreendercomainteressante

coisasquevocpodefazercomapenasumafunorecursivadetrsouquatrolinhas.
Nsvamosusarumacombinaodetrstcnicasparailustraroquerecurso
tudosobre:histriasdrago,vestgiosdeprogramaemodelosderecurso.Drago
histriassoatcnicamaiscontroversa:Estudantesapreciloseencontrar
losteis,masprofessoresdecinciadacomputaonemsempresotosensibilizada.
Sevocnogostadedrages,vocpodepularseces8.2,8.4,8.6e8.9.o
seesintervenientesaindafarsentidoelessimplesmentenovosertodivertido.

231

pgina244

232

CommonLisp:AGentleIntroduoComputaoSimblica

8.2MARTINEODRAGO
Nostemposantigos,antesdoscomputadoresforaminventados,alquimistasestudouo
propriedadesmsticasdosnmeros.Nafaltadecomputadores,elestinhamqueconfiarem
dragesparafazeroseutrabalhoparaeles.Osdrageseramanimaisinteligentes,mastambm
preguiosoemalhumorado.Ospiores,svezes,queimamseuguardaredes
umabatatafritacomumnicoarrotodefogo.Masamaioriadosdrageserammeramente
nocooperativos,comoaviolncianecessriamuitaenergia.Estaahistriadecomo
Martin,oaprendizdeumalquimista,descobriurecursopormaisinteligentequeumpreguioso

Drago.
Umdia,oalquimistadeuMartinumalistadenmeroseenviouoparabaixopara
ocalabouoparapedirodragosehouvereramestranhos.Martinnuncatinhasidoparao
calabouoantes.Elelevouumavelaparabaixocomele,enamaisdistante,maisescura
esquinaencontrouumvelhodrago,nomuitoamigvelolhando.Timidamente,elepisou
paraafrente.Elenoqueriaserqueimadoaumabatatafrita.
''Oquevocquer?''ResmungouodragocomoeleolhouparaMartinsuspeita.
''Porfavor,drago,eutenhoumalistadenmeros,eeuprecisosabersequalquerumdos
elessoestranhos''Martincomeou.''Aquiest.''Eleescreveunalistadaterracom
odedo:
(3142579865508914)
Odragoestavaemumhumordesagradvelnaqueledia.Sendoumdrago,ele
semprefoi.''Desculpe,menino'',disseodrago.''Eupoderiaestardispostoadizerlhese
oprimeironmerodalista,estranho,masissoomelhorqueeupoderiafazer.
Qualqueroutracoisaseriamuitocomplicadoprovavelmentenovaleomeuproblema.''
''Maseuprecisosabersequalquernmeronalistaestranho,noapenasoprimeiro
nmero''Martinexplicou.
''Muitoruimparavoc!'',Disseodrago.''Eusvouolharparaoprimeiro
nmerodelista.Maseuvouolharparaquantaslistasvocgosta,sevocdarlhesa
meumdecadavez.''
Martinpensouporumtempo.Tinhaquehaverumamaneiradecontornarodragode
orneriness.''Comosobreestaprimeiralista,ento?",Perguntou,apontandoparaoqueele
tinhadesenhadonocho:
(3142579865508914)
''Oprimeironmerodalista,noestranho'',disseodrago.
Martin,emseguida,cobriuaprimeirapartedalistacomamoedesenhouumnovo
deixouparntesis,deixando

pgina245

CAPTULO8recurso 233
(579865508914)
edisse:''Quetalestalista?''
''Oprimeironmerodalista,noestranho,''odragorespondeu.
Martincobertaumpoucomaisdalista.''Comosobreestalista,ento?''
(65508914)
''Oprimeironmerodalista,noestranhotambm,''disseodrago.Soou
furado,maspelomenoseleestavacooperando.
''Eesta?'",PerguntouMartin.
(8914)
''Noestranho.''
''Eeste?''
()
''Essaalistavazia!''Odragobufou.''Nopodehaverumaestranha
nmerodel,porquenohnadal.''
''Bem',disseMartin,''agoraeuseiquenoumdosnmerosnalista
oalquimistadeumeestranho.Elessotudoomesmo.''
''Eununcadisseisso!!!''gritouodrago.Martinsentiucheirodefumaa.''EU
sconteilhesobreoprimeironmeroemcadalistaquevocmemostrou.''
''Issoverdade,Dragon.Devoanotartodasaslistasquevocolhoupara?''
''Sedesejar,''odragorespondeu.Martinescreveunocho:
(3142579865508914)
(579865508914)
(65508914)
(8914)
()

''Vocnov?",PerguntouMartin.''Pormedizendoqueoprimeiroelemento
cadaumadessaslistasnoeraestranho,vocmedissequenenhumdoselementosnaminha
listaoriginaleraestranho.''
''Issomuitocomplicado,''odragodisse,irritado.''Parecegostavadevoctenho
recursodescoberto.Masnomepergunteoqueissosignifica,poisvoctemque
descobririssoporsimesmo.''Ecomqueelafechouosolhoseserecusouaproferir
outrapalavra.

pgina246

234

CommonLisp:AGentleIntroduoComputaoSimblica

8.3AFUNOPARAPESQUISARnmerosmpares
AquiestumaANYODDPfunorecursivaqueretornaTsequalquerelementodeumalista
denmerosestranho.Eleretornanilsenenhumdeles.
(Defunanyoddp(x)
(Cond((nullx)nil)
((Oddp(primeirox))t)
(T(anyoddp(restantex)))))
Sealistadenmerosestvazia,ANYODDPdeveretornarnula,umavezquecomoa
dragoobservou,nopodehaverumnmeromparemumalistaquenocontmnada.Ese
alistanoestvazia,vamosparaasegundaclusulaCONDetestaroprimeiro

elemento.Seoprimeiroelementoestranho,nohnecessidadedeolharmaislonge
ANYODDPpodepararevoltarT.Quandooprimeiroelementoainda,
ANYODDPdevechamarsesobreorestodalistaparamanteraprocuradeestranho
elementos.Essaaparterecursivadadefinio.
ParavermelhorcomoANYODDPfunciona,podemosusaroDTraceparaanunciar
cadachamadaparaafunoecadavalorderetorno.(AferramentaDTraceusados
aquifoiintroduzidanaseoLispToolkitdoCaptulo7.SeoseuLisp
notemoDTrace,useTRACEemvezdisso.)
(Defunanyoddp(x)
(Cond((nullx)nil)
((Oddp(primeirox))t)
(T(anyoddp(restantex)))))
(Anyoddpdtrace)
Vamoscomearcomoscasosmaissimples:umalistavazia,eumalistacomumestranho
nmero.
>(Anyoddpnil)
EnterANYODDP
|
X=NIL
\ANYODDPdevolvidoNIL
NADA
>(Anyoddp'(7))
EnterANYODDP
|
X=(7)
\TANYODDPdevolvido
T

pgina247

clusulaprimeiraCONDretornaNIL.

clusulasegundaCONDretornaT.

CAPTULO8recurso 235
Agoravamosconsiderarocasoemquealistacontmumnmeropar.o
testesnasduasprimeirasclusulasCONDserfalso,entoafunoiracabarem
aterceiraclusula,ondeelechamaasimesmodeformarecursivasobreorestodalista.Desde
OrestoNIL,issoreduzaumproblemaanteriormenteresolvido:(ANYODDP
NIL)nuladevidoprimeiraclusulaCOND.
>(Anyoddp'(6))
EnterANYODDP
|
X=(6)
ClusulaTerceira:chamadarecursiva.
|EnterANYODDP
||
X=NIL
|
\ANYODDPvoltouNILprimeiraclusularetornaNIL.
\ANYODDPdevolvidoNIL
NADA
Sealistacontmdoiselementos,umnmeroseguidoporumestranho
nmero,achamadarecursivairdesencadearasegundaclusulaCONDemvezdo
primeiro:
>(Anyoddp'(67))
EnterANYODDP
|
X=(67)
ClusulaTerceira:chamadarecursiva.
|EnterANYODDP
||
X=(7)
|
\ANYODDPvoltouTclusulaSegundoCONDretornaT.
\TANYODDPdevolvido
T
Finalmente,vamosconsiderarocasogeralondeexistemmltiplosmesmoe
nmerosmpares:
>(Anyoddp'(246789))
EnterANYODDP
|
X=(246789)
|EnterANYODDP
||
X=(46789)
||EnterANYODDP
|||
X=(6789)

|||EnterANYODDP
||||
X=(789)
|||
\TANYODDPdevolvido
||
\TANYODDPdevolvido
|
\TANYODDPdevolvido
\TANYODDPdevolvido
T

pgina248

236

CommonLisp:AGentleIntroduoComputaoSimblica
Noteseque,nesteexemplo,afunonotemquerecursetodoocaminho
atNIL.Desdeoprimeirode(789)estranho,ANYODDPpoderiaparare
retornarTnaqueleponto.
EXERCCIOS
8.1. UseumrastreamentoparamostrarcomoANYODDPirialidarcomalista(31425798
65508914).QualclusulaCONDnoverdadenestecaso?
8.2. MostracomoescreverANYODDPusandoSeemvezdeCOND.

8.4MARTINVISITADODRAGODENOVO
''Oldrago!''Martinchamadocomoelefezoseucaminhoatocalabouoraqutica

escadaria.
''Hmmmph!Vocnovamente.Estoudeolhoemseustruquesrecursiva.''Odragofez
noparececontentedevlo.
''Eutenhoquedescobriroquecincofactorial'',disseMartin.''Oque
factorialsignifica,afinal?''
Nestedragocolocaremumarmaisofendidoedisse:''Eunovou
dizerlhe.Procurloemumlivro.''
''Tudobem'',disseMartin.''Apenasmedigaocincofactorialeeuvoudeixar
vocsozinho.''
''Vocnosabeoquesignificafatoriais,masvocquermedizerlheo
fatorialdecinco???Todosimbecilcerto,euvoutedizer,noqueissovaifazernenhum
Boa.Fatorialdecincocincovezesfatorialdequatro.Esperoquevocestejasatisfeito.
Noseesqueadetrancaraportaemseucaminhoparafora.''
''Masoquefatorialdequatro?'",PerguntouMartin,nodetodosatisfeitocomo
evasivenessdodrago.
''Fatorialdequatro?Ora,quatrovezesfatorialdetrs,claro.''
''Eeusuponhoquevocvaimedizerquefatorialdetrstrsvezes
fatorialdedois'',disseMartin.
''Oqueummeninointeligentevoc!'',Disseodrago.''Agoravembora.''
''Aindano'',Martinrespondeu.''Fatorialdeduasduasvezesfatorialdeum.
Fatorialdeumumvezesfatorialdezero.Oqueagora?''
''Fatorialdezeroum,''disseodrago.''Issorealmentetudoquevocsempre
precisaparaselembrarsobrefactoriais.''

pgina249

CAPTULO8recurso 237
''Hmmm'',disseMartin.''Humpadroparaestafunofatorial.
Talvezeudeveriaescreverparabaixoospassosqueeujpasseipor.''Aquiestoqueele
escrevi:
Fatorial(5)=5fatorial(4)
=54fatorial(3)
=543fatorial(2)
=5432fatorial(1)
=54321fatorial(0)
=543211
''Bem,''disseodrago,''vocrecursedtodoocaminhoparafactorial
dezero,oquevocsabequeum.Agora,porquenotentartrabalharoseucaminho
devoltaat....''Quandopercebeuoqueestavafazendo,odragoparouem
nomeiodafrase.Dragesnososupostamenteparasertil.
Martincomeouaescrevernovamente:
11=1
211=2
3211=6
43211=24
543211=120
''Hey!''Martingritou.''Fatorialde5120.Essaaresposta!
Obrigado!!''
''Eunolhedissearesposta,''odragodisse,irritado.''Eusconteilhe
quefactorialdezeroum,efactorialdenNvezesfactorialdeN1.Voc
seasimesmodescansar.Recursiva,eupoderiaacrescentar.''
''Issoverdade'',disseMartin.''Agora,seeusoubesseoque"deformarecursiva"realmente
queriadizer.''
8.5ALISPversodafunofatorial
Aspalavrasdodragodeuumadefiniomuitoprecisadefatorial:nfatorialn
vezesn1factorialezerofatorialumdeles.AquiestumafunochamadaFACT
quecalculafatoriaisdeformarecursiva:
(Fatodefun(n)

(Cond((zeropn)1)
(T(*N(fato(N1))))))

pgina250

238

CommonLisp:AGentleIntroduoComputaoSimblica
EaquiestcomoLispiriaresolveroproblemadeMartin:
(Fatodtrace)
>(Fato5)
EnterFACT
|
N=5
|EnterFACT
||
N=4
||EnterFACT
|||
N=3
|||EnterFACT
||||
N=2
||||EnterFACT
|||||
N=1
|||||EnterFACT
||||||
N=0
|||||
\FACTvoltou1

||||
\FACTvoltou1
|||
\FACTretornou2
||
\FACTvoltou6
|
\FACTretornou24
\FACTretornou120
120
EXERCCIO
8.3. Porque(FACT20,0)produzirumresultadodiferentedoque(FACT20)?
Porque(FACT0.0)e(FACT0)ambosproduzemomesmoresultado?
8.6sonhodoDRAGO
AprximavezqueMartinvoltouparaocalabouo,eleencontrouodragoesfregandosua
olhos,comosetivesseacabadodeacordardeumlongosono.
''Eutiveumsonhomaiscurioso,''odragodisse.''Eraumsonhorecursiva,
defato.Vocgostariadeouvirsobreisso?''
Martinficouchocadoaoencontrarodragoemalgoparecidocomumamistoso
humor.Eleesqueceutudosobreomaisrecenteproblemadoalquimista.''Sim,porfavordiga
mesobreoseusonho,''disseele.
''Muitobem'',comeouodrago.''Nanoitepassadaeuestavaolhandoparaumnacolongo
depo,eeumepergunteiquantasfatiasfaria.Pararesponderaminha

pgina251

CAPTULO8recurso

CAPTULO8recurso 239
perguntaqueeurealmentefuiecortarumafatiadepo.Eutinhaumafatia,e
umpoucomaiscurtopedaodepo,masnenhumaresposta.Iintrigadocomoproblema
atqueeuadormeci.''
''Eissoquandovocteveosonho?",PerguntouMartin.
''Sim,muitocuriosa.Sonheicomoutrodragoquetinhaumpedaode
pocomoomeu,excetoasuaeraumafatiamenor.Eeletambmqueria
sabequantasfatiasseunacofaria,maseletinhaomesmoproblemaqueeu
fez.Elecortouumafatia,comoeu,eolhouparaoporestante,comoeu,e
emseguida,elecaiunosonocomoeutambm.''
''Ento,nenhumdevocsencontrouaresposta'',Martindisse,desapontado.
''Vocnosabequantotempooseupo,evocnosabequantotempooseu
qualquerum,excetoqueumafatiamenordoqueoseu.''
''Maseunosoufeitoainda,''odragodisse.''Quandoodragonomeusonho
adormeceu,eleteveumsonhotambm.Elesonhousequevocpodeimaginar
esteumdragocujafatiadepoeraumafatiamenordoqueoseuprpriopo.
Eestedragotambmqueriadescobrirquantasfatiasseunacofaria,
etentoudescobrirporcortarumafatia,masissonolhedizeraresposta,
porissoelecaiunosonopensandonisso.''
''Ossonhosdentrodesonhos!!'',exclamouMartin.''Vocestfazendominhacabea
nadar.Serqueesseltimodragotemumsonhobem?''
''Sim,eelenofoioltimotambm.Cadadragosonhoucomumdragocomuma
vadiarumafatiamenordoqueasuaprpria.Euestavaacumulandoumapilhabastanteprofundade
sonhosl.''
''Comovocconseguiuacordar,ento?",PerguntouMartin.
''Bem,''odragodisse,''eventualmente,umdosdragessonhavamcomum
dragocujaloaferatopequenaquenoestavalemtudo.Vocpodechamlode"o
loafvazio".Essedragopodiaverseunaconocontinhafatias,entoelesabia
arespostasuaperguntaerazeroelenoadormecer.
''Quandoodragoquesonhavacomaqueledragoacordou,elesabiaque,umavez
seuprprionacoeraumafatiamaior,eledeveserexatamenteumafatiamuitotempo.Entoele
acordousabendoarespostasuapergunta.
''E,quandoodragoquesonhavaemquedragoacordou,elesabiaque
onacotinhaqueserduasfatiasdecomprimento,umavezqueeraumafatiamaistempodoqueado
dragoqueelesonhou.E,quandoodragoquesonhavacomeleacordou
acima...."

''Euentendi!'',DisseMartin.''Eleacrescentouumparaocomprimentodopodo
dragoqueelesonhou,equerespondeusuaprpriapergunta.Equandovoc

pgina252

240

CommonLisp:AGentleIntroduoComputaoSimblica
finalmenteacordou,voctinhaarespostaparaoseu.Quantasfatiasfezoseunaco
fao?''
''Vinteesete'',disseodrago.''Foiumsonhomuitolongo.''

8.7umafunorecursivaparacontagemFATIASDEPO
Serepresentamumafatiadepoporumsmbolo,emseguida,umpopodeserrepresentadocomo
umalistadesmbolos.Oproblemadeencontrarquantasfatiasdeumpocontm
portanto,oproblemadeencontrarquantoselementosdeumalistacontm.Estede
claroqueocomprimentofaz,massenotmcomprimento,poderamosainda
contarasfatiasdeformarecursiva.
(Defuncontagemdefatias(loaf)
(Cond((loafnull)0)
(T(+1(contagemdefatias(poderepouso))))))
(Countfatiasdtrace)
Seaentradaalistavazia,emseguida,oseucomprimentoigualazero,demodoCOUNTFATIAS

simplesmenteretornazero.
>(contagemdefatiasnil)
EntercontagemdeFATIAS
|
NACO=NIL
\COUNTFATIASretornou0
0
Seaentradaalistade(X),contagemdeFATIASchamaasimesmodeformarecursivano
Restodalista,queNIL,emseguida,adicionaumparaoresultado.
>(Contagemdefatias'(x))
EntercontagemdeFATIAS
|
NACO=(X)
|EntercontagemdeFATIAS
||
NACO=NIL
|
\COUNTFATIASretornou0
\COUNTFATIASvoltou1
1
Quandoaentradaumalistamaislonga,contagemdeFATIAStemquerecursemaisprofundamente
parachegarlistavaziaparaqueelepossaretornarzero.Emseguida,medidaquecadachamadarecursiva
retornos,umadicionadoaoresultado.

pgina253

CAPTULO8recurso 241

>(Contagemdefatias'(xxxxx))
EntercontagemdeFATIAS
|
NACO=(XXXXX)
|EntercontagemdeFATIAS
||
NACO=(XXXX)
||EntercontagemdeFATIAS
|||
NACO=(XXX)
|||EntercontagemdeFATIAS
||||
NACO=(XX)
||||EntercontagemdeFATIAS
|||||
NACO=(X)
|||||EntercontagemdeFATIAS
||||||
NACO=NIL
|||||
\COUNTFATIASretornou0
||||
\COUNTFATIASvoltou1
|||
\COUNTFATIASretornou2
||
\COUNTFATIASretornou3
|
\COUNTFATIASretornou4
\COUNTFATIASretornou5
5
8.8Astrsregrasdarecursividade
Odrago,soboseudesagradofingidaparaperguntasdeMartin,naverdade,
gostavadeensinarlhesobrearecursividade.Umdiadecidiuexplicarformalmente
oquerecursomeios.OdragodisseMartinseaproximarcadarecursiva
problemacomosefosseumaviagem.Seeleseguiutrsregraspararesolver
problemasdeformarecursiva,elesemprecompletaraviagemcomsucesso.
Odragoexplicouasregrasdaseguinteforma:
1. Saberquandoparar.
2. Decidircomodarumpasso.
3. Quebraraviagemparabaixoemquepassomaisumajornadamenor.
VamosvercomocadaumadestasregrasseaplicasfunesLispqueescrevemos.
Aprimeiraregra,''saberquandoparar'',advertenosdequequalquerfunorecursiva
deveverificarparaverseaviagemfoiconcludaantesrecursingmais.
GeralmenteissofeitonaprimeiraclusulaCOND.EmANYODDPaprimeiraclusula
verificaseaentradaalistavazia,eseassimafunopraeretorna
NIL,umavezquealistavazianocontmquaisquernmeros.Afunofactorial,
FACT,paraquandoaentradadesceparazero.Zerofatorialum,e,quanto

pgina254

242

CommonLisp:AGentleIntroduoComputaoSimblica
odragodisse,issotudooquevocprecisaparaselembrarsobrefatorial.Oresto
calculadorecursivamente.NacontagemdeFATIASaclusulaprimeiraCONDcheques
paraNIL,''opovazio.''CountFATIASretornazeroseNILaentrada.
Maisumavez,estebaseadonaconstataodequeopobranconocontiverfatias,demodo
notemosaorecursemaislonge.
Asegundaregra,''decidircomodarumpasso,''nospedepararompercom
oproblemadeumpequenopedaoqueinstantaneamentesabecomoresolver.Dentro
ANYODDPverificamosseoprimeirodeumalistaumnmeromparSeportanto,
T.retornonafunofactorialquerealizarumanicamultiplicao,
multiplicandoaentradadeNporfatorialdeN1.NacontagemdeFATIASopasso
a+funo:Paracadafatiaquecortaropo,nsadicionamosumparaqualquerquesejao
comprimentodoporesultanteacabouporser.
Aterceiraregra,''quebraraviagemparabaixoemquepassoalmdeummenor
jornada,''significaencontrarumcaminhoparaafunodechamarsedeformarecursivano
problemaligeiramentemenorqueresultadequebrarumpequenopedaooff.o
funoANYODDPchamasesobreorestodalista,umalistamaiscurtadoquea
original,paraverseexistemnmerosmparesl.Afunofatorial
recursivamentecalculafatorialdeN1,umproblemaumpoucomaissimplesdoque
fatorialdeN,eusaoresultadoparaobterfatorialdeN.EmCOUNT
FATIASusamosumachamadarecursivaparacontaronmerodefatiasnorestodeum
po,edepoisadicionarumaoresultadoparaobterotamanhodetodoopo.

TrsFunesRecursivasdodrago
pararQuando
entrada Retorna

Funo
ANYODDP

NADA

FATO

CountFATIAS

NADA

Passoatomar

RestodoProblema

NADA (ODDP(PRIMEIROX))
(ANYODDP(RESTX))
1

N...

(FACT(N1))

1+...

(COUNTslices
(RESTNACO))

tabela81Aplicandoastrsregrasderecurso.
Tabela81resumeanossacompreensodecomoastrsregrasseaplicama
ANYODDP,FACT,eCOUNTfatias.Agoraquevocconheceasregras,voc
podeescreversuasprpriasfunesrecursivas.

pgina255

CAPTULO8recurso 243
ExercitaraprimeiraRECURSO
8.4. Vamosescreverumafunochamadarisadaquelevaumnmerocomo

deentradaeretornaumalistadequemuitostem.(Risos3)deveretornar
alista(HAHAHA).(Risos0)deveretornarumalistacomoNOtemem
lo,ou,comoodragopodecoloclo'',orisovazio.''
AquiestumesqueletoparaafunoRISO:
(Defunrir(n)
(cond()
(t(ha'contras))))
SobquecondiesdeveafunoRISOpararrecurso?
Substituirosmbolonoesqueletocomessacondio.quevalor
deveriarirderetornoparaessecaso?Substituirsmbolonoesqueleto
comessevalor.DadoqueumnicopassoparaesteproblemaadicionarumHA
paraoresultadodeumsubproblema,quepreenchasubproblemasubstituindoo
smbolo.
EscrevaseufunoRISOnocomputador.Emseguida,digite(DTrace
RIR)paraseguilo,e(risos5)paratestlo.Vocobteroresultado
vocquer?Oqueacontecepara(risos0)?Oqueacontecepara
(Risos1)?
Nota:Seafunoparecequeestemumloopinfinito,sairdela
evoltarparaociclodeleituraevalprint.(Exatamentecomoissofeito
dependedaversoespecficadoLispquevocusa.PergunteaoseuLisplocais
especialistasevocprecisardeajuda.)Emseguida,useoDTraceparaajudarvocaentender
oqueestacontecendo.
EXERCCIOS
8.5. Nesteexerccio,vamosescreverumafunoADDUPparasomartodos
osnmerosemumalista.(ADDUP'(237))deveretornar12.Voc
jsabecomoresolveresteproblemaapplicativelycomREDUZIR
agoravocvaiaprenderaresolvlodeformarecursiva.AntesdeescreverADDUPns
deveresponderatrsperguntasfeitaspornossostrsregrasderecurso.
uma.Quandoquevamosparar?Existealgumalistaparaaqualnsimediatamente
seiqueasomadetodososseuselementos?Oqueessalista?
Ovalordeveretornarafunoseobtmessalistacomo
entrada?
b.Nosabemoscomodarumnicopasso?Olheparaosegundo
clusulaCONDnadefiniodecontagemdefatiasoufato.

pgina256

244

CommonLisp:AGentleIntroduoComputaoSimblica
Issolhedalgumaidiasobreoqueonicopasso
deveserparaADDUP?
c.ComodeveADDUPchamarsedeformarecursivapararesolveroresto
doproblema?OlheparacontagemdefatiasouFACTnovamentese
vocprecisardeinspirao.
AnoteadefiniocompletadeADDUP.Digitena
computador.Seguilo,e,emseguida,tenteadicionarumalistadenmeros.
8.6. FaaALLODDP,umafunorecursivaqueretornaTsetodososnmeros
emumalistasompares.
8.7. EscreverumaversorecursivadeMEMBRO.ChamlodeRECMEMBROassimvoc
noredefinirafunodemembroembutido.
8.8. EscreverumaversorecursivadeASSOC.ChamlodeRECASSOC.
8.9. EscreverumaversorecursivadeNTH.ChamlodeRECNTH.
8,10. Paraxuminteirononegativoeyuminteiropositivo,x+yiguais
x+1+(y1).Seyzero,emseguida,x+yigualax.Useessasequaesparaconstruir
umaversorecursivade+chamadoRECPLUSdeADD1,SUB1,
CONDeZEROP.VocvaiterqueescreverADD1eSUB1tambm.

8,9MARTINDESCOBRErecursoinfinita

EmsuaprximaviagemparaocalabouoMartintrouxecomeleumpergaminho
rolagem.''Olhedrago,''chamou'',algumdevesabersobrearecursividade.
Euencontreiestedeslocamentonabibliotecadoalquimista.''
OdragoolhoususpeitosamentecomoMartindesenrolouopergaminho,colocandoum
castialemcadaextremidadeparasegurlaplana.''Esterolonofazsentido,''o
dissedrago.''Porumlado,eletemdemasiadasparnteses.''
''Aescritaumpoucoestranho","Martinconcordou,''maseuachoqueeudescobri
amensagem.umalgoritmoparacalcularnmerosdeFibonacci.''
''EujseicomocalcularosnmerosdeFibonacci,''disseodrago.
''Oh?Como?''
''Porque,eunosonhodeestragaradiverso,dizendolhe,''odrago
respondeu.
''Eunoachoquevocfaria,''Martindisparoudevolta.''Masolivrodizque
Lorotadenigualalorotaden1maislorotaden2.Essaumarecursivadefinio,eeu

pgina257

CAPTULO8recurso 245
jsabecomotrabalharcomrecursividade.''
''Oquemaisfazorolodizer?''Odragoperguntou.
''Nadamais.Deveriadizermais?''
Derepente,odragoassumiuumtommaisinsinuante.Martinencontroua

alterarsurpreendente.''MeninoQuerida!Vocfariaumvelhodragopobrepequena
pequenofavor?CalcularumnmerodeFibonacciparamim.Prometosparapedirlhe
paraumpequeno.''
''Bem,eudeveriaestarlemcimaagora,alimpezadascaldeires,''Martin
comeou,masvendooolharmagoadonorostododrago,acrescentou,''maseuachoque
temtempoparaumapequenaum.''
''Vocnovaisearrepender'',prometeuodrago.''Digame:oqueFibde
quatro?''
MartintraousuatraduodoalgoritmodeFibonaccinop:
Fib(n)=Fib(n1)+Fib(n2)
EntoelecomeouacalcularFibdequatro:
Fib(4)=Fib(3)+Fib(2)
Fib(3)=Fib(2)+Fib(1)
Fib(2)=Fib(1)+Fib(0)
Fib(1)=Fib(0)+Fib(1)
Fib(0)=Fib(1)+Fib(2)
Fib(1)=Fib(2)+Fib(3)
Fib(2)=Fib(3)+Fib(4)
Fib(3)=Fib(4)+Fib(5)
''Acabou?""Odragoperguntouinocentemente.
''No'',Martinrespondeu.''Algoesterrado.Osnmerosestoatornarse
cadavezmaisnegativa.''
''Bem,vocestarconcludoembreve?''
''Parecequeeununcavaiserterminado'',disseMartin.''Esterecurso
continuaindoparasempre.''
''Aha!Entende?Vocestpresoemumainfinitarecurso!''Odrago
regozijouse.''Euobserveioaomesmotempo.''
''Entoporquevocnodissealgumacoisa?''Martinexigiu.
Odragofezumacaretaedeuumpequenobufochamaazulapareceubrevementeem
suasnarinas.''Comoquevocnuncavirarecursividademestresevoccontarcomuma
dragoparafazeroseupensamentoparavoc?''

pgina258

246

CommonLisp:AGentleIntroduoComputaoSimblica
Martinnoestavacommedo,maselerecuouumpoucodequalquermaneiraparadeixarofumo
Claro.''Bem,comovocdetectaroproblematorapidamente,drago?''
''Elementary,rapaz.Opergaminhodissecomodarumnicopasso,ecomo
quebraraviagemparabaixoparaummenor.Elenodissenadasobrequandovoc
comeaaparar.Ergo,''odragosorriu,''vocno.''

8,10recursoinfinitaemLisp
funesLisppodeserfeitopararecorrerinfinitamenteignorandoodragodaprimeira
Estadoderecurso,quesaberquandoparar.AquiestoLisp
implementaodoalgoritmodeMartin:
(Defunfib(n)
(+(FIB(n1))
(FIB(n2))))
(FIBdtrace)
>(FIB4)
EnterFIB
|
N=4
|EnterFIB
||
N=3
||EnterFIB
|||
N=2
|||EnterFIB
||||
N=1

||||EnterFIB
|||||
|||||EnterFIB
||||||
||||||EnterFIB
|||||||
|||||||EnterFIB
||||||||

N=0
N=1
N=2
N=3

aoinfinito
Normalmente,umbomprogramadorpodedizersdeolharparaumafunose
vaiexporrecursoinfinita,masemalgunscasosissopodeserbastantedifcil
determinar.TentetraaraseguintefunoC,dandolheentradasquesopequenos
inteirospositivos:

pgina259

CAPTULO8recurso 247
(Defunc(n)
(Cond((igualn1)t)
((Evenpn)(C(N/2)))
(T(C(+(*N3)1)))))
>(C3)
DigiteC

|
N=3
|DigiteC
||
N=10
||DigiteC
|||
N=5
|||DigiteC
||||
N=16
||||DigiteC
|||||
N=8
|||||DigiteC
||||||
N=4
||||||DigiteC
|||||||
N=2
|||||||DigiteC
||||||||
N=1
|||||||
\CTdevolvido
||||||
\CTdevolvido
|||||
\CTdevolvido
||||
\CTdevolvido
|||
\CTdevolvido
||
\CTdevolvido
|
\CTdevolvido
\CTdevolvido
T
TentechamarCemoutrosvaloresentreumedez.Notesequenohnenhuma
relaoevidenteentreotamanhodaentradaeonmeroderecursiva
chamaesseresultado.tericosdosnmerosacreditamqueafunoretornaTparacada
nmerointeiropositivo,emoutraspalavras,nohentradasquecausamarecursividade
infinitamente.IstoconhecidocomoaconjecturadeCollatz.Masatqueaconjectura
provado,nopodemosdizercomcertezasedeveounoCsempreretorna.
EXERCCIOS
8.11. ApartequefaltadoalgoritmodeFibonaccideMartinaregraparaFib(1)
eFib(0).Ambosestesestoaserdefinidoum.
usandoeste

pgina260

248

CommonLisp:AGentleIntroduoComputaoSimblica
informaes,escrevaumaversocorretadafunoFIB.(FIB4)deve
voltarcinco.(FIB5)deveretornaroito.
8,12. ConsidereoseguinteversodoANY7P,umafunorecursivaque
pesquisaumalistaparaonmerosete:
(Defunqualquer7p(x)
(Cond((igual(primeirox)7)t)
(T(qualquer7p(restox)))))
Dumexemplodeentradaparaoqualestafunoirfuncionarcorrectamente.Dar
aqueleparaoqualafunorecorrerinfinitamente.
8.13. Reveradefiniodafunofatorial,FACT,dadaanteriormente.
Quetipodeentradaquevocpoderiadarlheacausarumarecursoinfinita?
8,14. Escrevaomuitomaiscurtofunoderecursoinfinitaquepuder.
8.15. Considerealistacircularmostradoabaixo.Qualocarrodestalista?
Qualocdr?QualserafunoCOUNTfatiasdefazerquando
dadaestalistacomoentrada?

x
8.11MODELOSrecurso
AmaioriadasfunesLisprecursivacairemalgunstiposdeformulrios.Essesso
descritapormodelosderecurso,quecapturamaessnciadaformaemum

fillintheblankspadro.Vocpodecriarnovasfunes,escolhendoum
templateepreenchendoosespaosembranco.Almdisso,umavezquevocjdominalos,vocpode
usarosmodelosparaanalisarfunesexistentesparaverqualpadroelesseencaixam.
Arecursodecauda8.11.1DuploTest
Oprimeiromodeloquevamosestudarduplotestederecursodecauda,quemostradona
Figura81.''Doubletest''indicaqueafunorecursivatemdoisfinais
testesSeumaforverdadeira,ovalorfinalcorrespondenteretornadoaoinvsde
prosseguircomarecursividade.Quandoambososensaiosfinaissofalsas,queacabamno

pgina261

CAPTULO8recurso 249

ArecursodecaudaduplaTest
Modelo:
(Defunfunc(X)
(COND(endtest1endvalor1)

(Endtest2fimvalue2)
(T(FUNCreduzidax))))

Exemplo:
Func:
Endtest1:
Endvalue1:
Endtest2:
Endvalue2:
Reduziux:

ANYODDP
(NULLX)
NADA
(ODDP(PRIMEIROX))
T
(RESTX)

(Defunanyoddp(x)
(Cond((nullx)nil)
((Oddp(primeirox))t)
(T(anyoddp(restantex)))))

Figura81Moldeparaodoubletestecaudarecurso.

pgina262

250

CommonLisp:AGentleIntroduoComputaoSimblica
clusuladeltimaCOND,ondeafunoreduzaentradadealgumaformae,emseguida,
chamaasimesmodeformarecursiva.Estemodeloestaserditocaudarecursivo,poiso
aopartedaltimaclusulaCONDnofazerqualquertrabalhoapsarecursiva
ligar.Sejaqualfororesultado,achamadarecursivaproduz,queoqueoCOND
retornos,demodoqueoquecadaumdospaischamadaretorna.ANYODDPumexemplode
umafunocaudarecursivo.
EXERCCIOS
8.16. OqueaconteceriasensmudamosoprimeiroesegundoclusulasCOND
emANYODDP?
8.17. UsedoubletestecaudarecursoparaescreverENCONTRARprimeiroODD,umafuno
queretornaoprimeironmeromparemumalista,ounilsenohnenhum.Comear
copiandoosvaloresdomodelorecursoparaANYODDPapenasumapequena
amudananecessriaparaderivarFINDprimeiroODD.
Arecursodecauda8.11.2Singleteste
Ummodelomaissimples,masmenosfrequentementeutilizadootestenicorecursocauda,que
mostradonaFigura82.Suponhaquensqueremosencontraroprimeirotomoemumalista,onde
alistapodeseraninhadosarbitrariamenteprofundamente.Nspodemosfazerissotomandosucessiva
Primeirosdalistaatquealcancemosumtomo.AfunoFINDprimeiroATOM
fazisso:
(encontrarprimeiroatom'(oohaheee))ooh
(encontrarprimeirotomo'((((AF))i)R))um
(encontrarprimeiroatom'fred)fred
Emgeral,arecursividadetestenicousadoquandosabemosafunovontade
sempreencontraroqueestprocurando,eventualmenteENCONTRARprimeiroATOM

garantidoparaencontrarumtomoseelecontinuatomandoestreiassucessivasdesuaentrada.
Nsusamosarecursodoubleteste,quandoexisteapossibilidadedeafunodepoder
Noconsegueencontraroqueestprocurando.EmANYODDP,porexemplo,osegundoteste
verificadoseeletinhaencontradoumnmerompar,maseranecessrioprimeiroumtesteparaverseo
funotinhafugidodofinaldalista,casoemqueeledeveretornarNIL.
EXERCCIOS
8.18. UsetestenicocaudarecursoparaescreverLASTELEMENT,umafunoque
retornaoltimoelementodeumalista.LTIMAelementodeverecursivamente

pgina263

CAPTULO8recurso 251

Arecursodecaudanicoteste

Modelo:
(Defunfunc(X)
(COND(fimvalorfinaldeteste)
(T(FUNCreduzidax))))

Exemplo:
Func:
Endteste:
Valorfinal:
Reduziux:

ENCONTRARprimeiroATOM
(ATOMX)
x
(PRIMEIROX)

(Defunencontrarprimeirotomo(x)
(Cond((tomox)x)
(T(encontrarprimeirotomo(primeirax)))))

Figura82Moldeparaotestenicocaudarecurso.

pgina264

252

CommonLisp:AGentleIntroduoComputaoSimblica
viajarparabaixonalistaatqueeleatinjaaclulaltimacontras(aclulacujocdr
umtomo)emseguida,eledeveretornarocarrodaclula.
8.19. SuponhaquedecidiuconverterANYODDPparatestenicocaudarecurso
,simplesmenteeliminandoaclusulaCONDcomotesteNULL.Para
quaisasentradasqueaindafuncionamcorretamente?Oqueaconteceriaem
casosemquenofuncionoucorretamente?
8.11.3Aumentandorecurso
AumentandofunesrecursivascomoCOUNTFATIASconstruiroseuresultado
aospoucos.Chamamosesteprocessodeaumento.Emvezdedividiro
problemaemumpassoinicialmaisumajornadamenor,quedividilaemumamenor
viajemmaisumpassofinal.Opassofinalconsisteemescolherumaumento
valoreaplicloparaoresultadodachamadarecursivaanterior.emCOUNT
Slices,porexemplo,nsconstrumosoresultadoprimeiramentefazendoumachamadarecursiva
e,emseguida,adicionandoumaoresultado.Ummodeloparadeaumentotestenico
recursomostradonaFigura83.
Semoaumentodoresultadopermitidoemfunesdecaudarecursivo.
Portanto,ovalorretornadoporumafunodecaudarecursivasempreigual
umdosvaloresfinaisnadefiniodafunonoconstrudapoucoapoucocomo
Cadachamadarecursivaretorna.CompareANYODDP,quesempreretornaTou
NADAnuncaaumentaoseuresultado.
EXERCCIOS
8.20. Dostrsmodelosquetemosvistoatagora,qualdelesdescreveFACT,
afunofactorial?Anoteosvaloresdosdiferentestemplate
componentesparafato.
8.21. EscreverumafunorecursivaADDNUMSqueacrescentaseanmerosdeN,
N1,N2,eassimpordiante,at0,edevolveoresultado.Porexemplo,
(ADDNUMS5)devecalcular5+4+3+2+1+0,quede15.
8.22. EscreverumafunorecursivaALLEQUALqueretornaTseoprimeiro

elementodeumalistaigualaosegundo,osegundoigualaoterceiro,
oterceiroigualaoquarto,eassimpordiante.(ALLEQUAL'(IIII))
deveretornarT.(ALLEQUAL'(IIEI))deveretornarNIL.TODOS
EQUALdeveretornarTparalistascommenosdedoiselementos.Serqueeste
problemarequeroaumento?Qualmodelovocvaiusarpararesolver
isto?

pgina265

CAPTULO8recurso 253

SingletesteAumentandorecurso

Modelo:
(Defunfunc(X)
(COND(fimvalorfinaldeteste)
(T(agostofunagostoval
(FUNCreduzidax)))))

Exemplo:
Func:
Endteste:
Valorfinal:
Agodiverso:
Agoval:
Reduziux:

CountFATIAS
(NULLX)
0
+
1
(RESTX)

(Defuncontagemdefatias(x)
(Cond((nullx)0)
(T(+1(contagemdefatias(restantex))))))

Figura83Moldeparaotestenicodeaumentorecurso.

pgina266

254

CommonLisp:AGentleIntroduoComputaoSimblica

8.12variaessobreosmodelosbsicos
Osmodelosqueaprendemosatagoratmmuitosusos.Certasformasdeutilizao
elessoespecialmentecomunsnaprogramaoLisp,emerecemespecial
meno.Nestaseonsvamoscobrirquatrovariaessobreosmodelosbsicos.
8.12.1ListConsingrecurso
ListconsingrecursousadamuitofrequentementeemLisp.Eleumcasoespecialde
aumentandorecursoemqueafunodeaumentoCONS.Comocada
chamadaretornarecursiva,criamosumanovaclulacontras.Assim,aprofundidadedo
recursoigualaocomprimentodacadeiadeclulascontrasresultante,almdeum
(PorquealtimachamadaretornaNIL,emvezdeumacons).AfunoRISO
vocescreveunoprimeiroexerccioderecursoumexemplodelistaconsing
recurso.VejaaFigura84paraomodelo.
EXERCCIOS
8.23. Suponhaquensavaliamos(risos5).Faaumatabelamostrando,paracadachamada
rir,ovalordeN(apartirdecincoatzero),ovalordo
primeiraentradaparaCONS,ovalordasegundaentradaparaCONS,eo
resultadoretornadoporRISO.
8.24. Escrevercontagemregressiva,umafunoquefazacontagemregressivaapartirdenusandolista
recursoconsing.(Contagemregressiva5)deveproduziralista(5432
1).
8.25. Comopoderiacontagemregressivaserusadoparaescreverumaversoaplicativode
FATO?(VocpodeignoraresteproblemasevocaindanoleuoCaptulo7ainda.)
8.26. Suponhaquequeriamodificarcontagemregressivaparaquealistaque
construtosterminaemzero.Porexemplo,(countdown5)seria
produzir(543210).Mostramduasmaneirasistopodeserfeito.
8.27. EscreverSQUARELIST,umafunorecursivaquelevaumalistadenmeros
comoentradaeretornaumalistadesuascasas.(SQUARELIST"(3456))
deveretornar(9162536).

pgina267

CAPTULO8recurso 255

ListConsingrecurso
(Umcasoespecialdeaumentarrecurso)

Modelo:
(Defunfunc(N)
(COND(endtesteNIL)
(T(CONSnovoelemento
(FUNCreduzidaN)))))

Exemplo:
Func:
Endteste:
Newelemento:
ReduziuN:

RIR
(ZEROPN)
'HA
(N1)

(Defunrir(n)
(Cond((Nzerop)nil)
(Hat('contras(rir(n1))))))

Figura84Modelopararecursolistaconsing.

pgina268

256

CommonLisp:AGentleIntroduoComputaoSimblica
8.12.2simultnearecursodediversasvariveis
recursosimultneademltiplasvariveisumaextensodiretapara
qualquermodeloderecurso.Emvezdeterapenasumaentrada,afunotem
vrios,eumoumaisdeles''reduzida"'comcadachamadarecursiva.Para
exemplo,suponhaquequeremosescreverumaversorecursivadeNTH,chamadomeu
NTH.Lembreseque(NTH0x)(PRIMEIROx)issonosdizqualotestefinalparausar.
Comcadachamadarecursivareduzimosnporumetomardescansasucessivasdo
listax.Afunoresultantedemonstratestenicorecursocaudacom
recursosimultneadeduasvariveis.OmodelomostradonaFigura85.
Aquiumtraoemquevocpodeverasduasvariveissendoreduzida
simultaneamente.
(Defunmyn(nx)
(Cond((zeropN)(primeiraX))
(T(meun(n1)(restantex)))))
>(Meuensimo2'(ABCDE))
EnterMYNTH
|
N=2
|
X=(ABCDE)
|EnterMYNTH
||
N=1
||
X=(BCDE)
||EnterMYNTH
|||
N=0
|||
X=(CDE)
||
\MYNTHvoltouC
|
\MYNTHvoltouC
\MYNTHvoltouC
C
EXERCCIOS
8.28. Asexpresses(MYNTH5'(ABC))e(MYNTH1000'(ABC))
tantocorrerparaforadaextremidadedalista.e,portanto,produzirumresultadonulo.noentanto,o
segundaexpressolevaumpoucomaistempoparaexecutardoqueoprimeiro.
ModificarMYNTHdemodoquearecursopraassimafunoexecutada
paraforadaextremidadedalista.
8.29. EscreverMYMEMBRO,umaversorecursivadeMEMBRO.estafuno
terduasentradas,masvocsvaiquererreduzirumdelescom

cadachamadasucessiva.Ooutrodevepermanecerinalterado.

pgina269

CAPTULO8recurso 257

Arecursosimultneadevriasvariveis
(UtilizandoomodelorecursoTestcaudanico)

Modelo:
(Defunfunc(NX)
(COND(fimvalorfinaldeteste)
(T(FUNCreduzidanreduzidox))))

Exemplo:
Func:

MYNTH

Endteste:
Valorfinal:
ReduziuN:
Reduziux:

(ZEROPN)
(PRIMEIROX)
(N1)
(RESTX)

(Defunmyn(nx)
(Cond((zeropN)(primeiraX))
(T(meun(n1)(restantex)))))

Figura85Modelopararecursosimultneadediversasvariveis,usandoumnicoteste
recursodecauda.

pgina270

258

CommonLisp:AGentleIntroduoComputaoSimblica

8.30. EscreverMYASSOC,umaversorecursivadeASSOC.
8.31. Suponhaquequeremosdizertorapidamentequantopossvel,seumanicalista
maiscurtadoqueaoutra.Seumalistatemcincoelementoseooutrotemum
milhes,noqueroterquepassarportodasummilhodeclulascontras
antesdedecidirqueasegundalistamaislonga.Portanto,nodevemoscham
COMPRIMENTOnasduaslistas.EscreverumafunorecursivaCOMPARE
Comprimentosquelevaduaslistascomoentradaeretornaumdosseguintes
smbolos:SAMEdecomprimento,PRIMEIROISmais,ouSEGUNDAIS
MAISLONGO.Usetripletesterecursosimultnea.Sugesto:Sexmenor
queYeambossonovazio,entoREST(x)maiscurtodoqueREST(y).
8.12.3condicionalAugmentation
Emalgunsproblemasdeprocessamentodelistaqueremosignorardeterminadoselementosdalista
eusarapenasasrestantesparaconstruiroresultado.Istoconhecidocomo
Aumentocondicional.Porexemplo,noextratodesmbolos,definidos
napginaoposta,apenasoselementosquesosmbolosseroincludosna
resultado.
>(extratosmbolos"(3ursose1menina))
ENTERextrairSMBOLOS
|
X=(3ursose1MENINA)
|ENTERextrairSMBOLOS
||
X=(ursose1MENINA)
||ENTERextrairSMBOLOS
|||
X=(AND1MENINA)
|||ENTERextrairSMBOLOS
||||
X=(1MENINA)
||||ENTERextrairSMBOLOS
|||||
X=(menina)
|||||ENTERextrairSMBOLOS
||||||
X=NIL
|||||
\ExtratosmbolosvoltouNIL
||||
\Extratosmbolosdevolvidos(menina)
|||
\Extratosmbolosdevolvidos(menina)
||
\Extratosmbolosdevolvido(emenina)
|
\Extratosmbolosdevolvidos(URSOSEMENINA)
\Extratosmbolosdevolvidos(URSOSEMENINA)
(URSOSEMENINA)
OcorpodeextractodeSMBOLOScontmduaschamadasrecursivas.umachamada
estaninhadoemumaexpressodeaumento,quenestecasoconsesumnovo

pgina271

CAPTULO8recurso 259

Aumentocondicional
Modelo:
(Defunfunc(X)
(COND(fimvalorfinaldeteste)
(Agostoteste(agostofunagostoval
(Funcreduziux))
(T(FUNCreduzidax))))

Exemplo:
Func:
Endteste:
Valorfinal:
Agoteste:

ExtractSMBOLOS
(NULLX)
NADA
(Symbolp(PRIMEIROX))

Agodiverso:
Agoval:
Reduziux:

CONS
(PRIMEIROX)
(RESTX)

(Defunextrairsmbolos(x)
(Cond((nullx)nil)
((Symbolp(primeiraX))
(Cons(primeirox)
(Extratosmbolos(restantex))))
(T(extratosmbolos(restantex)))))

Figura86Templateparaoaumentocondicional.

pgina272

260

CommonLisp:AGentleIntroduoComputaoSimblica
elementonalistaderesultados.Aoutrachamadaunaugmentedemvezdissooseuresultadoest
simplesmentedevolvido.Nasadaderastreioanteriorvocvainotarquesvezesdois

chamadassucessivasretornaromesmovalor,comoduaslistas(menina)eduaslistas
(ursosemenina)issoporqueumdecadapardechamadasescolheuo
clusulaCONDunaugmented.Quandoaclusulaaumentadafoiescolhido,o
resultadotemmais,comoquandofomosdezeroa(menina),delpara(AND
MENINA),edelpara(ursosemenina).VerFigura86parao
modelogeralparaoaumentocondicional.
EXERCCIOS
8.32. EscreverafunoSUMnumricoelementos,queacrescentasetodos
osnmerosemumalistaeignoraosnonmeros.(SUMNUMERIC
ELEMENTOS"(3URSOS3taaseumamenina))deveretornar
Sete.
8.33. EscreverMYREMOVE,umaversorecursivadafunoREMOVER.
8.34. EscreverMYcruzamento,um
funodeinterseo.

versodorecursiva

8.35. EscreverMYSETDIFERENA,umaversorecursivadoSET
funodediferena.
8.36. AfunoCOUNTODDcontaonmerodeelementosestranhosemumalista
denmerosporexemplo,(contagemdeODD"(45678))deveretornar
dois.
MostracomoescrevercontagemdeODDusandocondicional
aumento.Emseguida,escrevaumaoutraversodoCOUNTODDusandoo
templateregularesdeaumentorecurso.(Parafazerissovocvaiprecisar
escreverumaexpressocondicionalparaovalordeaumento.)
8.12.4Multiplerecurso
Umafunomltiplarecursivasefazmaisdoqueumachamadarecursivacom
cadachamada.(Noconfundirsimultneacommltiplosrecurso.O
extcnicadeapenasreduzdiversasvariveissimultaneamenteissono
envolvemmltiplaschamadasrecursivascomcadachamada.)AfunodeFibonacci
umexemploclssicodemltiplosrecurso.Fib(N)chamaseduasvezes:umavezpara
Fib(N1)enovamenteparaFib(N2).Osresultadosdasduaschamadassocombinadas
usando+.UmmodelogeralparamltiplosrecursomostradonaFigura87.
Umaboamaneiradevisualizaroprocessodemltiplosrecursoolharparao
formadaschamadasaninhadasnasadaderastreio.Vamosdefinirumachamadadoterminalcomoum

pgina273

CAPTULO8recurso 261

Multiplerecurso
Modelo:
(Defunfunc(N)
(COND(endtest1endvalor1)
(Endtest2fimvalue2)
(T(combinador(funcprimeirareduziun)
(Segundareduziunfunc)))))

Exemplo:
Func:
Endtest1:
Endvalue1:
Endtest2:
Endvalue2:
combinador:
PrimeirareduzidaN:

FIB
(EQUALN0)
1
(EQUALN1)
1
+
(N1)

Segundareduziun:

(N2)

(Defunfib(n)
(Cond((igualn0)1)
((Nigual1)1)
(T(+(FIB(n1))
(FIB(N2))))))

Figura87Modeloparamltiplosrecurso.

pgina274

262

CommonLisp:AGentleIntroduoComputaoSimblica
chamarquenorecursemaislonge.Emtodasasfunesanteriores,sucessiva
chamadasforamaninhadosestritamenteumdentrodooutro,eachamadamaisntimofoio
nicachamadaterminal.Emseguida,osvaloresderetornofluiuemumalinharetadesdeo
chamadamaisinternadevoltaparaoexterior.Mascomumafunodemltiplarecursiva
taiscomoFIB,cadachamadaproduzduasnovaschamadas.Osdoissoaninhadosdentrodo

chamadapai,maselesnopodemaninhardentrodeunsaosoutros.Emvezdisso,aparecemladoa
ladodentrodopai.Mltiplasfunesrecursivatem,portanto,muitos
chamadasterminais.Naseguintesadaderastreio,existemtrschamadasdeterminaise
duaschamadasnoterminais.
>(FIB3)
EnterFIB
|
N=3
|EnterFIB
||
N=2
||EnterFIB
|||
N=1
||
\FIBvoltou1
||EnterFIB
|||
N=0
||
\FIBvoltou1
|
\FIB2devolvido
|EnterFIB
||
N=1
|
\FIBvoltou1
\FIBvoltou3
3
EXERCCIO
8.37. Definirumafunosimplescombinamquelevadoisnmeroscomoentrada
eretornaasomadeles.Agorasubstituaaocorrnciade+naFIBcom
COMBINAR.TraarFIBecombinar,etentaravaliar(FIB3)ou
(FIB4).Oquevocpodedizersobrearelaoentrealiga,
chamadasdeterminais,echamadasnoterminais?
8.13RVORESECAR/RECURSOCDR
svezesqueremosprocessartodososelementosdeumalistaaninhada,noapenaso
elementosdenvelsuperior.Sealistadeformairregular,como(((GOLDILOCKS
.E))(THE.3)BEARS),issopodeparecerdifcil.Quandoescrevemosonosso
funo,nsnosabemosquantotempoouquoprofundamenteaninhadasuasentradasser.

pgina275

CAPTULO8recurso 263

CAR/CDRrecurso
(Umcasoespecialdemltiplarecurso)

Modelo:
(Defunfunc(X)
(COND(endtest1endvalor1)
(Endtest2fimvalue2)
(T(combinador(func(CARX))
(Func(CDRX))))))

Exemplo:
Func:
Endtest1:
Endvalue1:
Endtest2:
Endvalue2:
combinador:

FINDNMERO
(NumberpX)
x
(ATOMX)
NADA
OU

(Defunencontrarnmero(x)
(Cond((numberpx)x)
((tomoX)nil)
(T(ou(encontrarnmero(carx))
(Encontrarnmero(cdrx))))))

Figura88MoldeparaoCAR/CDRrecurso.

pgina276

264

CommonLisp:AGentleIntroduoComputaoSimblica

NADA

NADA

3
A

BEARS

E
GOLDILOCKS
Otruquepararesolveresteproblemanoapensarnaentradacomo
deformairregularlistaaninhada,massimcomoumarvorebinria(consulteoseguinte
.Ilustrao)rvoresbinriassomuitoregular:Cadanouumtomoouum
contrascomdoisramos,ocarroeoCDR.Porissotodaanossafunotemde
fazerprocessarostomos,echamarsedeformarecursivanocarroecdrdecada
contras.EstatcnicachamadaCAR/CDRrecursoumcasoespecialde
recursomltipla.

NADA

goldilockse

3URSOS

NADA

pgina277

CAPTULO8recurso 265
Porexemplo,suponhaquequeremosumafunoFINDnmeroaprocurarumarvore
eretornaroprimeironmeroqueaparecenamesma,ounilsenohnenhum.Ento
devemosusarnumberpeATOMcomonossostestesfinaiseORcomoa
combinador.(VejaomodelonaFigura88.)NotesequedesdeORum
condicional,assimqueumaclusuladoORavaliadacomoverdadeira,oORparadas
eretornaessevalor.Assim,notemosparapesquisartodaarvorea
funoirpararrecursingassimquequalquerresultadodechamadasemumvalordiferentedezero.
Almdebuscarrvore,umoutrousocomumparaCAR/CDRrecurso
construirrvoresusandoCONScomoocombinador.Porexemplo,aquiumafuno
quelevaumarvorecomoentradaeretornaumanovarvoreemquecadaNILnotomo
foisubstitudopelosmboloQ.
(tomosdetoqdefun(x)
(Cond((nullx)nil)
((tomoX)'Q)
(T(cons(tomostoq(carrox))
(tomosaQ(CDRx))))))
>(tomostoQ'(a.B))
(Q.Q)
>(tomostoq'(Hark(Haroldoanjo)canta))
(Q(QQQ)Q)
EXERCCIOS
8.38. QualseriaoefeitodeexcluiraprimeiraclusulaCONDem
TOMOSaQ?
8.39. Escreverumafunocontagemdetomosqueretornaonmerodetomosno
umaarvore.(Contagemdetomos"(A(B)C))deveretornarcinco,umavezqueem

AlmdeA,B,eCexistemdoisNILnarvore.
8,40. EscreverCOUNTCONS,umafunoqueretornaonmerodeclulascontras
emumarvore.(ContagemCONS'(foo))deveretornarum.(CONTAGEM
(Foobar)'CONS)deveretornardois.(CountCONS'((FOO)))
tambmdeveretornardois,umavezquealista((FOO))requerduasclulascontras.
(FRED'CountCONS)deveretornarzero.
8.41. EscreverumafunoSUMrvorequeretornaasomadetodososnmeros
aparecendoemumarvore.Nonnumbersdeveserignorado.(SUMrvore"((3
BEARS)(3tigelas)(1MENINA)))deveretornarsete.
8.42. EscreverMYSUBST,umaversorecursivadafunoSUBST.

pgina278

266

CommonLisp:AGentleIntroduoComputaoSimblica
8.43. EscreverFLATTEN,umafunoqueretornatodososelementosdeum
arbitrariamentelistaaninhadoemumalistadenvelnico.(Aplanar((AB(R))AC
(AD((A(B))R)A)))deveretornar(ABRACADABRA).
8.44. EscreverumafunoTREEPROFUNDIDADEqueretornaaprofundidademximadeum
rvorebinria.(TREEprofundidade"(A.B))deveretornarum.(RVORE
PROFUNDIDADE'((ABCD)))deveretornarcinco,e(TREEprofundidade"((A.B)
.(C.D)))deveretornardois.
8.45. EscreverumafunoPARENprofundidadequeretornaaprofundidademximade
parntesesaninhadosemumalista.(PARENprofundidade"(ABC))deveretornar

um,enquantoTREEPROFUNDIDADEvoltariatrs.(PARENprofundidade"(A
B((C)D)E))deveretornartrs,umavezqueexisteumelementoCque
aninhadoemtrsnveisdeparnteses.DICA:Esteproblemapodeserresolvido
peloCAR/CDRrecurso,masoscasosCAReCDRnoser
exactamentesimtrica.
8.14FUNESDEUSARDEAJUDA
Paraalgunsproblemastilparaestruturarasoluocomofunoajudar
almdeumafunorecursiva.Afunorecursivafazamaioriadotrabalho.o
ajudandofunoaquevocchamadenvelsuperioreleexecutaalguns
servioespecial,quernoincioounofinaldarecurso.Para
exemplo,suponhaquequeremosescreverumafunoCOUNTUPquecontaapartirde
umatn:
(countup5)(12345)
(countup0)nil
Esteproblemamaisdifcildoquecountdownporqueomaisntimo
chamadarecursivadeveencerrararecursoquandoaentradaatingecinco(na
exemploanterior),nozero.Emgeral,comoqueafunodesaberquando
Pare?AmaneiramaisfcilfornecerovalororiginaldeNaorecursiva
funoparaqueelepossadecidirquandoparar.Nstambmdevefornecerumextra
argumento:umcontadorqueindicaafunodequantotempoeleestnorecurso.
Atarefadafunoajudarfornecerovalorinicialparaocontador.
(Defuncontamup(n)
(Countuprecursivamente1n))

pgina279

CAPTULO8recurso 267
(Defuncontarserecursivamente(cntn)
(Cond((>cntn)nil)
(T(conscnt
(Countuprecursivamente
(CNT+1)N)))))
(Countuprecursivamentedtracecontamup)
>(Countup3)
EnterCOUNTUP
|
N=3
|EnterCOUNTUPrecursivamente
||
CNT=1
||
N=3
||EnterCOUNTUPrecursivamente
|||
CNT=2
|||
N=3
|||EnterCOUNTUPrecursivamente
||||
CNT=3
||||
N=3
||||EnterCOUNTUPrecursivamente
|||||
CNT=4
|||||
N=3
||||
\COUNTUPrecursivamentevoltouNIL
|||
\COUNTUPrecursivamentedevolvido(3)
||
\COUNTUPrecursivamenteretornado(2e3)
|
\COUNTUPrecursivamenteretornado(123)
\COUNTUPretornado(123)
(12,3)
EXERCCIOS
8.46. Outraformaderesolveroproblemadecontarparacimaadeadicionarum
elementoparaofimdalistacomcadachamadarecursivaemvezdeadicionar
elementosparaoincio.Estaabordagemnorequerumajudando

funo.EscreverestaversodoCOUNTUP.
8.47. EscreverFAApo,umafunoqueretornaumpedaodetamanho
N.(FAANACO4)deveretornar(XXXX).Useseemvezde
COND.
8.48. Escreverumafunorecursivaenterraressaenterraumitemsobonnveisde
parnteses.(BURY'FRED2)deveretornar((FRED)),enquanto(BURY
"FRED5)deveretornar(((((FRED))))).Qualmodelorecursofez
vocusa?

pgina280

268

CommonLisp:AGentleIntroduoComputaoSimblica
8.49. Escreveremparelhamentos,umafunoquereneoselementosdeduaslistas.
(emparelhamentos'(ABC)'(312))deveretornar((A1)(B2)(C3)).Voc
podesesuporqueasduaslistasserdeigualcomprimento.
8,50. Escreversublists,umafunoqueretornaossublistssucessivasdeum
Lista.((FIEFOEFEE'sublists))deveretornar((FEEFIEFOE)(FIE
FOE)(FOE)).
8.51. AmaneiramaissimplesdeescreverMYreverso,umaversorecursivade
Inversa,comumafunodeajudarmaisumafunorecursivadedois
insumos.EscreverestaversodoMYREVERSE.
8.52. EscreverMYUNION,umaversorecursivadeUNION.

8.53. EscrevermaiorMESMO,umafunorecursivaqueretornaomaior
mesmonmeronumalistadenmerosinteirosnonegativos.(MaiorMESMO"(52
43))deveretornarquatro.(MaiorMESMONIL)deveretornarzero.
UseafunoMAXbuiltin,queretornaomaiordeseusinsumos.
8.54. Escreverumafunorecursivaenormequeelevaumnmeroasuaprpria
poder.(ENORME2)deveretornar22(ENORME3)deveretornar33 =27,
4 =256,eassimpordiante.NouseREDUZIR.
(ENORME4)deveretornar4
8,15recursoemarteeliteratura
Recursopodemserencontradosnoapenasemprogramasdecomputador,mastambmemhistriase
empinturas.OclssicoAsMileUmaNoitesrabescontm
histriasdentrodehistriasdentrodehistrias,dandolheumsaborrecursiva.Umsimilar
efeitoexpressavisualmenteemalgunsdosdesenhosdoDr.SeussemTheCatinthe
HatComesBack.UmdestesmostradonaFigura89.Oassentamentodegatos
dentrodechapuscomooassentamentodecontextosemqueumafunorecursivachamaasimesmo.
Nahistria,tomadadecadagatoquetiraseuchapudesempenhaopapeldeumafunorecursiva
ligar.GatopequenoBtemseuchapusobrenestemomento,masarecurso,eventualmente,recebe
todoocaminhoaZ,eterminacomumaexploso.(Seestahistriatemqualquer
moral,pareceser,''saberquandoparar!'')
Algumasdasrepresentaesmaisimaginativasderecursoeauto
referencialidadenaartesoasobrasdoartistaholandsMCEscher,cuja
litografia''Mosdodesenho''aparecenaFigura810.DouglasHofstadter
discuteopapeldarecursoemmsica,arteematemticaemseulivro
Godel,Escher,Bach:AnEternalGoldenBraid.Ashistriasdedragoneste
captuloforaminspiradospelospersonagensdolivrodeHofstadter.

pgina281

CAPTULO8recurso 269

Figura89Gatosrecursivamenteaninhados,deTheCatintheHatComesBack,peloDr.
Suess.Copyright(c)1958porDr.Suess.ReproduzidocompermissodeRandomHouse,
Inc.

pgina282

270

CommonLisp:AGentleIntroduoComputaoSimblica

Figura810''Mosdodesenho''porMCEscher.Copyright(c)1989MCEscher
herdeiros/CordonArtBaarnHolland.
RESUMO
Recursoumaestruturadecontrolemuitopoderoso,eumdosmaisimportantes
ideiasemcinciadacomputao.Umafunoditoser"'recursiva''sechama
si.Paraescreverumafunorecursiva,temosderesolvertrsproblemascolocadospela
trsregrasderecursodoDrago:
1. Saberquandoparar.
2. Decidircomodarumpasso.
3. Quebraraviagemparabaixoemquepassomaisumajornadamenor.

pgina283

CAPTULO8recurso 271
Nsvimosumnmerodemodelosderecursonestecaptulo.recurso
modelosdecapturaraessnciadecertassoluesrecursivasestereotipados.
Elespodemserusadosparaescrevernovasfunes,ouparaanalisarexistente
funes.Osmodelosquevimosatagoraso:
1.
2.
3.
4.
5.
6.
7.
8.

Doubletestederecursodecauda.
Testenicorecursodecauda.
Testenicorecursodeaumento.
Listconsingrecurso.
recursosimultneadevriasvariveis.
Aumentocondicional.
Vriaschamadasrecursivas.
CARrecurso/CDR.

exercciosdereviso
8,55. Oquedistingueumafunorecursivaapartirdeumnorecursiva?
8.56. Escrevercadadois,umafunorecursivaqueretornatodososoutros
elementodeumalista,oprimeiro,terceiro,quinto,eassimpordiante.(Acadadois
'(ABCDEFG))deveretornar(ACEG).(Acadadois'(I
VimmimviqueeuCONQUISTADO))deveretornar(III).
8.57. Escrevermetadeesquerda,umafunorecursivaemduaspartesqueretornao
primeiron/2elementosdeumalistadecomprimenton.Escrevasuafunoparaqueo
listanotemqueserdomesmocomprimento.(Metadeesquerda'(ABCDE))
deveretornar(ABC).(Metadeesquerda"(12345678))deveretornar
(1234).VocpodeusarCOMPRIMENTOmasnorevertidaemseu
definio.
8.58. EscreverMERGElistas,umafunoquelevaduaslistasdenmeros,cadaum
emordemcrescente,comoentrada.Afunodeveretornarumalistaqueum
fusodoselementosemsuasentradas,emordem.(MergeLISTAS"(126
81012)'(235913))deveretornar(21235689101213).
8.59. Aquiestoutradefiniodafunofatorial:
Fatorial(0)=1
Factorial(n)=factorial(N+1)/(N+1)
Verifiquequeestasequaessoverdadeiras.arecursivadefinio?Escreva

umafunoLispqueimplementalo.Paraquaisentradasserafuno
retornararespostacorreta?Paraasentradasqueelevaideixardedevolvero
respostacorreta?Qualdastrsregrasderecursofazo
definioviolar?

pgina284

272

CommonLisp:AGentleIntroduoComputaoSimblica

ToolkitLisp:Odepurador

TodososLisperscomeandoaprenderrapidamenteumcomandodepurador,porqueassim
enquantodigitamalgoerrado,queondeelesacabam:nodepurador.
Elestmdeaprendercomosair!implementaesLispdiferirsubstancialmente
quandosetratadedepuradores,assimnohavernenhumamaneirapadroparaserecuperarde
umerro.AlgunsdevocsprovavelmenteforamdigitandoQparasairou:AparaAbort,
enquantooutrospodemestardigitandoControlCouControlG.Emqualquercaso,queagora
vocestconfiantedequevocpodesairdodepuradorsemprequequiser,porquenoficar
emtornodeumtempo?
Odepuradornorealmenteremovererrosdeprogramas.Oquefaz
deixloexaminaroestadodacomputao,quandoocorreuumerro.

Issotambmfazcomquesejaumaboaferramentaparaaprendersobrearecursividade.Podemosusaro
funodepausaparaentrarnodepuradoremumpontoestratgiconoclculo.
OargumentoparaBreakumamensagem,entreaspascordas,aserimpressoquandoo
depuradorinserido.Aquiestumaversomodificadadofatodequedemonstra
ousodeBreak:
(Fatodefun(n)
(Cond((zeropN)(quebrar"Nzero."))
(T(*N(fato(N1))))))
>(Fato5)
Nzero.
Entrandonodepurador:
Debug>
Estamosagorasentadonodepurador''Debug>''opromptdodepurador.
(Odepuradorpodeutilizarumalinhadiferente.)Umadascoisasquepodemosfazerem
Nestepontoexibirumbacktracedapilhadecontrole,quemostratodaa
chamadasrecursivasqueatualmentesoempilhados.Sevocnoestiverfamiliarizadocomostermos
como''pilhadecontrole''e''stackframe'',apenasbrincarcomodepurador
porumtempoevocvaipegarojeitodoqueestacontecendo.(Apilhacontrole
caminhodeLispdemanterocontroledeumacoleodechamadasdefunesaninhadas.Umapilha
quadroumaentradanapilhaquedescreveumadestaschamadasdefuno).Em
meudepuradorocomandoparaaexibiodeumregistodechamadasBK.

pgina285

CAPTULO8recurso

CAPTULO8recurso 273
Debug>bk
(INTERVALO"Nzero.")
(FACT(N1))
(FACT(N1))
(FACT(N1))
(FACT(N1))
(FACT(N1))
(FACT5)
<BottomofStack>
VariantesdocomandoBKpermitirdiferentestiposdepilhadecontrole
ainformaoaserapresentada.Naminhadepurador,BKFVdumademonstraode
nomesdefunoesuasvariveislocais.
Debug>bkfv
PAUSA
N=0
FATO
N=1
FATO
N=2
FATO
N=3
FATO
N=4
FATO
N=5
FATO
<BottomofStack>
Enquantonointeriordodepurador,podemosolharparaosvaloresdasvariveisedotipo
expressesLisparbitrriosusandolos.
Debug>n
0
Debug>(foon'contras)
(FOO.0)
Quandoentramosnodepurador,estamossentadosnotopodapilha.Nspodemos
movimentarapilhausandooscomandoschamados(naminhadepurador)paracimae
BAIXA.Sensnosmovemosparabaixodapilha,podemosveroutrasvariveislocaisnomeados
N.
Debug>down

(FACT(N1))

pgina286

274

CommonLisp:AGentleIntroduoComputaoSimblica
Debug>down
(FACT(N1))
Debug>down
(FACT(N1))
Debug>BKV
(INTERVALO"Nzero.")
N=0
(FACT(N1))
N=1
(FACT(N1))
N=2
(FACT(N1))
<Quadrodepilhaatual
N=3
(FACT(N1))
N=4
(FACT(N1))
N=5
(FACT5)
<BottomofStack>

Debug>n
3
Finalmente,podemosusarodepuradorpararetornarapartirdequalquerumadasfunes
chamaactualmentenapilha.Istofazcomqueoclculopararetomarcomoseo
funohaviaretornadonormalmente:
Debug>retornar10
600
Quandovoltamos10apartirdoquadroatualdapilha,oclculo
retomadonesseponto,eovalorproduzidofoide54310=600.
Odepuradornoserexatamentecomoaminha,eelapodefornecerumpouco
capacidadesdiferentes,masaidiabsicadeexaminarapilhadecontrole
comumatodososdepuradoresLisp.ProcurenomanualdoutilizadorparaoseuLisp
execuoparaverquaiscomandosdodepuradorsooferecidos.AJUDATyping
ou:'?'Hou''paraodepuradortambmpodeproduzirumalistadecomandos.

pgina287

CAPTULO8recurso 275

Exerccioteclado

Nesteexerccio,irextrairdiferentestiposdeinformaesdeum
bancodedadosgenealgicos.Abasededadoscontminformaesdurantecincogeraesde
umafamlia,comomostradonaFigura811.Essesdiagramassogeralmentechamadosdefamlia
rvores,masahistriagenealgicadestafamlianoumaestruturadervoresimples.
MariesecasoucomseuprimoNigel.Wandateveumfilhocom
VincenteoutrocomIvan.ZeldaeRobert,ospaisdeYvette,tem
duasbisavsemcomum.(IssopodeexplicarporYvettevirou
demodoestranho)EsTamarasabequemopaideFrederico.elano
dizendo.

Figura811informaesdegenealogiaporcincogeraesdeumafamlia.

pgina288

276

CommonLisp:AGentleIntroduoComputaoSimblica

(Famliasetf
'((NilnilColin)
(NilnilDeirdre)
(Nilnilarthur)
(Nilnilkate)
(Nilnilfranca)
(Nilnillinda)
(SuzanneColinDeirdre)
(Brucearthurkate)
(charlesarthurKate)
(Davidarthurkate)
(Ellenarthurkate)
(Georgefrancalinda)
(Hillaryfrancalinda)
(Nilnilandre)
(SuzanneTamarabruce)
(Suzannevincentbruce)
(Nilnilwanda)
(Ivangeorgeellen)
(Juliegeorgeellen)
(Mariegeorgeellen)

(Nigelandrehillary)
(TamaranilFrederick)
(Zeldavincentwanda)
(Josuivanwanda)
(NilnilQuentin)
(RobertQuentinjulie)
(OliviaNigelmarie)
(PeterNigelmarie)
(Nilnilerica)
(Yvetterobertzelda)
(Dianepetererica)))
Figura812Obancodedadosdegenealogia.

pgina289

CAPTULO8recurso 277
Cadapessoanobancodedadosrepresentadaporumaentradadeformulrio
(Nomedopaidame)

Quandoopaiouamedealgumdesconhecida,umvalordezerousado.
Asfunesquevocescrevenesteexercciotecladonoprecisaserrecursiva,
exceptoondeindicado.Parafunesqueretornamlistasdenomes,aexata
ordememqueestesnomesaparecemnoimportante,masnodevehaver
duplicatas.
EXERCCIO
8,60. Seobancodedadosdegenealogiajestarmazenadonocomputadorparavoc,
carregaroarquivoqueacontm.Seno,vocterquedigitarotextocomoele
aparecenaFigura812.Armazenarobancodedadosnavarivelglobal
FAMLIA.
uma.Escreverasfunespai,me,paise
CRIANASqueretornamopaideumapessoa,me,umalistadeseu
paisconhecidos,eumalistadesuascrianas,respectivamente.
(PAI'SUZANNE)deveretornarCOLIN.
(PAIS
'SUZANNE)deveretornar(COLINDEIRDRE).(PAIS
'FREDERICK)deveretornar(TAMARA),umavezqueopaideFrederick
desconhecido.(Arthur'CRIANAS)deveretornaroconjunto
(BRUCECHARLESDAVIDELLEN).Sequalquerumadessasfunes
dadaNILcomoentrada,eledeveretornarNIL.Esterecursosertil
maistarde,quandonsescrevemosalgumasfunesrecursivas.
b.EscreverIRMOS,umafunoqueretornaumalistadeirmosdeumapessoa,
incluindomeioirmosgenticos.(BRUCEdosirmos)deveretornar
(CHARLESDAVIDELLEN).(ZELDAdosirmos)deveretornar
(JOSHUA).
c.EscreverMAPUNION,umoperadoraplicativoquelevaumafunoe
umalistacomoentrada,aplicaafunodecadaelementodalistae
calculaauniodetodososresultados.Umexemplo(MAPUNION
#"Descanso"((1ABC)(2TJCE)(3FABCD))),quedeveretornar
.doconjunto(ABCEJFD)Dica:MAPUNIONpodeserdefinidocomoum
combinaodedoisoperadoresaplicativasvocjsabe.
d.Escreveravs,umafunoqueretornaoconjuntodeum
avsdapessoa.UseMAPUNIONemsuasoluo.

pgina290

278

CommonLisp:AGentleIntroduoComputaoSimblica
e.Escreverprimos,umafunoqueretornaoconjuntodeumapessoade
geneticamenterelacionadosprimosdeprimeirograu,emoutraspalavras,ascrianasdequalquer
deirmosdeseuspais.(JULIEprimos)deveretornaroconjunto
(TAMARAVINCENTNIGEL).
UseMAPUNIONemsua
soluo.
f.EscreverodeduasentradasrecursivapredicadoDESCEUFROMque
retornaumvalorverdadeiroseaprimeirapessoadescendentedosegundo.
(DescendenteFROM'TAMARA'ARTHUR)deveretornar
T.(descendenteFROM'TAMARA'LINDA)deveretornarNIL.
(Dica:Vocdescendentedealgumseeleumdosseus
pais,ousequeroseupaiouamedescendentedele.
Estaumadefiniorecursiva.)
g.EscrevaosrecursivaANTEPASSADOSfunoqueretornaumapessoade
conjuntodeancestrais.(MARIEdosantepassados)deveretornaroconjunto
(ELLENARTHURKATEGEORGEFRANKLINDA).(Dica:A
antepassadosdapessoasoseuspais,maisancestraisdeseuspais.Isto
umadefiniorecursiva.)
h.EscrevaorecursivafunoGERAOGAPqueretornao
nmerodegeraesqueseparamumapessoaeumdasua
antepassados.(GERAOGAP"Suzanne"COLIN)deve
retornarum.(GERAOGAP"FREDERICK'COLIN)deve
devolvertrs.(GERAOGAP"FREDERICK'LINDA)deve
voltarNIL,porqueLindanoumancestraldeFrederick.

Eu.Useasfunesquevocescreveupararesponderseguinte
questes:
1.
2.
3.
4.
5.

RobertdescendentesdeDeirdre?
QuemsoosancestraisdeYvette?
QualadiferenaentregeraesentreOliviaeFrank?
QuemsoprimosdePedro?
QuemsoosavsdeOlivia?

pgina291

CAPTULO8recurso 279

Tpicosavanados

8.16VANTAGENSdarecursividadeCAUDA
Lembresedequeasfunesdecaudarecursivofazernenhumtrabalhoapsachamadarecursivaa
devolveoquequerqueachamadaretornarecursiva.ANYODDPumaCauda
funorecursiva,masCOUNTFATIASno.Seolharmosparaorastreiode
COUNTFATIASvez,vemosquecadachamadaproduzumvalorderetornodiferente
(Devidoaoaumento).Emumafunocaudarecursivo,todasaschamadasretornaromesmo
valorcomoachamadaterminal.
>(Contagemdefatias'(xxxx))
EntercontagemdeFATIAS
|
NACO=(XXXX)
|EntercontagemdeFATIAS
||
NACO=(XXX)
||EntercontagemdeFATIAS
|||
NACO=(XX)
|||EntercontagemdeFATIAS
||||
NACO=(X)
||||EntercontagemdeFATIAS
|||||
NACO=NIL
||||
\COUNTFATIASretornou0
|||
\COUNTFATIASvoltou1
||
\COUNTFATIASretornou2
|
\COUNTFATIASretornou3
\COUNTFATIASretornou4
Emgeral,melhorescreverfunesrecursivasemformadecaudarecursivo
semprequepossvel,porqueossistemasLisppodeexecutarfunesdecaudarecursivo
deformamaiseficientedoqueasfunesnormaisrecursivas.Elesfazemissoatravsdasubstituio
achamadarecursivacomumsalto.MuitoscompiladoresLispexecutarestaotimizao
automaticamentealgunsintrpretesfazertobem.

pgina292

280

CommonLisp:AGentleIntroduoComputaoSimblica
Umatcnicacomumparaaproduodeumaversodecaudarecursivadeumordinrio
funorecursivaaintroduodeumavarivelextraparaacumular
valoresdeaumento.Porexemplo,aquiumafunodacaudarecursivochamada
TRCOUNTslicesqueconfiguraachamadainicialparaTRCS1.TRCS1utilizaum
varivelextradeNparamanteracontagemdonmerodefatiasvistoatagora.
(Defuntrcountfatias(loaf)
(LoaftrCS10))
(DefuntrCS1(loafn)
(Cond((nullloaf)n)
(T(trCS1(restoloaf)(+n1)))))
NorastrodeTRCOUNTfatiasquevocvainotarqueovalordeN
aumentacomcadachamada.Achamadadoterminalcalculaovalorderetorno,quatro
Estevalorentopassadadevoltainalteradasporcadanvel.
Umoutroexemplodecomooaumentopodesereliminadoatravsdaintroduo
umavarivelextraafunoinversa.Parainverterumalistadecomprimenton,ns
podeinverterorestodalistadeformarecursiva,emseguida,rumoaoprimeiroelementona
nofinal,assim:
(Defunmeureverse(x)
(Cond((nullx)nil)
(T(anexar(reverse(restantex))
(Lista(primeirox))))))
Masessadefinionorecursivacauda.Apsachamadaretornarecursiva,o
resultadoaumentadoporacrscimo.Aquiestumadeduaspartes,adefiniodecaudarecursivo
dereversoqueusaumvariveladicionalparaconstruirseoresultadocom(emvezde
depois)decadachamadarecursiva.

(Defuntrreverse(x)
(TRrev1xnil))
(Defuntrrev1(xresultado)
(Cond((nullx)resultado)
(T(TRrev1
(Restantex)
(Cons(primeiraX)resultado)))))
(Trrev1dtracetrreverso)

pgina293

CAPTULO8recurso 281
>(Trreverse'(ABCD))
EnterTRREVERSE
|
X=(ABCD)
|EnterTRREV1
||
X=(ABCD)
||
RESULTADO=NIL
||EnterTRREV1
|||
X=(BCD)

|||
RESULTADO=(A)
|||EnterTRREV1
||||
X=(CD)
||||
RESULTADO=(BA)
||||EnterTRREV1
|||||
X=(D)
|||||
RESULTADO=(CBA)
|||||EnterTRREV1
||||||
X=NIL
||||||
RESULTADO=(DCBA)
|||||
\TRREV1devolvido(DCBA)
||||
\TRREV1devolvido(DCBA)
|||
\TRREV1devolvido(DCBA)
||
\TRREV1devolvido(DCBA)
|
\TRREV1devolvido(DCBA)
\TRREVERSEdevolvido(DCBA)
(DCBA)
Nemtodasasfunesrecursivastmversescaudarecursivo.Qualquerfunoque
mltiplorecursivo,talcomoFIB,nopodeserfeitasimplesmenteporcaudarecursiva
aintroduodeumavarivelextra,umavezqueapsaprimeirachamadarecursivaretornaexiste
outroesperadeserfeito.
EXERCCIOS
8.61. EscreverumaversotailrecursivadeCOUNTUP.
8.62. Escreverumaversotailrecursivadefato.
8.63. Escreverversescaudarecursivodaunio,interseco,eSET
DIFERENA.Suasfunesnoprecisaretornarresultadosnamesma
ordemqueasfunesinternas.

pgina294

282

CommonLisp:AGentleIntroduoComputaoSimblica

8,17ESCREVEMnovosoperadoresdeaplicativo
Podemosusarfuncallparainvocarumafunoqueousuriofornece.este
nospermiteescrevernossosprpriosoperadoresaplicativas.Porexemplo,aquiestuma
versosimplificadadomapcarquesomentemapeiasobreumanicalista.
(Defunmymapcar(fnx)
(Cond((nullx)nil)
(T(cons(funcallfn(primeirox))
(Mymapcarfn(restantex))))))
AfunoquefornecemosaMYmapcardeveserumafunodeumaentrada,
jquequantasentradasserFUNCALLedcom.
EXERCCIO
8.64. EscreverumoperadorRVOREDEFINDSEqueretornaoprimeirotomonoNILde
umarvorequesatisfazumpredicado.(SETREEENCONTRAR'#ODDP'((24)(56)
7))deveretornar5.
8.18OSRTULOSfunoespecial
Atagora,tenhoescritoajudandofuncionacomoDEFUNsseparadas.Isto
umpoucodesleixada,umavezqueseafunodeajudardefinidaaomaisaltonvel,algum
podechamloacidentalmente.Asegundadificuldade,maisgravequeajudar
funesdefinidascomDefunnopodeacessarqualquerdafunoprincipaldolocal,
variveis.Ambosestesproblemaspodemserresolvidoscomasetiquetas.
AfunoespecialRTULOSnospermiteestabelecerfunolocal
definiesdentrodocorpodafunoprincipal,assimcomoLETnospermite
estabelecervariveislocais.Asintaxedestasduasformassemelhante.Para

RTULOS,parecequeisso:
(Etiquetas((fn1args1corpo1)
...
(Fnnargs2corpo2))
corpo)
Ocorpopodechamarqualquerdasfuneslocais.Asfuneslocaispossamrecorrer
unsaosoutros,etambmpodereferenciarvariveisdeseuspais.

pgina295

CAPTULO8recurso 283
Noexemploaseguir,observequeCOUNTUPrecursivamente
refernciasN,aentradaparaCOUNTUP.
(Defuncontamup(n)
(Etiquetas((countuprecursivamente(cnt)
(Se(>NCNT)nil
(Conscnt
(Countuprecursivamente
(CNT+1))))))
(Countuprecursivamente1)))
UmadesvantagemdousodertulosquenamaioriadasimplementaesLisp,

nohnenhumamaneiraderastrearfunesquesodefinidasdentrodeumaETIQUETAS
expresso.Masvocaindapodeusarpassoapassoatravsdaavaliao
manualmente,senecessrio.
EXERCCIO
8.65. UseetiquetasparaescreverversesdoTRCOUNTfatiaseTR
REVERSO.
8.19estruturasdedadosrecursiva
Estecaptulotemsededicadoaescreverfunescomdefiniesrecursivas.
estruturasdedadostambmpodeterdefiniesrecursivas.Considereoseguinte
definiodeumaexpressoS(''expressosimblica''):
UmSexpressoqualquerumdeumtomo,ouumaclulacontrasecujocarro
partesCDRsoSexpresses.
Otermo"Sexpresso"usadodentrodesuaprpriadefinio.Istooque
fazcomqueorecursivadefinio.Sexpressessoinstnciasdeummuitocomum
estruturadedadosrecursiva,comimportantesaplicaesemtodasasreasdocomputador
cincia,chamadodeumarvore.Aquioutroexemplodeumarvore,querepresentadestavez
umaexpressoaritmtica:

/\
/

/\
3

/
5

\
6

pgina296

284

CommonLisp:AGentleIntroduoComputaoSimblica
Osnsparteinferiordarvoresochamadosnsterminais,porqueelestm
semramosdescendenteapartirdeles.Osnsrestantessochamados
nsnoterminais.Umarvorepodeserdefinidadeformarecursiva,assimcomoSexpressions
estavam:
Umarvoreouumniconterminalouumnnoterminalcuja
ramossorvores.
rvoressonaturalmenterepresentadosporlistas.Arvoreacimacorresponde
lista((3+5)(8+6)).Vejamosoutrarvoreexpressoaritmtica:

/\
/

/\
2

/
2

*
/\
4

/\
12

/
6

Estarvoreilustraofatodequeosramosdeumnnoterminalprecisa
noserdomesmocomprimento.Arepresentaolistadestarvore((2+2)(3*
(4*(6/12)))).Podemosdefinirexpressesaritmticasrecursivamentecomo:
Umaexpressoaritmticaouumnmeroouumalistadetrselementos
cujoprimeiroeterceiroelementossoexpressesaritmticasecujas
elementodomeioumdos+,,*,ou/.
EXERCCIOS
8.66. EscreverARITHEVAL,umafunoqueavaliaasexpressesaritmticas.
(ARITHEVAL'(2+(3*4)))deveretornar14.

8.67. EscreverumaLEGALPpredicadoqueretornaTsesuaentradaumlegal
expressoaritmtica.Porexemplo,(LEGALP4)e(LEGALP'((2*
2)3))deveretornarT.(LEGALPNIL)e(LEGALP'(ABCD))
deveretornarNIL.
8,68. A''boalista''umacadeiadeclulascontrasterminandoemNIL.Aslistasquenoso
listasapropriadassochamadosdelistaspontilhadas,porqueelesdevemserescritoscomuma
ponto.Sequisssemosdefiniroconceitodeboalistadeformarecursiva,ns

pgina297

CAPTULO8recurso 285
poderiadizer''NILumaboalista,eassimqualquerclulacontrascuja....''Fill
norestodadefinio.
8.69. Dosnmerosinteirospositivosmaioresdoqueum,algunssoprimosenquantooutros
noso.Primessonmerosquesodivisveisapenasporsimesmose
por1.Umnonprime,queconhecidocomoumcompostonmero,podesempre
sertidosemcontaprimos.Aquiestumarvoredefatoraoparaonmero60
quefoiobtidoporsucessivasdivisespornmerosprimos:
60
/

30
/\
2

15

/\

Onmero60temfatoresde2,2,3e5,oquesignifica60=2235.
Escrevaumadefiniorecursivaparainteirospositivossuperioraumem
termosdenmerosprimos.
8.70. Aseguirumafunofatoresqueretornaalistadefatoresprimos
deumnmero.EleusaafunoREMbuiltinparacalcularo
restodadivisodeumnmeroporoutro.(FATORES60)retorna
(2235).Tentetraarafunodeajudaravercomoelefunciona.escreveruma
funosemelhante,FACTORRVORE,queretornaumarvoredefatorao
aoinvs.(FACTORRVORE60)deveretornaralista(602(302(153
5))).
(Fatoresdefun(n)
(Fatoresajudan2))
(Defunfatoresajuda(np)
(Cond((nigual1)nil)
((Zerop(remnp))
(Consp(fatoresajuda(/np)p)))
(T(fatoresajudan(+p1)))))
8.71. Asrvoresdeexpressesaritmticassochamadosrvoresbinrias,porque
cadannoterminaltemexactamentedoisramos.Qualquerlistapodeser
vistocomoumarvorebinria.Desenharumarvorebinriaquerepresentaaclulacontras
estruturadalista(AB(CD)E).Quaissoosnodosterminaisda
rvore?Quaissoosnodosnoterminais?

pgina298

286

CommonLisp:AGentleIntroduoComputaoSimblica
8.72. Maistiposgeraisdervoressopossveis,emquediferentesnstm
diferentesnmerosderamos.Escolhaalgumconceitoouobjetoe
descrevloemtermosdeumaestruturadervoregeral.

pgina299

Input/Output

9.1INTRODUO
Entrada/sada,ou''i/o,''aformacomoumcomputadorsecomunicacomomundo.
laolerevalprintdoLispforneceumtiposimplesdei/o,umavezquel
expressesapartirdotecladoeimprimeosresultadosnovisor.
svezesqueremosfazermais.UsandoasfunesdeE/Sdescritosneste
captulo,vocpodefazeroseuprogramadeimprimirqualquermensagemvocgosta.Vocpode
mesmofazloimprimirperguntaseaguardarqueousuriodigiteasrespostasno
teclado.
OutrousoparafunesdeI/Oparalerdadosdeumarquivoemdisco,ougravardados
emumarquivoparaquevocpossallodevoltaalgumoutrodia.maisfcilfazerissoem
Lispcomumdoquenamaioriadosoutrosidiomas.
Historicamente,entrada/sadatemsidoumadasreasdemaior
desacordoentreossistemasLisp.Aindahojenohnenhumajanelapadro
interfacedosistema,porexemplo,enohmaneirapadroparacontrolarummouseou
produzirdesenhosgrficos.CadafornecedorLispfornecesuasprpriasferramentasparafazer
essascoisas.Felizmente,aE/Srotinasmaisbsicastmsidofinalmente
padronizados.Vamosmanterobsicodestelivro.

287

pgina300

288

CommonLisp:AGentleIntroduoComputaoSimblica

9.2cadeiasdecaracteres
Afimdeobterocomputadorparaimprimirmensagensinformativasnovisor,ns
deveprimeiroaprendersobrecadeiasdecaracteres.Cadeiasdecaracteres(stringsparaoshort)
soumtipodesequnciaelessosemelhantesemalgumasmaneirasdelistas,esouma
subtipodevetores(discutidonoCaptulo13),maselestmumconjuntodiferentede
operaesprimitivas.
Cordasavaliarasimesmos,comonmerosdefazer.Avisodaseguinte
exemplosqueascordasnosoconvertidosemmaisculasaformacomosmbolos
Faz.Cordasnososmbolos.OpredicadoSTRINGPretornaTsesuaentrada
umalinha.
>"Cordassoascoisas"
"Cordassoascoisas"
>(Setfum"Esteobjetoumastring.")
"Esteobjetoumastring."
>(Stringpa)
T
>a
"Esteobjetoumastring."
>(Setfb'esteobjetoasmbolo)
ESTEobjetoISASYMBOL
>(Stringpb)
NADA
Comovocpodever,ascadeiasdecaracteresdevemsercolocadosentreaspasduplas
caracteres(",),quenosoosmesmosqueoapstrofo(')queusamosparacitaes
smboloselistas.Doisapstrofosnovaifuncionaraquivocdeveusaro
doublechavecitaosobreoseutecladoparadigitarumaseqncia.
9.3AfunoFormat

AfunodeformataonormalmenteretornaNIL,mascomoumefeitocolateralqueprovoca
coisasaserescritonovisorouparaumarquivo.Oprimeiroargumentopara
FormatodeveserosmboloTquandoqueremosescreverparaovisor.
(Valoresdiferentessousadosaogravaremumarquivodedisco.)Osegundoargumento

pgina301

289
CAPTULO9Input/Output
deveserumacadeia,chamadadestringdecontroledeformato.FORMATOescreveo
corda,semasaspas,emseguida,retornaNIL.
>(Formatot"Oi,me!")
Oime!
NADA
Astringdecontroledeformatotambmpodeconterdirectivasdeformataoespeciais,
quecomeamcomumtil,'',personagem.Porexemplo,adirectiva%
fazcomqueFORMATparamoverparaumanovalinha.Duasdirectivas%aoladounsdos
outroresultadodeumalinhaembranconasada.
>(Formatot"Otempovoa%comoumaflecha").
Otempovoa
comoumaflecha.
NADA
>(Formatot"moscasdefruta%%comobananas.")
Moscasdafruta

comobananas.
NADA
A&directivadizFORMATOparamoverparaumanovalinha,amenosqueelesabeque
jnoinciodeumanovalinha.Ento,doisoutrssucessivas&
directivastmomesmoefeitoqueumnico.A&directivatil
porquenemsempresabemondeocursortersidodeixadoquandoonosso
funochamada.Porexemplo,algumasimplementaesLispComum
exigemqueousuriopressioneretornodecarroapsoparntesefinaldecertaquando
digitandoumaexpressoparaociclodeleituraevalprint,enquantooutrasimplementaes
no,entonomomentoemqueformatochamado,ocursorserdeumaformadiferente
colocardependendoseousuriotinhaquebateratecladeretornoouno.
Emprogramasqueproduzemvriaslinhasdesada,boaprticapara
comearcadastringdecontroledeformatocomo&paraqueocursorgarantidoparaser
emumanovalinhaantesdeimprimircadamensagem.
(Defunmary()
(Formatot"&Marytinhaumpequenobasto.")
(Formatot"esuasasaseramlongasemarrom.")
(Formatot"&EemtodososlugaresqueMariafoi")
(Formatot"&Omorcegofoi,decabeaparabaixo."))

pgina302

290

CommonLisp:AGentleIntroduoComputaoSimblica

>(Mary)
Marytinhaumpequenobasto.
Suasasaseramlongasemarrom.
EemtodososlugaresqueMariafoi
Omorcegofoi,decabeaparabaixo.
NADA
OutradirectivaformataoimportanteS,queinsereoimpresso
representaodeumobjectoLispnamensagemqueimprimeFORMATO.(AS
significa''Sexpresso,''ou''expressosimblica,''umpoucoarcaico
prazoparaumobjetoLisp.)ParacadaocorrnciadoSnacadeiadecontroledeformato,
FORMATOrequerumargumentoextra.Noexemploaseguir,oprimeiroS
substitudoporosmbolodeBoston,osegundoSsubstitudopelalista
(NewYork),eoterceiroSsubstitudopelonmero55.
>(Formatot"deSaSemSminutos!"
'Boston'(NovaIorque)55)
DeBostona(NEWYORK)em55minutos!
NADA
Aquiestoutroexemplo.AfunoQUADRADOTALKtemumnmero
comoentradaedizlheoquadradodessenmero.Elanoretornaapraa
eleretornaNILporqueesseoresultadoretornadopeloformato.
(Defunquadradotalk(n)
(Formatot"&SquadradoS"n(*nn)))
>(Squaretalk10)
10quadradode100
NADA
>(mapcar#'quadradotalk"(12345))
1quadrado1
2aoquadrado4
3aoquadrado9
4quadrado16
5aoquadradode25
(NILNILNILNILNIL)
OresultadoretornadopelomapcarumalistadeNILporquecadachamadapara
QUADRADOTALKretornaNIL.
AdirectivaAimprimeumobjetosemusarcaracteresdeescape.o
maneiramaisfcildeexplicarissocompararcomoseqnciasdeimpressoAeS.S
incluiasaspas,enquantoqueumno.Aaspaum

tipodecaracteredeescape.

pgina303

291
CAPTULO9Input/Output
(Testedefun(x)
(Formatot"ecomcaracteresdeescape:S"x)
(Formatot"&Semcaracteresdeescape:A"x))
>(Teste"Oi,me")
Comcaracteresdeescape:"Oi,me"
Semcaracteresdeescape:Oi,me
NADA
EXERCCIOS
9.1. Escrevaumafunoparaimprimiroseguintedizernovisor:''No
sopilotosdeidade,ehpilotosemnegrito,masnohnegritovelho
pilotos.''Suafunodeveacabarcomacotaoemvriaslinhas.
9.2. EscreverumafunorecursivaTRAOLINEquedesenhaumalinhadeumespecificado
comprimentofazendo(FORMATOT"*")onmerocorretodevezes.
(DrawLINE10)deveproduzir
**********
9.3. EscreverumafunorecursivadrawBOXquechamaTRAOLINE
repetidamenteparadesenharumacaixadedimensesespecificadas.(DRAWBOX104)

deveproduzir
**********
**********
**********
**********
9.4. Escreverumafunorecursivanoventaenovegarrafasquecantaa
conhecidacano''Noventaenovegarrafasdecervejanaparede.''Aprimeira
versodestacano
99garrafasdacervejanaparede,
99garrafasdecerveja!
Tomeumparabaixo,
Passloaoredor,
98garrafasdecervejanaparede.
NoventaenovegarrafasdevemterumnmeroNcomoentradaeincio
contandoapartirdeNbaixoazero.(Istoparaquevocpossaexecutloemtrs
garrafasemvezdetodososnoventaenove).Suafunotambmdevedeixaruma
linhaembrancoentrecadaverso,edizeralgoadequadoquando
ficasemcerveja.

pgina304

292

CommonLisp:AGentleIntroduoComputaoSimblica

9.5. Partedequalquerprogramadetictactoedejogoumafunoparaexibiro
borda.EscreverumafunoPRINTBOARDquelevaumalistadenove
elementoscomoentrada.CadaelementoserumX,O,ouNIL.IMPRESSO
BOARDdeveexibiraplacacorrespondente.Porexemplo,
(PRINTBOARD"(XOONILNILXONILX))deveimprimir:
X|O|O

|X|

O|
|x
9.4Afunodeleitura
LEIAumafunoquelumobjetoLisp(umnmero,smbolo,listaou
qualquerqueseja)apartirdotecladoeretornaesseobjetocomoseuvalor.Oobjeto
notemdeserincludoporquenovaiseravaliada.Poracolocaodechamadas
LERdentrodeumafuno,podemostornarocomputadorlerosdadosdo
tecladosobocontroledoprograma.Aquiestoalgunsexemplos.typeindeusuriono
respostaalersublinhado.
(Defunmeuquadrado()
(Formatot"Porfavor,digiteumnmero:")
(Vamos((x(leia)))
(Formatot"OnmeroSquadradoS.%"
X(XX*))))
>(Meuquadrado)
Porfavor,digiteumnmero:7
Onmero7aoquadrado49.
NADA
>(Meuquadrado)
Porfavor,digiteumnmero:4
Onmero4quadrado16.
NADA
EXERCCIOS
9.6. Escreverumafunoparacalcularsalriobrutodeumtrabalhadorporhoradadauma
salrioporhoraemdlareseonmerodehorasqueeleouelatrabalhava.
Suafunodevepedirparacadaentradaquenecessita,imprimindoum
mensagememIngls.EledeveexibirsuarespostaemInglstambm.

pgina305

293
CAPTULO9Input/Output
9.7. AfunoCOOKIEMONSTERmantmleituradedadosdo
terminalatqueelelosmbolocookie.EscreverCookie
MONSTRO.Aquiumainteraodeamostra:
>(Cookiemonstro)
Dmebiscoitos!!!
Biscoito?Rocha
NoQuerROCHA...
Dmebiscoitos!!!
Biscoito?escovadecabelo
NoQuerHAIRBRUSH...
Dmebiscoitos!!!
Biscoito?biscoito
Obrigado!...MunchMunchMunch...BURP
NADA
9.5OSIMounoPFUNO
AfunoSIMounoPrecebeumastringdecontroledeformatocomoentradaepergunta
aousurioumaperguntasimouno.Ousuriodeveresponderdigitando''sim''em
quecasoafunoretornaT,ou''no'',casoemqueeleretornaNIL.

(Defunenigma()
(Se(simounop
"VocbuscarailuminaoZen?")
(Formatot"Entonoperguntarparaele!")
(Formatot"Vocencontroulo.")))
>(Enigma)
VocbuscaailuminaoZen?sim
Entonopeaparaele!
NADA
>(Enigma)
VocbuscaailuminaoZen?no
Emseguida,voctloencontrado.
NADA
Existetambmumaformamaiscurtadestafuno,chamadoYORNP,queapenas
exigequeousuriodigite''y''ou''n''comoresposta.

pgina306

294

CommonLisp:AGentleIntroduoComputaoSimblica

9.6leituradearquivosCOMCOMOPENFILE

AmacroCOMOPENFILEforneceumamaneiraconvenienteparalerdadosdeum
Arquivo.Suasintaxe:
(COMOPENFILE(varcaminho)
corpo)
COMOPENFILEcriaumavarivellocal(comoLET)edefineloparaum
objetodefluxorepresentandoumaconexoparaessearquivo.Objetosdefluxosoum
tipodedadosLispespecialparadescreverasligaesaosarquivos.Sevocquiserver
um,dumaolhadanovalordavarivelglobal*TERMINALIO*.elemantm
oobjetodefluxoLispusaparalerapartirdotecladoeescreverparaovisor.
AquiestoqueparecenomeusistemaLisp:
>*Terminalio*
#<FluxoTypescript,TS=18>
DentrodocorpodaCOMOPENFILEoobjetodefluxopodeserpassadocomo
umargumentoopcionalparalerparalerdadosapartirdoarquivoemvezdo
teclado.AodeixaroformulriocomOPENFILE,aconexocomoarquivo
fechadaautomaticamente.
Vamostentarumexemplodeleituradedadosdeumarquivo.Suponhaqueoarquivo
''Timber.dat''nodiretrio/usr/dstcontmestaslinhas: *
"ONorthSlope"
((45Redwood)(12carvalho)(43debordo))
100
Podemosleressesdadoscomoseguinteprograma:
(Defunobterrvorededados()
(Comarquivoaberto(Stream"/usr/dst/timber.dat")
(Vamos*((rvoreloc(leiastream))
(rvoretable(leiastream))
(Numrvores(leiastream)))
(Formatot"&HrvoresSemS."
nmrvoresrvoreloc)
(Formatot"&Elesso:S"rvoretable))))

*Lispcomumcompreendenomesdearquivousandoqualquersintaxeadequadoparaamquinaemqueo
Lispestemexecuo.EmmquinasUnix,o/usr/dst/timber.datcaminhointerpretadocomotimber.datarquivoem
diretrio/usr/dst.

pgina307

295
CAPTULO9Input/Output
>(Getrvorededados)
H100rvoresem"TheNorthSlope".
Soeles:((45REDWOOD)(12OAK)(43MAPLE))
NADA
9.7gravaodearquivosCOMCOMOPENFILE
PodemostambmusarCOMOPENFILEparaabrirarquivosparaasada,passandoo
argumentoespecialpalavrachave:DIREO:OUTPUT.Oriachoquesem
OPENarquivocriapodeentoserusadonolugardothabitualcomoumprimeiro
argumentoparaoformato.
(Defunsalvarrvorededados(rvoretablervoreloc
nmrvores)
(Comarquivoaberto(Stream"/usr/dst/timber.newdat"
:Direo:sada)
(Streamformatode"S%"rvoreloc)
(Streamformatode"S%"rvoretable)
(transmissoaoformatode"S%"numrvores)))
>(Salvarrvorededados
"OWestRidge"
'((45Redwood)(22carvalho)(43debordo))
110)
NADA

SegravardadosemumarquivousandoapenasdirectivaTs,temosacertezadeser
poderllodevoltanovamente.claroquepossvelescreverarbitrria
mensagensparaumarquivo,contendoapontuaoestranha,parntesesdesequilibradas,ou
oquevoctem,masnoseriacapazdeleroarquivodevoltaparaLispusando
LER.Talarquivoaindapodesertil,embora,porqueelepodeserlidopor
pessoas.Senecessrio,podeserlidoporLispumcarcterdecadavez,usando
tcnicasnocobertoaqui.
RESUMO
Afunodeformataolevadoisoumaisargumentos.Oprimeiroargumento
deveserTparaimprimirnodisplayosegundodeveserumastringdecontroledeformato.
OsargumentosrestantessousadosparapreencherasinformaesexigidaspelaS
directivasnastringdecontroledeformato.Adirectiva%fazcomqueFORMATpara
iniciarumanovalinhaadirectivaecomeaumanovalinhasomentesenojno
inciodeumanovalinha.

pgina308

296

CommonLisp:AGentleIntroduoComputaoSimblica
AfunodeleituralumobjetoLispdoterminalevolta
esseobjeto.Oobjectonotemdeserincludoporquenoser
avaliada.questesdeimpressosimouNOPeYORNP(usandoumformato
stringdecontrole)e,emseguida,retornarTouNILdependendodarespostaaousurio
d.

COMOPENFILEabreumarquivoparaentradaousada,eligaseaumlocal
varivelparaumobjetodefluxoquerepresentaaconexoparaessearquivo.este
fluxodeobjetopodeserpassadoparalerouFORMATOfazerarquivoi/o.
exercciosdereviso
9.8. Comososeqnciasdiferentesdossmbolos?
9.9. Oqueimpressoporcadaumdosseguintes?
(Formatot"como"'b)
(Formatot"always%quebrou")
(Formatot"SS"'alpha'aposta)
FUNESabordadosnestecaptulo
predicadostring:STRINGP.
funesdeentrada/sada:Formato,LEIA,YESounoP,YORNP.
Macroparaoarquivosimplesi/o:COMOPENFILE.

Exerccioteclado

Nesteexerccio,vamosescreverumprogramaparaproduzirumgrficodeumaarbitrria
funo.OprogramairsolicitarumnomedefunoFe,emseguida,traary=
F(x)paraumintervaloespecificadodexvalores.Aquiumexemplodecomooprograma
funciona:

pgina309

297
CAPTULO9Input/Output
>(Makegrfico)
Funoparaogrfico?quadrado
Comeandovalorx?7
Acabarcomvalorx?7
Plotagemcorda?"****"

****
****

****

****
****
****
****
****
****
****
****
****
****
****
****
T
EXERCCIO
9.10. Comovocescrevercadaumadasseguintesfunes,testlo,chamandoode
nvelsuperiorcomentradasapropriadasantesdeprosseguirparaaprxima
funo.

uma.EscreverumafunorecursivaESPAOOVERquelevaumnmeroNde
deentradaemoveocursorparaadireita,imprimindoNespaos,umdecada
Tempo.ESPAOdeveimprimir''Erro!''Sennegativo.Testlo
utilizandoafunoTEST.Tente(TEST5)e(TEST5).
(Testedefun(n)
(Formatot"%>>>")
(Espaoovern)
(Formatot"<<<"))
b.EscreverumafunoPLOTUMPONTOquelevaduasentradas,
GRFICOcordaseYVAL,impressesTRAARSTRING
(Semasaspas)nacolunaYVAL,eentosemoveparaumanova
linha.Acolunamaisesquerdanumeradozero.

pgina310

298

CommonLisp:AGentleIntroduoComputaoSimblica
c.Escreverumafunoenredopontosquerecebeumastringeumalistadey
valorescomoentradaetraalos.(PlotPONTOS"<>""(4681086
4))deveimprimir
<>
<>
<>
<>

<> <>
<>
d.EscreverumafunoGERARquelevadoisnmerosMeN
entradaeretornaumalistadenmerosinteirosdeMparaN.(GERAR3
3)deveretornar(3210123).
e.EscreverafunoMAKEGRAPH.
Fazgrficodeve
solicitarosvaloresdaFUNC,incio,fimePLOTTING
.String,eentoogrficodafunoNota:VocpodepassarFUNC
comoumaentradaparamapcarparageraralistadeyvaloresparao
funo.Qualserasegundaentradaparamapcarser?
f.Definirafunoquadradosegrficoloaolongodointervalode7a7.
Useoseuprimeironomecomoosmboloplotagem.

ToolkitLisp:Drible

AfunoFLUXOregistrapartedeumasessoLispemumarquivo.Istotil
sevocquiserfazerumaimpressodeumasessointerativaparamostraraalgum
outro.Dadoumnomedearquivocomoumargumento,driblarabreessearquivoparasada
einiciaagravao.Sechamadosemargumentos,elefechaoarquivonoqualele
estavagravando.Aquiestumexemplo:
>(Dribble"session1.log")
Agoragravarem/usr/dst/session1.logarquivo
>(const3)
(T.3)

pgina311

299
CAPTULO9Input/Output
>(Listade"fazer"no"alimentar"as"ervasdaninhas)
(NOALIMENTARASERVASDANINHAS)
>(Drible)
gravaoterminouem/usr/dst/session1.logarquivo
Oarquivo''session1.log''agoracontmoseguinte:
Gravaoem/usr/dst/session1.log
Agravaocomeous1:45pm1Mar89:
>(const3)
(T.3)
>(Listade"fazer"no"alimentar"as"ervasdaninhas)
(NOALIMENTARASERVASDANINHAS)
>(Drible)

Tpicosavanados

9.8PARMETROSDEDIRECTIVASFORMATO

Algumasdirectivasformatoaceitarparmetrosdeprefixoqueespecificamaindamaisasua
comportamento.parmetrosdeprefixoaparecementreoeadirectiva.Para
exemplo,adirectivaSaceitaumalarguradeparmetro.Aousaraopoexplcita
largura,como10S,nspodemosproduzirasadadecolunas.
(Gleeclubsetf
'((JohnSmith)(BarbaraWilson)(Mustaphaali)))
(Defunimpressodeumnome(name)
(Formatot"&10SS"
(segundonome)
(primeironome)))

pgina312

300

CommonLisp:AGentleIntroduoComputaoSimblica
(Defunimpressotodososnomes(x)
(Mapcar#'xprintumname)
'feito)
>(impressocomtodasasnomesgleeclub)
SMITH
JOO
WILSON
BARBARA
TODOS
MUSTAPHA
FEITO

9.9DIRETRIZESformatoadicional
AdirectivaDimprimeuminteiroemnotaodecimal(isto,base10).Isto
tambmpossvelimprimirosnmerosemoutrasbases,eatmesmoemalgarismosromanos,mas
novamosentrarnissoaqui.OsnmerosdepontoFdirectivaimpressesflutuantesem
umanotaodeformatofixo,quesempreincluiumpontodecimal.Todosesses
directivasreceberparmetrosdeprefixo.Oprimeiroparmetroprefixousadoparaespecificar
umalargurafixaparaasada:quantoscaractereseledeveocupar.(VontadeLisp
padasadacomespaosembranco,senecessrio.)Vamosconsiderarapenasumaoutra
parmetroprefixo.ComadirectivaF,osparmetroespecificasegundaprefixo
quantosdgitosestoaaparecerdepoisdopontodecimal.Porexemplo,7,5F
especificaumcampodesetecaracteres,comcincodgitosqueaparecemapsodecimal
ponto:
(Stimosdefun(x)
(Mapcar#'(lambda(numerador)
(Formatot"&4,2F/77,5F"
numerador
(/Numerador7,0)))
x)
'feito)
>(stimos"(13/222.53))
1.00/70,14286
1.50/70,21429
2.00/70,28571
2.50/70,35714
3.00/70,42857
FEITO

pgina313

301
CAPTULO9Input/Output
9.10OLISPPRIMITIVOS1,5SADA
Oi/oprimitivofunesTERPRI,PRIN1,princ,eimpressoforam
definidonoLisp1.5(oantepassadodetodosossistemasLispmodernos)eaindaso
encontradoemLispcomumhojeemdia.ElesestoincludosnosTpicosAvanados
seocomoumanotahistricavocpodeobteromesmoefeitocomoformato.
TERPRIsignificaterminateprint.Elemoveocursorparaumanovalinha.PRIN1
ePRINCtomarumobjetoLispcomoentradaeimprimilonoterminal.PRIN1
imprimeoobjetocomoquequerescaparcaracteressonecessriosparagarantirqueele
podeserlidodevoltacomLEIAPRINCimprimeoobjetosemfuga
personagens.Basicamente,adirectivaformatoSfuncionacomoPRIN1,eA
directivafuncionacomoPRINC.AmbosPRIN1ePRINCretornarasuaprimeira
argumento.
>(Setfum"Portantostu,Romeo?")
"PortantostuRomeo?"
>(Prin1a)
"PortantostuRomeo?"
"PortantostuRomeo?"
>(Princa)
PortantostuRomeo?
"PortantostuRomeo?"
AfunoPRINTumacombinaodasanteriorestrsfunes.isto
vaiparaumanovalinhacomTERPRI,imprimeoseuargumentocomPRIN1,eemseguida
imprimeumespaocomPRINC.Umaversosimplesdeimpressopodeserdefinidacomo
segue:
(Defunmeuprint(x)
(Terpri)
(Prin1x)
(Princ"")

x)
>(Mapcar#'myprint'(01234))
0
1
2
3
4
(01234)

pgina314

302

CommonLisp:AGentleIntroduoComputaoSimblica
TERPRI,PRIN1ePRINCaceitarumargumentofluxoopcionalapenascomo
LERoquelhespermiteserusadoparaoarquivoi/o.

9,11ManuseamentoEOF
svezesnecessriolerumarquivosemsaberdeantemoquantos
objetosqueelecontm.Quandooprogramachegaaofinaldoarquivo,aprxima
LEIAirgerarumerrodefimdearquivo,evocvaiacabarnodepurador.
possveldizerLEIApararetornarumvalorespecial,chamadoumindicadorEOF,
emvezdegerarumerronofinaldoarquivo.Fazemosissoatravsdofornecimentodedois
argumentosextraparaler:aNIL(significadonogeramumerro),ea

valorquedesejausarcomooindicadorEOF.Devemostercuidadocomovalorque
escolherparaisso.Seusssemosalgoemcomum,comoosmboloFOO,emseguida,se
oarquivorealmentecontmumFOO,nossoprogramaserenganadoempensarque
chegouaofim.Portanto,umaboaescolhaparaumindicadorEOFumrecm
geradocelularcontras.UsaremosEQemvezdeEQUALtercertezadeque
exatamenteessaclulacontrasretornado.
AquiestumexemplodeumprogramaquelumarquivoarbitrriodeobjetosLisp,
dizquantosobjetosforamlidos,eretornaumalistadeles.Eleusaoscontras
celular($EOF$)comoseuvalorespecialdefimdearquivo,masqualquercontrasrecmgerados
celularvaifazer,jqueoendereonicadaclulaimportante,noseucontedo.
(Defunleiameufile()
(Comarquivoaberto(stream"/usr/dst/samplefile")
(Vamos((contedo
(Leiaallobjetosdefluxo(lista'$eof$))))
(Formatot"&ReadSobjetosdoarquivo."
(contedosdecomprimento))
contedo)))
(Defunleiatodaobjetos(fluxodeeofindicadoras)
(Vamos((resultado(leiafluxonuloeofindicator)))
(If(resultadoeqeofindicador)
nada
(Resultarcontras(streamdeleituratodososobjetos)))))
Suponhaqueonossoarquivodeamostracontmasseguinteslinhas:
35cat(alces
carne)98.6"iogurtecongelado"
3.14159
Oprogramairiaproduziroseguinteresultado:

pgina315

303
CAPTULO9Input/Output
>(Leiameuarquivo)
Leia6objetosdoarquivo.
(35CAT(carnedealce)98.6"iogurtecongelado"3,14159)
9.12IMPRIMIRADOTNOTATION
notaodepontoumavariantedanotaocelularcontras.Nanotaodepontocadaclulacontras
exibidocomoumparnteseesquerdo,apartedocarro,umponto,apartecdr,eumdireito
parntese.AspeasdocarroeCDR,seaslistas,soelesprpriosexibidonoponto
notao,tornandoestaumadefiniorecursiva.Porexemplo,alista(A)
representadaporumanicaclulacontrascujocarroosmboloAecujaCDR
NADA.Nanotaodepontoestalistaestescrito(A.NIL).Aquiestoalgunsmais
exemplosdenotaodeponto:
Notaolista
NADA

DotNotation
NADA

UMA

UMA

(UMA)

(A.NIL)

(AB)

(A.(B.NIL))

(ABC)

(A.(B.(C.NIL)))

(Um(B)C)

(A.((B.NIL).(C.NIL)))

EXERCCIOS
9.11. EscreverumafunoDOTPRIN1quelevaumalistacomoentradaeimprimeloem
notaodeponto.DOTPRIN1irimprimirparntesespelo(FORMATOT"(")
e(FORMATOT")"),eospontosde(FORMATOT"."),evai
chamarsedeformarecursivaparaimprimirlistasdentrodelistas.DOTPRIN1deve
retornarnilcomooseuresultado.Tente(DOTPRIN1'(A(B)C))evejaseoseu
sadacoincidecomoresultadonatabelaacima.Emseguida,tente(DOTPRIN1

'((((UMA))))).
9.12. Lisptambmpodelerlistasemnotaodeponto.Tente(DOTPRIN1'(A.(B.
C))).Certifiquesededigitarumespaoantesedepoisdecadaponto.
9.13. Sevocdigitarnalistacitada"(A.NIL),ostiposdeLispparatrs(A).oque
acontecequandovocdigita"(A.B)?

pgina316

304

CommonLisp:AGentleIntroduoComputaoSimblica
9.14. Considereasseguintesduasestruturaslistacircular,cadaumacompostaporum
nicaclulacontras.QualserocomportamentodoDOTPRIN1sefordado
aprimeiraestruturacomoentrada?Oquevaifazersefordadaasegundaestrutura
comoentrada?

FOO
FOO
NOTATION9,13HYBRID

Lispnormalmenteexibecoisasemnotaolista,nodotnotao.Mascomotemos
visto,algumasestruturascelularescontras,como(A.B)nopodemserescritossempontos.
ApolticadoLispimprimirpontossomentequandonecessrio.Elenuncaimprimeumpontoamenos
acadeiadeclulascontrasterminaemumtomonoNIL.Asuasadaassimumhbridodepuro
notaesdelistaepontopuro,chamadodenotaohbrido.Aquiestoalgunsexemplos
dasdiferenasentreanotaodepontopuroenotaohbrida:
DotNotation

Notaohbrido

(A.NIL)

(UMA)

(A.B)

(A.B)

(A.(B.NIL))

(AB)

(A.(B.C))

(AB.C)

(A.(B.(C.D)))

(ABC.D)

((A.NIL).(B.(C.D)))

((A)BC.D)

EXERCCIO
9.15. EscreverHYBRIDPRIN1.Aquiestcomoafunodevedecidir
sedesejaimprimirumpontoouno.Seapartecdrdaclulacontrasumalista,
HYBRIDPRIN1continuaaimprimiremnotaolista.Seapartecdr
NIL,HYBRIDPRIN1deveimprimirumparntesedireito.Seapartecdr
outracoisa,comoumsmbolo,HYBRIDPRIN1deveimprimirumponto,
osmboloeumparntesedireito.Vocprovavelmentevaiachartil
definirumasubfunoparaimprimircdrsdelistas,umavezqueestassemprecomeamcomum

pgina317

305
CAPTULO9Input/Output
espao,enquantooscarrossemprecomeamcomumparnteseesquerdo.Testeoseu
funonosexemplosnatabelaanterior.
FunesdescritasTPICOSAVANADOS
Lispprimitivas1.5sada:TERPRI,PRIN1,PRINC,imprimir.

pgina318

306

CommonLisp:AGentleIntroduoComputaoSimblica

pgina319

10

Tarefa

10.1INTRODUO
VimosnoCaptulo5queomacroSETFalteraovalordeumavarivelesta
chamadodeatribuio.Temosevitadoatribuiotantoquantopossvelneste
livro,usandoseapenascomoloopdenvelsuperiorleiaevalprintparaconfigurarmundial
variveis.NsaindanoaprendeuausarSETFdentrodefunes.
Hboasrazesparaevitaraatribuioaoprimeiramenteaprendera
programa.Atribuiofacilmenteutilizadas,levandoafunesquesodifceisde
entenderedepurar.Seasuaprimeiralinguagemdeprogramaofoibsicos,
Pascal,Modula,ouC,todososquaisestofortementedependentesdaatribuio,voc
podesersurpreendidoaoverquantosprogramasLispinteressantesnouse
atribuioatodos.Lispforneceumconjuntomaisricodeestruturasdecontroledoqueaqueles
lnguas(comoLET,eosoperadoresaplicativas),quemuitasvezesfaz
atribuiodesnecessria.
H,noentanto,ocasiesemqueadequadoparausarnaatribuio
Lisp.Estecaptulointroduzalgumastcnicaspadroparaaprogramaocom
atribuio,ealgumasformasdeatribuioteisbuiltin,almdeSETF.
Atribuiofrequentementeusadoemcombinaocomestruturasdecontroleiterativos,
quesodiscutidasnocaptuloseguinte.

307

pgina320

308

CommonLisp:AGentleIntroduoComputaoSimblica

10,2ACTUALIZAOumavarivelglobal
Suponhaqueestamosoperandoumabancadelimonada,equeremosmanterocontroledecomo
muitoscoposforamvendidosatagora.Nsmantemosonmerodecoposvendidosemum
varivelglobal,*TOTALGLASSES*,queirinicializarazeroeste
caminho:
(Setf*TOTALculos*0)
ExisteumaconvenoemCommonLispqueasvariveisglobaisdevemter
* permitidoignoraro
nomesquecomeameterminamcomumasterisco.
convenoasteriscoaorealizaralgunsclculosrpidoscomglobais
variveisemnvelsuperior,masquandovocescreveumprogramaparamanipularmundial
variveis,vocdeveaderiraela.Portanto,vamoschamaranossavarivelglobal
*TOTALculos*.
Agora,cadavezquevenderumpoucodelimonada,nstemosqueatualizarestavarivel.
Tambmqueremosinformarquantoscoposforamvendidosatagora.Aquiest
umafunoparafazerisso:
(Defunsell(n)
"YeOldelimonada:Vendasacopo."

(Setf*totaisculos*(+*totaisculos*n))
(Formatot
"&IssofazvidrosSathoje."
*Totalculos*))
>(Vender3)
Issofaz3coposathoje.
NADA
>(Vender2)
Issofazcom5coposathoje.
NADA
ObservequeafunoSELLcontmduasformasemseucorpo.Oprimeiro
formaatualizaasvariveis*TOTALculos*.Asegundaformaimprimeuma
mensagemsobrequantoscoposforamvendidosatagora.SELLretornaNIL
porqueesseoresultadoretornadopeloformato.

*Notaaosinstrutores:TambmcomumparadeclararglobalscomDefVar,queproclamalosespeciale
geralmenteresultaemmenosavisosdocompilador.Masissonoestritamentenecessrioperfeitamentelegalterum
escopolxico(unspecial)varivelglobal.OmitimosdiscussodeDefVaraquiparaevitaraintroduodo
conceitodeescopodinmicoatocaptulo14.

pgina321

309
CAPTULO10Assignment

EXERCCIO

EXERCCIO
10.1. Suponhaquetinhaesquecidoparadefinir*TOTALGLASSES*parazeroantes
chamandoSELLpelaprimeiravez.Oqueaconteceria?Suponhamosquetemos
inicializado*TOTALGLASSES*aosmboloFOOemvezdezero.
Emqueoerrosetornaraparente?
10.3actualizaodemtodosestereotipados
SETFpodeatribuirqualquervalorparaqualquervarivel.Umusomuitocomumde
atribuioactualizarumavarivel,emoutraspalavras,ovalorantigodavarivel
utilizadoparacalcularoseunovovalordeveser.Alimonadaum
exemplotpicodeatualizarumavarivel.Muitos,talvezamaioriadosusosde
atribuiosodestaforma.CommonLispfornecemacrosembutidaspara
expressandooscasosdeatualizaomaiscomunsdeformamaisconcisadoquecomSETF.
Vamosconsiderardoisdeles:actualizarumcontador,incrementandoou
diminuindolo,eactualizarumalista,adicionandoouexcluindoumelementona
frente.
10.3.1OINCFeDECFMacros
Emvezdeincrementarumavarivelnumricaporescrito,digamos,(SETFA(+A5)),
vocpodeescrever(INCFA5).INCFeDECFsomacrosespeciaisdeatribuio
paraincrementaredecrementarvariveis.Seoincremento/decremento
valoromitido,opadroum.
>(Setfuma2)
2
>(INCF10)
12
>(DECFa)
11
EXERCCIO
10.2. ReescreverafunolimonadaestandeSELLusarINCFemvezde
SETF.

pgina322

310

CommonLisp:AGentleIntroduoComputaoSimblica
10.3.2OsMacrosPUSHePOP
Quandoaadiodeumelementodeumalistapeloconsingloparaafrente,talcomo(XSETF
('CONSFOOX)),vocpodeexpressarsuaintenomaiseleganteporescrito
(Push'FOOX).Onome''push''vemdecinciadacomputaoclssica
terminologiaparapushdownpilhas,ou''pilhas''parabreve.Umapilha
anlogoaumapilhademoladepratosemumcaf.Quandovocapertaum
pratonapilha,tornaseonovoelementodenvelsuperior.Quandovoccolocaro
superiorpratoforadapilha,opratoabaixosetornaonovosuperior
elemento.VamostentarusarPUSHparaconstruirumapilhadepratos:
(NilMyStacksetf)
(push'dish1MyStack)(dish1)
(push'dish2MyStack)(dish1dish2)
(push'dish3MyStack)(dish3dish2dish1)
Dish3agoraestnotopodapilha.(Lerumalistadaesquerdaparaadireita
comolerumapilhadecimaparabaixo.)UmavezquecadachamadaparaIMPULSOresultaemum
atribuio,oMyStackvarivelsersempreatualizadoparaapontarparao
maisnovocelularcontras,cabeadalista.Quandocomearaestalarpratosdo
stack,oprimeiropratoparasairserdish3.LispforneceumamacroPOP

atualizarumavarivel,fixandooparaorestodalistaparaaqualfoioriginalmente
apontador.
MyStack(dish3dish2dish1)
(MyStackpop)dish3
MyStack(dish2dish1)
ObservequeoresultadoPOPretornosoelementoquefoianteriormenteotopo
dapilha.Esseelementoretiradodapilhacomoumefeitocolateral.o
duasformasseguintessoequivalentes:
(MyStackpop)
(Vamos((topelemento(primeiraMyStack)))
(SetfMyStack(MyStackrepouso))
topelemento)
Aexpressopermitemaprimeiramemorizaotopodapilhanolocal,
varivelTOPelemento.Emseguida,nocorpoqueapareceapilhaatravsdacriao

pgina323

311
CAPTULO10Assignment
MyStackpara(RESTMyStack).FinalmenteeleretornaovalordeTOP
Elemento,queoelementoqueacaboudeaparecer.
PushepopdeverealmenteserchamadoPUSHFePOPFparaaconsistncia

comasoutrasformasdeatribuio.Seusnomesnoterminamem''F''porrazeshistricas
razes:ElesforaminventadosantesSETF,e,portanto,antesquehouvesseuma
"Conveno"F''.Bytheway,onomeSETFsignifica''campodefinido.''
Aquiestumexemplodeprogramaocompush:
(Setf*amigos*nil)
(Defunseencontra(pessoa)
(Cond((igualpessoa(primeira*amigos*))
'acabamosdenosconhecer)
((*amigosmembropessoa*)
'nsnosconhecemos)
(T(pushpessoa*amigos*)
'prazeremconheclo)))
>(Meet'fred)
PRAZEREMCONHECLO
>(Meet'Cindy)
PRAZEREMCONHECLO
>(Meet'Cindy)
ACABAMOSDENOSCONHECER
>(MeetJoe')
PRAZEREMCONHECLO
>(Meet'fred)
NSNOSCONHECEMOS
>*Amigos*
(JOECINDYFRED)
EXERCCIOS
10.3. Modificarafunoserenemparamanterumacontagemdequantaspessoastm
foramatendidosmaisdeumavez.Armazenarestacontagememumavarivelglobal.
10.4. EscreverumafunoesquecerqueremoveumapessoaapartirdosAMIGOS**
Lista.Seapessoanoestavanalista,emprimeirolugar,afuno
deveriareclamar.

pgina324

312

CommonLisp:AGentleIntroduoComputaoSimblica
10.3.3AtualizandoVariveislocais
Atribuionodevemserusadosdeformaindiscriminada.Porexemplo,geralmente
consideradodeseleganteparaalterarovalordeumavarivellocaldeveseapenas
vincularumanovavarivellocalcomLETvez.(Hexcees,claro.)
aindamenoseleganteparamodificarumavarivelqueapareceemumafunode
listadeargumentosfazendooquetornaafunodifcildeentender.Considereo
seguintecdigoescritoemmuitomauestilo:
(Defunmstyle(n)
(Formatot"&NS."n)
(DECFN2)
(Formatot"&NowNS."n)
(DECFN2)
(Formatot"&NowNS."n)
(Listade"resultado"(*n(n1))))
>(Maustyle9)
N9.
AgoraN7.
Agoran5.
(RESULTADO20)
Estecdigopodeserlimpoatravsdaintroduodealgumasvariveisextrasesubstituindo
asexpressesDECFcoma*formalet.Quandotodasasatribuiesdetersido
eliminado,estamoscertosdequeovalordeumavarivelnuncavaimudardeumavez

elecriado.Programasescritosnestelivredeatribuiodeestilosofceisde
compreender,emuitoelegante.
(Defunboastyle(n)
(Vamos*((p(n2))
(Q(p2)))
(Formatot"&NS."n)
(Formatot"&PS."p)
(Formatot"&QS."q)
("Resultado"lista(*q(q1)))))
>(Bomestilo9)
N9.
P7.
Q5.
(RESULTADO20)

pgina325

313
CAPTULO10Assignment
Existemalgumasocasiesemquemaisconvenienteparaatribuiraumlocais
varivelemvezdeDEIXEvinculandoo.Oquesesegueumexemplo.Observeque
cadavarivelobrigadoaNILinicialmente,e,emseguida,atribudoumnovovalorapenas
umavez.Estaformade'atribuio'disciplinado''noruimestilobastante
diferentedaatribuioqueocorrenafunoBADSTYLE.

(Defunobtername()
(Vamos((ltimanomenil)
(Primeironomenil)
(Nilnomedomeio)
(Ttulonil))
(Formatot"esobrenome?")
(Setfltimonome(ler))
(Formatot"&primeironome?")
(Setfprimeironome(ler))
(Formatot"enomedomeioouinicial?")
(Setfmeioname(ler))
(Formatot"&ttulopreferido?")
(Ttulosetf(ler))
(Ttulodalistadoprimeironomeonomedomeiodeltimonome)))
>(Nomeget)
ltimonome?higginbotham
Primeironome?Waldo
nomedomeioouinicial?j
Preferidottulo?almirante
(ALMIRANTEWALDOJHIGGINBOTHAM)
10.4QUANDOEMENOS
QUANDOEamenosquesoformascondicionaisquesoteisquandovocprecisa
avaliarcommaisdoqueumaexpressoquandoumtesteverdadeiro.Suasintaxe:
(QUANDOteste
corpo)
(Amenosdeteste
corpo)
Quandoaprimeiraavaliaaformadeteste.Seoresultadonulo,quandoJust
retornaNIL.SeoresultadofornonNIL,QUANDOavaliaasformasemseucorpo
edevolveovalordoltimo.AMENOSsemelhante,excetoqueavalia
asformasemseucorposseotestefalso.Paraambososcondicionais,

pgina326

314

CommonLisp:AGentleIntroduoComputaoSimblica
quandoasformasnocorposoavaliadas,ovalordaltimadevolvido.
Formasanterioresaoltimossoteisparaefeitossecundrios,taiscomoi/oou
tarefa.
AsnicasvantagensdaQUANDOEamenosquemaisdeCONDsoestilsticas.
Elestmumasintaxemaissimpleseumpoucomaisagradvel,eelesprecisamdemenos
recuoporqueseuscorpossorecuadasapenasdoisespaos.Aquiestum
exemplodecomoQUANDOEamenosquepodesertil.Suponhaquequeremos
escreverumafunoquelevadoisnmeroscomoentradaemultiplicalos.supor
Estafunoexigequeasuaprimeiraentradadeserestranhoesuasegundaentradamesmo.Seum
entradadotipoerrado,afunopode''soluo''loadicionandoousubtraindo
umeimprimirumamensagemdeavisoadequado.
(Defunexigentemultiplicar(xy)
"CalculaXvezesY.
InputXdevesermparYdevesermesmo."
(Amenosque(oddpx)
(INCFx)
(Formatot
"&AlterarXparaSparatornloestranho."x))
(Quando(oddpy)
(DECFy)
(Formatot
"&MudandoYparaSparatornloainda."y))
(*Xy))
>(Exigentemultiplicam46)
AlterarXa5paratornloestranho.
30

>(Exigentemultiplicam29)
AlterarXa3paratornloestranho.
MudandoYa8paratornloainda.
24
10.5VARIVEISGENERALIZADAS
Avarivelgeneralizadaemqualquerlugarumponteiropodeserarmazenado.Umordinrio
varivelcomoXouNcontmumapontadorparaoobjectoqueoseuvalor.Mas
ponteirostambmpodeserarmazenadaemoutrostiposdelocais,taiscomoocarrooumetadeCDR
deumaclulacontras.Atribuiosignificaasubstituiodeumponteirocomooutro.assim
quandodizemosqueovalordeNtrs,oquequeremosdizerqueavarivelchamada

pgina327

315
CAPTULO10Assignment
Ncontmumponteiroparaonmerodetrs.Umaexpressocomo(INCFN)substitui
esseponteirocomumponteiroparaonmeroquatro.
Asmacrosdeatribuionsabordadosnestecaptulopodeatribuira
variveisgeneralizadas,oquesignificaquepodearmazenarponteirosemmuitosdiferente
locais.OprimeiroargumentoparaSETF,INCF,DECF,empurrar,ouPOPtratadocomo
umadescriolugar.Vejaesteexemplo:
(Setfx'(JackBennyerade39pormuitosanos))

(Setf(sextox)'vrios)
>x
(JACKBENNYfoide39PARAVRIOSANOS)
>(DECF(quartox2))
37
>x
(JACKBENNYfoide37PARAVRIOSANOS)
Comovocpodever,setfeafinsformaspodeaceitardescrieslugarcomo
(QUARTAX),earmazenarnovosponteirosnesseslocais.Porexemplo,a
expresso(QUARTAX)especificaumponteiroquevivenocarrodoquarto
celularcontrasnacadeiaapontadaporX.EstelugartambmpodeserchamadooCAR
doCDDDRdeX,comomostradoabaixo:
valordex

(Cdddrx)
etc.
JACK

BENNY

ESTAVA

37

PARA

ESTUDO10,6CASO:TICTACTOEPLAYER
Nestaseovamosescrevernossoprimeiroprogramadegrandeporte:umprogramaquenos
desempenhatictactoe,mastambmexplicaaestratgiaportrsdecadamovimento.Quando
escreverumprogramadestecomplexo,valeapenatomaralgunsminutosnoinciopara
pensarsobreodesigngeral,emparticularasestruturasdedadosqueseroutilizados.
Vamoscomearpordesenvolverumarepresentaoparaoconselho.Vamoscontaro
quadradosnotabuleirotictactoedestaforma:

pgina328

316

CommonLisp:AGentleIntroduoComputaoSimblica
1|2|3

4|5|6

7|8|9
VamosrepresentarumaplacacomoumalistaconstitudapelosmboloBOARD
seguidopornovenmerosquedescrevemocontedodecadaposio.Umzero
significaaposioestvaziaumsignificaqueelepreenchidoporumOumdedezsignificaque
preenchidaporumX.AfunomakeBOARDcriaumanovaplacadetictactoe:
(Defuntornarboard()
(Listade'board000000000))
Observeque,seBumavarivelsegurandoumaplacadetictacdedodop,posioumdo
placapodeseracessadoporescrito(NTH1B),aposiodedoisem(NTH2B),e
embreve.(NTH0B)retornaosmboloBOARD.
Agoravamosescreverfunesparaimprimirabordo.CONVERTERTOLETRA
converteumzero,um,dezouparaumespao,umO,ouumX,respectivamente.chamada
ImpressoROW,queimprimeumalinhadaplaca.PRINTROWestem
virechamadoporPRINTBOARD.
(Defunconvertersecarta(v)
(Cond((igualv1)"O")
((Igualv10)"X")
(T"")))
(Defunprintlinha(xyz)
(Formatot"&A|A|A"
(Converterseletrax)
(Converterseletray)
(Converterseletraz)))

(Defunprintboard(placa)
(Formatot"%")
(Printrow
(1placaensimo)(ensima2board)(ensima3bordo))
(Formatot"&")
(Printrow
(4bordoensimo)(ensima5board)(ensima6board))
(Formatot"&")
(Printrow
(7bordoensimo)(ensima8board)(ensima9board))
(Formatot"%%"))

pgina329

317
CAPTULO10Assignment
>(Setfb(certifiqueboard))
(BOARD000000000)
>(Bprintboard)
||

||

||

NADA
Nspodemosfazerumajogadadedestrutivamentemudandoumadasposiesdotabuleiro
apartirdeumzeroparaum(porO)ouumdedez(paraX).Ojogadorvarivel
FazMOVEserumoudez,dependendodequemestsemovendo.
(Defunmakemove(jogadorposboard)
(Setf(bordoposensimo)jogador)
borda)
Vamosfazerumaplacadeamostraparatestarestasfunesantesdeprosseguir
maisdistante.Vamosdefinirvariveis*Computador*e*ADVERSRIO*parasegurar
osvaloresdedezeum(XeO),respectivamente,porqueistofarcomqueo
exemplomaisclaro.
(Setf*computador*10)
(Setf*oponente*1)
>(*Oponentetornarmove*3b)
(BOARD001000000)

ColoqueumOnapraa3.

>(Computadortornarmove**5b)
(BOARD0010100000)

ColoqueumXnoquadrado5.

>(Bprintboard)
||O

|X|

||
NADA

pgina330

318

CommonLisp:AGentleIntroduoComputaoSimblica
Paraoprogramaparaselecionaramelhorjogada,eledeveteralgumaformade
analisandoaconfiguraodaplaca.Issofcilparatictactoe.Hapenas
oitomaneirasdeganhartrsemumfila:trsnahorizontal,trsnavertical,edois
diagonalmente.Vamoschamarcadaumadessascombinaesa''triplete.''Nsvamosarmazenaruma
listadetodososoitotrigmeosemumTRIPLETS*variveisglobais*.
(trigmeos*setf*
'((123)(456)(789)
(417)(258)(369)
(159)(375)))

trigmeoshorizontal.
trigmeosverticais.
trigmeosdiagonal.

AgorapodemosescreverumafunoSUMTRIPLApararetornarasomado
nmerosnasposiesdotabuleiroespecificadosporessatripleto.Porexemplo,odireito
tripletodiagonal(357).Asomadoselementosdetrs,cincoesetedebordo
Bonze,indicandoqueexisteumO,umX,eumaplaca(emalguns
ordemnoespecificada)emquediagonal.Seasomatinhasidovinteeumanos,no
seriaduasXseumOumasomadedozeindicariaumXedois
OS,eassimpordiante.
(Defunsumtriplete(bordotripleto)
(+(N(primeirotripleto)board)
(N(segundatripleto)board)
(Ensima(terceirotripleto)board)))
>(Somatripletob'(357))
11

Esquerdatripletediagonal.

>(Somatripletob'(258))
10

TripleteverticaisOriente.

>(Somatripletob'(789))
1

Tripletehorizontalinferior.

Paraanalisarcompletamenteumaplacaquetemosdeolharparatodasassomas.Afuno
COMPUTESUMSretornaumalistadetodososoitosomas.

(Defuncomputaosomas(bordo)
(Mapcar#'(lambda(tripleto)
(Tripletobordosomatripleto))
*trigmeos*))
(computaosomasb)(110001011011)
Observequeseojogadornuncaficatrsemumafileira,umadasoitosomasvai
sertrs.Damesmaforma,seojogadorXconseguefazertrsemumafileira,umdosoito
somassero30.Podemosescreverumpredicadoparaverificaressacondio:

pgina331

319
CAPTULO10Assignment
(Defunvencedorp(bordo)
(Vamos((somas(computaosomasbordo)))
(Ou(membro(*3*computador*)somas)
(Membro(*3*oponente*)somas))))
Nsvamosvoltaraoassuntodaanlisedebordomaistarde.Vamosolharagoraparao
estruturabsicaparajogarojogo.AfunoPLAYumjogo
ofereceaousurioaopodeirprimeiro,edepoischamaumcomputador
MoverouADVERSRIOMOVE,conformeapropriado,passandoporumanovaplaca,vaziacomo
entrada.
(Defunplayumjogo()
(If(younp"Vocgostariadeirprimeiro?")
(Adversriomove(tornarboard))

(Computadormove(tornarboard))))
AfunoADVERSRIOMOVEpedeoadversrioparadigitarummovimentoe
verificaqueomovimentolegal.Emseguida,eleatualizaabordoechamadas
COMPUTADORMOVE.Mashdoiscasosespeciaisemquenodevemos
LigarparaocomputadorMOVE.Emprimeirolugar,seajogadadoadversriofazumaatrsem
fileira,oadversrioganhoueojogoacabou.Emsegundolugar,senohouver
espaosvaziosdeixadosnaplaca,ojogoterminouemumempate.Nsassumimosque
oadversrioOeocomputadorX.
(Defunoponentemove(board)
(Vamos*((pos(bordoleiaalegalmove))
(Novaboard(makemovimento
*oponente*
pos
borda)))
(Impressodebordonovaboard)
(Cond((winnerpnovaboard)
(Formatot"evocganha!"))
((Placafullpnovaboard)
(Formatot"&jogolao."))
(T(computadormovimentonovoboard)))))
Umlancelegaluminteiroentreumenovedemodoquea
posiodotabuleirocorrespondenteestvazio.LERALEGALMOVElum
objetoLispeverificaseummovimentolegal.Seno,aschamadasdefuno
sealerumoutromovimento.ObservequeasduasprimeirasclusulasCONDcada
conterumtesteedoisconsequentes.Seotesteverdadeiro,ambossoconsequentes
avaliada,eovalordoltimo(achamadarecursiva)devolvido.

pgina332

320

CommonLisp:AGentleIntroduoComputaoSimblica
(Defunleiaalegalmove(board)
(Formatot"eseumovimento:")
(Vamos((pos(leia)))
(Cond((no(e(integerppos)
(<=1pos9)))
(Formatot"eentradainvlido.")
(Leiaajurdicomovimentodaplaca))
((Not(zerop(bordoposensimo)))
(Formatot
"&Esseespaojestocupado.")
(Leiaajurdicomovimentodaplaca))
(Tpos))))
OpredicadoBOARDFULLPchamadoporADVERSRIOMOVEparatestarse
existemespaosmaisvaziosdeixadosnoquadro:
(Placafullpdefun(bordo)
(Not(membrodoconselho0)))
AfunoCOMPUTERMOVEsemelhanteaoADVERSRIOMOVE,
excetoojogadorXemvezdeO,eemvezdelerumapassagemda
teclado,vamoschamarESCOLHABESTMOVE.Estafunoretornaumalistade
doiselementos.OprimeiroelementoaposioemqueacolocarumX.O
segundoelementoumastringqueexplicaaestratgiaportrsdomovimento.
(Defuncomputadormove(board)
(Vamos*((melhormove(escolherbestmovimentodaplaca))
(Pos(primeirobestmovimento))
(Estratgia(segundomelhormovimento))
(Novaboard(makemovimento
*Computador*placapos)))
(Formatot"&Mymovimento:S"pos)
(Formatot"&minhaestratgia:A%"estratgia)
(Impressodebordonovaboard)
(Cond((winnerpnovaboard)
(Formatot"eeuganhar!"))
((Placafullpnovaboard)
(Formatot"&jogolao."))
(T(adversriomovimentonovoboard)))))

Agoraestamosquaseprontosparajogaronossoprimeirojogo.Aprimeiraversodo
ESCOLHABESTMOVEterapenasumaestratgia:Escolhaumajogadalegalna
aleatria.AfunoRANDOMMOVEESTRATGIAretornaumalistacujos
primeiroelementoomovimento,ecujosegundoelementoumastringqueexplicaa
estratgiaportrsdomovimento. AfunodePICKRANDOMESVAZIAMENTO

pgina333

321
CAPTULO10Assignment
POSIOescolheumnmeroaleatriodeumanove.Seessaposioplaca
vazio,eleretornaessemovimento.Casocontrrio,elechamaasimesmodeformarecursivaparatentaroutro
nmeroaleatrio.
(Defunescolherbestmove(board)
(Boardestratgiarandommovimento))
(Defunmoveestratgiaaleatria(bordo)
(Lista(pickrandomemptyposiodotabuleiro)
"Movimentoaleatrio"))
(Defunpickrandomemptyposio(bordo)
(Vamos((pos(+1(aleatrio9))))
(If(zerop(bordoposensimo))
pos
(Pickrandomemptyposiodotabuleiro))))

Primeiraverso.

Vocpodetentarjogaralgunsjogoscomoprogramaparavercomoelesesente.
Muitoembrevevocvaiperceberqueaestratgiademovimentoaleatrionomuitobomperto
ofimdojogosvezesfazcomqueoprogramaparafazermovimentosqueso
downwrightestpido.Vejaesteexemplo:
(Setfb'(placade10100
000
110))
>(Bprintboard)
X|X|

||

|O|O
NADA
>(Bcomputadormove)
Meumovimento:4
Minhaestratgia:movimentoaleatrio
X|X|

X|
|

O|O|

pgina334

322

CommonLisp:AGentleIntroduoComputaoSimblica
Seumovimento:9
X|X|

X|
|

O|O|O
Vocganha!
NADA
Ocomputadorjteveduasseguidaselepoderiatervencido,colocandoumX
naposiotrs.Masemvezdisso,pegouummovimentoaoacasoeacaboucolocando
umXnaposioquatro,quenofezbememtudo,porqueessatrincaverticalfoi
jbloqueadaspeloOnaposionove.
Parafazercomqueonossoprogramadeformamaisinteligente,podemosprogramloparaprocurardoisemumfila
situaes.SehdoisXsemumalinha,eledevepreenchernoterceiroXparaganharo
jogo.Casocontrrio,sehouverduasOsconsecutivas,devecolocarumXlpara
bloquearoadversriodeganhar.
(Defuntornartrsemumfila(bordo)
(Vamos((pos(placadeganharoubloco
(*2*computador*))))
(Epos(listapos"fazertrsemumafileira"))))
(Defunblocoopositorwin(bordo)
(Vamos((pos(placadeganharoubloco
(*2*oponente*))))
(Epos(listapos"blocoadversrio"))))
(Defunganhaoublock(placadoalvodesoma)
(Vamos((tripleto(encontrarse
#'(Lambda(ida)
(Igual(bordosomatripleto
viagem)
targetsum))
*trigmeos*)))
(Quandotripleto
(Encontraremptyposiodotabuleirotripleto))))

(Defunencontraremptyposition(casasdotabuleiro)
(Encontrarse#'(lambda(pos)
(Zerop(bordoposensimo)))
quadrados))

pgina335

323
CAPTULO10Assignment
AmbosfazemtrsemumfilaeNILretornoBLOCKoponentese
elesnoconseguemencontrarummovimentoqueseadaptassuasrespectivasestratgias.Agoraprecisamos
reverESCOLHABESTMOVEapreferirestasduasestratgiasmaisinteligentespara
aestratgiademovimentoaleatrio.NsintroduzimosumORparaocorpodeCHOOSE
BESTmoverparaqueelevaitentarsuasestratgiasdeumdecadavezatqueumdeles
retornaummovimentonoNIL.
(Defunescolherbestmove(board)
(Ou(maketrsemumfilaboard)
(Bordoblocoopositorwin)
(Boardestratgiarandommovimento)))

Segundaverso.

Estanovaestratgiafazparaumjogomaisinteressante.Ocomputador
defendersequandobviooadversrioestprestesaganhar,evaidemorar
aproveitaraoportunidadeparaganharquandotemduasseguidas.
>(Playumjogo)
Vocgostariadeirprimeiro?y
Seumovimento:1

O|
|

||

||
Meumovimento:5
Minhaestratgia:movimentoaleatrio
O|
|

|X|

||
Seumovimento:2
O|O|

|X|

||

pgina336

324

CommonLisp:AGentleIntroduoComputaoSimblica

Meumovimento:3
Minhaestratgia:oponentebloco
O|O|x

|X|

||
Seumovimento:4
O|O|x

O|X|

||
Meumovimento:7
Minhaestratgia:fazertrsemumafileira
O|O|x

O|X|

X|
|
Euganho!
NADA
RESUMO
AmacroSETFpodeatribuirqualquervalorparaqualquervarivel.''''Atualizandoumavarivel
significacomputarseunovovalorcombasenoseuvalorantigo.doisestereotipada
formasdeactualizaosoaumentaroudiminuirumavarivelnumrica(por
queINCFDECFepodeserusado),eadioouremoodeumelemento
apartirdafrentedeumalista(paraoqualpushepoppodeserusado.)Amaioriadasatualizaes
soexecutadasemvariveisglobais.Alterandoovalordeumavarivellocal
geralmenteconsideradaestilodeprogramaoruimmelhorparavincularumanovavarivel
comLETvez.
Umavarivelgeneralizadaemqualquerlugarumponteiropodeserarmazenado.Todosos
macrosdeatribuiodiscutidasnestecaptulooperaremvariveisgeneralizadas,
variveisnoapenascomuns.

pgina337

325
CAPTULO10Assignment
AtribuiousadoapenasmoderadamenteemprogramasLisp.LET,aplicativo
operadoresefunesdecaudarecursivoeficiente,oqueamaioriadosoutrosidiomas
falta,fazeraatribuiodesnecessriaemmuitoscasos.programaslivredeatribuio
soconsideradosmuitoelegante.
exercciosdereviso
10.5. ReescreveraseguintefunofeioparausarobomestilodeLisp.
(Defunfeia(xy)
(Quando(>xy)
(Setftemperaturay)
(Yxsetf)
(Setfxtemp))
(Setfavg(/(+xy)2.0))
(Setfpct(*100(/avgy)))
(Listade'avgmdia'
pct'porcento'de'ymax))
(feio202)
(Mdia11,055,0porcentodomximo20)
10.6. SuponhaqueavarivelXnulo.Qualseroseuvalorserdepoisdeavaliar

(XXIMPULSO)trsvezes?
10.7. Oqueesterradocomaexpresso(SETF(comprimentox)3)?
FUNESabordadosnestecaptulo
macrosdeatribuiogeneralizada:SETF,INCF,DECF,empurrar,pop.
Condicionais:QUANDO,AMENOS.

ToolkitLisp:BREAKeERROR

Asfunesdepausaedeerrosoteisparadepurao,eparafazer
programasmaisresistentesainsetos.INTERVALOfoiintroduzidonoCaptulo8
seodekitdeferramentas,masassuascapacidadestotaisnoforamapresentadosl.ambosRUPTURA
eerroterumastringdecontroledeformatocomoseuprimeiroargumento.Adicional

pgina338

326

CommonLisp:AGentleIntroduoComputaoSimblica
argumentos,sehouver,sousadoscomoargumentosparaasdirectivasformato,comoS

queaparecemnacadeiadecontrole.
INTERVALOimprimeamensagemgeradapelostringdecontroledeformatoe
emseguida,fazcomqueLispparaentrarnodepurador.Depoisquevocfeitousandoo
depurador,vocpodecontinuaraexecutaroseuprogramadeondeeleparoupor
emitindoumcomandodepuradorchamadoalgocomoGO,continuar,ou
REINICIAR.(Debuggerssonotoriamentedependentedeimplementao,demodoqueo
comandoprecisausardependedequalmarcadeLispvocestcorrendo.)A
BreakFunoretornaNIL,eavaliaoprosseguecomaprximaforma.
AquiestumexemplodousoBREAKparadepurarumafuno.Estafuno
deveriaterumpreodevendaeumataxadecomissocomoentrada,figurao
comissosobreavenda,imprimirumamensageme,emseguida,retornarricosou
POBREdependendoseacomissofoimaiordoque100dlares.
svezes,porm,eleretornaNIL.Esteumbug.
(Defunanalisarfinslucrativos(preocomissodetaxa)
(Vamos*((Comisso(*Preocomissodetaxa))
(resultado
(Cond((>comisso100)"ricos)
((<Commission100)"pobres))))
(Formatot"eeuprevejoquevocvaiser:S"
resultado)
resultado))
>(Analisarfinslucrativos1,6000,15)
Euprevejoquevocvaiser:RICH
RICO
>(Analisarfinslucrativos31000,02)
Euprevejoquevocvaiser:POBRES
POBRE
>(Analisarfinslucrativos2,0000,05)
Euprevejoquevocvaiser:NIL
NADA
Paradepurarafuno,comeamosatravsdainserodeumachamadaparaquebrarocorpo.
Ento,podemosusarodepuradorparaexaminarapilhadecontroleeverificaro
valoresdevariveislocais.

pgina339

327
CAPTULO10Assignment
(Defunanalisarfinslucrativos(preocomissodetaxa)
(Vamos*((Comisso(*Preocomissodetaxa))
(resultado
(Cond((>comisso100)"ricos)
((<Commission100)"pobres))))
(Break"valorderesultS"resultado)
(Formatot"eeuprevejoquevocvaiser:S"
resultado)
resultado))
>(Analisarfinslucrativos2,0000,05)
ValorderesultNIL
Entrandonodepurador:
Debug>preo
2000
Debug>comissodetaxa
0,05
Debug>comisso
100,0
Agora,acausadoerroaparente:Quandoacomissoexatamente
iguala100,nemCONDclusulatemumverdadeiroteste,demodoCONDretornaNIL.o

soluosubstituirosegundotestecomexpressoT.
AfunodeerrolevaosmesmosargumentosqueBreak:umformato
stringdecontroleseguidoporalgunsargumentosopcionaiscujosvaloressero
impressospelasdirectivasformato.Umadiferenaentreoerroea
Breakqueoerronuncaretorna:Vocnuncapodecontinuarapartirdeum
ERRO.Emsegundolugar,apenasERROrelataoerroeinterrompeoprograma,ele
nonecessariamentecoloclonodepurador,emboranamaioria
implementaesquevai.
Osprogramaspodemsertornadasmaisresistentesainsectosatravsdainserodesanidade''
'cheques':expressesqueverificamparagarantirquetudonormal,echamada
ERRORsealgoesterrado.Porexemplo,estaversodamdia
funoverificaparasecertificardesuasentradassoosdoisnmeros:
(Mdiadefun(xy)
(Amenosque(e(numberpx)(ynumberp))
(Erro"argumentosdevemsernmeros:S,S"
xy))
(/(+Xy)2.0))

pgina340

328

CommonLisp:AGentleIntroduoComputaoSimblica
Lispcomumprevvriasoutrasfunespararelatarerros.
WARNimprimeumamensagemdeaviso,masnopraaexecuodoprograma.
CERRORsinalizaum''errocontnuo.''Ousurioinformadodoerroe

dadaaopodecontinuaraexecuo.Estasfunes,eonovo
Lispcomum''sistemadecondio''quelhepermitesinalizareprenderarbitrria
condiesdeerro,nosercobertonestelivro.Verifiquesuareferncia
manualparadetalhes.

Exerccioteclado

Esteexercciotecladorequerquevocadicionealgumasestratgiasadicionaisparao
tictactoeprogramadereproduodiscutidoanteriormente.Aprimeiraestratgiavamosconsiderar
chamaseapeadoaperto,quepodeserfeitautilizandoqualquerumdosdoisdiagonal
trigmeos.Suponhaqueoadversrio,O,vaiprimeiro,edepoisdetrsmovimentosdotabuleiro
separececomisso:
O|
|

|X|

||O
Nesteponto,iniciouumsqueeze.SeXrespondepelaescolhadeum
canto,podeforarumavitria,levandoocantorestante.Suponha,por
exemplo,queXescolhetrs(cantosuperiordireito),eO,emseguida,levasete
(.Cantoinferioresquerdo)Oconselhoparececomisso:
O|
|x

|X|

O|
|O
AgoraXestcondenadoporqueSpodefazertrsemumfiladuasmaneirasdiferentes:
verticalmenteouhorizontalmente.NoimportaomovimentoXescolheseguinte,O
vaiganhar.

pgina341

329
CAPTULO10Assignment
AdefesaadequadacontraumsqueezeparaXparaescolherumladoquadrado
(Duas,quatro,seis,ouoito),emvezdeumcanto.EsteforasOparatomarafrente
quadradoladoparabloquearX,eoperigopassado.Aquiestumexemplo:
O|
|

|X|

||O

Adversrioconfiguraumsqueeze.

O|
|

|X|x

||O

6:Xdefendeoptandoporumladoquadrado.

O|
|

O|X|x

||O

4:OforadoabloquearX.

O|
|

O|X|x

X|
|O
O|
|O

O|X|x

X|
|O

7:XforadoparabloquearO.

3:SnovamenteforadaparabloquearX.

Depoisdemaisduasjogadas,ojogoterminaemempate.
Umasegundaestratgiaofensivaqueremosprotegercontrachamadode''doisem
um.''Comoosqueeze,elepodeserconfiguradousandootripletediagonal.Emum
doisemumdaestratgia,oadversriotomaocentrodapraa,ocomputadorleva
umcanto,eoadversriotomaocantooposto,comoeste:

pgina342

330

CommonLisp:AGentleIntroduoComputaoSimblica
O|
|

|O|

||x

AgoraavezdeXparamover.SeXtemumladoquadrado,podeforarumavitriapor
tomandoumcanto,comoeste:
O|
|

|O|x

||x

6:Xtomaumquadradolado.

O|
|O

|O|x

||x

3:agoraOpodeganhardeduasmaneiras.

O|
|O

|O|x

X|
|x

7:Xtentabloquear.

O|O|O

|O|x

X|
|x

2:Ovitriasdequalquermaneira.

AnicadefesacontraumataquededoisemumparaXparatomarumcanto
emvezdeumquadradolado.
EXERCCIO
10.8. Digiteoprogramadetictactoecomoaparecenestelivro,como
segundaversodoESCOLHABESTMOVE.Experimentaroprogramapor
jogaralgunsjogosantesdeprosseguir.

pgina343

331
CAPTULO10Assignment
uma.Configurarumavarivelglobalchamada*CANTOS*paramanterumalistados
quatroposiesesquina.Configurarumavarivelglobalchamada*OSLADOS*para
mantenhaumalistadosquatroquadradoslaterais.Noteseque(FINDESVAZIAMENTO
Posiodotabuleiro*OSLADOS*)retornarumladoquadradovazio,se
houveralgum.
b.EscreverumafunoBLOCKSQUEEZEPLAYqueverificaa
diagonaisparaumpadroOXOedefende,sugerindoumlado
quadradocomoamelhorjogada.SuafunodeveretornarNILsehouver
nosqueezeemandamento.Casocontrrio,eledeveretornarumalista
contendoumnmerodomovimentoeumasrieexplicandoaestratgia
portrsdomovimento.Testeasuafunoaochamloemumaplacadeamostra.
c.Escreverumafunoblocodedoisemumqueverificaasdiagonais
paraumpadrooOXouXOOedefende,sugerindoumcanto
comoamelhorjogada.SuafunodeveretornarNILsenohouver
Doisemumameaaparaoqualaresponder.Casocontrrio,eledeveretornarum
listacontendoummovimentoeumadescriodaestratgia.
d.ModificarafunoESCOLHABESTMOVEporissoquetentaestes
duasestratgiasdefensivasantesdeescolherummovimentodeformaaleatria.
e.Seocomputadorvaiemprimeirolugar,emseguida,apsaprimeirajogadadoadversriono
podeserumaoportunidadeparaocomputadorparaconfigurarumsqueezeou
situaodedoisemumparaprenderoadversrio.Escreverfunesparaverificar
asdiagonaisesugerirumataqueapropriadoseaoportunidade
existe.ModificarafunoESCOLHABESTMOVEparaincluir
estasestratgiasofensivasemsualistadecoisasparatentar.

pgina344

332

10

CommonLisp:AGentleIntroduoComputaoSimblica

Tpicosavanados

10.7DOITYOURSELFCIRURGIALISTA
VocpodeusarSETFemvariveisgeneralizadasparamanipularponteirosdiretamente.
Porexemplo,suponhaquequeremostransformarumacadeiadetrsclulascontrasemumacadeia
deduasclulascontraspor''cortandoparafora''daclulamdia.Emoutraspalavras,queremos
paraalteraraCDRdaprimeiraclulaparaqueeleapontadirectamenteparaaterceiraclula.aquiest
comofazerisso:
(Defunsnip(x)
(Setf(cdrx)(cdr(cdrx))))
>(Setfa'(sempagamento))
(NOPAGAMENTOPARABAIXO)
>(Setfb(cdra))
(PAGAMENTOINICIAL)
>(Cortara)
(PAGAMENTO)
>a
(NOPAGAMENTO)
>b
(PAGAMENTOINICIAL)
NotesequeovalordeBpermaneceuinalteradaporPInas.ApenasaCDRdo
primeiraclulanacadeiafoialterada,comosemostranaFigura101.

pgina345

333
CAPTULO10Assignment

(Setfa'(sempagamento))
(Setfb(cdra))
uma

b
NADA
NO

BAIXA

PAGAMENTO

(snipa)(sempagamento)

uma

b
NADA

NO

BAIXA

PAGAMENTO

Figura101Efeitosdacirurgiadelistanalista(NOPAGAMENTOPARABAIXO).

pgina346

334

CommonLisp:AGentleIntroduoComputaoSimblica
PodemosusarSETFparacriaraseguinteestruturacircular.
>(Setfcirc(listade'foo))
(FOO)
>(Setf(cdrcirc)circ)
(FOOFOOFOOFOO...)
AquiestoquealistacircularCIRCrealmenteseparece:

FOO
Modificandolistasalterandodiretamenteosponteirosemsuascelascontras
conhecidacomocirurgialista.Cirurgialistatilemgrandesprogramas,complexos
porqueelepodesermuitomaisrpidoparamudaralgumasindicaesdoqueconstruirumtodo
novalista.Issotambmreduzosrequisitosdememriadoprograma(oufazcomqueele
acoletadelixocommenorfrequncia).programaoavanadaCommonLisp
incluilotesdecirurgialista,masparainiciantesissononecessrio.Muitos
asoperaesdecirurgiadelistamaiscomumjsoconstrudosparaLispcomum,
comoveremosnaprximaseo.
10.8operaesdestrutivasemlistas
operaesdelistadestrutivossoaquelesquealterarocontedodeumacluladecontras.
Estasoperaesso''perigoso'',porqueelespodemcriarestruturascirculares
quepodeserdifcildeimprimir,eporqueosseusefeitossobreasestruturascompartilhadaspodeser
difcildeprever.Masfunesdestrutivastambmsoferramentaspoderosaseeficientes.
Porconveno,amaioriadelestmnomesquecomeamcomN.(comoo
CAR/convenoCDReo'conveno'F'',estesurgiuessencialmentepor
acidente,maspermaneceemvirtudedabrevidadeeutilidade.)
10.8.1NCONC
NCONC(pronunciase''enkonk'',derivadode''concatenar'')um
versodestrutivadoacrscimo.EnquantoAPPENDcriaumanovalistaparaasua

pgina347

335
CAPTULO10Assignment
resultado,NCONCmudafisicamenteoltimocontrascelulardesuaprimeiraentradaparaapontar
paraasuasegundaentrada.Exemplo:
>(Setfx'(ABC))
(ABC)
>(Setfy'(def))
(DEF)
>(Anexarxy)
(ABCDEF)

NoalteraXouY,mas
aesderesultadoestruturacomY.

>x
(ABC)

Xinalterada.

>(Xynconc)
(ABCDEF)

NCONCalteraalista(ABC).

>x
(ABCDEF)

valordeXmudou.

>y
(DEF)

Ydono.

SeaprimeiraentradaparaNCONCNIL,elesretornaasuasegundaentrada.Porisso
razo,nosedeveassumirque(NCONCXY)iralterarovalordeX.Se
Xnada,oseuvalornoseralterada.Portanto,devesesempreusar
SETFparaarmazenaroresultadodeNCONCemX,apenasnocaso.
>(Xsetfnil)
NADA
>(Setfy'(semsortehoje))
(NOHOJEsorte)
>(Xynconc)

(NOHOJEsorte)
>x
NADA
>(Setfx(nconcxy))
(NOHOJEsorte)

pgina348

336

CommonLisp:AGentleIntroduoComputaoSimblica
>x
(NOHOJEsorte)
AfunoNCONCrealmenteaceitaqualquernmerodeentradase
concatenadestrutivatodosdelesparaformarumacadeiadeclulascontraslonga.Ns
podeescreveranossaprpriaversodeNCONCquelevaexatamenteduaslistascomoentradae
fazcomqueaCDRdaltimacluladalistaprimeiropontoparaasegundalista.Issoento
retornaumapontadorparaoinciodaprimeiralista.Umpontocomplicado:seoprimeiro
listaNIL,MYNCONCdeveretornarasegundalista,assimcomoAPPENDfaria
Faz.
(Defunmynconc(xy)
(Cond((nullx)y)
(T(setf(cdr(ltimox))y)

x)))
10.8.2NSUBST
NSUBSTumaversodestrutivadesubst.Elemodificaumalistamudando
osponteirosnoscarrosdealgumasclulas.
>(rvoresetf'(idizer(ei(ei)o)))
(EUDIGO(EI(EI)O))
>(Nsubst'a'ervore)
(EUDIGO(AI(AI)O))
>rvore
(EUDIGO(AI(AI)O))
>(nsubst'alegre'(AI)darvore:teste'#iguais)
(EUDIGO(AIANIMADORO))
Noltimoexemplo,umavezqueestvamosprocuradarvoreparaalista(AI),ns
tinhaquedizerNSUBSTusarEQUALcomootestedeigualdade.Otestepadro,
EQL,noteriafuncionado.
10.8.3OutrasfunesDestrutivos
MuitasoutrasfunesLispComumtmcontrapartidasdestrutivos.tem
NREVERSE,NUNION,NINTERSECTIONeNSETDIFERENA,por
exemplo.Hapenasduasexceesparaa''N''convenodenomenclatura.

pgina349

337
CAPTULO10Assignment
APPENDfoiaprimeirafunoLispterumcorrespondentedestrutivo.
SuaversodestrutivafoichamadoNCONC,para''concatenar.''(Houve
tambmumafunoCONC,masseuusoeraobscuraedesapareceunatarde
dialetos.)ElefoimuitosanosdepoisqueNCONCdeuorigemao''N''
convenoparaindicarfunesdestrutivas.porissoquenoexiste
NAPPEND.Anicaoutraexceoaconvenodo''N''REMOVE.
SuacontrapartedestrutivachamadoDELETEnovamenteporrazeshistricas.
(DELETEfoiinventadoapsNCONC,masantesdeConvenes''N''foi
estabelecido,demodoqueningumpensounonomenremova).O''N''
comumenterealizadaemrepousopor''noncopying''ou''nonconsing.''
10,9programaocomoperaesdestrutivas
Umlugarondeasoperaesdestrutivassoespecialmentetilnatomada
pequenasalteraesnasestruturasdelistacomplexos,taiscomoafunomakeMOVE
noprogramadetictactoe.Aquiestoutroexemplo.Suponhaquetemosa
Atabelaaseguirarmazenadonavarivelglobal*COISAS*:
((Cuboverdegrandeobject1brilhante)
(Cubovermelhopequenoobject2maantemetal)
(Cuboobject3vermelhapequenamaanteplstico))
ComopodemosmudarosmboloObject1aoFROB?Aexpresso
(ASSOC'Object1*COISAS*)retornaralista(Object1GRANDE
VerdebrilhanteCUBE).PodemosusarSETFnestalistaparaalterlofisicamente
armazenandonametadecarrodaprimeiraclulacontras.Comoesteumdestrutivo
operaonalista,ovalordascoisas**irmudartambm.Vamos
emfrenteeescreverumafunogeralpararenomearobjetos:
(Defunrenomeao(newnameobj)
(setf(carro(coisasassocobj**))))newName
>(RenomearFROB'object1')
FROB
>**Coisas
((FROBGRANDEverdebrilhanteCUBE)

(Object2PEQUENOVERMELHOcubodemetalMAANTE)
(Object3REDpequenocuboPLSTICOMAANTE))
PodemosusarNCONC,outraoperaodestrutiva,paraadicionarumanovapropriedade
aumobjetoj**coisas.

pgina350

338

CommonLisp:AGentleIntroduoComputaoSimblica
(Defunadicionar(objPROP)
(Nconc(assocobjcoisas**)(listaprop)))
>(Assoc'Object2*coisas*)
(Object2PEQUENOVERMELHOcubodemetalMAANTE)
>(Adicionar'object2'afiada)
(Object2PEQUENOVERMELHOMETALMAANTECUBEafiados)
>**Coisas
((FROBGRANDEverdebrilhanteCUBE)
(Object2PEQUENOVERMELHOMETALMAANTECUBEafiados)
(Object3REDpequenocuboPLSTICOMAANTE))
EXERCCIOS
10.9. EscreverumaCHOPfunodestrutivaqueencurtaqualquerlistanoNILaum

listadeumelemento.(CHOP"(FEEFIEFOEFUM))deveretornar
(TAXA).
10,10. EscreverumaNTACKfunoquedestrutivamentetachasumsmboloemumalista.
(NTACK'(FEEFIEFOE)'FUM)deveretornar(FEEFIEFOEFUM).
10.11. Desenharaestruturacelularcontrasqueresultadaseguintesequnciade
operaes:
(Setfx'(ABC))
(Setf(cdr(ltimox))x)
10.12. SuponhaqueavarivelHestdefinidoparaalista(HIHO).Qualacrtica
diferenaentreosresultadosde(APPENDHH)e(NCONCHH)?
10.10SETQESET
EmdialetosLispanteriores,ondesetfegeneralizadasvariveisnoforam
disponveis,afunodeatribuiofoichamadoSETQ.OespecialSETQ
funoaindaestemtornodehoje.AsintaxedalinguagemamesmaqueamacroSETF,eele
podeserusadoparaatribuirvaloresavariveiscomuns(masnogeneralizada).
>(Setqx'(pedraseflechas))
(SlingsandArrows)
SevoclerlivrosLispmaisantigos,vocvainotarqueaatribuiofeitacom
SetqemvezdeSETF.programadoresmodernosCommonLispusarSETFpara

pgina351

339
CAPTULO10Assignment
todasasformasdeatribuio,seelesestoarmazenandodentrodeumavarivelcomum
taiscomoXouumavarivelgeneralizado,taiscomo(segundox).SETQhoje
consideradaarcaica.Internamente,noentanto,amaioriadasimplementaesLisptransformarum
SETFemumSETQseaatribuioumavarivelcomum,demodoquevocpodever
algumasrefernciasasetqnasadadodepurador.
AfunoSET,comoSETQ,vemdomaisantigodialetoLisp,Lisp
1.5.SETavaliaambososseusargumentosoprimeiroargumentodeveseravaliadacomoum
smbolo.PorqueCommonLispusaescopolexical,enquantoLisp1.5nofez,
osignificadodaSETmudouumpouco.EmLispcomum,SETarmazenauma
valornaclulavalordeumsmbolo,oquesignificaqueatribuivarivelglobal
**
nomeadopelosmbolo,mesmoseumavarivellocalexistecomomesmonome.
AfunoSMBOLOVALORretornaocontedodaclulavalordeumsmbolo.
AquiestumexemplodousodoSETeSMBOLOVALOR:
(Patosetf'donald)

OPATOglobal.

ADUCKlocal.
(Defuntest1(pato)
(Listadepato
(Smbolodevalor'pato)))
(test1Huey')(hueydonald)
OutraPATOlocal.
(Defuntest2(pato)
Alteraropatoglobal.
(Set'pato'Daffy)
(Listadepato
(Smbolodevalor'pato)))
(test2'Huey)(hueydaffy)
patodaffy

**Paraasvariveiscomescopodefinidodeformadinmica,discutidasnoCaptulo14,SETatribuiaoactualmenteacessvel
variveldinmicacomessenome.

pgina352

340

CommonLisp:AGentleIntroduoComputaoSimblica

pgina353

11

IteraoeBlocoEstrutura

11.1INTRODUO
Apalavra''iterate''significapararepetiroufazeralgomaisemais.
Recursoeaplicativasoperadoressorepetitivas,masiterao(tambmconhecido
como''loop'')omaissimplesestruturadecontrolerepetitivo.praticamentetodos
linguagensdeprogramaoincluemalgumaformadeescreverexpressesiterativos.
IteraoemLispmaissofisticadodoquenamaioriadosoutrosidiomas.cicio
fornececonstruesdeiteraopoderososchamadosfazeme*,bemcomosimples
oschamadosdotimeseDOLIST.
Nestecaptulo,tambmvaiaprendersobre''estruturadebloco'',umconceito
emprestadadafamliaAlgoldelinguagens,queincluiPascal,Modula,
eAda.VamosvercomoogrupodeexpressesLispemblocos,comodar
nomesparaosblocos,eporissotil.
11.2dotimesEDOLIST
AsformasmaissimplessoiterativosdotimeseDOLIST.Ambossomacro
funes,oquesignificaquenoavaliartodososseusargumentos.Elestma
mesmasintaxe:
(Dotimes(indexvarn[resultadodeformato])
corpo)

341

pgina354

342

CommonLisp:AGentleIntroduoComputaoSimblica
(DOLIST(listadendicevar[resultadodeformato])
corpo)
Dotimesavaliaasformasemseucorponvezes,aopisarumndice
varivelentrezeroen1.Emseguida,eledevolveovalorderesultadoforma,que
defaultsazeroseomitido.(Aformaresultadoapresentadoentreparntesisacima
porqueopcional.)Aquiestumexemplodedotimescontagemdozero
attrs.AvarivelndicechamadoI.Notequeoresultadoretornadopor
DotimesNIL.
>(dotimes(I4)
(Formatot"&IS."i))
I0.
I1.
I2.
I3.
NADA
DOLISTtemamesmasintaxequedotimes,masemvezdecontagem,que
ospassosavarivelndiceatravsdoselementosdeumalista.Nasequncia
exemplo,ovalorretornadoporDOLISTosmboloFLORES.
>(Dolist(x'(azulverdevermelho)'flores)

(Formatot"&rosassoS."x))
Rosassovermelhas.
AsrosassoAZUL.
AsrosassoVERDE.
FLORES
11,3SAIRDOCORPODEUMLOOP
Afunoderetornopodeserusadoparasairdocorpodeumaformaiterao
imediatamente,semloopingmaislonge.RETURNlevaumaentrada:a
valorpararetornarcomoresultadodaformadeiterao.Quandoadevoluousadopara
forarasadadeumaformadeiterao,oformaresultadoexpresso,sehouver,
ignorado.
AquiumafunoiterativachamadoFINDprimeiroODDqueretornaoprimeiro
nmerompardeumalista.EleusaDOLISTparapercorreroselementosdalista,
evoltarparasairdoloop,logoqueumnmeromparencontrado.Sealista
nocontmnmerosmpares,emseguida,quandooloopforconcludo,DOLISTvoltar
NADA.UmpontointeressantesobreFINDprimeiroODDqueocorpodo
circuitocontmdoisformulriosemvezdeum.corposdelooppodeconterqualquernmero
deformas.

pgina355

CAPTULO11iteraoeBlocoEstrutura343
(Defunencontrarprimeirompar(listadenmeros)

(Dolist(elistadenmeros)
(Formatot"&TestingS..."e)
(Quando(oddpe)
(Formatot"encontradoumnmerompar.")
(Retornoe))))
>(Encontrarprimeiroodd'(24678)),nuncachegara8.
Testando2...
Testando4...
Testando6...
Testando7...encontrouumnmerompar.
7
>(Encontrarprimeiroodd'(246810))
Testando2...
Testando4...
Testando6...
Testando8...
Testando10...
NADA
Oquesesegueumexemploondeaespecificaodeumexplcitoresultadoformacom
DOLISTtil.AfunoCHECKALLODDusaDOLISTparaverificar
quetodososelementossompares.Seassimfor,DOLISTretornaosmboloTno
conclusodociclo.Sequalquerelementononoddforencontrado,afuno
retornaimediatamenteapartirdocircuitocomumvalordezero.
(Defuncheckallmpar(listadenmeros)
(Dolist(elistadenmerost)
(Formatot"&VerificarS..."e)
(If(no(oddpe))(nilretorno))))
>(Checkallodd'(135))
Verificando1...
Verificao3...
Verificando5...
T
>(Checkallodd'(1345))
Verificando1...
Verificao3...
Verificao4...
NADA

pgina356

344

CommonLisp:AGentleIntroduoComputaoSimblica
EXERCCIOS
11.1. Escreverumaversointerativadafunodemembro,chamadaIT
MEMBRO.EledeveretornarTsesuaprimeiraentradaapareceemseusegundo
entradaelenoprecisaretornarumasublistadesuasegundaentrada.
11.2. EscreverumaversoiterativodeASSOC,chamadaITASSOC.
11.3. EscreverumaversorecursivadeCHECKALLODD.Deveproduziro
mesmasmensagenseomesmoresultadoqueaversoiterativoanterior.

11,4COMPARANDORECURSIVEEbuscaiterativa
Parapesquisarumalistasimples,iteraomaissimplesdeusardoquearecursividade.Podeainda
sermaiseficaz,dependendodaimplementao.Compareestesdois
versesdoFINDPRIMEIROmpar,queforamsimplificadosomitindoa
expressodeformato:
(Defunrecffo(x)
"Recursivelyencontrarprimeironmerompardeumalista."
(Cond((nullx)nil)
((Oddp(primeiraX))(primeiraX))
(T(recFFO(restantex)))))

(Defunitffo(listadenmeros)
"Iterativamenteencontrarprimeironmerompardeumalista."
(Dolist(elistadenmeros)
(Se(oddpe)(retornoe))))
Humpardepequenasvantagensparaaversoiterativa.Emprimeirolugar,o
testedeterminaoimplcita:DOLISTsemprepraquandochegaaofinalde
alista.NaversorecursivatemosqueescreverumaclusulaCONDexplicitamente
verificarisso.Emsegundolugar,aversoiterativaosnomesvarivelE
elementossucessivosdalista,quemaisconveniente.Norecursiva
verso,nomesXrepousasucessivasdalista,porissotemosdelembrarsede
escrever(PRIMEIROX)parareferirseaoselementosdesimesmos,etemosqueexplicitamente
computar(RESTX)comcadachamadarecursiva.
Emoutrassituaesrecursopodesermaissimplesemaisnaturaldoqueiterao.
Porexemplo,vocpodefacilmentepesquisarumarvorecomrecursoCAR/CDR.Hsim
nenhumamaneiraigualmenteelegantedefazerissodeformaiterativa.Existemsoluesiterativos,maseles
sofeios.

pgina357

CAPTULO11iteraoeBlocoEstrutura345
11,5BUILDINGUPresultadoscomCESSO
NoCaptulo8,vimosvriasmaneirasdeconstruirrepetidamenteumresultado,comoum

lista,atravsdechamadasrecursivas.Nosprogramasiterativosresultadossoconstrudasatravsrepetitivo
tarefa.Vamosprimeirovercomofazerissonocorpodeumdotimesou
DOLISTusandoatribuiesexplcitas,comoSETF.Maistarde,nocaptulovoc
vercomoatribuiespodemserimplcita,comDO.
Vamoscomearusandodotimesparacalcularafunofatorial.Nsprimeiro
criarumPRODvarivelauxiliarcomumvalorinicial.Nsvamosrepetidamente
atualizarestevalornocorpodadotimes,eemseguida,retornarovalorfinal
dePRODcomooresultadodadotimes.Desdeondicevarivelquevaria
dezeroaN1aoinvsdeapartirdeumaN,devemosadicionarumparaIcadavez
quereferenciaroseuvalornocorpo.Assim,(ITFACT5)contadesdezeroat
quatro,masmltiplosPRODpelosnmerosdeumacinco.
(Defunlofact(n)
(Vamos((prod1))
(Dotimes(emprod)
(Prodsetf(*prod(+i1))))))
(itfato5)120
Aquiestoutrousodaatribuioexplcita:paraescreverumconjuntoiterativa
funodeinterseco.Oelementovarivelobrigadoasucessiva
elementosdoconjuntoX.SeelementoummembrodoconjuntoY,queempurrado
emresultsetcasocontrrio,no.QuandotodososelementosdeXtm
sidoprocessado,DOLISTretornaovalorderesultset.
(Defunitinterseo(xy)
(Vamos((nilsetresultado))
(Dolist(elementoxresultset)
(Quando(membrodoelementoy)
(Pushelementoresultset)))))
>(Itinterseco'(face)
'(Cravo))
(CE)
EXERCCIOS
11.4. Escreverumaversoiterativadecomprimento,chamadodeTIdecomprimento.
11.5. EscreverumaversoiterativodeNTH,chamadaITNTH.

pgina358

346

CommonLisp:AGentleIntroduoComputaoSimblica
11.6. EscreverumaversoiterativodeUNION,chamadoITUNION.suafuno
Nonecessriodevolveroresultadonamesmaordemcomoaunioembutido
funo.

11.6COMPARAOCOMDOLISTmapcarERECURSO
Mapcaramaneiramaissimplesdeaplicarumafunoacadaelementodeumalista.
Considereoproblemadaquadraturaumalistadenmeros.Aversoaplicativa
claramentemaissimplesdoqueaversorecursiva:
(Defunappsquarelist(listadenmeros)
(Mapcar#'(lambda(N)(*nn))
listadenmeros))
(appsquarelist'(12345))(1491625)
(Defunrecsquarelist(x)
(Cond((nullx)nil)
(T(cons(*(primeirox)(primeirox))
(Recsquarelist(restantex))))))
Ooperadormapcarnoscuidadeviajarparabaixonalistadeentrada
epararquandosechegaaofinal,mastambmcuidadeconsingoresultado
Lista.Tudoistotemdesermanuseadodeformaexplcitanaversorecursiva.Seusarmos
DOLISTparaescreverumasoluoiterativa,otestedeterminaoserotratadas
automaticamente,masaindatemosqueconstruiroresultadocomumcompromissoexplcito

tarefa.Aquiestumaprimeiratentativadeumasoluo:
(Defundefeituosoitsquarelist(listadenmeros)
(Vamos((resultadozero))
(Dolist(elistadenmerosresultar)
(Push(*ee)resultado))))
>(Listcomdefeitoitquadrado"(12345))
(2516941)
oresultadodafunofalha:paratrs.Istotpicoparauma
soluoiterativa.Comoafunoprossegueatravsdalistadeentradadaesquerda
paraadireita,eempurracadaresultadoparaafrentedalistaderesultados,alistaderesultados
acabatrs.Oquadradodoprimeironmeronalistadeentradaaltima
nmeronalistaderesultados,eassimpordiante.Nspodemosconsertarissoporescrito(REVERSE
RESULTADO)comoresultadoformadaDOLIST.

pgina359

CAPTULO11iteraoeBlocoEstrutura347
(Defunlosquarelist(listadenmeros)
(Vamos((resultadozero))
(Dolist(elistadenmeros(resultadoinverso))
(Push(*ee)resultado))))
>(Itsquarelist'(12345))

(1941625)
Sevocestevelerostpicossecesavanadas,vocvaientender
porprogramadoresLispexperientespreferemusarafunodestrutiva
NREVERSEnofinaldeumaiteraoemvezdeusarREVERSA.Sevoctiver
sidopularessassees,nosepreocupecomisso.
EXERCCIOS
11.7. PorqueoselementosderetornodefunoITinterseonareversa
encomendarapartirdofimelesapareceramemsuaprimeiraentrada?Comovocpode
corrigirisso?
11.8. Escreverumaversoiterativadoreverso,chamadoITREVERSE.
11.7ODOMACRO
DOaformaiteraomaispoderosanoLisp.Podeligarqualquernmerode
variveis,comoLETelepodeentrarqualquernmerodevariveisndicedequalquermaneiraquevoc
gostarepermitequevocespecifiqueseuprpriotesteparadecidirquandosairdoloop.
Porquetopoderosa,asintaxedoDObastantecomplicado:
(DO((var1inic1[update1])
(Var2inic2[Atualizao2])
...)
(Testedeao1...aon)
corpo)
Emprimeirolugar,cadavarivelnalistadevariveisdoDOatribudooseuvalorinicial.
Emseguida,aformadetesteavaliada.Seoresultadoforverdadeiro,noavaliaa
aesdeterminaoeretornaovalordaltima.CasocontrrioFAZER
avaliaasformasemseucorpoemordem.OcorpopodeconterRETURNs
queforarafazerparavoltarimediatamenteaoinvsdeinteragiraindamais.Quando
DOatingeaextremidadedocorpo,elecomeaaiteraoseguintedocircuito.Primeiro,
cadavarivelnalistadevariveisactualizado,definindooparaovalordesua
atualizarexpresso.(Aexpressoactualizaopodeseromitida,casoemqueo
variveldeixadoinalterado.)Quandotodasasvariveisforamatualizados,o

pgina360

348

CommonLisp:AGentleIntroduoComputaoSimblica
testededennciatenhatentadodenovo,eseverdade,noavaliaaresciso
aes.Casocontrrio,elecontinuaaavaliarocorponovamente.
AquiestumafunochamadaLANAMENTOescritocomDO.Observequeeleusa
apenasumavarivelndice,CNT,oquediminuiapartirdeNbaixoazero.Isto
possvelescreverLANAMENTOusandodotimesvez,masseriaumpouco
poucoestranhoporquedotimespassosavarivelndiceno''errado''
direo.
(Lanamentodefun(n)
(Fazer((cntn(cnt1)))
((Cntzerop)(formatot"Soprefora!"))
(Formatot"S..."cnt)))
>(Lanamento10)
10...9...8...7...6...5...4...3...2...1...Soprefora!
NADA
EXERCCIOS
11.9. MostracomoescreverCHECKALLODDutilizandoDO.
11.10. MostracomoescreverLANAMENTOusandodotimes.
AquiestumaimplementaodecontagemdecortescomDO.(CONTAGEM
FATIASfoiintroduzidonoCaptulo8.)Estecicloutilizaduasvariveisndice.
CNTcomeaemzeroeusadoparaconstruiroresultado.passosZatravs
Repousasucessivasdopo.
(Defuncontagemdefatias(loaf)
(Fazer((cnt0(+cnt1))
(Zloaf(restantez)))

((Nullz)cnt)))
Issofaztemumcorpovazio:Todooclculofeitoporexpresses
nalistadevariveis.Suponhaqueavaliar(COUNTslices'(XX)).Quando
entramosnoDO,CNTinicializadoparazeroeZinicializadopara(XX).Agora
vemotestedeterminao:DesdeZnoNIL,oloopnoterminar.
Ocorpoestvazia,porissovaiparaatualizarsuasvariveis.CNTestdefinidoparaovalor
de(+CNT1),queum.Zdefinidocomo(DESCANSOZ),quealista(X).Agora
DOtentaotestedeterminaonovamente.ZaindanoNIL,porisso,umaiteraomaisumavez.
EstetempoCNTdefinidocomoduas,eZdefinidocomozero.Agora,otestedeterminao
verdade.Aexpressoaseravaliadaeretornadoquandoolaotermina
CNT,assimqueretornadois.

pgina361

CAPTULO11iteraoeBlocoEstrutura349
11,8VANTAGENSDECESSOIMPLICIT
FAZERtemvriasvantagenssobredotimeseDOLIST.Elepodepisaro
variveisndicedequalquermaneiraquevocgosta,porissopodecontarparabaixo,emvezdese,para
exemplo.DOtambmpodevincularmltiplasvariveis.Istotornamaisfcilparaconstruir
resultadonalistadevariveisdaDOnohnecessidadedeumLETcircundante
eumSETFexplcita,comocomasformasmaissimplesdeiteraoedotimes
DOLIST.AquiestumaversodafunofactorialescritocomDO.

(Fatodefun(n)
(Fazer((em(i1))
(Resultado1(*resultadoi)))
((Zeropi)resultado)))
EstaversodoFACTcontaparabaixoemvezdeparacima,eelefazusoda
propriedadedeligaoparaleladeDO.Quandocalculamos(FACT5),inicialmenteI
definidoparacincoeresultaremum.Quandohoradeatualizarasvariveis,o
expresso(I1)avaliaaquatro,e(*RESULTADOI)avaliaacinco.
Sdepoisdeambasasexpressesdeatualizaoforamavaliadassoasvariveis
sealterado:Iestdefinidoparaquatroeresultadodefinidoparacinco.Aprximavez
atravsdolao,(I1)avaliaatrs,e(*RESULTADOI)avaliaa
54ou20.Eassimpordiante.Vejaatabelaaseguirparaoresto.
Eu
5
4
3
2
1
0

RESULTADO
1
5
20
60
120
120

(I1)
4
3
2
1
0

(*RESULTADOI)
5
20
60
120
120

AmboscontamfatiaseFACTtmcorposvazios.Estefrequentementeo
maisrazoparausarDO.Vocpodefazerasatribuiesimplcita
fazendotodootrabalhoemexpressesdeatualizaonalistadevariveis,paraquenotenha
paraescreverumempurroouSETF.Funesescritasnesteestilosoconsideradosmuito
elegante.
svezes,porm,melhornotentarfazertodootrabalhonaatualizao
expresses.Istoespecialmenteverdadeiroquandoaatualizaocondicional.Considerar
estaversodoITINTERSECTION,quetemumcorponulo:

pgina362

350

CommonLisp:AGentleIntroduoComputaoSimblica
(Defunitinterseo(xy)
(Fazer((x1x(restox1))
(Resultadonulo(if(membro(primeirax1)y)
(Cons(primeirax1)resultado)
resultado)))
((X1null)resultado)))
EstaversocomplicadoporqueaDOqueratualizarRESULTADO
cadaiteraodoloop,masnssqueremosovaloramudarquando
(PRIMEIRAX)ummembrodeY.Umaversomaissimplespodeserescritoporomitindoo
atualizarexpressopararesultarnalistadevariveis.Emvezdisso,realizara
atualizarcomumempurrocondicionalnocorpo:
(Defunitinterseo(xy)
(Fazer((x1x(restox1))
(Nilresultado))
((X1null)resultado)
(Quando(membro(primeirax1)y)
(Push(primeirax1)resultado))))
Setudoquevocprecisafazeriterarsobreoselementosdeumalista,DOLISTmais
concisodoqueDO.Masnomaisgeral.Porexemplo,podemosusarFAZERpara
iterarvriaslistasaomesmotempo,comonoFINDMATCHING
Elementos.Estafunocomparaelementoscorrespondentesdeduaslistas
atqueencontradoisquesoiguais,talcomooterceiroelementodaslistas(BIRD)
e(TAPETE).
(Defunencontrarcombinandoelementos(XY)
"PesquisarXeYparaoselementosquecorrespondem."
(Fazer((x1x(restox1))
(Y1y(restoy1)))
((Ou(x1nulo)(nuloY1))nil)
(Se(igual(primeirox1)
(PrimeiroY1))

(Retorno(primeirax1)))))
>(Encontrarmatchingelementos
'(pssaro)
'(tapete))
R

pgina363

CAPTULO11iteraoeBlocoEstrutura351
11.9OMACRODO*
AquiestENCONTRARprimeiroODDescritocomDO.Segueseaconvenodecostume:
AvarivelXintensificadaatravsrepousasucessivosdaentrada.Dentrodo
corpo,podemosescrever(PRIMEIROX)parasereferiraelementosdaentrada.
(DefunFFOcomdo(listadenmeros)
(Fazer((xlistadenmeros(restantex)))
((Nullx)nil)
(Se(oddp(primeiraX))(retorno(primeirax)))))
AmacroDO*temamesmasintaxequefazer,maselecriaeatualizao

variveissequencialmentecomoLET*,emvezdetudodeumavez,comoLET.Um
vantagemdeDO*emumafunocomoFINDprimeiroODDqueelenospermite
definirumasegundavariveldendiceparaconteroselementossucessivosdeumalista,enquanto
aprimeiravarivelndicedetmoscdrssucessivas:
(DefunFFOcomdo*(listadenmeros)
(Fazer*((xlistadenmeros(restantex))
(E(primeiraX)(primeirax)))
((Nullx)nil)
(Se(oddpe)(retornoe))))
ObservequeavarivelEndiceusaaexpresso(PRIMEIROX)tantoparaasua
valorinicialeoseuvalordeactualizao.Istonecessrioporque,seovalordeactualizao
foramomitidos,ovalordeEnomudariacadavezfomosatravsdo
loop.TambmimportantequeoEapareceapsXnalistadevariveisdaDO*,
porqueovalordeEdependeovalordeX.
EXERCCIOS
11.11. ReescreveraseguintefunoparausarFAZER*emvezdeDOLIST.
(Defunencontrarmaior(listadenmeros)
(Vamos((maior(primeiralistadenmeros)))
(Dolist(elemento(repousolistadenmeros)
maior)
(Quando(>elementomaior)
(Omaiorelementosetf)))))
11.12. Reescreveraseguintefunoparausarfazeremvezdedotimes.
(defunpotnciade2(n)2ensimapotncia.
(Vamos((resultado1))
(Dotimes(noresultado)
(ResultadoresultadoINCF))))

pgina364

352

CommonLisp:AGentleIntroduoComputaoSimblica
11.13. ReescreveraseguintefunousandoDOLISTvezdeDO*.
(Defunprimeiranointeiro(x)
"RetornaroprimeiroelementonointeirodeX."
(Fazer*((zx(restantez))
(Z1(primeiroz)(primeiraZ)))
((Nullz)'none)
(Amenosque(Z1integerp)
(Z1retorno))))
11.14. SuponhaquensmodificamosafunoFFOCOMDO*acimaporapenas
mudandooat*aumOD.Obugqueestaintroduo?
11,15. AversoseguintedafunoFFOCOMDOtemmuito
sutilbugnele.Qualoerro?Sevocprecisardeumadica,experimenteonalista
(24678),e,emseguida,nalista(2467).
(DefunFFOcomdo(x)
(Fazer((zx(restantez))
(E(primeiraX)(primeiraZ)))
((NulaZ)nil)
(Se(oddpe)(retornoe))))

11.10loopsinfinitosCOMDO
VocpodefazerloopDosempreespecificandoNILcomootestedeterminao.
Umlugarondeissotilumafunoquetentaleralgo
especficoapartirdoteclado,comoumnmero.Seousuriodigitaalgodiferente
doqueumnmero,afunoimprimeumamensagemdeerroenovamenteesperaparaaentrada.
Seousuriodigitarumnmero,afunosaidoloopusandoRETURNpara
retornaronmero.Aquiestumexemplo:
(Defunleiaanmero()
(Fazer((respostanula))
(nada)

(Formatot"eFavordigitarumnmero:")
(Respostasetf(ler))
(If(respostanumberp)
(Respostaderetorno))
(Formatot
"&Desculpe,Snoumnmero.Tentedenovo."
responda)))

pgina365

CAPTULO11iteraoeBlocoEstrutura353
>(Leiaanmero)
Porfavordigiteumnmero:foo
Desculpe,FOOnoumnmero.Tentenovamente.
Porfavor,digiteumnmerodetelefone:(123)
Desculpe,(123)noumnmero.Tentenovamente.
Porfavordigiteumnmero:37
37
11.11BLOCOSIMPLCITAS
EmLispComumcorposdasfunesestocontidasemimplcitosblocos,ea
nomedafunotambmservecomoonomedobloco.Umblocoumasequnciade
expressesquepodemserencerradoaqualquermomentoatravsdoretornodeSpecial

funo.NoexemploaseguirocorpodeFINDprimeiroODDumbloco
chamadoFINDprimeiroODD.OsargumentosparaRETURNFROMsoumbloco
nomeeumaexpressoderesultadoonomedobloconoavaliado,porissonodeve
sercitado.
(Defunencontrarprimeirompar(x)
(Formatot"eProcurandoporumnmerompar...")
(Dolist(elementox)
(Quando(elementooddp)
(Formatot"&FoundS."elemento)
(Retornodeencontrarprimeiroestranhoelemento)))
(Formatot"&Nenhumencontrado.")
'Nenhum)
>(Encontrarprimeiroodd'(24678))
Procurandoporumnmerompar...
Encontrado7.
7
>(Encontrarprimeiroodd'(246810))
Procurandoporumnmerompar...
Nenhumencontrado.
NENHUM
NesteexemplousamosRETURNFROMparasairdocorpodeencontrar
PRIMEIROODD,noapenasocorpodoDOLIST.Retornodosretornos
apartirdoblocodeinclusomaisprximocomonomeespecificado.Oscorposde
formasloopingcomodotimes,DOLIST,fazer,e*socolocadosem
blocosimplcitaschamadoNIL.Aexpresso(RETURNx)realmenteapenasuma
abreviaturade(RETURNDENILx).Assim,nocorpodeFINDFIRST

pgina366

354

CommonLisp:AGentleIntroduoComputaoSimblica
ODD,oretornoFROMestaninhadodentrodeumblocochamadoNIL,queestem
virecontidoemumblocodenominadoFINDprimeiroODD.
AquiestumexemploondeRETURNFROMnecessria,issonofaz
envolvemiterao.AfunoSQUARELISTusamapcaraoquadradoum
listadenmeros.Noentanto,sequalquerumdoselementosacabapornoserumnmero,
SQUARELISTretornaosmboloNOPEemvezdeobterumerro.o
RETURNdedentrodaexpressolambdasainosalambda
expresso,mastambmamapcar,eocorpodaprpriaSQUARELIST.
(Defunquadradolist(x)
(mapcar
#'(Lambda(e)
(Se(numberpe)
(*Ee)
(Retornodapraalist'Nope)))
x))
(listquadrado"(12345))(1491625)
(listquadrado"(12,trs,quatro5))NOPE
Almdissoosblocosimplcitoscontendooscorposdefuno,osblocospodemtambmser
explicitamentedefinidoatravsdafunoespecialdebloco.Istostilna
aplicaesavanadasnovamosentraremdetalhesaqui.
RESUMO
DOLISTedotimessoasformasmaissimplesdeiterao.Fazere*so
maispoderoso,porqueelespodempisardiversasvariveisaomesmotempousandoarbitrria
expressesdeatualizaoetestesdeterminao.Masparaproblemassimples,como
pesquisaroselementosdeumalista,DOLISTmaisconciso.
Todasasformasdeiteraofazerimplcitasatribuiesparasuasvariveisdendice.
Esteotipomaislimpodeatribuiodeusarvocnuncarealmentetemqueescrever
umSETF,porqueoloopfazatarefaparavoc.svezes,porm,
melhorparaconstruiroresultadousandoatribuioexplcitanocorpoloop.este
especialmenteverdadeiroquandoestamosusandoaatribuiocondicional,comonoIT
funodeinterseo.

Nomesdefunesservircomonomesdeblocosimplcitos.Podemos,portanto,usar
DEVOLVAFROMparasairdeumafunodequalquerlugaremseucorpo.

pgina367

CAPTULO11iteraoeBlocoEstrutura355
exercciosdereviso
11.16. ComoaslistasdevariveisdeLETediferem?
11.17. Ovalorretornadopelaseguinteexpresso?(Esteumtruque
questo.)
(Dotimes(i5i)
(formatodet"&I=S"i))
11.18. ReescreveraexpressodotimesnoproblemaanteriorutilizandoDO.
Serqueissoajudaexplicarovalordotimesretornos?
11.19. SerquemudaraordemdasentradasnalistadevariveisdeumDO
expressofazeradiferena?Porqu?
11,20. Seumloopusaapenasumavariveldendice,podefazereserusado*
alternadamente?
11.21. UmamaneiraparacalcularFib(5)comearcomFib(0)eFib(1),quens

saberparaserum,eadicionlosjuntos,dandoFib(2).Emseguida,adicionarFib(1)
Fibe(2)paraobterFib(3).AdicionarFib(2)eFib(3)paraobterFib(4).Adicionar
Fib(3)eFIB(4)paraobterFib(5).Esteummtodoiterativoenvolvendo
semrecursonsapenastemosquemanteremtornodosdoisltimosvaloresdeFib
paracomputaroprximo.EscreverumaversoiterativadaFIButilizandoeste
tcnica.
FUNESabordadosnestecaptulo
macrosdeiterao:dotimes,DOLIST,faa,faa*.
Funesespeciaisparaestruturadebloco:bloco,DEVOLVAFROM.
funocomumparasairdeumbloconomeadoNIL:RETURN.

Exerccioteclado

Nesteexercciotecladovamosexploraralgumaspropriedadesdesimplese
ADNdecadeiadupla,oucidodesoxirribonucleico.ADN,eorelacionado
RNAmolcula,formamomaterialgenticoencontradonovrusetodootipo

pgina368

356

CommonLisp:AGentleIntroduoComputaoSimblica
declulas,apartirdebactriasparaaspessoas.AfitadeDNAmuitoparecidocomumacadeiade
clulascontrasoselementosdacadeiasodequatrotipos,correspondenteao
quatrobasesdeadenina,timina,guanina,citosinae.Vamosrepresentaruma
fitadeDNAdeumalistadasbases.Lista(AGGTCATTG)corresponde
aumacadeiaquenovebasesdecomprimentoaprimeirabasesendoadeninaeosdoisseguintes
guanina.Aquiumdiagramaesquemticodacadeia:

!
!
!
!
!
UMA G
G
T
C

!
!
UMA T

!
T

!
G

Cadaumadasquatrobasestemumconjuntocomoqualpodeformarumpar.
paresadeninacomtimina,enquantoqueosparesguaninacomcitosina.duasdesolteiro
fitasdeDNApodemsecombinarparaformarDNAdecadeiadupla(cujaforma
afamosa''duplahlice''),quandocadaumadassuasbasescorrespondentesso
complementar.Avertente(AGGTCATTG)eavertente(TCCAG
TAAC)socomplementares,porexemplo.DNAdecadeiaduplaparece
esta:

!
!
!
!
!
UMA G
G
T
C
.
.
.
.
.
.
.
.
.
.
T
C
C
UMA G
!
!
!
!
!

!
UMA
.
.
T
!

!
T
.
.
UMA
!

!
T
.
.
UMA
!

!
G
.
.
C
!

EXERCCIO
11.22. Escreversoluesinterativasparatodasaspartesdesteexerccioquerequerem
acesrepetitivas.
uma.EscreverumafunoCOMPLEMENTOBASEquelevaumabasecomoentrada
eretornaabasecomplementarcorrespondente.(COMPLEMENTO
ABASE')deveretornarT(TCOMPLEMENTOBASE')deve
Umregressoeassimpordiante.
b.EscreverumafunoCOMPLEMENTOSTRANDqueretornao
cadeiacomplementardeumasequnciadeADNdecadeiasimples.
(COMPLEMENTOSTRAND"(AGGT))deveretornar(TCCA).

c.EscreverumafunomakeDOUBLEquelevaumnicofiode
ADNcomoentradaedevolveumaversodecadeiadupla.Nsvamos
representamDNAdecadeiaduplaporfazerumalistadecadabaseeseu

pgina369

CAPTULO11iteraoeBlocoEstrutura357
complemento.(FazDOUBLE'(GGACT))deveretornar((G
C)(GC)(AT)(CG)(TA)).
d.UmadaspistasimportantesparaanaturezadecadeiadupladeDNAfoio
observaodequeemADNdeocorrncianatural,quersetratedepessoas,
animais,ouplantas,apercentagemobservadadeadeninasempre
muitoprximadadetimina,enquantoapercentagemobservadade
guaninamuitoprximoaodecitosina.EscreverumafunoCOUNT
BASESquecontaonmerodebasesdecadatipodeDNA
Strand,eretornaoresultadocomoumatabela.Suafunodevefuncionar
tantoparasimpleseADNdecadeiadupla.Exemplo:(COUNT
BASES'((GC)(AT)(TA)(TA)(CG)))deveretornar((A3)(T3)
(G2)(C2)),enquantoque(contagemdeBASES'(AGTACTCT))deve
retorno((A2)(T3)(L1)(C2)).Noltimocaso,aspercentagens
nosoiguaisporqueestamostrabalhandocomapenasumnicofio.
QuerespostavocganhasevocaplicarcontagemdeBASESao
acorrespondentesequnciadecadeiadupla?
e.EscreverumaPREFIXPpredicadoqueretornaTseumafitadeDNAum

prefixodeoutra.Paraserumprefixo,oselementosdaprimeiracadeia
devecorresponderexatamenteoselementoscorrespondentesdosegundo,oque
podesermaislongo.Exemplo:(GTC)umprefixode(GTCAT),masno
de(AGGTC).
f.EscreverumaAPPEARSPpredicadoqueretornavertenteTseumDNA
apareceemqualquerlugardentrodeoutro.Porexemplo,(CAT)aparecena
(TCATG),masnono(TCCGTA).Dica:Sexapareceemy,ento
xumtantoumprefixodey,oudeREST(y)oude(RESTREST(y)),
eassimpordiante.
g.EscreverumaCOVERPpredicadoqueretornaTseasuaprimeiraentrada,repetido
umcertonmerodevezes,coincidecomtodaasuasegundaentrada.Exemplo:
(AGC)tampas(AGCAGCAGC),masno(AGCTTG).Voc
podesesuporquenemvertenteserNIL.
h.EscreverumaPREFIXfunoqueretornamaisesquerdabasesNdeumDNA
Strand.(PREFIX4'(CGATTAG))deveretornar(CGAT).Faz
NoconfundaoPREFIXfunocomoPREFIXPpredicado.
Eu.Osbilogosdescobriramqueporesdealgunsocorremnaturalmente
filamentosdeDNAsoconstitudospormuitasrepetiesdeumcurto''semente''
seqncia.Escreverumkernelfunoqueretornaoprefixomaiscurto
deumacadeiadeADNquepodeserrepetidoparacobrirofio.(NCLEO

pgina370

358

CommonLisp:AGentleIntroduoComputaoSimblica

'(AGCAGCAGC))deveretornar(AGC).(Kernel'(AAA
AA))deveretornar(A).(Kernel'(AGGTC))deveretornar(A
GGTC),porquenestecasoapenasumanicarepetiodetoda
vertentecobriroofio.Dica:Paralocalizarokernel,veja
prefixosdecomprimentocrescenteatencontrarumquepodeserrepetido
paracobrirofio.
j.EscreverumafunodrawDNAquelevaumDNAdecadeiasimples
sequnciacomoentradaeextraila,juntamentecomasuacadeiacomplementar,
comonodiagramanoinciodesteexerccio.

ToolkitLisp:TIME

AfunoTEMPOmacrodizlhequantotempolevouparaavaliaruma
expresso.Podetambmdizerlhequantamemriafoiusadaduranteo
avaliaoeoutrascoisasteis.Osdetalhesexatosdemedidasquehoras
ecomoasinformaessoexibidassodependentesdeimplementao.Tempo
tilparamediraeficciadeprogramas,porexemplo,paracomparardois
soluesparaumproblemaparaverqualmaisrpido,ouparavercomomuitomaislentoum
funoexecutadaquandodadaumaentradamaior.Aquiestumexemplo:
(Defunaddup(n)
"Adicionaseosprimeirosnmerosinteirosn"
(Fazer((i0(+i1))
(Soma0(+somai)))
((>In)soma)))
Aentradaummil.
>(Tempo(addup1000))
Avaliaotomou:
0,83segundosdetemporeal,
0.65625segundosdetempodeexecuodousurio,
81falhasdepgina,e
48208bytesConsed.
500500

pgina371

CAPTULO11iteraoeBlocoEstrutura359
>(Time(addup10000))deentradadedezmil.
Avaliaotomou:
6.909996segundosdetemporeal,
6.484375segundosdetempodeexecuodousurio,
217falhasdepgina,e
480208bytesConsed.
50005000
Comovocpodever,quandoaentradadeaddupfoiaumentadode1000para
10.000,otempodousuriocorridaebytestotaistambmConsedaumentadoporumfactorde
dez.Masonmerodefalhasdepginaaumentouporumfatordeapenas2,6.

11

Tpicosavanados

11.12PROG1,PROG2,EProgn
PROG1,PROG2eProgntrsfunesmuitosimples.todaselastm
umnmeroarbitrriodeexpressescomoentradaeaavaliarumaexpresses
deumavez.PROG1devolveovalordaprimeiraexpressoPROG2retornao
valordosegundoProgndevolveovalordaltimaexpresso.
>(Prog1(foosetf'x)
(Barsetf'x)
(Setfx'baz)
(FormatodeT"&XS"X))
XBAZ
FOO
>(PROG2(foosetf'x)
(Barsetf'x)
(Setfx'baz)
(FormatodeT"&XS"X))
XBAZ
BARRA

pgina372

360

CommonLisp:AGentleIntroduoComputaoSimblica
>(Progn(foosetf'x)

(Barsetf'x)
(Setfx'baz)
(FormatodeT"&XS"X))
XBAZ
NADA
Estesformulriossousadosraramentehoje.Elesforamimportantesnaanterior
versesdoLISP,emqueocorpodeumafunopodeconternomximoum
expressoeumaclusulaCONDpoderiaconternomximoumconsequente.
UmlugarondePrognaindatilnaverdadepartesefalsopartede
umIF.Sevocquiseravaliarvriasexpressesnaverdadepartesoufalsoparte,
vocdeveagruplosusandoalgocomoProgn,bloquearouuma
DEIXEI.
OsefeitosdePROG1PROG2epodeserfacilmenteconseguidocomLet.Para
exemplo,POP(X)equivalenteparaambasasseguintesexpresses:
(prog1
(PrimeiraX)
(Setfx(restantex)))
(Vamos((oldtop(primeirox)))
(Setfx(restantex))
oldtop)
Hoje,asegundageralmenteconsideradamaisfcildelereentender.
11.13argumentosopcionais
funesCommonLisppodeserescritoparaaceitarargumentosopcionais,palavrachave
argumentosouqualquernmerodeargumentos,colocandosmbolosespeciaischamados
lambdalistapalavraschavenalistadeargumentos.Porexemplo,asvariveisaseguir
um&listalambdanomepalavrachaveopcionalargumentosopcionais.o
seguintefunoaceitaumargumentoobrigatrioXeumopcional
argumentoY.Seumargumentoopcionalnofornecida,opadroNIL.
(Defunfoo(x&yopcional)
(FormatodeT"&XS"X)
(FormatodeT"&YS"Y)
(Listadexy))

pgina373

CAPTULO11iteraoeBlocoEstrutura361
>(Foo35)
X3
Y5
(35)
>(Foo4)
Xrepresenta4
YNIL
(4NIL)
NotemosdeusarNILcomoovalorpadroparaosargumentosnofornecida.isto
possvelespecificarovalorpadroaserusado,substituindooopcional
nomedoargumentonalistalambdacomumalistadeformulrio(nomepadro).No
seguintefunoDIVIDECHECK,ovalorpadroparaodivisordois.
(REM,chamadoporDIVIDECHECK,umafunointernaqueretornao
restodadivisodeumnmeroporoutro.)
(Defundivisodeverificao(dividendoseopcional(divisor2))
(Formatot"S&Adividirporigual,S"
dividendo
(If(zerop(dividendodivisorrem))"faz"
"no")
divisor))
>(Dividircheck273)

27sedivideporigual,3
NADA
>(Dividircheck27)
O27nodividirigualmentepor2
11.14ARGUMENTOSDEDESCANSO
Avarivelnasequnciadeumelistlambdapalavrachaverestanteservinculadaaumalista
dosrestantesargumentosparaumafuno.Istopermitequeafunodeaceitar
umnmeroilimitadodeargumentos,como+eformatarfazer.Aquiestumafuno
quelevaumnmeroilimitadodeargumentoseretornasuamdia:
(Mdiadefun(eargsdedescanso)
(/(Reduo#'+args)
(argscomprimento)
1.0))

pgina374

362

CommonLisp:AGentleIntroduoComputaoSimblica

(mdia12345)3.0
(mdiade351119)9,5

(mdia)0,0
Umlugarondevocdevetercuidadosobrecomousarumargumento&REST
emumafunorecursiva.Comaprimeirachamada,osargumentosdafunoso
coletadoemumalista.Seafuno,emseguida,chamaasimesmodeformarecursivanoCDRde
essalista,eleseroprocessamentodeumalistadeumalista,aoinvsdalistaoriginal.Aqui
umexemplo:umafunoFAULTYSQUAREALL,quedeveretornar
umalistadosquadradosdetodososseusargumentos:
(Defundefeituosaquadradosdetodos(eargsdedescanso)
(If(argsnulos)nil
(Cons(*(primeirosargs)(primeirosargs))
(argsdefeituososquaretudo(CDR)))))
(Dtracecomdefeitoquadradosdetodos)
>(Comdefeitoquadradostodos12345)
EnterFAULTYSQUAREALL
|
ARGS=(12345)
|EnterFAULTYSQUAREALL
||
ARGS=((2345))
Erronafuno*.
Argumento(2345)noumnmero.
PodemoscorrigiroproblemausandoAPLICARparafazerachamadarecursiva.
ComAPLICAR,ovalorde(CDRARGS)tratadacomoumalistadeargumentospara
achamadarecursiva,nocomoumnicoargumento.
(Defunquadradostudo(eargsdedescanso)
(If(argsnulos)nil
(Cons(*(primeirosargs)(primeirosargs))
(Aplicar#'argsquadradostodos(CDR)))))
(quadradostodos12345)(1491625)
AsfunesPROG1,Prog2,eprognpodeserdefinidausandoo
&RESTlistalambdapalavrachavedaseguinteforma:
(Defunmyprog1(x&restoignorar)x)

pgina375

CAPTULO11iteraoeBlocoEstrutura363
(DefunmyPROG2(xy&restoignorar)y)
(Defunmyprogn(&restantex)
(Carro(ltimax)))
AsversesembutidasdoPROG1,PROG2ePrognnosepreocupamem
criarumalistadeseusargumentos,porqueelessprecisaderetornarumvalor.
11.15argumentos
EmanterioressecesTpicosAvanadosvimosvriasfunesqueaceitam
argumentos,comomembroeENCONTRARSE.Porexemplo,quandovoc
quermembroautilizarEQUALcomootestedeigualdade,vocescreve:
(Membroxy:test#'iguais)
argumentossoteisquandoafunorecebeumgrandenmerode
argumentosopcionais.Usandopalavraschave,evitamosterquememorizaruma
Paraqueessesargumentosopcionaistodosnstemosdelembrarsoosseusnomes.
Vocpodecriarsuasprpriasfunesqueaceitamargumentosusando
o&KEYlistalambdapalavrachave.Talcomoacontececom&OPCIONAL,valorespadropodeser
fornecido,seforocaso.AquiestumafunoMAKESUNDAEqueaceitaatseis
argumentos:
(Defuntornarsundae(nomeechave(tamanhode'regular)
(Icecream'vanilla)
(Xaropede'hotfudge)

nozes
cerejas
chantilly)
(Listade'sundae
(List'paraonome)
(Listadegelados'comxaropede'xarope)
(lista='coberturas'
(Removernil
(Lista(enozes'nozes)
(Ecerejascerejas)
(Echicoteadocream
'chantilly))))))
>(Makesundae'john)
(SUNDAE(paraJohn)
(BaunilhacomHOTFUDGExarope)
(COBERTURAS=NIL))

pgina376

364

CommonLisp:AGentleIntroduoComputaoSimblica
>(Makesundae'cindy
:'Strawberrysyrup
:Porcast
:Cerejast)
(SUNDAE(paraCindy)
(BaunilhacomMORANGOxarope)

(Coberturas=(cerejasNUTS)))
Palavraschave,taiscomo:CEREJASsempreavaliamparasimesmosporisso
elesnoprecisamdesercitado.Observequeusamosapalavrachave:Cerejas
aochamarMAKEsundae,masnalistadeargumentoseocorpodomake
SUNDAEusamosascerejassmbolocomuns.Estaumaimportante
distino.DentroMAKESUNDAE,cerejasapenasumaoutravarivel.
Anicacoisaespecialsobreeleamaneiracomoelerecebeoseuvalor.Assimcomoum&oRESTO
variveltratadoespecialmente,asvariveisdefinidascom&CHAVEobterosseusvaloresemuma
maneiraespecial:AochamarMAKEsundae,queespecificarumvalorpara
Cerejasporprecedendoovalorcomas:Cerejaspalavrachave.
11.16variveisauxiliares
Apalavrachave&AUXlambdalistusadoparadefinirvariveislocaisauxiliares.
Vocpodeespecificarapenasonomedavarivel,casoemqueavarivelcriada
comumvalorinicialdezero,ouvocpodeusarumalistadeformulrio(expressovar).Dentro
oltimocasoexpressoavaliadaeoresultadoservecomoovalorinicial
paraavarivel.AquiumexemplodautilizaodeumavarivelauxiliarparaLEN
manterocomprimentodeumalistade:
(mdiadefun(eargsdescanso
&Aux(LEN(argscomprimento)))
(/(Reduo#'+args)len1.0))
A&AUXchaverealizaamesmacoisacomooLET*especial
funo:Ambascriamnovasvariveislocaisusandoligaosequencial.o
escolhadequalusarpuramenteumaquestodegosto.
FunesdescritasTPICOSAVANADOS
PROG1,PROG2,Progn.
LambdalistaPalavraschave:&OPCIONAL,eREST,&KEY,eAUX.

pgina377

12

EstruturasedosistemaTipo

12.1INTRODUO
Lispcomumincluimuitostiposdedadosembutidos,quejuntosformamumtipo
sistema.Ostiposquecobrimosatagorasonmeros(dediversasvariedades),
smbolos,conses,cordas,objetosdefuno,eobjetosdefluxo.Estessoo
tiposdedadosbsicos,masexistemmuitopoucosmais.
OsistemacomumtipoLisptemduaspropriedadesimportantes.Emprimeirolugar,ostipos
sovisveis:ElessodescritosporestruturasdedadosLisp(smbolosoulistas),e
Hbuiltinfunesparatestarotipodeumobjetoeparaoregressodeum
descriodotipodeumobjeto.
Emsegundolugar,osistemadetipoextensvel:

Osprogramadorespodemcriarnovostiposaqualquermomento.
Estruturassoumexemplodeumtipodedadosdefinidospeloprogramador.Depoisde
cobrindoosprincpiosbsicosdosistemadetipo,estecaptuloexplicacomonovaestrutura
tipossodefinidoscomoestruturasepodemsercriadosemodificados.
OCommonLispObjectSystem(CLOS)forneceumavanado
instalaodetipodedadosdefinidospeloprogramadorquesuporta'orientadaaobjeto'
programao.''NsnocobrirCLOSnestelivro.Paranossospropsitos,
estruturassersuficiente.

365

pgina378

366

CommonLisp:AGentleIntroduoComputaoSimblica

12.2TYPEPETIPODE
OpredicadoTYPEPretornatrueseumobjetodotipoespecificado.Digitar
especificadorespodemserexpressescomplexas,massvamoslidarcomsimples
casosaqui.
(typep3Nmero')t

(typep3'inteiro)t
(typep3'float)nil
(typepsmbolo'foo')t
AFigura121mostraumapartedahierarquiadotipocomumLisp.este
diagramatemmuitascaractersticasinteressantes.Taparecenotopodahierarquia,
porquetodososobjetossoinstnciasdetipoT,etodosostipossosubtiposde
T.tipocomumincluitodosostiposquesoconstrudosnoCommonLisp.
TipoNULLincluiapenasosmboloNIL.Tipodelistasubsumeostipos
CONSenulos.NULL,portanto,umsubtipodeambosSMBOLOeLIST.
STRINGumsubtipodevetor,queumsubtipodematriz.matrizesso
discutidonoCaptulo13.
AfunoTYPEDOSretornaumespecificadordetipoparaumobjeto.desdeobjetos
podeserdemaisdeumtipo(porexemplo,3umnmero,umnmerointeiro,eum
fixnumNILumsmboloeumalista),oresultadoexatoretornadoporRECEPO
DEdependentedeimplementao.Aquiestoalgunsexemplostpicos:
(tipode'aardvark)smbolo
(tipode3,5)decurtoflutuador
(Tipoof"(respiraobat))contras
(tipode"Phooey")(simplesstring6)
Otipoespecificador(SIMPLESTRING6)descreveumcaracteresdecomprimentofixo
stringcomseiselementos.AlgumasimplementaesLisppoderetornarapenas
SIMPLEcorda,ouumstring,ou(vetordestringsCHAR).
o
relaoentrecordasevetoresserexplicadonoCaptulo13.

pgina379

367
CAPTULO12EstruturaseOSistemadeTipo

Figura121UmapartedahierarquiadotipocomumLisp.
12.3ESTRUTURASDEDEFINIO
EstruturassoprogramadordefinidoobjectosLispcomumnmeroarbitrriode
componentesnomeados.tiposdeestruturaautomaticamentetornamsepartedoLisp
Tipodehierarquia.AmacroDEFSTRUCTdefinenovasestruturaseespecifica
osnomeseosvalorespadrodeseuscomponentes.Porexemplo,podemosdefinir

umaestruturachamadaSTARSHIPcomoeste:
(Navedefstruct
(Nilnome)
(Velocidade0)
(Condio"verde)
(Parabaixo"escudos))
EstaformaDEFSTRUCTdefineumnovotipodeobjetochamadoSTARSHIP
cujoscomponentessochamadosnome,velocidade,condies,eescudos.
STARSHIPtornasepartedahierarquiadetipodesistemaepodeserreferenciado
poressasfunes,comoTYPEPeTIPODEDE.

pgina380

368

CommonLisp:AGentleIntroduoComputaoSimblica
ODEFSTRUCTfunomacrotambmfazvriasoutrascoisas.isto
defineumafunodeconstrutorMAKESTARSHIPparaacriaodenovasestruturas
destetipo.Quandoumanovanavecriado,ocomponentenomeseropadro
paraNIL,avelocidadeparazero,acondioparaVERDE,eosescudosparabaixo.
>(SetfS1(makenaveestelar))
#S(STARSHIPNOMENIL
VELOCIDADE0
CONDIOVERDE
SHIELDSEMBAIXO)

Anotao#SomodopadroparaexibirestruturasemCommonLisp.
Alistaqueseseguecontma#Sotipodaestruturaseguidaporum
sequnciaalternadadenomesevaloresdoscomponentes.Nosedeixeenganarpela
usodeparntesesemnotao#S:Estruturasnosolistas.listacomum
operaescomoCAReCDRnovaifuncionaremestruturas.
s1#s(nomenilnaveestelar
velocidade0
verdecondio
escudosparabaixo)
>(S1automveis)
Erro:CARdanolistadeobjetos:#S(STARSHIP...)
Emboranovoscasossogeralmentecriadoschamandooconstrutor
funoMAKESTARSHIP,tambmpossveldigitarobjetosStarship
diretamenteparaociclodeleituraevalprint,usando#Snotao.Notesequeo
estruturadevesercitadoparaevitarasuaavaliao.
>(setfs2'#s(velocidadeStarship(warp3)
condiovermelho
escudosup))
#S(STARSHIPNOMENIL
VELOCIDADE(WARP3)
CONDIOVERMELHA
SHIELDSUP)

pgina381

369
CAPTULO12EstruturaseOSistemadeTipo
12,4TIPOpredicadosparaestruturas
OutroefeitocolateraldaDEFSTRUCTqueelecriaumtipodepredicadoparao
estruturacombasenonomedeestrutura.Nestecaso,opredicadochamada
STARSHIPP.
(s2navep)t
(navep'foo)nil
UmavezqueonomedotipoSTARSHIPesttotalmenteintegradonosistemadetipo,ele
podeserusadocomTYPEPeserdevolvidoporTIPODEDE.
(typeps1'naveestelar)t
(tipodes2)naveestelar
12,5acessaremodificarESTRUTURAS
Quandoumanovaestruturadefinida,DEFSTRUCTcriafunesdeacessopara
cadaumdosseuscomponentes.Porexemplo,elecriaumSTARSHIPSPEED
doassessorpararecuperarocomponentedevelocidadedeumanaveestelar.
(s2navespeed)(warp3)
(Starshipantepaross2)se
Estasfunesdeacessotambmpodeservircomodescrieslugarparasetfe
osoutrosoperadoresdeatribuiogeneralizadas.
>s1
#S(STARSHIPNOMENIL
VELOCIDADE0
CONDIOVERDE
SHIELDSEMBAIXO)

(S1setf(navename)"Empresa")
(INCF(S1navevelocidade))1
>s1
#S(STARSHIPNAME"Empresa"
SPEED1
CONDIOVERDE

pgina382

370

CommonLisp:AGentleIntroduoComputaoSimblica
SHIELDSEMBAIXO)
Usandoestasfunesdeacesso,podemosfacilmenteescrevernossasprpriasfunespara
manipularestruturasdemaneirasinteressantes.Porexemplo,afunodealerta
aseguirfazcomqueumanavedeaumentarosseusescudos,e,almdissoaumentaacondio
nvelparaser,pelomenos,AMARELO.
(Alertadefun(x)
(setf(Starshipanteparosx)'up)
(If(igual(navecondiox)'verde)
(Setf(navecondiox)'amarelo))
"escudosraise)
(S1alerta)escudosraise

s1#s(navenomede"Empresa"
velocidade1
amarelocondio
escudosparacima)
UmprogramadorLispexperienteprefereusarummaisdescritivo
nomedeXparaoargumentodealerta.DesdeALERTesperaqueoseuargumento
paraserumanaveestelar,porquenousaressenomenalistadeargumentos?Oresultadoseria
parececomisso:
(Alertadefun(nave)
(Setf(naveestelarescudos)'up)
(If(igual(navecondionaveestelar)'verde)
(Setf(naveestelarcondio)'amarelo))
"escudosraise)
Poroutrolado,algunsprogramadoresencontraresteestilodeescritaconfuso,
porqueeleusaoSTARSHIPsmbolocomoumnomedevarivellocale,como
digiteonome.Sevocseenquadramnessacategoria,vocpodepreferirusarum
formaabreviadaparaonomedavarivel,comoSTRSHIP.
12.6ARGUMENTOSpalavrachaveparafunesdeconstrutor
Quandoumanovainstnciaestruturacriada,nosoobrigadosausaropadro
Osvaloresparaoscomponentes.Podemosespecificarvaloresdiferentes,fornecendolhes
argumentosdepalavrachavenachamadaparaoconstrutor.(VejaTpicosAvanados
ponto6.14paraumaexplicaodepalavraschaveeargumentos.)Aquiest
umexemplousandooconstrutorMAKESTARSHIP:

pgina383

371
CAPTULO12EstruturaseOSistemadeTipo
>(Setfs3(makenaveestelar:name"Reliant"
:escudos'danificados))
#S(NOMESTARSHIP"Reliant"
VELOCIDADE0
CONDIOVERDE
SHIELDSdanificado)
12.7MUDANAdefiniesdeestrutura
SevocredefinirumtipodeestruturausandoDEFSTRUCTparaalterarosnomesou
ordenaesdecomponentes,vocdevejogarforatodasasvelhasestruturasdeque
digitarasfunesdeacessopodemnofuncionaradequadamentesobreeles,eh
Podemexistiroutrosproblemastambm.Porexemplo,depoisdeterguardadoumanavechamada
DependentenoS3,seredefinirSTARSHIP,ovalordeS3irtornarseum
estranhoobjetoeoscamposserotodosmisturados.
>(Navedefstruct
(Nilcapito)
(Nilnome)
(Parabaixo"escudos)
(Condio"verde)
(Velocidade0))
STARSHIP
>s3
#S(CapitodeStarship"Reliant"
NOME0
SHIELDSVERDE
Condiesdeavaria)
>(S3navespeed)
ndicedevectorforadoslimites:Erro
em#S(capitodeStarship"Reliant"...)
Paracorrigiroproblema,nssimplesmenteprecisamosreconstruiraestruturausandoo
redefinidofunodeconstrutorMAKESTARSHIP.
>(Setfs3(makenaveestelar:capito"Benson"

:Name"Reliant"
:escudos'danificados))
#S(CapitodeStarship"Benson"
NAME"Reliant"
SHIELDSDANIFICADO

pgina384

372

CommonLisp:AGentleIntroduoComputaoSimblica
CONDIOVERDE
VELOCIDADE0)
>(S3navespeed)
0

Agoraelefuncionacorretamente.

RESUMO
Lispcomumcontmmuitostiposdedadosembutidosapenasosbsicosso
discutidonestelivro.OsistemacomumtipoLispaomesmotempovisvele
extensvel.Osusuriospodemestenderosistemadetipo,definindonovostiposdeestrutura.
DEFSTRUCTdefinetiposdeestrutura.Adefiniodaestruturaincluio
nomesdetodososcomponentese,opcionalmente,especificavalorespadroparaeles.
Senenhumpadrodadoparaumcomponente,NILusado.DEFSTRUCTtambm
defineautomaticamenteumafunodeconstrutorparaotipo(comoomake
STARSHIP)eumpredicadotipo(talcomoSTARSHIPP).

exercciosdereviso
12.1. Descreverasfunesdocapitosmbolos,:Capito,e
STARSHIPCAPITOnoexemplonave.
12.2. (STARSHIPSTARSHIPP")verdadeira?
12.3. Quaissoosvaloresde(TYPEDE'MAKESTARSHIP),(TYPEDE
#'FazSTARSHIP),e(TYPEDOS(FAASTARSHIP))?
FUNESabordadosnestecaptulo
macroestruturaquedefine:DEFSTRUCT.
funesdosistemaTipo:TYPEPeTYPEDE.

ToolkitLisp:descrevereINSPECIONE

DESCREVERumafunoquerecebequalquertipodeobjetoLispcomoentradaegravuras
umadescrioinformativadomesmo.MuitossistemasLispvmcomonline
documentaoquepodeserconvenientementeacessadodestaforma.DESCREVER

pgina385

373
CAPTULO12EstruturaseOSistemadeTipo
tambmumaboamaneiradeverossistemascomoLisptrabalhaminternamente,desdequevocpode
descreversmboloscomoCONS,NIL,eDefuneaprendercoisasinteressantes.
AsadaproduzidapeloexactadependedequalDESCREVER
implementaodeCommonLispvocestusando.Aquiestoalgunstpico
exemplos.Comoumcomeolispervocprovavelmentenovaientendertodoo
detalhesdoqueDESCREVERestdizendoavoc,masintriganteloscomaajuda
deummanual(edescrevertambm)podeserdivertido.
>(Descrever7)
7umafixnum.
umnmeroprimo.
>(Descrever'fred)
FREDumsmbolointernoUSURIOpacote.
>(Descrevert)
TumsmboloexternoemLISPpacote.
umaconstante.OseuvalorT.
>(Descrever'contras)
CONSumsmboloexternoemLISPpacote.
Elepodeserchamadocomestesargumentos:(xy)
Documentaodefuno:
Retornaumalistacomxcomoocarroeycomo
oCDR.
DESCREVERparticularmentetilparamostrarasestruturas.Namaioria
implementaesdoCommonLisp,DESCREVERmostraoscamposdo
estruturaemumformatomaislegveldoqueo#SnotaoLispusaporpadro.
>(DescreverS1)
#S(STARSHIP...)umaestruturadotipoSTARSHIP.
NOME
"Empreendimento"
VELOCIDADE
1
CONDIO
AMARELO
SHIELDS
ACIMA
OutraferramentaquepodeserdivertidoparaexperimentarcomchamadoFISCALIZAO.Ese
oseucomputadortemummouseeumsistemadejanelas,inspecionepodedeixlo
inspecionaroscomponentesdeumobjetoapontandoparaelescomomouse.Experimentar
adefiniodeumafunosimplescomoametade,emseguida,fazer(Inspect'HALF)paravercomo
definiesdefunessoarmazenadasinternamente.

DiferentesimplementaesLispfornecerdiferentestiposdeinspectores.Voc
vaiprecisardeolharnomanualparaoLispparticularquevocestusandoparaaprender

pgina386

374

CommonLisp:AGentleIntroduoComputaoSimblica
comousaroInspetordeformaeficaz.

Exerccioteclado

Nesteexercciodetecladoqueirimplementarumarededediscriminao.
redesdediscriminaosoredesdesimenoperguntasusadasparaproblema
tarefasderesoluo,comodiagnosticarproblemasnomotorautomotivo.Aquiestodois
exemplosdedilogoscomumarededediagnsticodocarro:
>(Pista)
Serqueomotorvirar?no
Vocouvequalquersomquandovocgiraachave?no
atensodebateriafraca?no

Sooscabosdabateriasujoousolto?sim
Limpeoscaboseaperteasconexes.
NADA
>(Pista)
Serqueomotorvirar?sim
Serqueomotorfuncionarporqualquerperododetempo?no
Existegsnotanque?no
Enchaotanqueetentarligaromotornovamente.
NADA
AFigura122mostraumapartedarededediscriminaoquegerouesse
dilogo.Olquidoconstitudoporumasriedens.Cadantemumnome(a
smbolo),umaquestoassociada(astring),um"sim"ao''eum'no'action''.
Osimenenhumaaopodesertantoosnomesdeoutrosnsparair,ou
elespodemsercordasquedoodiagnsticodoprograma.Umavezquenesteltimocaso
nohnenhumnovonaoqualir,oprogramapraapsaexibiodo
corda.
Figura123mostracomoaredesercriada.Notesequearvoreda
perguntasincompleto.Seseguirmososcaminhoscertos,podemosacabartentando
iraumnqueaindanotenhasidodefinida,comomostradoaseguir.Nisso
Casooprogramaapenasimprimeumamensagemepra.
>(Pista)

pgina387

375
CAPTULO12EstruturaseOSistemadeTipo

Figura122Umapartedeumarededediscriminaoparaasoluodediagnsticoautomotivo
problemas.
Serqueomotorvirar?sim
Serqueomotorfuncionarporqualquerperododetempo?sim
NMOTORWILLRUNBREVEMENTEaindanodefinido.
NADA
EXERCCIO
12.4. Nesteexerccio,vocircriarumarededediscriminaoparaosetorautomotivo
diagnsticoqueimitaocomportamentodosistemamostradona
pginasanteriores.
uma.EscreverumaDEFSTRUCTparaumaestruturachamadaNODE,comquatro
componenteschamadosnome,pergunta,simCASE,eno
CASO.
b.Definirumavarivel*NLIST*globalqueirsegurartodososns
naredediscriminao.EscreverumaINITfunoqueinicializao
rededefinindo*NLIST*aNIL.

pgina388

376

CommonLisp:AGentleIntroduoComputaoSimblica

(Addnode'start
"Serqueomotorvirar?"
"motordemarchaover
"Motorwontturnover)
(Addn'motordemarchaover
"Serqueomotorfuncionarporqualquerperododetempo?"
"Motorvontadedegernciabrevemente
"Motorwontrun)
(Addnode"motorvairun
"Existegsnotanque?"
'Gsintank
"Enchaotanqueetentarligaromotornovamente.")
(Addnode"motorvaiturnover
"Vocouvequalquersomquandovocgiraachave?"
"Quandoturnkeydesom

"Nosomquandoturnkey)
(Addn'nosomquandoturnkey
"abaixatensodabateria?"
"Substituirabateria"
'Bateriadetensook)
(Addn'bateriadetensook
"Sooscabosdabateriasujoousolto?"
"Limparoscaboseaperteasconexes."
'Batterycabosbom)
Figura123cdigoLispparacriararededediagnsticoautomotivo.

pgina389

377
CAPTULO12EstruturaseOSistemadeTipo
c.EscreverADDn.Eledeveretornaronomedon,acrescentou.

d.EscreverFINDn,quelevaumnomedencomoentradaeretorna
onseeleaparecerna*NLIST*,ouNILseissonoacontecer.
e.EscreverPROCESSOn.precisoumnomedencomoentrada.Senopuder
encontraron,eleimprimeumamensagemdequeonnofoidefinido
ainda,eretornaNIL.Casocontrrio,elepedeaousurioapergunta
associadoaessene,emseguida,retornaaaosimdonou
Nenhumaaco,dependendodecomooutilizadorresponde.
f.EscreverafunoRUN.Elamantmumavarivellocalchamada
CURRENTNODE,cujovalorinicialINICIAR.Elefazumloop,chamando
PROCESSOnparaprocessaronatual,earmazenarovalor
retornadoporPROCESSndevoltaCURRENTn.Seo
valorretornadoumastring,afunoimprimeacadeiaepra.Ese
ovalorretornadonulo,eletambmpra.
g.Escreverumafunointerativoparaadicionarumnovon.Eledevepedir
ousurioparaonomedon,apergunta,eosimenenhumaao.
Lembresequeaquestodeveserumacadeia,fechadoemcasal
citaes.Suafunodeveadicionaronovonparaarede.
h.Seomotorfuncionarbrevemente,mas,emseguida,barracasquandoestfrio,
possvelqueavelocidadedemarchalentaestmuitobaixo.Escreverumnovonchamado
ENGINEvaicorrerBREVEMENTEparasaberseomotor
barracasquandoofrio,masnoquandoquente.Seassimfor,temmovimentolquida
outronondeousurioperguntadoseavelocidadedemarchalentafrio
pelomenos700rpm.Senofor,digaaousurioajustaravelocidadedemarchalenta.

12

Tpicosavanados

pgina390

378

CommonLisp:AGentleIntroduoComputaoSimblica

12.8FUNESDEIMPRESSOPARAESTRUTURAS
Muitasvezesconvenienteparainventarnotaesespecializadasparaestruturasdeimpresso.
Porexemplo,podemosnoquerervertodososcamposdeumobjetoestelar
semprequeimpressoquepodesersatisfeitoapenasparaveronome.o
convenoparaimpressoabreviadodescriesestruturaemLispcomum
paratornarseumanotaocomeandocom''#<''eterminacom''>''que
incluiotipodeestruturaalmdeinformaesidentificandooquequerqueseja
desejado.Porexemplo,podemosoptarporimprimirnavesdestaforma:
#<NaveestelarEnterprise>
Oprimeiropassoparapersonalizaraformacomoosobjetosdenavesdeimpressoparaescreveranossa
funoprpriadeimpresso.Eledevetertrsentradas:oobjetoqueestsendoimpresso,o
defluxoemqueimprimilo,eumnmero(chamadodeprofundidade)queLispComum
utilizaparalimitaraprofundidadedeassentamentoaoimprimirestruturascomplexas.Nsvamos
ignoraroargumentodeprofundidadenestelivro,masanossafunoaindadeveaceitartrs
argumentosparafuncionarcorretamente.Aquiest:
(DefunprintStarship(xprofundidadestream)
(Formatostream"#<STARSHIPA>"
(Navenamex)))
Podemostestarestafuno,chamandoocomumanavecomoaprimeiraentrada.Bem
usarTparaasegundaentrada(Trefereseaofluxodesadapadro,quea

consola),eumaprofundidadedezero.
>(Printnaves1t0)
#<NaveestelarEnterprise>
Agora,parafazerachamadaLispestafunosemprequeelatentaimprimirumanaveestelar,ns
deveincluirafunodeimpressocomoumaopoparaoDEFSTRUCT:
>(Defstruct(naveespacial
(:Functionprintprintnaveestelar))
(Nilcapito)
(Nilnome)
(Parabaixo"escudos)
(Condio"verde)
(Velocidade0))
STARSHIP
>(SetfS4(makenaveestelar:name"Reliant"))
#<STARSHIPReliant>

pgina391

379
CAPTULO12EstruturaseOSistemadeTipo
>(StarshipanteparosS4)
VERDE
>(Formatot"&EsteSdeixararbita."S4)

Este#<STARSHIPReliant>deixandorbita.
NADA

pgina392

380

CommonLisp:AGentleIntroduoComputaoSimblica
funesdeimpressosoespecialmenteteisquandoumaestruturacontmoutras
estruturascomocomponentesequeremossuprimiramaiorpartedodetalhe.Elesso
quaseessencialquandoexistemponteiroscircularesentreestruturas.Para
exemplo,cadacapitotemumnavio,ecadaenviarumcapito.Seasestruturas
KirkeparaopontoEnterpriseparaooutro,emseguida,quandoumououtroimpresso,
Lisppoderiaentrarumloopinfinito,ouentoserforadoausarobastanteunaesthetic
#1#notaoparaexpressarcorretamenteacircularidade.Seasfunesdeimpressoparao
estruturasStarshipecapitoexibirapenasoscamposdenome,iremos
terumanotaoconcisaparaessesobjetosemqueoscircularidadesnoso
evidente.
EXERCCIO
12,5. Criarumdefstructparaocapitocomoscamposnome,idade,enavio.
FazerumaestruturaquedescreveJamesT.Kirk,capitodaEnterprise,
35anosFaaopontoEmpresadevoltaparaKirkatravsdeseucapito
componente.ObservequequandovocimprimirKirk,vocvseunaviotambm.
Agoradefinirumafunodeimpressoparaocapitoqueexibeapenasonome,
taiscomo#<CAPITO"JamesT.Kirk">.

12,9IGUALDADEDEESTRUTURAS
AfunoEQUALnotrataduasestruturasdistintascomoigual,mesmose
tmosmesmoscomponentes.Porexemplo:
>(SetfS5(makenaveestelar))

#S(STARSHIPNOMENIL
VELOCIDADE0
CONDIOVERDE
SHIELDSEMBAIXO)
>(SetfS6(makenaveestelar))
#S(STARSHIPNOMENIL
VELOCIDADE0
CONDIOVERDE
SHIELDSEMBAIXO)
>(S6S5iguais)
NADA
>(S6S6iguais)
T

pgina393

381
CAPTULO12EstruturaseOSistemadeTipo
Noentanto,afunoequalpirtratarduasestruturascomoiguaisseeles
sodomesmotipoetodososseuscomponentessoiguais.
>(EqualpS5S6)
T
>(Equalps5'#s(nomenavenil

velocidade0
verdecondio
escudosparabaixo))
T
EqualptambmdiferedaEQUALemignorardistinescasoquando
comparaodecaracteres.
("empresa"igual"Empresa")nil
(equalp"empresa""Empresa")t
12.10HERANAdeoutrasestruturas
tiposdeestruturapodemserorganizadosemumahierarquiausandoaopo:include
paraDEFSTRUCT.Porexemplo,podemosdefinirumnaviotipodeestruturacuja
componentessoNOME,capito,eequipeSIZE.Entopodemosdefinir
STARSHIPcomoumtipodenaviocomarmascomponentesadicionaise
Shields,efornecimentonaviocomoumtipodenaviocomumadicional
componentechamadoCARGO.
(Naviodefstruct
(Nilnome)
(Nilcapito)
(Niltripulaosize))
(Defstruct(Starship(:includenavio))
(Nilarmas)
(Escudosnil))
(Defstruct(abastecimentodonavio(:includenavio))
(Carganil))
OscamposdeumaestruturaSTARSHIPincluemtodososcomponentesdonavio.
Assim,quandofazemosumanaveestelar,seustrsprimeiroscomponentesseroNOME,
CAPITO,eequipeSIZE.Omesmovaleparanaviosdeabastecimento.

pgina394

382

CommonLisp:AGentleIntroduoComputaoSimblica
>(z1setf(makestarship
:Capito"JamesT.Kirk"))
#S(STARSHIPNOMENIL
CAPITO"JamesT.Kirk"
NILCREWSIZE
ARMASNIL
SHIELDSNIL)
>(z2setf(certifiquesupplyship
:Capito"HarryMudd"))
#S(NILNOMEDEALIMENTAOSHIP
CAPITO"HarryMudd"
NILCREWSIZE
CARGONIL)
AEnterprisetantoumnavioeumanave,paraqueambosostipopredicadosvai
returntrue.
>(Z1naviop)
T
>(Z1navep)
T
>(Z1fornecimentoshipp)
NADA
Finalmente,notequeasfunesdeacessoparanaviostambmseaplicamatodosossubtipos
donavio,queincluemnavesenaviosdeabastecimento.Assim,podemosacessaro
capitodaEnterpriseusandoNAVIOCAPITOouSTARSHIP
CAPITO,masnoforneceSHIPCAPITO.

>(NaviocapitoZ1)
"JamesT.Kirk"
>(NavecapitoZ1)
"JamesT.Kirk"
>(OfertashipcapitoZ1)
Erro:#S(STARSHIPNOMENIL...)no
deTipodefornecimentonavio.

pgina395

13

Matrizes,tabelasdehash,epropriedade
listas

13.1INTRODUO
Estecaptuloabordabrevementetrstiposdedadosdistintos:matrizes,tabelasdehash,e
listasdepropriedades.Arrayssoutilizadosmuitofrequentementeemoutraprogramao
lnguas,masnocomtantafrequnciaemLisp.Arazoqueamaioriadaslnguastm
umconjuntotopobredetiposdedadosqueasmatrizesdevemserusadosparamuitos
aplicaesondeaslistas,estruturasoutabelasdehashseriaprefervel.
listasdepropriedadessoomaisantigodostrstiposdedadosdiscutidosnestecaptulo
elesfaziampartedodialetoLisporiginal,Lisp1.5.EmLispmoderna
deprogramaoquetmsidolargamentesubstitudasportabelasdehash,maselesaindaesto
dignodeseentender.
13,2criaodeumamatriz
Umamatrizumblococontguodearmazenamentocujoselementossonomeadospelo
subscritosnumricos.Nestelivrovamosconsiderarapenasunidimensional
matrizes,quesochamadosvetores.(apenasumpequenopassodevetorespara
asmatrizesematrizesdedimensesmaiselevadasconsulteomanualderefernciaparaobterdetalhes.)
OscomponentesdeumvectordecomprimentoNsonumeradosdezeroaN1.Vamos
criaronossoprimeirovetorearmazenlonavarivelMYVEC:

383

pgina396

384

CommonLisp:AGentleIntroduoComputaoSimblica
(Setfmyvec'#(violinoajuste440a))
Nodeixequeanotao#()confundiloempensarqueasmatrizessolistas.UMA
listaumacadeiadeclulascontras.Umamatriznoumacorrenteumblococontguode
armazenamento.Ovector#(TUNINGVIOLINO440A)representadodestaforma,em
memria:

TUNINGVIOLINO

440

UMA

Aporosombreadadoarranjochamadoumcabealhomatriz.Contm
informaesteissobreamatriz,taiscomoasuaduraoenmerode
dimenses,queLispusasemprequevocacessaroselementosdamatriz.Como
vocpoderiaesperar,operaesdelistabsicas,taiscomoCAReCDRnofuncionamem
matrizes,jquematrizesnosoclulascontras.
>Meuvec
#(TUNINGVIOLINO440A)
>(CarromyVEC)
Erro:#(TUNINGVIOLINO440A)noumalista.
Comooarmazenamentoemmatrizescontgua,podemosacessarcadaelementodeum
matriztorpidoquantoqualqueroutroelemento.Comlistas,temosdeseguirumacadeiade
ponteirosparacomearapartirdeumaclulacontrasparaooutro,porisso,dependendodocomprimento
alista,podedemorarmuitomaistempoparaacessaroltimoelementodoqueoprimeiro.
acessoeficienteasmatrizesprincipalvantagemtemsobrelistas.Outro
vantagemquenamaioriadasimplementaes,umamatrizusaapenasmetade
memriacomoumalistadeigualcomprimento.Masaslistastambmtmalgumasvantagenssobre

matrizes.Listasdecomprimentoarbitrriosofacilmenteconstrudaselementoporelemento,
recursivamenteouiterativamente.Notofcildecultivarumamatriz,umelementode
* Outravantagemdaslistasqueelespodemcompartilharestruturademaneirasque
Tempo.
soimpossveisparamatrizes,masnovamosentraremdetalhesdoquenestelivro.

*Notaaosinstrutores:Pode,claro,usarmatrizescomponteirosdepreenchimento,masvocspodeadicionarelementosdeumas
final,eocomprimentomximodeveserfixadoantecipadamente.Ouvocpodeusarmatrizesajustveis,maschamadasrepetidas
paraAJUSTARmatrizsomuitocaros.

pgina397

385
Captulo13matrizes,tabelasdehashelistasdepropriedades
13.3ARRAYSDEIMPRESSO
Parasercapazdeveroselementosdeumamatriz,precisodefiniravarivelglobal
*PRINTarray*deT.Istoasseguraqueosvectoresseroimpressosnamesma
#(Thing1thing2...)notaoqueusamosparadigitlos.Se*PRINTarray*
NIL,vetoresematrizesseroimpressosdeformamaisconcisaimplementaodependente
formarusando#<>notao,emqueosseuselementosindividuaissosuprimidos.
>(Setf*printarray*nil)
NADA

>Meuvec
#<Vector{204844}>
>(Setf*printarray*t)
T
>Meuvec
#(TUNINGVIOLINO440A)
13,4acessaremodificaroselementosdematriz
OvectorquefoiarmazenadanaMYVECtemquatroelementos,numeradosdezero,um,dois,
etrs.AfunoAREFusadoparaacessaroselementosdeumamatriz
nmero,assimcomoNTHusadoparaacessaroselementosdelistas.
>(ArefmyVEC1)
VIOLINO
AREFtambmentendidacomoumnomedelugarporSETFAssimcomoalgumlojas
novosvaloresemumamatriz.Vamosfazerumconjuntofrescoearmazenaralgunsitensnela.
>(Setfum'#(nilnilnilnilnil))
#(NILNILNILNILNIL)
>(Setf(arefa)'foo0)
FOO
>(Setf(arefa1)37)
37
>(Setf(arefumbar2)')
BARRA

pgina398

386

CommonLisp:AGentleIntroduoComputaoSimblica
>a
#(FOO37BARNILNIL)
>(Arefum1)
37
Muitasfunesqueoriginalmenteaprenderamausaremlistassorealmenteconcebido
paratrabalharemsequncias,queincluemambasaslistasevectores.Algunsexemplos
dasfunesdesucessessodecomprimento,invertaeENCONTRARSE.
>(Comprimentoa)
5
>(Revertera)
#(NILNILBAR37FOO)
>(Encontrarse#'numberpa)
37
Poroutrolado,algumasfunesfuncionamapenasemlistas.Almdobvio
CAReCDR,hMembroeasoutrasfunesdeconjunto,maissubst
esublis,elistadestrutivafunescomoNCONC(descritoem
TpicosAvanadosseo10.8.)Masfunesdesucessesdestrutivas,como
NREVERSE,trabalharemamboslistasouvetores.

13,5ARRAYScriandocomMAKEARRAY
AfunoLispMAKEARRAYcriaeretornaumanovamatriz.o
comprimentodamatrizespecificadopeloprimeiroargumento.Ocontedoinicialde
amatrizindefinido.AlgumasimplementaesCommonLispinicializarmatriz
elementosazerooutrosusamNIL.Paraserseguro,vocnodeveconfiaremconjunto
elementosquetenhamqualquervalorinicialparticular,amenosquevoctenhaespecificadoum
explicitamente.
FazARRAYaceitavriosargumentos.Ainicial

ELEMENTpalavrachaveespecificaumvalorinicialaserusadoparatodososelementosde
amatriz.
>(Makearray5:initialelemento1)
#(11111)
A:InitialNDICEpalavrachaveespecificaumalistadevalorespara
inicializandoosrespectivoselementosdeumamatriz.Alistadeveserexatamentecomo
Contantoqueamatriz.

pgina399

387
Captulo13matrizes,tabelasdehashelistasdepropriedades
>(Makearray5:initialcontedos"(aeiou))
#(AEIOU)
SevocnousarumadessaspalavraschaveaochamarMAKEmatriz,o
contedosiniciaisdamatrizserimprevisvel.
13,6CORDAScomovetores
Stringsso,naverdade,umtipoespecialdevetor.Assim,taiscomofunes
COMPRIMENTO,invertaeAREF,quetrabalhamemvetores,tambmfuncionamem
cordas.
(comprimento"Cockatoo")8

(reverso"Cockatoo")"ootakcoC"
(aref"Cockatoo"3)#\k
Oselementosdeumacadeiasochamadosobjetosdecaracteres.Porexemplo,#\K
denotaoobjetopersonagemconhecidocomominsculas''k.''Ospersonagenssoainda
outrotipodedados,distintosmbolosenmeros.objetosdecaracteresfazer
noprecisasercitadoporqueelesavaliamparasimesmos,assimcomoosnmerosfazem.
#\K#\k
(tipode#k\)personagem
DesdeSETFentendeAREFcomoumnomedelugar,vocpodedestrutivamente
modifiquecordascomSETF.Vocdevenicopersonagemarmazenarobjetosnacadeia,
embora,ouocorrerumerro.
>(Setfpet"Cockatoo")
"Cockatoo"
>(Setf(arefpet5)#\p)
#\P
>pet
"Cockapoo"
>(Setf(arefpet6)'bonito)
Erro:bonitonodotipodecaracteres.

pgina400

388

CommonLisp:AGentleIntroduoComputaoSimblica

13,7tabelashash
Atabelahashofereceessencialmenteamesmafuncionalidadequeumalistadeassociao.
Vocforneceumachave,quepodeserqualquertipodeobjeto,eLisplheddevolta
oitemassociadocomessachave.Avantagemdetabelasdedispersoqueelesso
implementadousandoespeciaisalgoritmosdehashquepermitemLispparaolharascoisas
semuitomaisrpidodoqueelepodeprocurlosemumalistadeassociao.Hashingrpido
emparteporqueastabelasdehashsoimplementadosusandovetoresemvezdeclulascontras
correntes.
listasdeassociaoaindatemalgumasvantagenssobretabelasdehash.Elesso
maisfcildecriaremanipularporquesoestruturasdelistacomuns.Jogodavelha
tabelasusamrepresentaesdependentedeimplementaoquenosodiretamente
visvelparaoutilizador.Entosevocquersimplicidadeabsoluta,useumalistadeassociao.Ese
vocestdispostoatrocaralgunssimplicidadeparaaeficincia,useumatabelahash.
Astabelasdehashnopodemserdigitadosapartirdotecladoaformacomovetorespode.
ElesspodemsercriadospelafunoMAKEHASHTABLE.No
tipopadrodetabelahash,EQLusadaparacompararaschavesdeitensqueso
armazenado.TambmpossvelcriartabelasdehashqueusamEQouEQUAL.Jogodavelha
objetosdetabelasoimpressosdeformadependentedaimplementao,quegeralmente
nomostrarlheoselementos.Oexemploseguintetpica:
>(Setfh(makedehashtable))
#<TableHashEQL5173142>
>(Tipodeh)
HASHQUADRO
AfunoGETHASHprocuraumachaveemumatabelahash.Achavepodeser
qualquertipodeobjeto.GETHASHentendidacomoumaespecificaolugarporSETF,
porissotambmpodeserutilizadoparaarmazenaratabeladehash.
>(Setf(gethash'johnh)
"(Advogado(16unidadedebordo)))
(ADVOGADO(16MAPLEDrive))
>(Setf(gethash'maryh)
'(Mdico(23CedarCourt)))

(Mdico(23CEDARCOURT))
>(Gethash'johnh)
(ADVOGADO(16MAPLEDrive))
T

pgina401

389
Captulo13matrizes,tabelasdehashelistasdepropriedades
>(Gethash'billh)
NADA
NADA
>h
#<TableHashEQL5173142>
GETHASHretornadoisvaloresemvezdeum.Oprimeirovaloroitem
associadochave,ouNILseachavenofoiencontradonatabeladehash.o
segundovalorTseachavefoiencontradonatabeladehash,ouNILsenofosse
encontrados.Arazoparaestesegundovalorforparadistinguirumachavequeapareceem
amesacomumitemassociadodeNILdeumachavequenoapareceemtudo.
Vocpodecomseguranaignorarosegundovalorderetornonovamosfazerusode
vriosvaloresderetornonestelivro.
DESCREVERirdizerlhecoisasteissobreumatabelahash,taiscomoa
nmerodebaldesquetem.Umbaldeumgrupodeentradas.Quantomaisbaldes
houver,menosentradasseroatribudosaomesmobalde,demodorecuperaes

sermaisrpido.Masopreodeestavelocidadeumaumentonaquantidadede
memriaatabeladehashusa.FISCALIZAOpodeserusadoparaolharparaasentradasdeum
tabelahash.
>(Descreverh)
#<EQLHashTable5173142>umatabeladehash.
Atualmente,possui2entradase65baldes.
13.8listasdepropriedades
EmLisp,cadasmbolotemumalistadepropriedades.Listasdepropriedadesfornecembasicamenteo
mesmasfacilidadesqueaslistasdeassociaoetabelashash:Vocpodearmazenarumvaloremuma
listadepropriedadessobumadeterminadachave(chamadodeindicador),e,posteriormente,procurarcoisas
nalistadepropriedades,fornecendooindicador.listasdepropriedadessoorganizadascomo
listasalternadasdeindicadoresevalores,comoeste:
(Ind1valor1ind2valor2...)
listasdepropriedadessomuitoantigoseleserampartedoLisp1,5originais.Eles
estoincludosaquiparaofimdeserexaustivoparaamaioriadasaplicaes,
melhorusarumalistadeassociaooutabelahash.MuitosusamimplementaesLisp
aslistasdepropriedadesdesmbolosparaosseusprpriosfins.Porexemplo,sevocolhar
nalistadepropriedadedeCONSouCONDvocpodeveralgunsespecficasdosistema
emformao.Osusuriossolivresparacolocarassuasprpriaspropriedadesnalistapropriedade,mas
umaidiamuitoruimparamexercomaspropriedadesasuaLispcolocal.

pgina402

390

CommonLisp:AGentleIntroduoComputaoSimblica
AfunoGETrecuperaumapropriedadedeumsmboloconstantedoindicador.
SETFentendeGETcomoumadescriodolocalquecomonovopropriedadesso
armazenadonalistadepropriedades.VamosdarosmboloFREDumapropriedadechamadaSEX
comomachodevalor,umapropriedadechamadaAGEcomovalor23,eumapropriedadechamada
Irmoscomvalor(GEORGEWANDA).
(Setf(obtersexo'fred')'masculino)
(Setf(obteridade'fred')23)
(Setf(obterirmos'fred')'(Georgewanda))
>(Descrever'fred)
FREDumsmbolo.
SuapropriedadeIRMOS(GEORGEWANDA).
Suapropriedadeidade23.
Suapropriedadenascedosexomasculino.
AlistadepropriedaderealdeFREDparececomisso:
(Irmos(georgewanda)idade23sexomasculino)
RecuperandoumadaspropriedadesdeFredfcil:NssusarGETparapesquisa
alistadepropriedades.Nota:GETusaafunoEQparaverificarsehigualdade,demodo
indicadoresdepropriedadenodevemsernmeros.Normalmente,elessosmbolos.
(get'fred'idade)23
(get'fred'icecreamsaborfavorito)nil
Comovocpodever,quandoumsmbolonotemapropriedadeespecificada,GET
normalmenteretornaNIL.Noentanto,GETtambmaceitaumterceiroargumentoque
vaivoltaremvezdeNILsenopodeencontraroimvelquefoiconvidadoaolharparacima.
EstaumamaneiradedistinguirumsmbolotendoumFOOimvelcomvalor
NILapartirdeumsmboloquenotemumapropriedadefooemtudo.Porexemplo,ns
podesaberqueMabelapenasumacriana(suapropriedadeIRMOSNIL),mas
OsirmosdeClaranopodesergravado.
(Setf(obterirmos'Mabel')nil)
(get'Mabel''irmosdesconhecidos)nil
(get'Clara'irmos'desconhecida)desconhecido

Ovalordeumapropriedadepodeseralteradaaqualquermomento.SuponhaquetemumaFRED
aniversrio:

pgina403

391
Captulo13matrizes,tabelasdehashelistasdepropriedades

(INCF(obteridade'fred'))24
(get'fred'idade)24
AfunoSYMBOLPLISTretornalistadepropriedadesdeumsmbolo.Isto
discutidoemmaisdetalhenasecoavanadaTpicos13,10.
>(Smboloplist'fred)
(Irmos(georgewanda)idade24sexomasculino)
NspodemosremoverumapropriedadeinteiramenteusandoumafunochamadaREMPROP.
OvalorretornadoporREMPROPdependentedeimplementao.Ser
noNILseapropriedadefoiencontradonalistadepropriedades,ouNILseapropriedade
nofoiencontrado.Comoefeitocolateral,tantoonomedapropriedadeedoassociado
valorsoremovidosdalistadepropriedades.
>(Idaderemprop'fred')
(AGE24SEXOMASCULINO)
(get'fred'idade)nil

Valordependentedaimplementao.

13.9Programaocomlistasdepropriedades
Suponhaqueestamosaconstruirumbancodedadossobreospersonagensdeumahistria,eumdos
osfatosquedesejagravarencontrosentreospersonagens.Podemosarmazenaruma
listadenomessobaMETtemapropriedadedecadaindivduo.Umnome
nodeveaparecernalistamaisdeumavez,emoutraspalavras,alistadeveser
umconjunto.AmaneiramaisfcildefazerissoescreverumafunochamadaADDPROPpara
adicionarumelementoaumconjuntoarmazenadosobonomedapropriedade.Aquiadefiniode
ADDPROP:
(Defunaddprop(symelemprop)
(Elempushnew(obtersymprop)))
PUSHNEWumoperadordeatribuiogeneralizadacomoempurrar,masprimeiro
verificaseoelementonoummembrodalista,porissotilpara
adiodeumelementodeumconjunto.
UsandoanossafunoADDPROPpodemosfacilmenteescreverumafunoparagravar
reunies:
(Defunrecordereunio(xy)
(AddpropXY'temMet)
(Addpropyx'temmet)
t)

pgina404

392

CommonLisp:AGentleIntroduoComputaoSimblica

Estafunofazusodofactodeque''temmet''umarelaosimtrica,
Emoutraspalavras,seXtemmetY,entoYtemtambmconhecix.
>(Smboloplist"pequenovermelho)
NADA
>(Wolfie'littlered'recordreunio)
T
>(Smboloplist"pequenovermelho)
(HASMET(Wolfie))
>('Wolfiesmboloplist)
(HASMET(LITTLERED))
>(Recordereunioav'Wolfie')
T
>('Wolfiesmboloplist)
(HASMET(AVLITTLERED))
EXERCCIOS
13.1. EscreverumafunochamadaSUBPROPqueexcluiumelementodeumconjunto
armazenadassobumnomedepropriedade.Porexemplo,seosmbolotemALPHA
lista(ABCDE)comoovalordesuapropriedadeFOOPROP,fazendo
(SUBPROP'Alpha'D'FOOPROP)devedeixar(ABCE)comoo
valordapropriedadeFOOPROPdeALPHA.
13.2. EscreverumafunochamadaESQUEAMEETINGqueesquecequedois
particularaspessoasquejconheciunsaosoutros.UseSUBPROPemsua
soluo.
13.3. AutilizaodosmboloPLIST,escrevasuaprpriaversodafunoGET.
13.4. EscreverumaHASPROPpredicadoqueretornaTouNILparaindicarseum
smbolotemumapropriedadeparticular,independentedovalordoreferido
.imvelObservao:SeosmboloAtemumFOOimvelcomvalornulo,
(HASPROP'A'FOO)aindadeveretornarT.
RESUMO
Matrizessoumtipodesequncia,comosolistas.matrizesunidimensionaisso
chamadosvetores.Cordassovetoresdecaracteres.Osarrayspodemsercriadoscom
Fazmatriz,eseuselementosacessadoscomafunoAREF.Muitos

pgina405

393
Captulo13matrizes,tabelasdehashelistasdepropriedades
funesquetrabalhamemlistastambmfuncionamemmatrizes,taiscomocomprimento,
ReversaeENCONTRARSE.
tabelasdeHashofereceressencialmenteamesmafuncionalidadecomolistasdeassociao.
Astabelasdehashpreverpesquisamuitoeficientedeitens,porqueelesnofazem
pesquisarnasequencialmenteatabeladeformaASSOCfaz.Emvezdisso,useumhash
algoritmoparacalcularumndice,queusadoparaacederaumvector.
listasdepropriedadesestoassociadasasmbolos,esousadosporalgunssistemasLisp
paraarmazenarinformaesdependedaimplementao.Elessousadosraramenteem
modernadeprogramaoLisp.Astabelasdehashsopreferidossobreambasaslistasdepropriedades
edeassociaolistaquandooacessoeficienteimportante.
exercciosdereviso
13.5. Dumavantagemdematrizessobrelistas.
13.6. Dumavantagemdelistassobrematrizes.
13.7. Oquerequermaisclulascontras:umalistadepropriedades,ouumalistadeassociaode
parespontilhada?
FUNESabordadosnestecaptulo
funesdematriz:Faamatriz,Aref.

interruptordeimpressora:*PRINTarray*.
funesdetabeladehash:FAAHASHTABLE,GETHASH.
funesdelistagemdepropriedade:obtenha,SMBOLOPLIST,REMPROP.

ExercciomatrizTeclado

VamosdescobrircomoaleatriogeradordenmerosaleatriosdoseuLisp.Nisso
exerccioqueirproduzirumhistogramade200valoresaleatriosentreaszero
edez.Vamosusarumamatrizparamanterocontroledequantasvezesnosdeparamos
cadavalor.Aquiestumexemplodecomooprogramairfuncionar:

pgina406

394

CommonLisp:AGentleIntroduoComputaoSimblica
>(Newhistograma11)

binsOnze:0a10.

T
>(Dotimes(i200)
(Recordevalue(aleatrio11)))
NADA
>(Printhistograma)
0[14]**************
1[18]******************
2[19]*******************
3[8]********
4[21]*********************
5[13]*************
6[17]*****************
7[23]***********************
8[18]******************
9[25]*************************
10[24]************************
Total200
NADA
AfunoRANDOMretornauminteiroaleatriodezeroat,masno
inclusive,oseuargumento.Assim(Random11)devolveumnmerodezeroa
dez.Navisualizaodohistograma,oprimeironmeroemcadalinhaovalorqueestamos
contando.Oprximonmero,entreparnteses,aformacomomuitasinstnciasdessevalor
Foramobservadas.Orestantedalinhacontmumasteriscoparacada
instncia.Altimalinhaindicaonmerototaldepontosregistadosatagora.
EXERCCIO
13.8. Sigaospassosabaixoparacriarumprogramadedesenhohistograma.Seu
funesnodevemassumirqueohistogramaterexatamenteonze
bins.Emoutraspalavras,nouseonzecomoumaconstanteemseuprograma
usar(Comprimento*HISTarray*)emvez.Dessaforma,oprogramair
sercapazdegerarhistogramasdequalquertamanho.
uma.Escrevaexpressesparaconfigurarumavarivelglobal*HISTarray*que
detmamatrizdecontagens,eumavarivelglobal*TOTALDEPONTOS*
quecontmonmerodepontosregistadosatdata.
b.EscreverumafunoNEWHISTOGRAMparainicializarestasvariveis
adequadamente.Deveterumaentrada:onmerodebinsos
histogramater.

pgina407

395
Captulo13matrizes,tabelasdehashelistasdepropriedades
c.EscreverafunoRECORDvalorquelevaumnmerocomoentrada.
Seonmerosituaseentrezeroedez,deveaumentaro
elementoapropriadodamatriz,etambmatualizar*total
PONTOS*.Seaentradaestforadointervalo,fichavalordeve
emitirumamensagemdeerroapropriada.
d.EscreverumafunoPRINTHISTLINEqueassumeumvalordezeroa
tencomoentrada,olhasequeovalornamatriz,eimprimeo
Alinhacorrespondentedohistograma.Paraobterosnmerosdealinhar
emcolunascorretamente,vocprecisarusarasdiretrizesdeformato2S
paraexibirosand3Svalorparaexibiracontagem.Vocpodeusarum
Dotimesparaimprimirosasteriscos.
e.EscreverafunoPRINThistograma.

HashTableExerccioTeclado

Umcriptogramaumtipodequebracabeaqueexigequeosolverparadecodificaramensagem.

Ocdigoconhecidocomoumcdigodesubstituio,porqueconsisteemsubstituir
umacartaparaooutroemtodaamensagem.Porexemplo,sesubstituirmosJ
paraF,TparaA,eWparaoL,apalavra''queda''seriacodificadocomoJTWW.
Aquiumcriptogramarealparavocresolver:
zjzekljjlsjfslapziezvlijpibkljufwxujpjfhffvjupi
enlpopibslafmlPVVbfwkj
Oobjectivodesteexerccionotecladopararesolveroscriptogramasmo,
masparaescreverumprogramaparaajudloaresolvlos.Aquiestcomoonossocryptogram
programaderesolvervaicomear.Ocriptogramarepresentadocomoumalistade
cordas.Todasasletrasdevemserminsculas.
(Criptotextosetf
'("Zjzekljjlsjfslapziezvlijpibkljufwxujphffvjupijf"
"EnlpopibslafmlPVVbfwkj"))

pgina408

396

CommonLisp:AGentleIntroduoComputaoSimblica
>(Resolvercriptotexto)

zjzekljjlsjfslapziezvlijpibkljufwxujpjfhffvjupi

enlpopibslafmlPVVbfwkj

Substituaqualletra?
Aoabordarumnovocriptograma,eleajudaaolharparaaspalavrasmaiscurtas
primeiro.EmInglshapenasduaspalavrasdeumaletra,''I''e''a'',demodoqueo
dcimopalavradocriptograma,P,deveserumdaqueles.Suponhaqueachoque
PdecifraaA.AbaixodecadaPnotextoqueescreverumA.
Substituaqualletra?p
Oquesignifica'p'decifrar?uma

zjzekljjlsjfslapziezvlijpibkljufwxujpjfhffvjupi
uma
uma

uma

uma

enlpopibslafmlPVVbfwkj
aa
uma

Substituaqualletra?
EmseguidanspodeolharparatodososdeduasletraspalavraseachoquedecifraZ
paraI.AbaixodecadaZnamensagemqueescreverumI.
Substituaqualletra?z
Oquesignifica'z'decifrar?Eu

zjzekljjlsjfslapziezvlijpibkljufwxujpjfhffvjupi
ii
ai
Eu
uma

uma

uma

enlpopibslafmlPVVbfwkj
aa
uma

Substituaqualletra?
Umarestrioimportantesobrecriptogramasqueajudaatornlossolucionvel
quenenhumacartapodedecifraramaisdeumacoisa,enohduascartaspode
decifraramesmacoisa.Nossoprogramadeveverificarparagarantirqueeste
restrioobedecidaporqualquersoluoquegeramos.

pgina409

397
Captulo13matrizes,tabelasdehashelistasdepropriedades
Substituaqualletra?z
'Z'jfoidecifradocomo'i'!

zjzekljjlsjfslapziezvlijpibkljufwxujpjfhffvjupi
ii
ai
Eu
uma

uma

uma

enlpopibslafmlPVVbfwkj
aa
uma

Substituaqualletra?k
Oquesignifica'k'decifrar?uma
Mas'p'jdecifraa'a'!

zjzekljjlsjfslapziezvlijpibkljufwxujpjfhffvjupi
ii
ai
Eu
uma

uma

uma

enlpopibslafmlPVVbfwkj
aa
uma

Substituaqualletra?
Emalgummomento,agentepodequererterdevoltaumasubstituio.Suponhasequedepois
decifrarPeZdecidimosquePnodeverealmentedecifraraAdepoisdetudo.
Oprogramadevepermitiraeste:
Substituaqualletra?desfazer
Desfazerqualletra?p

zjzekljjlsjfslapziezvlijpibkljufwxujpjfhffvjupi

ii
Eu Eu
enlpopibslafmlPVVbfwkj

Substituaqualletra?
Oprocessocontinuaatquetenhamosresolvidoocriptograma.
EXERCCIO
13.9. ConfigureavarivelCRYPTOTEXTglobal,comomostrado.Emseguida,construiro
criptogramaderesoluodeferramenta,seguindoestasinstrues:
uma.Cadaletradoalfabetotemumaletracorrespondenteaquese
decifra,porexemplo,PdecifraaA.Comoseresolvero
criptogramavamosarmazenaressasinformaesemduastabelasdehashchamado

pgina410

398

CommonLisp:AGentleIntroduoComputaoSimblica
*CifrarTABLE*e*decifrarTABLE*.Nsvamosusar
*DecifrarTABLE*paraimprimirocriptogramadecifrado.Ns
precisa*cifrarTABLE*paraverificarsehduascartassendo
decifradoparaomesmo,porexemplo,sePdecifradoaA
e,depois,tentoudecifrarKparaA,umaolhada*ENCIPHER
TABELA*revelariaqueAjtinhasidoatribudoa

P.SePdecifradoparaAe,emseguida,tentoudecifrarP
aE,umaolhada*decifrarTABLE*nosdiriaquePtinha
jfoidecifradoaexpressesA.Escreverparainicializarestes
variveisglobais.
b.EscreverumafunoMAKESUBSTITUIOquelevadoiscaracteres
objetoscomoentradaearmazenaasentradasapropriadasem*DECIPHER
TABELA*e*cifrarTABLE*demodoqueaprimeiraletra
decifraparaasegundaeasegundaletraencriptaparaoprimeiro.
Estafunononoprecisaverificarsequalquercartajtemum
entradanestastabelasdehash.
c.EscreverumafunodesfazerSUBSTITUIOquelevaumaletracomo
entrada.Eledevedefiniraentrada*decifrarTABLE*dessacarta,
e*cifrarTABLE*entradadacartalodecifradopara,a
NADA.
d.ProcureadocumentaoparaafunoCLRHASH,eescreverum
funoclaroquelimpaasduastabelasdehashusadosneste
problema.
e.Escreverumafunodecifrarcadeiaquelevaumnicocodificado
stringcomoentradaeretornaumnovo,cordaparcialmentedescodificado.Deveria
comearporfazerumanovasequnciadomesmocomprimentoqueaentrada,
contendotodososespaos.Aquiestcomofazerisso,supondoqueavarivel
LENprendeocomprimento:
(Certifiquestringlen:initialelemento#Espao\)
Prximoafunodevepercorreroselementosdeentrada
string,quesoobjetosdecaracteres.Paracadapersonagemquedecifra
paraalgonoNIL,essevalordeveserinseridodentrodo
posionanovacadeiacorrespondente.Finalmente,afuno
deveretornaranovacadeia.Aotestarestafuno,certifiquese
suasentradassotodasasletrasminsculas.
f.EscreverumafunoSHOWlinequeexibeumalinhadecriptograma
texto,comotextodecifradoexibidoabaixodela.

pgina411

399
Captulo13matrizes,tabelasdehashelistasdepropriedades
g.EscreverumafunoSHOWtextoquelevaumcriptograma(listade
strings)comoentradaeexibeaslinhascomonosexemplosdo
comeandodesteexerccio.
h.TiponadefiniodeGETprimeiroCHAR,queretornaoprimeiro
caracteresnarepresentaominsculasimpressadeumobjeto.
(Defunobterprimeirochar(x)
(Chardowncase
(Char(formatonil"A"x)0)))
Eu.EscreverumafunoREADletraquelumobjetodo
teclado.Seoobjetoofimsmbolooudesfazer,deveser
retornadocomoovalordoLEIACARTA.Casocontrrioleitura
CARTAdeveusarGETprimeiroCHARnoobjetoparaextrairo
primeirocaracteredasuarepresentaoimpressaeledeveretornarque
personagemcomooseuresultado.
j.EscreverumafunoSUBLETRAquelevaumobjetopersonagemcomo
entrada.Seessepersonagemjfoidecifrado,SUBLETRA
deveimprimirumamensagemdeerroqueinformaaoqueacartanotenhasido
decifrado.CasocontrrioSUBCARTAdeveperguntar''Oquefaz
(letra)decifrar?''elerumacarta.Seoresultadoumpersonagem
eaindanofoicifrada,SUBCARTAdevechamar
FazSUBSTITUIOpararegistrarasubstituio.Casocontrrio,uma
mensagemdeerroapropriadadeveserimpresso.
k.Escreverumafunodesfazerletraquepede''Undoquecarta?''
elemumpersonagem.Seessepersonagemfoidecifrado,
DESFAZERCARTAdevechamarUNDOdesubstituiodacarta.
Casocontrrio,umamensagemdeerroapropriadadeveserimpresso.

eu.EscreverafunoprincipalRESOLVERquelevaumcriptogramacomoentrada.
RESOLVERdeveexecutaroseguinteloop.Emprimeirolugar,deveexibir
ocriptograma.Emseguida,eledeveperguntar''Substitutequecarta?''E
chamarLEIACARTA.Seoresultadoforumpersonagem,RESOLVERdeve
chamarSUBCARTAseoresultadoosmboloUNDO,eledevechamar
DESFAZERCARTAseoresultadoosmboloEND,eledeveretornar
Tcasocontrrio,deveemitirumamensagemdeerro.Emseguida,eledeveir
devoltaaoinciodociclo,amenosqueovalordevolvidopela
LERcartafoiEND.
m.PdecifraaAeZdecifraparaI.Resolverocriptograma.

pgina412

400

CommonLisp:AGentleIntroduoComputaoSimblica

ToolkitLisp:ROOM

sistemasLisptendemausarummontedememria.Quandoelessaem,elestentamobter
Mais.ExistemvriasmaneirasLisppoderecebermaismemria.Emprimeirolugar,elepodetentar

recuperarqualquerarmazenamentoalocadoanteriormentequenoestmaisemuso,taiscomocontras
clulassquaispontosmaisnada.Esteprocessochamadodelixo
coleo.AlgunslixoLispsrecolhercontinuamente,masamaioriatemqueparar
oqueestofazendo,coletadelixo,edepoiscontinuar.Apausaparaumalatadelixo
coleogeralmenteapenasalgunssegundos,masseoseuLispcoletadelixo
comfrequncia,essaspausaspodeserirritante.
ApesardetodasasimplementaesLispincluemumcoletordelixo,no
partedopadroCommonLisp,entonohnenhumamaneirapadroparamodificarum
parmetrosdocoletordelixooudeoutraformainteragircomele.Emmuitos
implementaes,porm,existeumafunobuiltinchamadoGCquefazcomque
Lispparacoletadelixoimediatamente.Emgeral,eleimprimeumaespciedeinformativo
mensagemposteriormente.
>(GC)
Acoletadelixocompleta.
Cercade303.008bytesforamrecuperados.
NADA
OutraformaLisptentaobtermemriaestpedindoaosistemaoperacional
Paramaisquandoseesgota.Sevocinstalarmaischipsdememriaemsua
computador,oLisppodenoteracoletadelixocomtantafrequncia,epode
portanto,corrermaisrpido.AfunoSALAimprimeumresumodacorrentedoLisp
usodememria,assimvocpodedizerquantamemriafoialocada.Desde
cadaimplementaoLispgereasuamemriadeformadiferente,osdetalhesdo
VerQuartoproduzserodiferentes.Umexemplotpicosegue.EsteLisp
utilizandoumtotalde6,7megabytesdememria.
Sevocestiverusandoumaestaodetrabalhocomamemriavirtual,quandoLispprecisademais
memria,elevaicomearautilizarsemaisdoseudiscoparaespaodetroca.Masseo
discoestcheio,Lispvaificarsemespaodetroca.Seexisteoperigodeodisco
encherse,melhorcoletadelixocommaisfrequnciadoqueaumentarvirtual
Tamanhodamemria.Vocpodedefinirlimitessobreaquantidademximadememriaasua
Lisppermitidousar,mascadaaplicaolidacomissodeformadiferente.
Consulteomanualdoutilizadorparamaisdetalhes.

pgina413

401
Captulo13matrizes,tabelasdehashelistasdepropriedades
>(Quarto)
Digitar
|dinmica|
esttica|ReadOnly|
Total
||||
bignum
|
528|
16|
596|
1140
relao
|
0|
0|
8|
8
SingleFloat
|
0|
0|
0|
0
LongaFloat
|
36|
0|
2,592|
2628
Complexo
|
0|
0|
0|
0
Corda
|
19008|1.130.416|
22772|1.172.196
BitVector
|
0|
456|
0|
456
IntegerVector
|
31880|3.706.124|
13092|3.751.096
GeneralVector
|
8740|
421540|
72772|
503052
ordem
|
0|
244|
0|
244
Funo
|
3924|
21948|
415040|
440912
Smbolo
|
7520|
322700|
360|
330580
Lista
|
22992|
398708|
152816|
574516
||||
totais:
|
94628|6.002.152|
680.048=6.776.828
NADA

13

Tpicosavanados

13.10CLULASpropriedadedelista

Recordesequeumsmbolocompostodecincoponteiros.Atagoransvimostrs
los:onomedosmbolo,acluladevalor,eaclulafuno.Alistadepropriedades
clulaoutrodessescomponentes.Cadasmbolotemumalistadepropriedades,
emborapossasernulo.Emcontraste,nemtodosossmbolostemumafuno
definioemsuaclulafuno,ouumvaloremsuacluladevalor.
SuponhaqueestabelecerumalistadepropriedadesparaosmboloCATINHAT.o
funoSYMBOLPLISTpodeserusadoparaacessaralistadepropriedadesquetemos
criado.

pgina414

402

CommonLisp:AGentleIntroduoComputaoSimblica
(Setf(get'catinhat'gravataborboleta)'vermelho)
(Setf(get'catinhat"cauda)'long)
>(Smboloplist'catinhat)
(CaudaLongaBOWTIERED)
AestruturadosmboloCATINHATagoraseparececomisso:
nome

"CATINHAT"

NADA

plist
RABO

LONGO

GRAVATABORBOLETA
VERMELHO

SETFentendeSYMBOLPLISTcomoumnomedelugar,porissopossvel
darumsmbolodeumanovalistadepropriedadesusandoSETF.Substituindoocontedodeum
clulaslistadepropriedadesdosmboloperigoso,embora,porqueelepoderiaacabarcom
propriedadesimportantesqueseLISPtinhaarmazenadonalistadepropriedades.
Umarazolistasdepropriedadeshojeconsideradaarcaicaqueelesso
estruturasdedadosglobais:Umsmbolotemapenasumalistadepropriedades,eacessvel
emtodaparte.Seusamostabelasdehashparaarmazenarnossasinformaes,podemosmanter
vriasdelasemtornode,aomesmotempo,representandodiferentesconjuntosdedados.
Cadatabelahashindependente,entoasalteraesfeitasnoafetaroo
outras.
13.11MAISSOBRESEQUNCIAS
Afunocoagirpodeserutilizadoparaconverterumasequnciaapartirdeumtipode
outro.Senscoagirumastringparaumalista,podemosverocarterindividual
objectos.Poroutrolado,podemosusarcoagirparatransformarumalistadecaracteresemum
corda.
>(Coagir"Cockatoo"'lista)
(#\C#\o#\c#\k#\a#\t#\o#\o)
>(Coagir'(#\b#\i#\r#\d)'string)
"pssaro"

pgina415

403
Captulo13matrizes,tabelasdehashelistasdepropriedades
>(Coagir'(foobarbaz)"vector)
#(FOOBARBAZ)
Contudoumaoutramaneiradefazerumaseqnciafazerumvetorcommake
Matriz,usandoo:palavrachaveELEMENTTYPEparaespecificarqueestevector
detmapenasobjetosdotipoStringCHAR.(StringCHARumsubtipode
Personagem.)VetoresdeStringCHARssostrings.
>(Arrayfazer3:elementodotipo'stringchar
:Initialcontents'(#\M#\o#\m))
"Mame"
Amaioriadosoperadoresdoaplicativo,taiscomoFINDIFereduzir,trabalharem
qualquertipodesequncia,enoapenaslistas.Mapcarespecficoparalistas,mash
tambmumafunodemapeamentogeral,MAP,quefuncionaemsequnciasdequalquertipo.
AprimeiraentradaparaMAPespecificaotipoderesultado,asegundaentradaa
funodemapeamento,easentradasrestantessosequnciasaseremmapeadosover.
MAPApraquandoatingeofinaldequalquerumadassequnciasdeentrada.
>(Mapa"lista#'+
'(1234)
'#(10203040))
(11223344)
>Mapalist("lista#'
'(abc)
'#(123)
"Xyz")
((A#1\x)(B#2\Y)(C#3\Z))
SeMAPdadaNILcomoumprimeiroargumento,eleretornaNILemvezde
aconstruodeumasequnciaapartirdosresultadosdomapeamento.Issotilsevoc
desejaaplicarumafunoacadaelementodeumaseqnciaspeloseuefeitocolateral.
>(Mapanil#"impresso"deumab")
#\uma
#\Espao
#\B

NADA
FunesdescritasTPICOSAVANADOS
funesdesucesses:mapa,coagir.

pgina416

404

CommonLisp:AGentleIntroduoComputaoSimblica

pgina417

14

MacroseCompilao

14.1INTRODUO
Funesdemacrooumacrosparabreve,soumamaneiradeestenderasintaxedeLisp.
Nestecaptulo,vamosutilizarevaltracediagramaseumapequenaferramentachamadaPPMX
(DefinidonaseoLispToolkit)paravercomomacrostrabalhar.Haverum
algumasrefernciasamaterialemanterioressecesTpicosavanados,masvocvaiser
disseparaondeolhar,sevocaindanoleuasseesantes.
Nasegundametadedocaptulovamosdarumaolhadacompilao.Sevocs
decidirumdeseusprogramascorremuitolentamente,acompilloumamaneirafcilde
tornlomaisrpido.OcompiladortraduzprogramasLispemlinguagemdemquina
programas,quepoderesultaremum10a100vezesspeedup.
14.2macroscomoTAQUIGRAFIA
Penseemmacroscomooequivalentecomputadordetaquigrafia.Qualquercoisaquevocescrever
emtaquigrafiatambmpodeserescritonaplancieInglslevamuitotempo.
Damesmaforma,macrosLispComumnodeixededizerqualquercoisaquenopodeser

expressacomfunescomuns,maselesajudloadizerascoisasmais
concisa.UmbomexemploINCF.maisrpidoescrever(INCFA)doque
(SETFA(+A1)).
Algumasmacrossomuitoespertos,especialmenteaatribuiogeneralizada
macroscomoSETFeINCF.Elessocapazesdeinterpretardeformaarbitrriacomplexo
405

pgina418

406

CommonLisp:AGentleIntroduoComputaoSimblica
descrieslugarcomorefernciasdevariveisgeneralizadas.Quandovocescreveum
expressocomo
(INCF(Aref(ensimomatrizNum*listadematrizes*)
(primeirossubscritos)))
vocestcontandocomaespertezadoINCFparadescobriroqueestelugar
descriosignifica.
Macrospodemgerarprogramascomplicadosdeinstruessimples.o
DEFSTRUCTmacro,porexemplo,transformaumadefiniodeestruturaparanavesespaciais
emumalongacorrentedeinstruesparaapoiarotipodedadosSTARSHIP.
EstesincluemdefiniesdefunesparaMAKESTARSHIPeSTARSHIPP,
epeasparafunesdetodososcomponentesdanave,taiscomo
STARSHIPNAME.Nosseriaummontedetrabalhoparadigitartodosestes
definiesmanualmente,masalgumasdascoisasqueDEFSTRUCTproduz
dependentedeimplementao.Porexemplo,asinstruesparaainsero
STARSHIPcomoumapartedahierarquiacomumtipoLispdiferemdeum

implementaoLispcomumparaoprximo.Elasenvolvemfunese
variveisquenofazempartedopadroLispcomum,e,provavelmente,noso
mesmodocumentadopelofornecedordoLisp.AmacroDEFSTRUCTpermiteLisp
fornecedoresparaocultaressesdetalhescomplicadosdeseusclientes,proporcionandoum
acordados,maneirapadroparadefinirestruturasquefuncionaemtodososcomum
implementaoLisp.
14,3expansodemacro
Sevocescreveralgoemtaquigrafia,eventualmente,elevaiterqueser''ampliado''
emInglssimplesdeentendereagirsobreela.Lispexpandeautomaticamente
chamadasdemacroparaamesmarazo.Amacrorealmenteumshorthandespecial
expandindofunoquenoavaliaseusargumentos.Suafunoolharpara
seusargumentoseproduzirumaexpressoqueLisppodeavaliar.Nocasode
(INCFA),amacroINCFchamadono(unevaluated)argumentoA.
constriumaexpresso,taiscomo(SETQA(+A1)),queretorna.o
expressoexataINCFconstridependentedeimplementao,masser
algoparecidocomistoSETQ.Lisp,emseguida,avaliaaexpressoe
incrementaovalordeA.
LembredaSeo10.10queafunoespecialSETQexecuta
atribuiodevariveiscomuns.QuandovocusaSETFparaatribuirauma
varivelordinria,amacroSETFrealmenteseexpandeemumachamadaparaSETQ.

pgina419

CAPTULO14MacroseCompilao407
Nanotaoevaltrace,expansodemacromostradoporumalinhapontilhada.o
expressoamacroretornaavaliadonormalmente,mostradaporumalinhaslidafina
nodiagramaaseguir:
(INCFa)
DigiteINCFmacrocomaentradaA
expansodemacro:(SETQA(+A1))
(Setqum(+1um))
(+A1)
5
Umdefinidopara5
5
Sevocquerolharparaexpansesdemacronocomputador,vocpodeusarum
pequenaferramentachamadaPPMX,definidonaseoLispToolkitdestecaptulo.
OnomePPMXsignifica''PrettyImprimirexpansodemacro.''AlgunsLisp
editorestambmfornecemcomandosparaaexibiodeexpansesdemacroveroseu
manualdousurio.
>(Ppmx(INCFa))
expansodemacro:
(SETQA(+A1))
EmalgumasimplementaesLispINCFexpandedeformadiferente.Porexemplo,ele
podeexpandirseparaumaexpressoLETquecriaumavarivellocalparaarmazenaro
valorde(+A1),e,emseguida,armazenaessevalordevoltaparaA.Istopodeparecerum
abordagembastanteindiretaparaincrementarA,maslembresequeINCF
projetadosparalidarcommuitomaiscasoscomplexosqueenvolvemgeneralizada
tarefa.Nessescasos,umLETpodeserrealmentenecessrio.
>(Ppmx(INCFa))
expansodemacro:
(LET((#:G0144(+A1)))
(SetqA#:G0144))
Noexemploacima,#:G0144umsmbolointerno,chamadoumGensym.isto
foigeradoautomaticamenteporINCFparaservircomoumnomedevarivellocal.
Gensymssogarantidosparanoentraremconflitocomosnomesdequalquerumdosseus
variveis.Porrazesquenovaientraraqui,#:G0144umsmbolodiferente
doG0144.Vocnopodedigitarosmbolodoteclado,paraqueelenuncavai

conflitocomqualquervarivelnoseuprograma,mesmoseacontecerdevocescolhero
nomearG0144.

pgina420

408

CommonLisp:AGentleIntroduoComputaoSimblica
EXERCCIOS
14.1. UsePPMXparaencontraraexpressoparaque(POPX)seexpande.
14.2. UsePPMXparaveratqueexpressooseguinteDEFSTRUCT
seexpande.(Osresultadosseroaltamentedependentedaimplementao.)
(Navedefstruct
(Nilnome)
(Condioverde"))

14.4DEFINIODEUMAMACRO
MacrossodefinidoscomDEFMACRO.Suasintaxesemelhanteaodefun.Vamos
definirumaversosimplificadadoINCFparaincrementarvariveiscomuns.Nosso
macroterumnomedevarivelcomoentradaeconstruirumaexpressopara
incrementaressavarivelporum.
(DefmacrosimplesINCF(var)
(Listade'setqvar(lista'+var1)))

(Setfa4)
>(SimpleINCFa)
5
>(Ppmx(simpleINCFa))
expansodemacro:
(SETQA(+A1))
OutramaneiradevercomoSIMPLEINCFfuncionarelacionlascom
DTrace.(SevocestiverusandooTRACEpadrofornecidocomoLisp
implementao,emvezdeDTrace,vocpodenosercapazderastrearmacros.)
DTrace(simpleINCF)
>(SimpleINCFa)
EnterSIMPLEINCFmacro
|
Form=(SIMPLEINCFA)
\SIMPLEINCFexpandidopara(SETQA(+A1))
6
bomparausaroDTraceemmacrosquevocescrevese,masemalgumLisp
implementaespodeserdesaconselhvelparatraarimportantesmacrosembutidas,como
SETF.Seorastreamentodessesmacroscausaproblemas,usePPMXvez.Um

pgina421

CAPTULO14MacroseCompilao409

vantagemdePPMXsobrerastreioqueoresultadodomacroexpansion
nicaimpressas,noavaliado.PPMXlhepermiteexperimentarcommacro
expandindoexpressesarbitrriassemsepreocuparcomasuacausandoum
errodeavaliao.
AgoravamosmodificarSIMPLEINCFparaaceitarumsegundoargumentoopcional
especificandoaquantidadepelaqualincrementaravarivel.Fazemosissocomo
&OPCIONALlistlambdapalavrachave.(Argumentosopcionaisforamexplicadasem
seoTpicosAvanados11.13.)Ovalorpadroparaincrementaro
varivelserum.
(DefmacrosimplesINCF(var&opcional(valor1))
(Listade'setqvar(lista'+montantevar)))
(Setfb2)
>(Ppmx(simpleINCFb(*3a)))
expansodemacro:
(SETQB(+B(*3A)))
>(SimpleINCFb(*3a))
17
Macrosnoavaliamseusargumentos,demodoqueasentradasparaSIMPLEINCF
soosmboloBealista(*3A),enoosnmeros2e15.Umevaltrace
diagramamostracomoSIMPLEINCFcalculaaexpansodemacro,que
Lisp,emseguida,avalia.
(SimpleINCFb(*3a))
DigiteSIMPLEINCFmacrocomentradasBe(*3A)
criarVARvarivelcomvalorB
criarvalorvarivelcomovalor(*3A)
(Listade'setqvar...)
ResultadodaLISTA(SETQB(+B(*3A)))
expansodemacro:(SETQB(+B(*3A)))
(Setqb(+b(*3a)))
(+B(*3a))
17
oconjuntoBa17
17

pgina422

410

CommonLisp:AGentleIntroduoComputaoSimblica
VamosagoraconsideraroporquINCFtemqueserumamacroemvezdeumafuno.
SuponhaquenstentamosfazerumafunoINCF,usandodefun.Vamoschamlo
FAULTYINCF.
(DefundefeituosoINCF(var)
(Setqvar(var+1)))
DesdeFAULTYINCFumafuno,eleavaliaseusargumentos,eno
esperadopararetornarumaexpressoparaLispparaavaliar.Podeiremfrentee
fazerseaincrementao.Masdesdequeosseusargumentossoavaliados,huma
problema.Vamosveroqueacontece:
(Setfa7)
>(DefeituosoINCFa)
8
>(DefeituosoINCFa)
8
>a
7
AentradaparaFAULTYINCFonmerosete.FAULTYINCFcria

umavarivellocalchamadaVARrealizarasuaentradae,emseguida,eleincrementaVARpor
um.ElenosabenadasobreavarivelA,porqueoseuargumentoera
avaliadasantesqueafunofoiinserido.Umdiagramaevaltracetornaeste
Claro.
(DefeituosoINCFa)
Umavaliaa7
DigiteFAULTYINCFcomentrada7
criarVARvarivelcomvalor7
(Setqvar(var+1))
(+Var1)
8
definirVARa8
8
ResultadodaFAULTYINCF8
PodemostentarcitandoavarivelAquandootransmitirparaaFAULTY
funoINCF.claroquevamosterdemodificaradefiniodeFAULTY

pgina423

CAPTULO14MacroseCompilao411
INCF,porqueasuaentradanosermaisumnmero.Mas,porrazesquese
serexplicadonaseoTpicosAvanados,issonovaifuncionar.

SIMPLEINCFdeveserescritocomoumamacro.Istonoinvalidaoqueera
disseanteriormentesobremacrosnosermaisqueumaabreviaoaindaestamoslivrespara
escreverumaexpressoSETQemvezdeusarSIMPLEINCF.NoumSETQ
macro:umafunoespecial.Adiferenaexplicadanaprxima
seo.
EXERCCIO
14.3. EscreverumamacroSETNILquedefineumavarivelparaNIL.
14,5MACROScomoextensessinttica
Desdeofimdemacrosestenderasintaxedalinguagem,Lispfaz
Notratarumachamadademacrocomoumachamadadefunonormal.Htrsimportantes
diferenasentreasfunescomunsefunesdemacro:
1. Osargumentosparafunescomunssosempreavaliadososargumentospara
funesdemacronosoavaliados.
2. Oresultadodeumafunocomumpodeserqualquercoisaoresultadoretornado
porumafunomacrodeveserumaexpressoLispvlido.
3. Depoisdeumafunomacroretornaumaexpresso,essaexpresso
imediatamenteavaliada.Osresultadosretornadosporfunescomunsnofazer
obteravaliados.
Almdemacros,CommonLisptambmincluiumpequenonmerode
funesespeciais.AlgunsexemplossoSETQ,SE,deixe,eBLOCK.Especial
funessoasmenoresblocosdeconstruonveldeLispComumelesso
responsvelporcoisascomoatribuio,escopoeestruturadecontrolebsico
taiscomoblocoselacetes.Comomacros,funesespeciaisnoavaliaroseu
argumentos,maselestambmnoretornamexpressesparaseravaliado.Elesso
primitivasquefazemcoisasmuitoespeciais.Vocnopodeescrevernovoespecial
funesapenasumaimplementorLisppodefazerisso.
Voltandonossadiscussodemacroscomotaquigrafia,devemosdizerque
algoquepodeserfeitocomumamacrotambmpodeserfeitosemmacros,pela
usandoumacombinaodefunesCommonLispcomuns,funesespeciais,
e,emalgunscasos,asfunesdependentesdeimplementao.

pgina424

412

CommonLisp:AGentleIntroduoComputaoSimblica

14.6OBACKQUOTEPERSONAGEM
SIMPLEINCFconstrudaumaexpressoLispatravsdacombinaodeduaschamadaslista,
algunssmboloscitados,eosvaloresdasvariveisVARemontante.
Estaabordagemfuncionabastantebem,quandoaexpressopequena,masquando
macrosdeveproduzirgrandes,expressescomplicadas,estranho
construlospoucoapouco.Oquensprecisamosumamaneiradeescreverummodelo
paraaexpressodamacroretornar.Entotodaamacrotemquefazerpreencher
osespaosembranco.Ocaractereacentograveproporcionaumainstalaodessetipo.
Ocaractereacentograve(')anlogoaocitar,emqueambossousadospara
listasdecotao.Noentanto,dentrodeumalistabackquoted,qualquerexpressoqueprecedida
porumavrgulaconsiderado''unquoted'',ouseja,ovalordo
expressoemvezdoqueaprpriaexpressousada.
(Nomesetf'fred)
>'(Isto,nomedePittsburgh)
(EsteFREDDEPITTSBURGH)
>'(Ideu,nomesobre,(*258)dedlares)
(DEIFREDcercade200dlares)
PodemosusarbackquoteparaescreverumaversomaisconcisadoSimples
INCFmacro:

(DefmacrosimplesINCF(var&opcional(valor1))
'(Setq,var(+,var,montante)))
>(Ppmx(simpleINCFfredemprstimo(*258)))
(SETQFREDLOAN(+FREDLOAN(*258)))
EXERCCIO
14.4. EscreverumamacrochamadaSIMPLEROTATEFquealternaovalorde
duasvariveis.Porexemplo,seABdoisesete,emseguida,(Simples
ROTATEFAB)devefazerumseteeBdois.Obviamente,aconfigurao
AparaBemprimeirolugar,eemseguida,definindoBparaAnofuncionar.Suamacrodeve
expandirseparaumaexpressoLETquedetmsobreosvaloresoriginaisda
duasvariveiseatribuilhesosseusnovosvaloresemseucorpo.
Umusomuitocomumdemacrosparaevitarterquecitarargumentos.o
macroseexpandeemumachamadadefunocomumcomversescitadasdo
argumentospreenchidosquandonecessrio.Vocpodeusarbackquoteparagerar

pgina425

CAPTULO14MacroseCompilao413
expressescomcitaesnelesporincluindoasaspascomopartedo
modelo,comoeste:
'(setffoo'bar)(barsetffoo')

Noexemploabaixo,TWODEONEumamacroquelevaumafuno
nomeeoutroobjetocomoargumentoseleseexpandeemumachamadaparaafuno
comdoisargumentos,ambasasquaissooobjectocitado.
(Defmacrodoisfromum(objetofunc)
'(,Func',objeto',objeto))
>(TwodeonecontrasAardvark)
(AARDVARK.AARDVARK)
>(Ppmx(twodeonecontrasAardvark))
expansodemacro:
(AARDVARKCONS'AARDVARK')
NscolocarumavrgulaantesOBJECTporquequeremosqueovalordessa
varivelaserinseridanalistaqueBACKQUOTEconstruesacitaoantes
avrgulatambmsetornapartedalista.Sedeixardeforaacitao,amacro
vaiexpandirsepara(CONSAARDVARKAARDVARK),queircausarum
deerrovarivelnoatribudaamenosAARDVARKtemumvalor.Sedeixardefora
avrgulaemvezdeacitao,amacroirexpandirsepara(objeto'CONS
'OBJETO).
EXERCCIO
14.5. EscreverumSETMUTUALmacroquelevadoisnomesdevariveiscomoinput
eseexpandeparaumaexpressoquedefinecadavarivelparaonomedo
ooutro.(SETMUTUALAB)devedefinirumpara'BeBpara'A.
Vamostentarumexemplomaiscomplexodecrase.Vamosescreverumamacro
SHOWVARqueexibeovalordeumavarivel,comoeste:
(Defunf(x,y)
(Showvarx)
(Showvary)
(*Xy))
>(F37)
OvalordeXde3
OvalordeYde7
21

pgina426

414

CommonLisp:AGentleIntroduoComputaoSimblica
SHOWVARdeveserumamacroporqueeleprecisasaberonomedo
varivelqueestexibindo,enoapenasovalor.Vamosdividiroproblemaa
pequeno.AmensagemsobreovalordeXpodeserimpressapeloseguinte
expresso.ObservequeapenasaprimeirainstnciadeXcitado.
(FormatodeT"&OvalordeSS"'xx)
NspodemosagorafacilmenteabstrairomodelonecessrioparaoSHOWVAR
macro.Acombinaodeumacitaoseguidoporumavrgulapodeparecerestranho,
masvocpodeverapartirdoexemploanterior,ondeacitaovem.
(Defmacroshowvar(var)
'(FormatoT"&OvalordeSS"
',Var
,Var))

14,7PROCESSAMENTOCOMBACKQUOTE
Outracaractersticadoacentograveque,seumelementodemoldeprecedidoporum
vrgulaeumsinaldearroba(,@),ovalordesseelementoemendadoparaoresultado
backquotequeconstriemvezdeserinserido.(Ovalordoelemento
deveserumalista.)Seapenasumavrgulautilizado,oelementopoderiaserinseridocomoum
nicoobjeto,resultandoemumnvelextradeparnteses.
(Nomesetf'fred)
(Endereosetf'(16unidadedebordo))

>'(,Nomeviveem,endereoagora)
(FREDvidasem(16MAPLEDrive)NOW)
>'(,Nomeviveem,@endereodeagora)
(FREDvidasem16MAPLEunidadeagora)

Insero.
Splicing.

Aquiumexemplodeondesplicingtil.AmacroSETZERO,a
serdefinidomaistarde,levaqualquernmerodevariveiscomoentrada.Elaseexpandeemum
expressoparadefinircadaumdelesazeroetambmpararetornarumamensagemparaessa
efeito.Porqueamacrodevegerarvriasaes,masspoderetornar
umvalor,quecombinaasaesemumanicaexpressocomProgn.
>(Setdezeroabc)
(ZeradoABC)

pgina427

CAPTULO14MacroseCompilao415
>(Ppmx(ajustedezeroabc))
expansodemacro:
(progn
(UmSETF0)
(SETFB0)
(SETFC0)
'(ZeroABC))

AquiadefiniodeSETZERO.Elausaparaconstruirummapcar
expressoSETFparacadavarivelnalistadeargumentos.Asexpressessetf
soentoexcisadoparadentrodocorpodoProgn.Almdisso,aexpressofinalno
OcorpodePrognumalistacitadaconstrudoporsplicing.Sehouvesseumaplancie
vrgulalemvezdeumavrgulaeemcombinaosinal,oresultadoseria
(Zerado(ABC)).
(Defmacrofixadoemzero(&descansarvariveis)
'(Progn,@(mapcar#'(lambda(var)
(Listade'setfvar0))
variveis)
'(Zero,@variveis)))
EXERCCIO
14.6. Escreverumamacrochamadavariveldacadeiaqueaceitaqualquernmerode
insumos.Aexpresso(variveldacadeiaABCD)deveexpandir
emumaexpressoquedefineAa'B,Bpara'CeCpara'D.
14.8Ocompilador
OcompiladortraduzprogramasLispemlinguagemdemquina.Istofaz
programascorrermaisrpido:aaceleraotpicaumfatorde10a100.Como
comeandoprogramadorLispvocprovavelmentenoestescrevendomuitograndesprogramas,
assimqueavelocidadenopodeserumapreocupao.Noentanto,comovoclidarcommaisambicioso
problemas,vocacabarporencontrarsepreocupadoscomodesempenho
questescomoarapidezcomqueumprogramaexecutadoeaquantidadedememriaqueeleusa.
Compilaopodereduzirambasasfiguras.
Existemduasformasdeutilizarocompilador.Vocpodecompilarumanicafuno
usandoCOMPILE,ouumarquivointeirousandocompilaoFILE.muitosLisp
editoresorientadosfornecermaneirasparaquevocpossainvocarocompiladorcomapenasum
keystrokeoudois,paraquevocnuncapodeprecisarchamaressasfunesdeformaexplcita.

pgina428

416

CommonLisp:AGentleIntroduoComputaoSimblica
VamosdarumaolhadanoefeitodaCOMPILEsobreotempodeexecuodeumasimples
funo.Estafunoretornaomenornmerointeiromaiordoquearaizquadrada
dasuaentrada.Elecalculaoresultadodeumaformamuitotedioso,masquevainosajudar
mediraaceleraoalcanadapelacompilao.
(Defuntediososqrt(n)
(Dotimes(in)
(Se(>(*ii)N)(retornoi))))
>(Time(tediosasqrt5000000))
Avaliaotomou:
1.169998segundosdetemporeal,
0.953125segundosdetempodeexecuodousurio,
0.09375segundosdetempodesistemadecorrer,
69falhasdepgina,e
53816bytesConsed.
2237
Vemosquearaizquadradadecincomilhesestentre2236e2237.Ns
TambmvemosqueaversointerpretadadetediosaSQRTlevaaproximadamente0,95
segundosdeutilizadorexecutartemponesteexemplo.Vocpodequererescolherummenor
argumento,seasuamquinamuitomaislentodoqueisso.Agora,vamostentarcompilar
TediosoSQRTeveroquorpidoaversocompiladaexecutado.
>(Compilar'tediososqrt)
TediosoSQRT
>(Time(tediosasqrt5000000))
Avaliaotomou:
0.04999995segundosdetemporeal,
0.03125segundosdetempodeexecuodousurio,
0,0segundosdetempodesistemadecorrer,

1pginafalhase
32bytesConsed.
2237
Aversocompiladalevouapenas.03125segundosdetempodeusuriodeexecuo,tornandose
30vezesmaisrpidoqueaversointerpretada.TambmConsedsomente32bytes,
enquantoqueaversointerpretadaConsedmaisde50Kbytes.Nesseparticular
implementao,oconsingdevidoao*usodafuno&RESTpara
recolherosseusargumentos.Esteconsesumalistacadavezqueafunochamada.o
compiladortransformachamadaspara*emlinguagemdemquinamultiplicaminstrues,que
eliminaocustodeumachamadadefunoeoconsingqueoacompanha.

pgina429

CAPTULO14MacroseCompilao417
14,9ELABORAOEEXPANSOMACRO
AnormaCommonLisppermitechamadasdemacroasersubstitudospelosseus
expansesaqualquermomento.EmalgumasimplementaesLispDefunfazo
expansodemacroimediatamente.Emoutros,achamadademacrosubstitudopelaprimeira
vezqueafunoavaliada.Emimplementaesmuitosimplesumachamadademacro
podenuncasersubstitudo,comaexpansoresultanteemvezdamacro
expandiudenovocadavezqueaexpressoavaliada.

Desdeaexpansomacropodeaconteceraqualquermomento,vocnodeveescrever
macrosqueproduzemefeitossecundrios,taiscomoatribuiesouI/O.Masbompara
amacroparaexpandirseparaumaexpressoqueproduzefeitoscolaterais.
(Defmacrobadannouncemacro()
(Formatot"%HiMom!"))
(Defundizeroi()
(Mauannouncemacro))
>(Compilar'dizeroi)
Oime!
DIGAOI
>(Digamosoi)
NADA
Noexemploacima,amacrofoiampliadocomopartedoprocessode
compilarSAYHI.Assim,ocompiladordisse:''Oi,me!''Oresultadoda
macrofoiNIL,entoissooquefoicompiladonocorpodeSAYHI.Quando
nschamamosafunoSAYHIcompilado,elenodiznadaporqueamacrotem
foramsubstitudoscomasuaexpanso.Oproblemapodeserresolvidofazendocomqueo
macroretornoaexpressodeformato,emvezdeexecutlo.
(Defmacroboaannouncemacro()
"(Formatot"%HiMom!"))
14.10compilarprogramasinteiros
Quandocompilarumprogramainteiro,elesergeralmentearmazenadonumficheiro.Voc
podeutilizarafunodecompilaodearquivonoarquivo.AlgunseditoresLisppermitem
quevocfaaissocomumcomandoeditor.Elestambmpodempermitirquevocparacompilar
ocontedodeumbuffereditorsemescrevloemumarquivo.Vejaousuriodo
manualparadetalhes.

pgina430

418

CommonLisp:AGentleIntroduoComputaoSimblica
Devidoformacomocompiladoresdetrabalho,vocterqueseguiralgumassimples
regrasparaorganizaroseuprograma.Sevocnoseguirestasregras,o
compiladorpodeproduzirmensagensdeerroenocompilarseuprograma
corretamente.
Primeiro,seseuprogramausaqualquervarivelglobal,ocompiladorpodeemitirum
mensagemdeavisodizendoqueavarivelfoi''assumiuserespecial.''
VariveisespeciaissoexplicadosnaseoTpicosavanados.Vocpodeter
livrardessesavisosdeclarandoasvariveiscomDefVar,
DEFPARAMETER,ouDEFCONSTANT.Adeclaraodeveocorrernoincio
noarquivo,antesdequalquerfunoquefazrefernciaaessasvariveis.Voctambmpode
ignorarosavisossevocescolher.
Emsegundolugar,seoseuprogramacontmmacros,asdefiniesdemacrodeveser
colocadoanteriormentenoarquivodoquequaisquerfunesquelhesfazemreferncia.Casocontrrio,se
funoFOOchamaumBARmacro,LisppodenoperceberquandocompilarFOO
queeleprecisaparatratarachamadaparabarcomoumachamadademacroparaserexpandido.SeFOO
foicompiladoincorretamente,amaioriadoscompiladoresiremitirumavisoquandoeles
descobrirquebarummacro.
Emterceirolugar,seoseuprogramaredefinequaisquerfunesembutidas,ocompiladorpode
nolidarcomissocorretamente.Certifiquesedeusarnomesquenoentrememconflitocombuiltin
funes.documentaoonlinepodeajudloaverificarisso.

ESTUDODECASO14.11:mquinasdeestadosfinitos
Mquinasdeestadosfinitos(FSMs)soumatcnicadecomputaoterica
cinciaparadescreverdispositivoscomosimplescomomquinasdevendaautomticaoutrfego
luzesfuncionam.Nestaseovamosescreverumsimuladordepropsitogeralparafinita
mquinasdeestadoparademonstraroquorealprogramasLispsodesenvolvidos.Para
tornaradiscussomaisconcretavamosnosconcentraremumadeterminadamquinapara
simular,masnossosimuladorvaitrabalharparaqualquermquinadeestadosfinitos.

Considereseumamquinadevendaautomticacomdoisprodutos:gomaebalas.Chiclete
custa15centavos,ebalascustar20centavos.Qualquercombinaodemoedasemoedas
podeserusadoparaoperaramquinaemitirmudanaapropriada
automaticamente.Sebastantedinheirofoicolocadoem,pressionarobotodegomaou
obotovaihortelentregaroprodutodesejado.Pressionandoaalavancamoedaretorno
aqualquermomentoirretornarummontanteigualaoquefoicolocadonamedida.
Ocomportamentodanossamquinadevendaautomticapodeserdescritaformalmentepela
mquinadeestadofinitomostradonaFigura141.Amquinaestinicialmenteemumestado
chamadostart.SeelerecebeoNQUELsmbolocomoentrada,elevai''Clunk!''E

pgina431

CAPTULO14MacroseCompilao419

Figura141diagramadeestadosfinitosparaumamquinadevendaautomtica.
moveseparaumestadonomeadoTER5.SeestemestadoTER5etornaseo
smboloDIMEcomoentrada,elevai''Clink!''esegueparaoestadoTER15.Dentro
Estadotm15,seeleficaaentradaGUMBUTTON,eleofereceumpacotede
gengivaevaiparaENDEstado.
Amquinatemumtotaldeseisestados:iniciar,leve5,TEM10,
TEM15,tm20,eEND.(chamadodeumamquinadeestadosfinitosprecisamente
porqueonmerodeestadosfinito.)Cadaestadorepresentadaporumn
Figura141,ecadapossveltransiodeumestadoparaoprximo
representadoporumarco(umaseta).Oarcomarcadocomaentradanecessriopara
fazeratransioeaaoamquinadevetomarquandosesegue
essatransio.Porexemplo,oarcodeHAVE10TER15rotulado
NQUEL/''Clunk!''.

pgina432

420

CommonLisp:AGentleIntroduoComputaoSimblica

(Inciodefnode)
(Defnodetem5)
(Defnodetm10)
(Defnodetm15)
(Defnodetm20)
(Fimdefnode)
(Inciodefarc
nquel
tem5"Clunk!")
(Inciodefarc
dime
tm10"Clink!")
(Inciodefarc
inciocoinretorno
"Nadadevoltar.")
(Defarctem5denquel
tm10"Clunk!")
(Defarctem5dime
tm15"Clink!")
(Defarctem5comearcoinretorno
"Obtivemoscincocentavos.")
(Defarctm10nquel
tm15"Clunk!")
(Defarctm10centavo
tm20"Clink!")
(Defarctm10startcointretorno
"Obtivemosdezcentavos.")
(Defarctm15nquel
tm20"Clunk!")
(Defarctm15centavo
tm20"mudanadenquel.")
(Defarctm15gomabutton
fim
"Entregargoma.")
(Defarctm15coinretornostart"Obtivemosquinzecentavos.")
(Defarctm20nquel
tm20"Nickelretornado.")
(Defarctm20centavo
tm20"Dimeretornado.")
(Defarctm20gomabutton
fim
"Entregargoma,mudanadenquel.")
(Defarctm20finaldebotodehortel
"Entregarbalas.")
(Defarctm20coinretornostart"Obtivemosvintecentavos.")
Figura142definiesdensedearcoparaamquinadevendaautomtica.

pgina433

CAPTULO14MacroseCompilao421
AdefiniocompletadamquinadevendaautomticamostradonaFigura142.
ODEFNODEmacroseDEFARCfornecerumasintaxeparaconveniente
definindoofinitoestadodamquinaumapartedecadavez.Aquiestumexemplodeexecuodo
FSMsimuladorparaquepossaverametaparaaqualvamostrabalhar.
>(FSM)
INCIOEstado.Entrada:nquel
Clunk!
EstadoTER5.Entrada:centavo
Clink!
EstadoTER15.Entrada:botogoma
Entregargoma.
NADA
Comeamosaconstruirnossosimuladoratravsdacriaodeestruturasparanse
arcos,usandoDEFSTRUCT.Cadantemumnome,umalistadearcosdeentrada,euma

listadearcosdesada.Cadaarcotemuma''de''n,um''a''n,umrtulo,eum
aao.Nstambmdefinirfunesdeimpressoparaestasestruturas.
(Defstruct(n(:printfunodeimpressonode))
(Nilnome)
(Entradasnil)
(Sadasnil))
(Defunprintnode(nprofundidadestream)
(Streamformato"#<NodeA>"
(Nnodename)))
(Defstruct(arco(:printfunodeimpressodearco))
(Apartirdenil)
(Azero)
(Etiquetanil)
(Aconil))
(Defunimpressodearco(arcoprofundidadestream)
(Streamformato"#<ARCA/A/A>"
(Nodename(arcdearco))
(Arcolabelarco)
(Nodename(arcotoARC))))
Agoraprecisamosdeumavarivelglobal*NODES*paramanteralistadens
compreendendoamquina,eumavarivel*ARCSmundial*paramanteralistadearcos.
Outravarivel,*CURRENTNODE*,mantmocontroledoestadodamquina.
NsdeclaramosessasvariveisglobaiscomDefVar,explicounaAvanada
secodetpicos.AfunoINITIALIZEdefineessasvariveisparaNIL.

pgina434

422

CommonLisp:AGentleIntroduoComputaoSimblica
(DefVarnodos**)
(arcos*DefVar*)
(DefVar*atualn*)
(Defuninitialize()
(Setf*ns*nil)
(Setf*arcos*nil)
(Setf*atualn*nil))
AmacroDEFNODEumpoucode''acarsinttico''paraadefiniodenovo
nodos.ElesimplesmentecolocaumacitaonafrentedeseuargumentoechamaaADD
funodon.
(Defmacrodefnode(nome)
"(Addnode",nome))
ADDNODEconstriumnovoncomonomedadoeadicionaloparao
listamantidanavarivelglobal*NODES*.ElausaNCONC(adestrutiva
versodeanexar)demodoquepodeadicionaronparaofimdalista.Istoassegura
queosnsnosgnglios**aparecenaordememqueeleseram
definidocomDEFNODE,emvezdeemordeminversa.ADDntambm
retornaonrecmcriado.
(Defunaddn(nome)
(Vamos((newnode(makenode:nomenome)))
(Setf*ns*(nconc*ns*(listadenewnode)))
newnode))
>(Inicializar)
NADA
>(Inciodefnode)
#<Ninicial>
>(Defnodetem5)
#<NodeTER5>
*ns*(#<IniciarNode>#<NodeHAVE5>)
FINDNODElevaumnomedendeentradaeretornaocorrespondente
n.Senenhumnexistecomessenome,FINDNODEsinalizaumerro.

(Defunencontrarn(nome)
(Ou(encontrarnsnome**:tecla#"nodename)
(Erro"NonchamadoAexiste."Name)))

pgina435

CAPTULO14MacroseCompilao423
>(Encontrarnode"tm5)
#<NodeTER5>
>(Encontrarnode"tm6)
Erro:NonchamadoHAVE6existe.
AmacroDEFARCforneceumasintaxeconvenienteparaadefiniodearcos,e
afunoADDARCfazotrabalhoreal.Quandoumarcocriado,ele
adicionadoslistadenssadasdodeneonENTRADAS
listadoquens.Almdisso,adicionadolistamantidanavarivelglobal
*ARCS*.
(Defmacrodefarc(dertulopara&Actionopcional)
'(Adicionararc','de,etiqueta',para',ao))
(Defunadicionararc(labelnamedeparanomedaao)
(Vamos*((apartirde(encontrarnname))
(Para(encontrarnodetoname))

(Novaarc(makearco:apartirde
:Etiquetadaetiqueta
:Paraa
:Aoao)))
(Setf*arcos*(*nconcarcos*(novalistadearco)))
(setf(nsadas)
(nconc(nsadas)
(Novalistadearco)))
(setf(nentradaspara)
(nconc(nentradaspara)
(Novalistadearco)))
novaarco))
>(Defarccomearnqueltem5"Clunk!")
#<ARCSTART/NQUEL/TEM5>
AgorapodemosescreverafunoFSMdenvelsuperior.precisoumaentradaopcional
especificandooestadoinicialdamquina.OestadoinicialpadroINICIAR.
FSMrepetidamentechamaafunoONEtransioparapassarparaaprxima
Estado.Quandoamquinaatingeumestadosemarcosdesada(comoEND),ele
pra.ObservequeoDOtemumalistadevariveisvazio.
(DefunFSM(eopcional(pontodepartida'start))
(Setf*atualn*(encontrarnodepontodepartida))
(Fazer(nil)
((Null(nsadas*atualn*)))
(Umatransio)))

pgina436

424

CommonLisp:AGentleIntroduoComputaoSimblica
Finalmente,podemosescreverONEtransio.Elepedeumaentradaemarcas
atransiodeestadoapropriado,alterandoovalorde*CURRENTNODE*.
Senohouverumatransiolegaldoestadoatual,umavezqueaentrada,eleimprimeuma
mensagemdeerroepedeaintroduonovamente.
(Defunumatransio()
(Formatot"&StateA.entrada:"
(Nodename*atualn*))
(Vamos*((ANS(ler))
(Arco(encontrarans
(Nsadas*atualn*)
:Tecla#"arcolabel)))
(Anoserquedearco
(Formatot"&NoarcodeAtemaetiquetaA.%"
(Nodename*atualn*)ans)
(Retornodezeroonetransio))
(Vamos((nova(arcotoARC)))
(Formatot"&A"(arcoarcoaction))
(*Atualnsetf*novo))))
>(FSA)
INCIOEstado.Entrada:centavo
Clink!
EstadoTER10.Entrada:trimestre
NoarcodeHAVE10temrtulotrimestre.
EstadoTER10.Entrada:centavo
Clink!
EstadoTER20.Entrada:centavo
Dimeretornado.
EstadoTER20.Entrada:botodehortel
Entregarbalas.
NADA
Onossosimuladornoestlimitadoasimulaodemquinasdevendaautomtica.qualquerdispositivo
quepodeserdescritoemumnmerofinitodeestadosetransiesdeestadopodeser
simuladaporesteprograma.
EXERCCIO
14.7. Estenderoexemplomquinadevendaautomticadevenderbarrasdechocolatepara25
centavos.Tornloaceitartrimestres,bemcomomoedasemoedas.Quandovoc
colocaremumquartoeledeveir''Kerpedao!''

pgina437

CAPTULO14MacroseCompilao425
RESUMO
MacrossoaversodoLispdetaquigrafia,comvriosusos.Elespermitem
programadoresparadefinirextensessintticasparaLispedizerascoisasmais
concisa.ElestambmajudamimplementadoresLispesconderimplementaodesarrumado
detalhesespecficosdeseusclientes.Macrosnoavaliamseusargumentos
elesretornamexpressesLispquesoavaliados.Novasmacrospodemserdefinidos
comDEFMACRO.
Comomacros,funesespeciaisnoavaliamsuasentradas.mas,aocontrrio
macros,elesnoretornamexpressesLispqueestoaseravaliados.Especial
funesfornecemasprimitivasemqueLispconstrudo,comoaatribuio,
condicionaiseestruturadobloco.
Ocaractereacentograveconstriumalistadeummodelo.Seummolde
elementoprecedidoporumavrgulaquevaiseravaliadaentoinseridoovalor
nalistaqueestsendoconstrudo.Elementosprecedidoporumavrgulaearroba
combinaosounidasnalista,emvezdeinserido.crase
particularmentetilemmacrosqueconstroemexpressescomplexas,preenchendo
osespaosembrancodeummodelo.

exercciosdereviso
14.8. Porqueimprudenteparaescrevermacrosquetmefeitoscolaterais?
14.9. Lispcomumcontmexatamente24funesespeciaisembutidos.Oqueso
eles?(Dica:Procurenocaptulo5doCommonLisp:ALinguagem).
14.10. Quantomaisrpidofazerprogramastpicoscorrerapssercompilado?
FUNESabordadosnestecaptulo
definiodemacro:DEFMACRO.
Compiler:compilao,compilaoFILE.

pgina438

426

CommonLisp:AGentleIntroduoComputaoSimblica

ToolkitLisp:PPMX

PPMXsignifica''PrettyImprimirexpansodemacro.''Elemacroexpandsseuprimeiro
argumento(noavaliada)eimprimeoresultado.PPMXnoapenastilpara
aprendendosobremacrosembutidascomoSETF,tambmbastantetilparadepurao
macrosquevocescrevesesehumproblemacomasuaexpanso.
(Defmacroppmx(formulrio)
"Prettyimprimeaexpansomacrodeforma".
'(Vamos*((exp1(macroexpand1',formulrio))
(Exp(exp1macroexpand))
(*Printcrculo*nil))
(Cond((igualexpexp1)
(Formatot"eexpansoMacro:")
(Exppprint))
(T(formatot"&primeiraetapadaexpanso:")
(Exp1pprint)
(Formatot"%%expansofinal:")
(Exppprint)))
(Formatot"%%")
(valores)))
Seumamacroseexpandeemoutrachamadamacro,PPMXmostratantooresultadode
aprimeiraexpansoeaexpressofinalderivadaquandotodasasmacrostersido
expandida.Porexemplo,amacroEXTENSOINCFabaixoexpandeseparauma
chamarparaamacroSETF.SETF,porsuavezseexpandeemumachamadaparaoespecialSETQ
funo.
(DefmacrolongaINCF(var)
'(Setf,var(+,var1)))
>(Ppmx(longaINCFa))
Primeiraetapadeexpanso:
(SETFA(+A1))
expansofinal:
(SETQA(+A1))
Emalgumasimplementaes,amacrodotimesseexpandeemumachamadaparao
FAZERmacro.Noexemploabaixo,DO,porsuavezseexpandeemumamaiscomplexa

pgina439

CAPTULO14MacroseCompilao427
expressoenvolvendoBLOCK,DEIXE,TAGBODY,eGO.Nsnocobrir
tagbodieseirnestelivro.
>(ppmx(dotimes(in)
(Se(>(*ii)N)(retornoi))))
Primeiraetapadeexpanso:
(DO((I0(1+I))
(#:G6517N))
((>=I#:G6517)NIL)
(IF(>(*II)N)(RETURNI)))
expansofinal:
(BLOCKNIL
(LET((I0)
(#:G6517N))
(TAGBODY(GO#:G6519)
#:G6518(IF(>(*II)N)(RETURNI))
(PSETQI(1+I))
#:G6519(amenosque(>=I#:G6517)(GO#:G6518))
(RETURN(PrognNIL)))))

Exerccioteclado

Nossosimuladordemquinadeestadosfinitoschamadode''intrprete'':Elaoperapor
interpretaroneestruturasdedadosdearcocomoumadescriodamquina.Amaisrpida
maneiradesimularumamquinadeestadosfinitosescreverumafunoespecializadapara
cadan.Afunousacomoargumentoumalistadesmbolosdeentradaparao
mquina.Eleolhaparaoprimeirosmbolo,decidesobreoestadoapropriado
transioparafazer,emseguida,chamaafunocorrespondenteaesseestado,
passandoorestodalistadeentrada.
EstaabordagemmaisrpidoporquenotemosparachamarASSOCouencontrar
N.Naverdade,nsnoreferenciaroneestruturasdedadosdearcocomotodos.o
aceleraopodeserimportanteseestamossimulandoumamquinacomplexa,commuitos
estados,comoumpedaodecircuitosdocomputador.
Umavezquetodasasentradasdevemserfornecidosaomesmotempocomoumalista,emvezdesolicitar
paraelesdeformainterativa,possvelqueamquinaficarsementradasantesde

pgina440

428

CommonLisp:AGentleIntroduoComputaoSimblica
chegaraumestadofinal.Nessecaso,bastadevolveronomedoltimoestado
atingidopelamquina.Aseguirumafunoparasimularamquina

quandoeleestemestadoinicial.
(Defuncomear(entradaSyms
&Aux(esteentrada(primeirossyms)))
(Cond((inputSymsnula)'start)
((Igualaraesteinput'denquel)
(Formatot"&A""Clunk!")
(Ter5(entradaSymsdescanso)))
((Igualaraesteinput'moedadedezcentavos)
(Formatot"&A""Clink!")
(Tm10(entradaSymsdescanso)))
((Igualthisinput'coinretorno)
(Formatot"&A""Nadadevoltar.")
(Start(entradaSymsdescanso)))
(T(erro"NoarcodeAcometiquetaA."
'Startthisentrada))))
Supondoquetodososoutrosestadostinhamfunessemelhantesdefinido,podemosescrever
(START"(NQUELDIMEGUMBUTTON))paraobterumchiclete.Oresultado
ficariaassim:
>(Start'(nquelcentavogomabutton))
Clunk!
Clink!
Entregargoma.
FIM
Escreverumafunoparacadaestadotedioso.muitomaisconvenientepara
definirumamquinacomexpressesDEFNODEeDEFARC.Paraobtervelocidade,
porm,precisoconverterosnsdefunes.Seriabomsens
poderiaobterocomputadorparafazerestetrabalhoparans.
EXERCCIO
14.11. Nesteexercciotecladovamosescreverumcompiladorparaestadosfinitos
mquinasquetransformacadanemumafuno.Adefiniodo
vendingnsearcosdamquinajdeveestarcarregadoemseu
Lispantesdeiniciaroexerccio.
uma.EscreverumafunodecompilaoARCquelevaumarcocomoentradae
retornaumaclusulaCOND,seguindooexemplomostradoanteriormente.
Testeasuafunoemalgunsdoselementosdalista*ARCS*.
(CompilaoARC(PRIMEIRO*ARCS*))deveretornarestalista:

pgina441

CAPTULO14MacroseCompilao429
((Igualaraesteinput'denquel)
(Formatot"&A""Clunk!")
(Ter5(entradaSymsdescanso)))
b.Escreverumafunodecompilaonquelevaumncomoentradae
retornaumaexpressoDefunparaessen.(Compilenode
(STARTFINDNODE'))deveretornaraDefunmostrado
anteriormente.
c.EscreverumamacrocompilaomquinaqueseexpandeemumaProgn
contendoumadefunparacadan*NODES*.
d.Compilaramquinadevendaautomtica.Oquesignificaaexpresso(START
'(DIMEDIMEDIMEGUMBUTTON))produzem?

14

Tpicosavanados

14.12A&BODYLAMBDApalavrachavelista
UmarazoaspessoasescrevemmacrosparaqueelespossamadicionarnovospedaosdesintaxeparaLisp.
Porexemplo,podemosescreverumamacroenquantoaforneceromesmocontrole
estrutura,comoloopswhileemoutrosidiomas.
(Defmacrowhile(testeecorpocorpo)
'(Faz()
((No,teste))
,@corpo))
Amacroenquantotomaumaexpressodetestecomoseuprimeiroargumento,seguido
porzerooumaisexpressescorpoaseravaliadoseotesteverdadeiro.Ocorpo
expressespoderiamserrecolhidoscom&REST,masLispcomumincluiuma
palavrachaveespecial,CORPOE,parausarquandoosargumentosrestantesparaumamacro
formarocorpodeumaestruturadecontrolo.AlgunseditoresLispprestarespecial
aatenoparaapalavrachave&BODYaorecuarchamadasparamacros.Ousode

pgina442

430

CommonLisp:AGentleIntroduoComputaoSimblica
CORPOEsignificatambmaosleitoreshumanosdadefiniodemacroqueo
restantesargumentossoumcorpodecdigoLisp.
AprximaPOWERdedoisfunoabaixousaumloopwhilepara
repetidamenteodobrodovalordavariveli,apartirdeum,atoprimeiro

potnciadedois,quemaiordoqueaentradadeN.
(Defunprximapotnciadedois(n&aux(i1))
(While(<in)
(Formatot"eno"i)
(Setfi(*i2)))
Eu)
>(Prximapotnciadedois11)
noum
no2
no4
no8
16
Paramelhorestilo,esteproblemaespecficodeveserresolvidocomfazeremvezde
ENQUANTO,paraevitarSETFsexplcitas.
14.13LISTASdesestruturaoLAMBDA
AmacroMIXandmatchlevadoisparescomoentradaeretornaum
expressoqueproduzquatropares:
(Defmacromixandmatch(pq)
(Vamos((x1(primeirap))
(Y1(segundap))
(X2(primeiroq))
(Y2(segundaq)))
'(List'(,x1,y1)
'(,X1,Y2)
'(,X2,Y1)
'(,X2,y2))))
>(Mixandmatch(fredwilma)(Barneybetty))
((FREDWILMA)(FREDBETTY)(BARNEYWILMA)
(BARNEYBETTY))
Nesteexemplo,desmontouasduasentradas(FREDWILMA)e
(BARNEYBETTY)manualmente,usandoumaexpressoLET.Masumavezqueasmacros

pgina443

CAPTULO14MacroseCompilao431
noavaliamsuasentradas,elessocapazesdetratarexpressesdeentradalistacomo
estruturasqueserdesmontadoautomaticamente.Istoconhecidocomodesestruturao.
Vocpodeespecificaraformadedesestruturarumaexpressodeentrada,substituindoumavarivel
nalistadeargumentosdamacrocomumaoutralistadeargumentostodo.Porexemplo,
podemossubstituiravarivelPemmisturarecombinarcomalistadeargumentos
(Y1X1),eoQvarivelcom(Y2X2).Aqui,ento,umaversodoMIXING
EMATCHusandodesestruturao:
(Defmacromixandmatch((x1y1)(x2y2))
'(List'(,x1,y1)
'(,X1,Y2)
'(,X2,Y1)
'(,X2,y2)))
Desestruturaoestdisponvelapenasparamacros,enofunescomuns.Isto
particularmentetilparamacrosquedefinemnovosbitsdeestruturadecontrolecoma
sintaxecomplexa.AmacroDOVECTORqueseseguemodeladoaps
DotimeseDLIST.passosdeumavariveldendiceatravsdeelementossucessivos
deumvector.Osusosmacrodesestruturaoparaescolherdistanteavarivelndice
nome,ovectordeexpresso,eaformaresultado.
(Dovectordefmacro((varvectorexp
&Resultformaopcional)
&Bodycorpo)
'(Fazer*((VECDov,vetorexp)
(LENDov(comprimentovecDov))
(IDov0(+I1dov))
(,Varnil))
((IgualiDovlenDov),resultarforma)

(Setf,var(arefvecDoviDov))
,@corpo))
>(Dovector(x'#(foobarbaz))
(FormatodeT"&XS"X))
XCOMID
XBAR
XBAZ
NADA
VocpodeverapartirdaexpansodaDOVECTORporqueestamacrotil
comoumaformadetaquigrafia:

pgina444

432

CommonLisp:AGentleIntroduoComputaoSimblica
>(Ppmx(dovector(x'#(foobarbaz))
(FormatodeT"&XS"x)))
Primeiraetapadeexpanso:
(DO*((VECDOV'#(FOOBARBAZ))
(LENDOV(COMPRIMENTOVECDOV))
(IDOV0(+IDOV1))
(XNIL))

((EQUALIDOVLENDOV)NIL)
(SETFX(AREFVECDOVIDOV))
(FORMATOT"eXS"X))
expansofinal:
(BLOCKNIL
(LET*((VECDOV'#(FOOBARBAZ))
(LENDOV(COMPRIMENTOVECDOV))
(IDOV0)
(XNIL))
(TAGBODY
(GO#:G955)
#:G954(SETFX(AREFVECDOVIDOV))
(FORMATOT"eXS"X)
(SETQIDOV(+IDOV1))
#:G955
(Amenos(EQUALIDOVLENDOV)
(GO#:G954))
(RETURNNIL))))
ODOVECTORseexpandeparaumaexpressoDO*comvariveislocais
VECDOV(parasegurarovetor)eLENDOV(paraseguraroseucomprimento),eum
variveldendicechamadoIDOV.Estesnomesforamescolhidosporqueso
Nodeveentraremconflitocomquaisquernomesdevariveisdousurio.SetivssemosusadoVEC,LEN,
eeuemvezdisso,elespodemimpedirqueusuriosacessemalgumasvariveislocaisde
contaprpriacomessesnomes. * Aexpansotambmcontmumaexplcita
atribuioparaavarivelXnocorpodoca*.ApsaDOVECTOR
retornosmacrooDO*expresso,aindamaismacrocresceuLispemum
combinaodeBLOCK,DEIXE,TAGBODY,eGO.oDOVECTOR
expressomuitomaisagradvelparaossereshumanosdelerdoqueaexpansomacro.

*Notaaosinstrutores:Claroqueexistemmelhoresformasdeprevenirtaisconflitosdenome.Poderamosusaro
sistemadepacotes,ougensyms.Masessesestoforadombitodeumlivrointrodutrio.

pgina445

CAPTULO14MacroseCompilao433
14,14macrosedeescopolxico
VamosvoltarnossaconsideraodeFAULTYINCF,umatentativadeimplementar
INCFcomoumafunoemvezdeumamacro.Suponhaquecitaravarivelantes
passloparaafuno,porescrito(AFAULTYINCF').FAULTYINCF
precisafazerduascoisas:Eledevesaberovaloratualdavarivel,e
devesubstituiressevalorporumnovo.
Nocasodevariveisglobaisqueissopossvel.Lembresequeavidaglobaisem
aclulavalordosmboloqueosnomesdeTI.Podemosusarafunobuiltin
SMBOLOVALORparaacessaracluladevalor.Podemosarmazenarnestaclulapor
usandoSETFouusandoafunoSETbuiltindiscutidonaSeo10.10.
AquianossanovaversodoFAULTYINCF:
(DefundefeituosoINCF(var)
(Setvar(+(smbolodevalorvar)1)))
(Setfa7)
>(DefeituosoINCF'a)
8
>(DefeituosoINCF'a)
9
>a
9
Afunoparecefuncionarcorretamente,maselesvaifuncionarparaoglobal
variveis.Setentarmosusloemumavarivellocal,eleirfalhar.SIMPLEINCF
funcionacorretamentetantoparaasvariveislocaisouglobais.

(Defuntestesimples(nabo)
(NabosimplesINCF))
(Defuntestdefeituoso(nabo)
(NabodefeituosoINCF'))
>(Testesimple37)
38
>(Testedefeituoso37)
Erro:NABOvarivelnoatribuda.

pgina446

434

CommonLisp:AGentleIntroduoComputaoSimblica
EmTESTSIMPLESamacroSIMPLEINCFseexpandeparaumaexpresso
queentoavaliadanocontextolexicaldeTESTsimples.Assim,olocalde
Nabovarivellexicamenteaparente,enohnenhumproblema.
(Testesimple37)
DigiteTESTSIMPLEScomentradade37
criarNABOvarivelcomvalorde37
(NabosimplesINCF
DigiteSIMPLEINCFmacrocomNABOentrada

Macrodeexpanso:(NABOSETQ(+NABO1))
(Setqnabo(+nabo1))
(Nabo+1)
NABOavaliapara37
38
definidonaboa38
38
Resultadodoensaiodesimples38
PodemosverobugnoFAULTYINCFcomumdiagramaevaltrace.Dentro
ocorpodoFAULTYINCFfuncionaranicavarivellocalvisvel
VAR.Alinhaacheiopesadoemtornodocorpoindicaqueoprogenitor
contextolexicaldeFAULTYINCFocontextoglobal,demodoTESTFAULTYde
NABOvarivellocalnolexicallyacessvel.Nohnenhumvaloratribudo
paraonabovarivelglobal,porisso,quandoSMBOLOVALORolhanovalor
clulatornaseumerrovarivelnoatribuda.
(Testedefeituoso37)
DigiteTESTFAULTYcomentradade37
criarNABOvarivelcomvalorde37
(DefeituosoINCF'nabo)
DigiteFAULTYINCFcomNABOentrada
criarVARvarivelcomvalorNABO
(Setvar(+(smbolodevalorvar)1))
(+(Smbolodevalorvar)1)
(Smbolodevalorvar)
VARavaliadacomoNABO
Erro:NABOvarivelnoatribuda

pgina447

CAPTULO14MacroseCompilao435
14.15significadohistricodemacros
Umadasagradveiscaractersticasdemacrosqueasuasintaxeidnticado
funesordinriaseespeciais.Istotornamaisfcilparaosprogramadoresafazer
extensessintticasparaLispdeumaformainvisvel:aspessoasqueusamasextenses
nopodedizerqueelessoprogramadordefinido,emvezdeemconstrudo.Emcontraste,nas
linguagenscomoPascal,nopossveladicionarnovostiposdeinstruo,somentenovo
procedimentos.AsnicasmaneirasdeestenderasintaxedoPascalsoparaescreverum
prprocessadoroumodificarocompilador.Ambasasabordagenssoimpraticveisse
quersercapazdecombinarextensescontriburamporvriosprogramadores.
MuitosrecursosdoCommonLisporiginadoemdialetosanteriores,comoalguns
pacotemacroprivadadoprogramador.
ExemplosincluemoSETF,
macrosDEFSTRUCTe,comOPENarquivo.MesmoDEFMACROfoi
originalmenteumaextenso.(EmboraLisptevemacrosdesdeo
comeando,antesDEFMACROveiotiveramqueserdefinidadeumaformamais
maneiracomplicada.)
Lisptemevoludocontinuamenteaolongodesuahistriade30anos,commuitaspessoas
contribuindoboasidiasparaextenses.Estaevoluonoteriasido
possvelsemmacros.ParaalmdoalargamentoLisp,macrostambmpodemserusadaspara
definirinteiramentenovosidiomas.linguagensdealtonvelespecializadosparaartificial
programaodeintelignciamuitasvezessoconstrudasemcimadoLispdestaforma.Asfiguras
nestelivroforamcriadosusandoumalinguagemgrficaespecializadaimplementado
comomacrosLispComum.
14.16escopodinmico
Aolongodestelivrotemosusadoescopolexicalparatodasasvariveis.Lexical
escoposignificaque,paraqueumafunoCOMIDparaacederaumavarivelX,o
definiodeFOOdeveaparecerdentrodocontextoemqueXdefinido.SeFOO

definidaanvelsuperiorcomDefun,entoelespodeacessarvariveisglobais
(Maisqualquermoradoreselasedefine).Masseumafunodefinidaporum
lambdaexpressoqueaparecedentrodocorpodeoutrabarradefuno,entoele
podeacessarasvariveislocaisdebar,bemcomoasuaprpria.funesdefinidas
foradobarnopodeacessarqualquerumadasvariveisdobar.
Aalternativaaoescopolexicalchamadodinmicadeescopo.Antesde
Lispcomum,escopodinmicoeraanormanoLisp.escopolexicalfoi
encontradoapenasemdoisdialetosdoramochamadoEsquemaeT.

pgina448

436

CommonLisp:AGentleIntroduoComputaoSimblica
Variveisdinamicamentecomescoposotambmchamadosdeespeciaisvariveis.Quandoum
nomedavariveldeclaradoparaserespecial,essavarivelnoserlocalparaqualquer
funoseuvalorseracessvelemqualquerlugar.Emcontraste,escopolxico
variveisssoacessveisnointeriordocorpodeformaaqueosdefine.
UmamaneiradedeclararumnomedevarivelespecialcomomacroDefVar.
(avesDefVar)
Vamoscompararosefeitosdedelimitaodombitolexicalemrelaodinmicadasvariveis.
Nsjdeclarouavesaescopodinamicamente.UsaremosFISHcomoum
escopolxicovarivel,porissonodeveserDEFVARed.Cadavontadevarivel
seratribudoumvalorinicialapropriadoabaixoentovamosescreverumafunopara
referenciarovalordecadavarivel.

(Peixesetf'(atumsalmo))
((Abutreguiadasavessetf))
(Defunrefpeixe()
peixe)
(Defunrefaves()
aves)
(refpeixe)(atumsalmo)
(refpssaros)(abutreguia)
Agora,paraveradiferenaentreasduasdisciplinasdeescopo,vamosescrever
funesquenomearseusinputspeixeseaves.Primeiro,vamosconsideraro
familiarizado,escopolxicocasoutilizandoFISH.
(Defuntestlexical(peixe)
(Listadepeixe(refpeixe)))
>(Testlexical'(guppyminnow))
((GUPPYMINNOW)(salmoatum))
EmTESTLEXICALoFISHexpressorefereseaoFISHvarivellocal.
EstavarivellocalnovisvelparaREFFISH.Osmbolodospeixesnocorpo
deREFFISHcontinuaasereferiraoFISHvarivelglobal.Noevaltrace
diagrama,vocpodeverqueocorpodeREFFISHfechadoemumalinhaslida,
indicandoqueseucontextolexicalpaiocontextoglobal.desdeREF
FISHnocriaumavarivellocaldoseuprpriopeixechamado,qualquerocorrnciade
FISHnoseucorpotomadacomoumarefernciaparaavarivelglobal.

pgina449

CAPTULO14MacroseCompilao437
FISHvarivelglobaltemumvalor(TUNAsalmo)
((Peixinhoguppytestlexical'))
DigiteTESTLEXICALcomentrada(GUPPYMINNOW)
criarFISHvarivellocalcomovalor(GUPPYMINNOW)
(Listadepeixe(refpeixe))
FISHavaliadacomo(GUPPYMINNOW)
(Refpeixe)
DigiteREFFISH
FISHavaliadacomo(salmoatum)
ResultadodaREFFISH(salmoatum)
((GUPPYMINNOW)(salmoatum)
ResultadodoensaiodeLEXICAL((GUPPYMINNOW)(salmoatum))
Nocasoescopodeformadinmica,utilizandoasaves,afunotestedeolhares
idnticoaoanterior,mascomportasedeformadiferente.Estadiferenadevido
aoefeitodeavesdeclarandodoDefVarserespecial.
(Defuntestdinmica(aves)
(Avesdelista(refpssaros)))
>(Testdinmica"(RobinSparrow))
((ROBINPARDAL)(ROBINPARDAL))
>(refpssaros)
(EAGLEABUTRE)
QuandoentramosnocorpodeTESTDYNAMIC,umanovavariveldinmica
AVESnomeadocriado.Apartirdeagora,atquedeixamocorpo,todousode
AVESemqualquerpartedoprogramairreferirseaestavarivel,mesmoqueocorreem
algumaoutrafunoforadeTESTDYNAMIC.Avarivelglobalchamada
AVESinacessveldesdequeestanovavariveldinmicaestnaexistncia.
QuandoretornaTESTEDYNAMIC,ospssarosvariveisdinmicasquecriou
deixardeexistir,easavesnomesernovamenteassociadoao

AVESvarivelglobal.
Nohnenhumanotaoevaltraceespecialparavariveisdinmicasvocsimplesmente
temqueobservarseumdeterminadonomefoiDEFVARedouno.Umavezqueeletem,
todasasvariveiscomessenomeserescopodinamicamente.

pgina450

438

CommonLisp:AGentleIntroduoComputaoSimblica
osPSSAROSvarivelglobaltemumvalor(EAGLEABUTRE)
((Pardalrobintestdinmica"))
DigiteTESTdinmico,comentrada(ROBINPARDAL)
criarAVESvariveisdinmicascomovalor(ROBINPARDAL)
(Avesdelista(refpssaros)
AVESavaliadinamicamentepara(ROBINPARDAL)
(refpssaros)
DigiteRefAVES
AVESavaliadinamicamentepara(ROBINPARDAL)
ResultadodaRefAVES(ROBINPARDAL)
((ROBINPARDAL)(ROBINPARDAL))
ResultadodoensaiodeDYNAMIC((ROBINPARDAL)(ROBINPARDAL))

Aregraparaavaliarvariveisdeescopodinamicamentequequandonsbatemosum
linhamaisespessa,emvezdesaltarparaocontextolexicalglobal,queacabamosdepassar
direitanomeio,continuandoaolharparaacriaodeumavarivelcomque
nome.Nsusamossomenteovalorglobalsetornamtodoocaminhoparaoglobal
contexto,oquesignificaquenenhumafunoatualmentetemumavarivelcomomesmonome
avarivelglobal.
Otermo''ligaodinmica''referesepropriedadedequeasavesdenome
emREFavesnoestpermanentementeassociadoaqualqueroutravarivel,ocaminho
PeixeestassociadoaumavarivelglobalemREFFISH.Emvezdisso,o
conexoentreonomeeavarivelrealfeitadeformadinmica.
QuandoRefAVESchamadodentroTESTDYNAMIC,ospssarossmbolo
referesesavesvariveisdinmicasestabelecidaspeloTESTDYNAMIC.
QuandoRefAVESchamadononvelsuperior,osmesmospssarossmbolo
interpretadacomoumarefernciasavesdevariveisglobais.
escopodinmicodeveserusadocommoderao.EmdialetosanterioresLisponde
foiopadro,seuusocausoualgunsbugsdoprograma,ondeumafuno
acidentalmentemodificarumavariveldinmicacriadaporoutro.Lexical
escopoprotegeasvariveislocaisdeumafunodemodificaesporoutros,
funesnorelacionadas.Masexistemalgunscontextosondeescopodinmico
exatamenteacoisacertaparausar.UmexemplodadonaSeo14.18.

pgina451

CAPTULO14MacroseCompilao439
14.17DefVar,DEFPARAMETER,DEFCONSTANT
DefVar,DEFPARAMETEReDEFCONSTANTtodosdeclararnomesparaser
especial.DefVarusadaparadeclararvariveiscujosvaloresvomudar
duranteaoperaonormaldoprograma.Eleaceitaumopcionalinicial
valorvariveleumacadeiadedocumentao.
>(*TOTALculosDefVar*0
"Totaldeculosvendidosatagora")
*TOTALGLASSES*
UmfatocuriososobreDefVarque,seavariveljtiverumvalor,
DefVarnovaimudarisso.Elesatribuiovalorinicial,seavariveltem
Nenhum.
>(DefVar*TOTALculos*3)
*TOTALGLASSES*
>*TOTALculos*
0
DEFPARAMETERtemamesmasintaxequeDefVar,masusadopara
declararvariveiscujosvaloresnovaimudarenquantooprogramaexecutado.Eles
segure''definiesdeparmetros''queinformamoprogramacomosecomportar.Outro
diferenaentreDEFPARAMETEReDefVar
aquele
DEFPARAMETERiratribuirumvaloraumavarivelmesmoseelejtemum.
>(defparameter*maxcopos*500
"Onmeromximodeculospodemosfazer")
*MAXVIDROS*
>(Defparameter*maxcopos*300)
*MAXVIDROS*
>*Maxvidros*
300
DEFCONSTANTutilizadoparadefinirconstantes,oquenemsempregarantido
mudar.AconvenoemLispcercarosnomesdeespecial

variveis
comumasterisco,masistonoseaplicaaconstantes.umerro
tentaalterarovalordeumaconstante,ouparacriarumanovavarivelcomamesma
nomearcomoumaconstante.PIumbuiltinconstanteemCommonLisp.
>(Defconstantvelocidadedaluz299.792.500,0

pgina452

440

CommonLisp:AGentleIntroduoComputaoSimblica
"Velocidadedaluzemmetrosporsegundo")
VELOCIDADEDALUZ
>(Setfvelocidadedaluz"muitorpido)
Erro:Nopossvelatribuiravelocidadedaluz.
umaconstante.
>(Vamos((pi'grego))
(Pisaladalist'))
Erro:NopossvelcriarumavarivelchamadaPI.
umaconstante.
Declarandoumaquantidadeaserconstante,porvezes,permitequeocompilador
gerarlinguagemdemquinamaiseficientedoquesefosseumavarivel.Issotambm
impedequealgumaltereovaloracidentalmente.
Amaioria
implementaesaindapermitequevocaltereovalordeliberadamente,embora,por
passandopelodepurador.

14.18religaovariveisespeciais
GrandepartedaterminologiadeLispparavariveisumresquciodosdiasemque
escopodinmicoeraanorma.Porrazeshistricasalgunsescritoresfalamsobre
''Vinculativoumavarivel''quandoqueremdizer''criarumanovavarivel.''Masaspessoas
tambmdizem''dasvariveisnoligado''quandoqueremdizer''varivelnoatribuda.''
Vinculativonoserefereestritamenteatribuioqueumadasprincipaisfontes
deconfusoterminolgicaemLisp.variveislexicaisnoglobaissempretm
valores,maspossvelparavariveisglobaisouespeciaisdeexistirsemumvalor.
Novamosentraremdetalhesarcanosdoquenestelivro.
Temosevitadoaconfusoatagorapelarecusandoseausarotermo''ligao''
detodo.Nestaseofinal,introduzirotermo''religao"parasereferir
criaodeumanovavarivelespecialcomomesmonomequeoantigo.Enquanto
anovavarivelestnaexistncia,todososusosdessenomeemqualquerpartedoprograma
vaisereferiraele(amenosqueonomerecuperarmaisumavez),eoanterior
varivelcomessenomeserinacessvel.Estritamentefalando,nosomos
religaoqualquervarivel:Nsestamosreligaodinamicamenteonome,tornandose
referemsetemporariamenteparaumavariveldiferente.
Lispcomumcontmalgumasvariveisespeciaisembutidos.Alguns
estescontrolarocaminhodeentrada/sadatratado.Porexemplo,avarivel
*PRINTBASE*usadopeloformatoeoutrasfunesparadeterminaro
debasenaqualosnmerosestoparaserimpressos.Normalmenteelessoimpressosembasede

pgina453

CAPTULO14MacroseCompilao

CAPTULO14MacroseCompilao441
dez.Nspodemosreligardinamicamente*PRINTBASE*paraimprimirnmerosnaoutra
bases.Umavezquejestdeclaradoespecial,nsnotemqueDefVarlo.Para
religarlo,nssimplesmenteinclulonalistadeargumentosdanossafuno.
(Defunprintinbase(*printbasex*)
(Formatot"&DestescritoSnabasedeD."
xx*impressodebase*))
>(Printinbase10205)
205estescrito205embase10.
NADA
>(Printinbase8205)
205315escritonabase8.
NADA
>(Printinbase2205)
205estescrito11.001.101nabase2.
NADA
NstambmpodemosreligarvariveisespeciaisusandoLET,comoPPMXrebotea
varivel*PRINTCIRCLE*.Quandoumavarivelespecialrecuperar,qualquer
atribuies,noimportaondeelesocorremnoprograma,vaiafetaronovo
varivel,nooantigo.Noexemploaseguir,quandoCOLISOFOO
chamadonocorpodoLETdentroREBINDFOO,eleincrementaadinmica
*varivelchamadaFOO*quefoiestabelecidopeloLET.Quandoelachamada
foradoLET,eleincrementaavarivelglobal*FOO*.Se**FOOteve
notenhasidodeclaradaespecial,bumpVARsempreacessaromundial
*FOO*.
(DefVar*foo*2)
(Defunbumpfoo()
(INCF*foo*))
(Defunreligarfoo()
(Bumpfoo)
(Showvar*foo*)
(Vamos((*foo*100))
(Formatot"eDigiteoLET...%")
(Showvar*foo*)
(INCF*foo*)

(Showvar*foo*)
(Bumpfoo)
(Showvar*foo*)

pgina454

442

CommonLisp:AGentleIntroduoComputaoSimblica
(Formatot"eDeixeoLET.%"))
(Bumpfoo)
(Showvar*foo*))
>(Religarfoo)
Ovalorde*FOO*3
DigiteoLET...
Ovalorde*FOO*100
Ovalorde*FOO*101
Ovalorde*FOO*de102
DeixeoLET.
Ovalorde*FOO*4
NADA
Religaodevariveisespeciaismaistilquandodiferentespartesdeum
grandenecessidadeprogramaparacomunicarunscomosoutros,einformaoquepassa
atravsdeargumentosextrasparafunesimpraticvel.Escrevendorealmentegrandesprogramas
requerumconjuntodiferentedehabilidadesdoqueoqueestelivroenfatizaumaboa
tpicoparaumcursodeLispavanado.
FunesdescritasTPICOSAVANADOS

DEFMACRO:o&listalambdaCORPOpalavrachave.
Declaraes:DefVar,DEFPARAMETER,DEFCONSTANT.

pgina455

ApndiceA
AferramentaSDRAW

AferramentaSDRAWfornecetrsfunesemnveldeusurio:SDRAW,SDRAW
LOOP,eRabisco.SDRAWpegaumalistacomoentradaechamaa
diagramadapilhacontrascorrespondentenovisor.implementosSDRAWLOOP
umaleituraevaldrawcircuitosemelhanteaoloopdeleituraevalprintnormal.rabisco
usadoparainterativamente''crawlemtornode''naestruturadalista,tendosucessiva
CARseCDRs.EleusaSDRAWparaexibiraposioatualnalista.
Consulteapgina186paraobterexemplos.
AversogenricadoSDRAWmostradoaquiirfuncionaremqualquerlegal
implementaoLispcomum.It''chama''clulascontrasemitindoum
sequnciadecaracteresapropriado.versesmaissofisticadasdoSDRAWparaum
variedadedeimplementaesLispcomunsestodisponveisemdisqueteapartirdo
editor.AlgumasdessasversesdesenharclulascontrasusandoogrficoIBMPC
conjuntodecaracteres.Outros,projetadoparaosistemaXWindows,utilizefunesCLX
paraproduzirgrficosdebitmap.
Duasobservaessobreaexecuo:Primeiro,osoftwareviveempacote
SDRAWeusaSOMBREAMENTOIMPORTparainjetaroSDRAWsmbolos,
SDRAWLOOP,erabiscarnopacotedousurio.Issopodeserdesativado
apagandoasquatroprimeirasformasnoarquivo.Emsegundolugar,afunoSDL1(partedo
SDRAWLOOP)usaHANDLERCASEaerrosdeavaliaoarmadilha.
HANDLERCASEpartedonovosistemacondiorecentementeadicionado
padroLispcomum.NemtodasasimplementaesapoiarHANDLERCASE
ainda.Senecessrio,vocpodesubstitulocomIGNOREERROS,ouqualquerquesejao
funoequivalentechamadoemsuaimplementao.

A1

pgina456

A2

CommonLisp:AGentleIntroduoComputaoSimblica

*Mode:LispPacote:SDRAW*

SDRAWdesenhaestruturascelularescontras.
Dolivro"CommonLisp:AGentleIntroduo

ComputaoSimblica",deDavidS.Touretzky.
TheBenjamin/CummingsPublishingCo.,1989.

rotinasdenveldeusurio:
(ObjSDRAW)desenhaobjnoterminal
(SDRAWLOOP)colocaousurioemumloopreadevaldraw
(Objrabisco)interativamenterastejarobj
(Inpackage"SDRAW")
(Exportao'(sdraw::sdrawsdraw::sdrawcircuitosdraw::rabisco))
(Sombreamentoimport"(sdraw::sdrawsdraw::::sdrawrabiscosdrawcircular)
(Encontrarpackage"USURIO"))

Osparmetrosseguintessoexpressasemunidadesdecaracteres(horizontal)
e(linhasverticais).ElesseaplicamatodasasversesdoSDRAW,

masseusvalorespodemalterarseclulascontrasestosendodesenhadocomo
bitmapeiaemvezdesequnciasdecaracteres.
(Defparameter*sdrawdisplaywidth*79.)
(Defparameter*sdrawhorizontaltomocutoff*79.)
(Defparameter*sdrawHorizontalconscutoff*65.)
(Defparameter*etcstring*"etc.")
(Defparameter*circstring*"circ.")
(Defparameter*etcespaamento*4.)
(Defparameter*circspacing*5.)
(Defparameter*intertomohespaamento*3.)
(Defparameter*constomohsetalength*9.)
(Defparameter*interconsvsetalength*3.)
(Defparameter*consvsetaoffsetlimite*2.)
(Defparameter*consvsetaoffsetvalor*1.)
(Defparameter*sdrawverticalcutoff*22.)
(Defparameter*sdrawnumlinhas*25)
(DefVar*linhaterminaes*(makearray*sdrawnumlinhas*))

pgina457

A3
APNDICEAOFerramentaSDRAW

SDRAWedefiniessubordinados.
(Defunsdraw(obj)
(Preencha*linhaterminaes*maisnegativoFixnum)
(Drawestrutura(struct1obj00nil))
(valores))
(Defunstruct1(objlinharootcolobjmemory)
(Cond((tomoobj)
(Structprocessotomo(formatonil"S"obj)linharootcol))
((Membroobjobjmemria:teste#'eq)
(Structprocessocirclinharootcol))
((>=Fileira*sdrawverticalcutoff*)
(Structprocessoetclinharootcol))
(T(processostructcontrasobjlinharootcol
(Consobjobjmemria)))))
(Defunstructprocessotomo(tomodecordalinharootcol)
(Vamos*((startcol(structencontrarstartlinharootcol))
(Fimcol(+startcol(comprimentotomodecorda))))
(Cond((<endcol*sdrawhorizontaltomocutoff*)
(Structrecordposiodelinhaendcol)
(Listade'linhatomodestartcoltomodecorda))
(T(structprocessoetclinharootcol)))))
(Defunprocessostructetc(linharootcol)
(Vamos((startcol(structencontrarstartlinharootcol)))
(Structrecordposition
linha
(+Startcol(comprimento*etcstring*)*etcespaamento*))
(Listade'linhamsginiciarcol*etcstring*)))
(Defunstructprocessocirc(linharootcol)
(Vamos((startcol(structencontrarstartlinharootcol)))
(Structrecordposition
linha
(+Startcol(comprimento*circstring*)*circspacing*))
(Listade'linhamsginiciarcol*circstring*)))

pgina458

A4

CommonLisp:AGentleIntroduoComputaoSimblica

(Defunprocessostructcons(objlinharootcolobjmemory)
(Vamos*((consstart(structencontrarstartlinharootcol))
(Carestrutura
(Struct1(objcarro)
(+Row*interconsvsetalength*)
consstartobjmemria))
(Startcol(terceirocarroestrutura)))
(If(>=startcol*sdrawHorizontalconscutoff*)
(Structprocessoetclinharootcol)
(Lista'contraslinhastartcolcarroestrutura
(Struct1(cdrobj)row
(+Startcol*hsetalengthconstomo*)
objmemria)))))
(Defunstructencontrarstart(linharootcol)
(Maxrootcol(+*intertomohespaamento*
(Aref*Alinhaterminaes*linha))))
(Defunstructrecordposition(linhaendcol)
(Setf(aref*Alinhaterminaes*linha)endcol))

SDRAWLOOPedefiniessubordinados.
(Defparameter*sdrawloopprontastring*"S>")
(Defunsdrawloop()
"Leiaevalprintloopusandosdrawparaexibirosresultados."
(Formatot"eDigitequalquerexpressoLisp,ou(abort)parasair.%%")
(Sdl1))

pgina459

A5
APNDICEAOFerramentaSDRAW
(Defunsdl1()
(circular
(Formatot"&A"*sdrawlooppromptdecorda*)
(Vamos((forma(leia)))
(Setf+++++

+++
+
Formato)
(Vamos((resultado(valorlistamltipla
(Manipuladordecasos(formaeval)
(Erro(condx)condx)))))
(Typecase(primeiroresultado)
(Erro(resultadodeerrosdeexibiodeSDL))
(T(setf/////
///
/resultar
*****
***
*(Primeiroresultado))
(DisplaydeSDLresultado*)))))))
(DefunvisordoSDLresultado(resultado)
(Vamos*((*printcrculo*t)
(*Impressodecomprimento*nil)
(*Denveldeimpresso*nil)
(**Nilimpressobonita)
(Fulltext(formatonil"Resultado:S"resultado))
(Texto(if(>(comprimentofulltext)
*Sdrawdisplaywidth*)
(Stringconcatenar'
(Subseqfulltext0(*sdrawdisplaywidth*4))
"...)")
textocompleto)))
(Resultadosdraw)
(If(resultadoconsp)
(Formatot"%A%"text))
(Terpri)))
(DisplaydeSDLdeerrosdefun(erro)
(Formatot"A%%"erro))

pgina460

A6

CommonLisp:AGentleIntroduoComputaoSimblica

Rabiscoedefiniessubordinados.
(Defparameter*rabiscodepromptdecorda*"Rabisco>")
(DefVar*rabiscoobjeto*nil)
(DefVar*rabiscocorrenteobj*)
(DefVar*extraindosequence*nil)
(Defunrabisco(obj)
"Leiaevalprintloopparaviajaratravsdelista"
(Formatot"&Crawlpormeiodalista:'H'paraajuda,'Q'parasair%%.")
(Setf*rabiscoobjeto*obj)
(Setf*rabiscocorrenteobjobj*)
(Setf*extraindosequence*nil)
(Objsdraw)
(Scrawl1))
(Defunscrawl1()
(circular
(Formatot"&A"*rabiscodepromptdecorda*)
(Vamos((comando(leiamaisculachar)))
(Comandodecaso
(#\A(rabiscocarcmd))
(#\D(rabiscocdrcmd))
(#\B(rabiscobackupcmd))
(#\S(rabiscostartcmd))
(#\H(visualizaorabiscoajuda))
(#\Q(regresso))

(T(visualizaorabiscoerro))))))
(Defunrabiscocarcmd()
(Cond((consp**rabiscocorrenteobj)
('Extraodeseqnciacar*empurro*)
(Setf*rabiscocorrenteobj*(car*rabiscocorrenteobj*)))
(T(tformato
"&NopodetomarcarroouCDRdeumtomo.UseBparafazerobackup.%")))
(Visualizaorabiscoresultado))

pgina461

A7
APNDICEAOFerramentaSDRAW
(Defunrabiscarcdrcmd()
(Cond((consp**rabiscocorrenteobj)
(Push'cdr*extraindosequence*)
(Setf*rabiscocorrenteobj*(cdr*rabiscocorrenteobj*)))
(T(tformato
"&NopodetomarcarroouCDRdeumtomo.UseBparafazerobackup.%")))
(Visualizaorabiscoresultado))

(Defunrabiscobackupcmd()
(Cond(*extraodeseqncia*
(Pop*extraindosequence*)
(Setf*rabiscopresenteOBJ*
(Extratoobj*extraindosequence**rabiscoobjeto*)))
(T(formatot"ejnoinciodoobjeto.")))
(Visualizaorabiscoresultado))
(Defunrabiscostartcmd()
(Setf*rabiscocorrenteobj***rabiscoobjeto)
(Setf*extraindosequence*nil)
(Visualizaorabiscoresultado))
(Defunextratodeobj(seqobj)
(Reduzirfuncall'#
seq
:Objdevalorinicial
:Apartirdetfinal))
(Defunobtercar/cdrstring()
(Se(null*extraodeseqncia*)
(Formatonil"'S
(Formatonil"(carro'S
(Mapa'string#'(lambda(x)
(Ecasex
(Carro#\a)
(Cdr#\d)))
*Extraodeseqncia*)
*Rabiscoobjeto*)))

pgina462

A8

CommonLisp:AGentleIntroduoComputaoSimblica

(Defunvisorrabiscoresultado(&aux(*printpretty*nil)
(*Impressodecomprimento*nil)
(*Denveldeimpresso*nil)
(*Printcrculo*t))
(Vamos*((extratodecorda(getcarro/cdrstring))
(Texto(if(>(extratodecorda)*sdrawdisplaylarguracomprimento*)
(Stringconcatenar'
(Subseqextratodecorda0
(*Sdrawdisplaywidth*4))
"...)")
extratodecorda)))
(Sdraw*rabiscocorrenteobj*)
(Formatot"&%A%%"text)))
(Defunvisorrabiscoajuda()
car:(Umformatodet"ecomandoslegais)
D)cdrB)fazerbackup%")
(Formatot"&
S)iniciarQ)sairH)ajuda%"))
(Defunvisordorabiscodeerros()
(Formatot"comando&ilegal.%")
(Visualizaorabiscoajuda))
(Defunleituramaisculachar()
(Vamos((resposta(leialine)))
(E(plusp(respostadecomprimento))
(Charupcase(charresposta0)))))

pgina463

A9
APNDICEAOFerramentaSDRAW

Asdefiniesaseguirsoespecficosparaaimplementaotty.
(Defparameter*consstring*"[*|*]")
(Defparameter*conscellflatsize*5.)
(Defparameter*consharrowshaftchar*#\)
(Defparameter*conshsetachar*#\>)
(Defparameter*consvline*"|")
(Defparameter*ContraV*pontadeseta"V")

(DefVar*TextLinearray*(makearray*sdrawnumlinhas*))
(DefVar*TextLinecomprimentos*(makearray*sdrawnumlinhas*))
(Eval,quando(cargaeval)
(Dotimes(i*sdrawnumlinhas*)
(Setf(aref*TextLinearray*i)
(Makearray*sdrawdisplaywidth*
:Elementodotipo'stringchar))))
(DefunCharBLT(stringlinhastartcol)
(LET((OEP(Aref*TextLinecomprimentos*linha))
(Linha(aref*TextLinearray*linha)))
(Fazer((ispos(1+i)))
((>=Istartcol))
(Setf(areflinhai)#\Space))
(Substituastringline:Incio1iniciarcol)
(Setf(aref*TextLinecomprimentos*linha)
(+Startcol(cadeiadecomprimento)))))
(Defundrawestrutura(sentidos)
(Preencha*TextLinecomprimentos*0.)
(followdireesdirees)
(Despejodisplay))
(defunfollowindicaes(dirseopcionalestcar)
(Ecase(dirsdeautomveis)
(contras(chamamconsdirs))
((tomomsg)(drawmsg(segundadirs)
(Terceirodirs)
(Quartadirs)
carro))))

pgina464

A10

CommonLisp:AGentleIntroduoComputaoSimblica

(Defundesenharcons(obj)
(Vamos*((linha(segundaobj))
(Col(terceiroobj))
(Carcomponente(quartaobj))
(CDRcomponente(quintaobj))
(Linha(aref*TextLinearray*linha))
(Hsetastart(+col*conscellflatsize*))
(HsetaCol(1(terceiraCDRcomponente))))
(Charbltlinhacol*consstring*)
(Fazer((ihsetastart(1+i)))
((>=Ihsetacol))
(Setf(linhaArefi)*consharrowshaftchar*))
(Setf(linhahsetacol)*conshsetacharAref*)
(Setf(aref*TextLinecomprimentos*linha)(1+hsetacol))
(CharBLT(+linha1)(+col1)**consvline)
(CharBLT(+linha2)(+col1)*consvflecha*)
(Followindicaestcarrocomponente)
(CDRcomponentedireesacompanhamento)))
(Defundesenharmsg(linhacadeiacolcar)
(Linhadecharblt
(+Col(se(ecar
(<=(Cadeiadecomprimento)
*Consvdeslocamentosetalimite*))
*Valordedeslocamentoconsvseta*
0))
corda))
(Defundespejodisplay()
(Terpri)
(Dotimes(i*sdrawnumlinhas*)
(Vamos((len(aref*TextLinecomprimentos*i)))
(Se(plusplen)
(Formatot"&A"

(Subseq(aref*TextLinearray*i)0len))
(Nilretorno))))
(Terpri))

pgina465

ApndiceB
AferramentaDTrace

DTraceforneceumaexibiotraomaisdetalhadadoqueamaioriafabricante

implementaesfornecidosderastrear.Oprogramaexportaduasfunes,
DTraceeDUNTRACE,cujasintaxeamesmaqueTRACEe
Untrace,respectivamente.Consulteapgina217etodooCaptulo8paraexemplos.
AversogenricadoDTracemostradoaquicontmapenasum
funodependentedaimplementao:fetchArglist.BUSQUEArglist
levaumsmbolocomoentradaeretornaalistadeargumentosdafunonomeadapor
essesmbolo.VersesdoDTraceparavriasimplementaesLisp,com
apropriadasfunesfetchArglist,estodisponveisemdisqueteapartirdo
editor.Algumasdessasversestambmproduzemmelhorsadadoqueogenrico
verso,porexemplo,usandoocaracteregrficoIBMPCconfiguradoparadesenhar
setas.
ParaproduzirumaversodoDTraceparaumanovaimplementaoLisp,vocvai
temquedescobrircomoextrairinformaeslistadeargumentosapartirdeclulasdefuno
listase/oupropriedade.Verosexemplosnofinaldoprograma.Vocpode
tambmdefinemfetchArglistparasimplesmenteretornarNIL,emqueargumentosdecaso
vaiserexibidocomoArg1,Arg2,eassimpordiante.
UmaoutranotasobreosoftwareDTrace:elaviveemDTracepacote,
eusaSOMBREAMENTOIMPORTparainjetaroDTracesmbolose
DUNTRACEnopacotedousurio.Issopodeserdesativadoexcluindoo
primeirosquatroformasnoarquivo.

B1

pgina466

B2

CommonLisp:AGentleIntroduoComputaoSimblica

*Mode:LispPacote:DTrace*
DTraceumaalternativaporttilparaoLispTRACEeuntraceComum
macros.Eleofereceumavisualizaomaisdetalhadadoqueamaioriadasferramentasderastreamento.

Dolivro"CommonLisp:AGentleIntroduo

ComputaoSimblica",deDavidS.Touretzky.
TheBenjamin/CummingsPublishingCo.,1989.

rotinasdenveldeusurio:
DTracemesmasintaxequeTRACE
DUNTRACEmesmasintaxequeuntrace
(Inpackage"DTrace":utilizao"("LISP"))
(Exportao'(dtrace::dtracedtrace::duntrace
*Dtraceprintlength**printlevelDTrace*
*Dtraceprintcrculo**dtraceprintpretty*
*Dtraceprintarray*))
(Sombreamentoimport"(dtrace::dtracedtrace::duntrace)(encontrarpackage"USURIO"))
(Packageuso"DTrace""USURIO")

DTraceerotinassubordinadas.
(Defparameter*dtraceprintlength*7)
(Defparameter*printlevelDTrace*4)
(Defparameter*dtraceprintcrculo*t)
(Defparameter*dtraceprintpretty*nil)
(Defparameter*dtraceprintarray**printarray*)
(DefVar*traadasfunes*nil)
(DefVar*nvelderastreio*0)

(Dtracedefmacro(efunonomesdedescanso)
"Ativaorastreamentodetalhadoparafunesespecificadas.DesfazercomDUNTRACE."
(If(nulosfunonomes)
(Listadecotao'*traadasfunes*)
(Listade'quote(mapcan#'dtrace1funonomes))))

pgina467

B3
FerramentaANEXOBODTrace
(Defundtrace1(nome)
(Amenosque(nomesymbolp)
(Formato*errodesada*"&Sumnomedefunoinvlida."Nome)
(Retornodezerodtrace1))
(Amenosque(nomefboundp)
(Formato*errodesada*"&funoindefinidaS."Nome)
(Retornodezerodtrace1))
(Eval'(untrace,nome))
seelesestotraandolo,desfazersuatrace
(Duntrace1nome)
seestamostraandolo,desfazeronossotrao
(Quando(nomeespecialformp)
(Formato*errodesada*
"&NopossveltraarSporqueumaformaespecial."nome)
(Retornodezerodtrace1))
(If(nomedamacrofuno)
(Nometracemacro)
(Nomefunoderastreamento))

(Setf*traadasfunes*(*nconctraadasfunes*(nomedalista)))
(listadenomes))
AsfunesabaixoderefernciarotinasDISPLAYxxxquepodemserfeitas
implementaoespecficaparagrficosextravagantes.versesgenricasde
essasrotinassodefinidosmaisadiantenestearquivo.
(Funoderastreamentodefun(nome)
(Vamos*((formalarglist(nomefetcharglist))
(Olddefn(nomefunosmbolo))
(Newdefn
#'(Lambda(&argumentodalistaderepouso)
(Vamos((resultadozero))
(Nomedeexibiofunoentrada)
(Vamos((*nvelderastreio*(1+*nvelderastreio*)))
(comdtraceprinterconfiguraes
(Showfunoargsargumentodalistaformaldearglist))
(Resultadosetf(valorlistamltipla
(Aplicarolddefnargumentodalista))))
(Resultadonomefunodeexibioderetorno)
(Resultadovaloreslist)))))
(Setf(obteronome"originaldefinio)olddefn)
(Setf(obteronome'traoudefinio)novadefn)
(Setf(obteronomedo"tiposeguido)'defun)
(Setf(nomefunosmbolo)novadefn)))

pgina468

B4

CommonLisp:AGentleIntroduoComputaoSimblica

(Defuntracemacro(nome)
(Vamos*((formalarglist(nomefetcharglist))
(Olddefn(nomedamacrofuno))
(Newdefn
#'(Lambda(macroargsenv)
(Vamos((resultadozero))
(Nomefunodeexibiodeentradademacro')
(Vamos((*nvelderastreio*(1+*nvelderastreio*)))
(comdtraceprinterconfiguraes
(showfunoargsmacroargsformaldeArglist))
(Resultadosetf(funcallolddefnmacroargsenv)))
(Nomefunodeexibioderetorno(resultadodalista)'macro)
(Valoresresultar)))))
(Setf(obteronome"originaldefinio)olddefn)
(Setf(obteronome'traoudefinio)novadefn)
(Setf(obteronomedo"tiposeguido)'defmacro)
(Setf(nomedamacrofuno)novadefn)))
(Defunshowfunoargs(Efetivosformals&opcional(argcount0))
(Cond((reaisnulos)nil)
((Formalsnulos)(pegaargsnumericamentefactuaisargcount))
(T(caso(primeirosformals)
(&opcionais(showfunoargs
reais(Restoformals)argcount))
(Edelazer(showfunoargs
(Listadereais)(descansarformals)argcount))
(&Key(punhopalavrachaveargsreais))
(&AUX(funomostraargsreaisnilargcount))
(T(pegaumarg(primeirareais)(primeirosformals))
(Funoshowargs(valoresreaisdedescanso)
(Descansarformals)
(1+argcount)))))))
(Defunpegaargsnumericamente(actualsargcount)
(Dolist(xreais)
(ArgcountINCF)
(Displayargnumricoxargcount)))
(Defunpegaumarg(valvarspec)

(Cond((tomovarspec)(visualizaoumargvalvarspec))
(T(visualizaoumargval(primeiravarspec))
(Se(terceirovarspec)
(Visualizaoonatarg(terceirovarspec))))))

pgina469

B5
FerramentaANEXOBODTrace
(Defunpegachaveargs(valoresreais)
(Cond((reaisnulos))
((Keywordp(primeirareais))
(Visualizaoumarg(segundareais)(primeirareais))
(Pegachaveargs(repouso(valoresreaisdedescanso))))
(t(displayoneargreais"argumentosadicional:")))))

DUNTRACEerotinassubordinadas.
(Duntracedefmacro(efunonomesdedescanso)
"Desligaorastreamentoparafunesespecificadas.
Semargumentos,desligatodootraado."
(Setf*traodenvel*0)precauodesegurana
(Citaolist'
(mapcan#'duntrace1(oufunonomes*traadasfunes*))))

(Defunduntrace1(nome)
(Amenosque(nomesymbolp)
(Formato*errodesada*"&Sumnomedefunoinvlida."Nome)
(Retornodezeroduntrace1))
(Setf*traadasfunes*(apagarnome*traadasfunes*))
(Vamos((origdefn(obteronomedenenhum"originaldefinio'))
(Defnrastreada(obteronome'traoudefinio))
(Tiporastreada(obteronome'dotiporastreada'none)))
(Amenos(ou(eqorigdefn'none)
(No(nomefboundp))
(No(igualtraoudefnelefoipararredefinido?
(Tiporastreadaecase
(Defun(nomefunosmbolo))
(Defmacro(nomedamacrofuno))))))
(Tiporastreadaecase
(Defun(setf(nomefunosmbolo)origdefn))
(Defmacro(setf(nomedamacrofuno)origdefn)))))
(Nomeremprop'traoudefinio)
(Nomeremprop"tiposeguido)
(Nomeremprop"originaldefinio)
(listadenomes))

pgina470

B6

CommonLisp:AGentleIntroduoComputaoSimblica

rotinasdeexibio.

Ocdigoaseguirgerasadacarterdebaunilhaparaaordinria
exibida.Elepodesersubstitudoporcdigodegrficosespeciaisseo
autorizaesdeexecuo,porexemplo,emumPC,vocpodeusarogrficoIBM
conjuntodecaracteresparadesenharsetasmaisagradveisparaofuturo.EmumacorPCvoc
podeusarcoresdiferentesparasetas,paranomesdefuno,por
valoresdeargumento,eassimpordiante.
(Defmacrocomdtraceimpressoradefinies(ecorpocorpo)
'(Deixe((*impressodecomprimento**dtraceprintlength*)
(*Denveldeimpresso**printlevelDTrace*)
(*Printcrculo**dtraceprintcrculo*)
(*Impressomuito**dtraceprintpretty*)
(*Printarray**dtraceprintarray*))
,@corpo))
(Defparameter*entrysetastring*"")
(Verticalstringdefparameter**
"|
(Defparameter*sadadesetastring*"\\")

")

(Defparameter*traceenvolvente*15)
(Defunexibioemfunodeentrada(nomeeftypeopcional)
(Espaoover)
(Drawentryseta)
(Formato*traceoutput*"EnterS"name)
(If(eqftype'macro)
(Formato*traceoutput*"macro")))
(Defunvisoronearg(nomeval)
(Espaoover)
(*Traceformatodesada*
(Nometypecase
(Palavrachave"SS")
(String"AS")
(t"S=S"))
NomeVal))
(Defunvisorargnumrico(numval)

(Espaoover)
(Formato*traceoutput*"ArgD=S"numval))

pgina471

B7
FerramentaANEXOBODTrace
(exibioemfunoderetornoDefun(resultadosdenomeeftypeopcional)
(comdtraceprinterconfiguraes
(Espaoover)
(Drawsadadeseta)
(Formato*traceoutput*"SA"
nome
(If(eqftype'macro)"expandiusepara""retornado"))
(Cond((resultadosnulos))
((Null(resultadosdedescanso))
(Formato*tracesada*"S"(primeirosresultados)))
(T(formato*tracesada*"valores{S,}s"
(Resultados)butlast
(carro(ltimosresultados)))))))
(Defunespaoover()
(Formato*traceoutput*"&")
(Dotimes(i(mod*traodenvel**traceenvolvente*))
(Formato*traceoutput*"A"*verticalstring*)))
(Defunchamaraentradadeseta()
(Formato*traceoutput*"A"*entrysetastring*))

(Defundrawsadadeseta()
(Formato*traceoutput*"A"*sadadesetastring*))

AfunofetchArglistdependentedeimplementao.isto
retornaalistaargumentoformaldeumafunocomoseria
apareceremumaexpressoDefunoulambda,incluindoqualquerlambda
Listadepalavraschave.AquiestoasversesdofetchArglistparatrs
implementaesLisp.
versoLucid
#+LUCID
(Defunfetcharglist(fn)
(Sistema::fnarglist))

pgina472

B8

CommonLisp:AGentleIntroduoComputaoSimblica

GCLispverso3.1
#+GCLISP
(Defunfetcharglist(nome)
(Vamos*((s(sys:nomelistalambda))
(As(leiadecorda)))
(Ses
(If(EQL(elts0)#\novalinha)
(Editarglist(descansara))
uma))))
#+GCLISP
(Defuneditarglist(arglist)
(Vamos((resultadozero)
(Nopalavraschaveignorenil))
(Dolist(argarglist(resultadonreverse))
(Amenos(eskipnopalavraschave
(Symbolparg)
(Not(keywordparg)))
(Resultadoargpush))
(If(eqarg'&key)(setfskipnopalavraschavet)))))
versoCMUCommonLisp.Estaversoolhaemumsmbolode
clulafunoesabecomotirarfechamentosalmlexicais
eobjetosdecdigocompiladoencontradosl.
#+CMU
(Defunfetcharglist(x&opcionalOriginalx)
(Cond((symbolpx)(fetcharglist(funosmbolox)x))
((Compiladofunopx)
(Leiadecorda
(lisp::%primitivoscabealhorefx
lisp::%defunoArgnomesslot)))
((Listpx)(caso(primeirox)
(Lambda(segundox))
(Lisp::%lxicofechamento%(fetcharglist(segundox)))
(Sistema:macro'(&descansar"Form="))
(T'(&descansar"Arglist:"))))
(T(cerror(nilformato
"UsarumalistadeargumentospadrorazovelparaS"
Originalx)
"ObjetoUnkownnaclulafunodeS:S"originalxx)
'())))

pgina473

ApndiceC
Respostasaosexerccios

CAPTULO1RESPOSTAS
1.1.

13

12

3
4

16

ABS

4
3

C1

pgina474

C2

CommonLisp:AGentleIntroduoComputaoSimblica

48

15

5/3

2/3

8
0

5
6

1
1/3

ABS

1.2.

Smbolos:AARDVARK,canalizao,123GO,ZEROP,ZERO,
DEZESSETE.Nmeros:87,1492,3.14159265358979,22/7,0,12.

pgina475

ANEXOCRespostasaosexercciosC3
1.3.

<

11

12

ODDP

KIRK
IGUAL
SPOCK

DOZE

numberp

<

ZEROP

9
IGUAL
9

pgina476

C4

CommonLisp:AGentleIntroduoComputaoSimblica

T
IGUAL
NADA

SUB2:

1.4.

SUB1

SUB1

TWoP:

1.5.

SUB2

ZEROP

METADE:

1.6.

/
2

pgina477

ANEXOCRespostasaosexercciosC5

METADE:

*
0,5

VriosdgitosP:

1.7.

>
9

1.8.
1.9.

Afunocalculaanegaodeumnmero,poroutraspalavras,ela
mudaosinaldepositivoparanegativoeviceversa.
TWOMOREP:

IGUAL

ADD2

pgina478

C6

CommonLisp:AGentleIntroduoComputaoSimblica
1.10.

TWOMOREP:

SUB2

IGUAL

MDIA:

1.11.

1.12.

METADE

MaisqueHALFP:

>

METADE

1.13. AfunosempreretornaT,umavezqueasadadonumberp(ouT
ouNIL)sempreumsmbolo.

pgina479

ANEXOCRespostasaosexercciosC7
1.14.
NADA

NO

12

NO

NADA

NO

NO

NADA

NOONEP:

1.15.

IGUAL
1

1.16.

NOPLUSP:

NO

>

NO

pgina480

C8

CommonLisp:AGentleIntroduoComputaoSimblica
EVENP:

1,17.

ODDP

NO

1.18. OpredicadoretornaTsomentequandosuaentrada2.
1.19. DafunogeraNILquandosuaentradanulo.Todasasoutrasentradas,
incluindoTenabo,resultamemumaproduodeT.
XOR:

1.20.

IGUAL

NO

1.21. (A)AsadadeZEROPserTouNIL,queoerrado
tipodeentradaparaADD1.(B)EQUALexigeduasentradas.(C)nopode
saceitamumaentrada.
1,22. Todosospredicadossofunes.Nemtodasasfunessopredicados,umavezqueno
todasasfunesderespondersimounoaperguntas.
1,23. Igual,nao,<e>sopredicadoscujosnomesnoterminamem''P''.
1,24. Nmerosesmbolossoambossmbolos.Nemumnmero.
1,25. OsmboloFALSEverdadeemLisp,porquenonula.
1,26. (A)Falso:ZEROPnoaceitaTouNILcomoentrada.(B)verdade:todoo
predicadosestudadasatagoraproduzirTouNILcomosada.Lisptem
apenasalgumasexcepesaestaregra.

pgina481

ANEXOCRespostasaosexercciosC9
1.27.
T

EVENP

Erro!inputtypeerrado.

EVENP

Erro!Nmeroerradodeentradas.

2
3

CAPTULO2RESPOSTAS
2.1.
NADA
PARA
2.2.

ESTAR

OU

NO

PARA

Bemformado:asegundalista,((A)(B)),oquinto(A(B(C))),eo
sexta,(((A)(B))(C)).

2.3.

NADA
PORFAVOR

NADA
ESTAR

2.4.

ESTAR

MEU

((CURVASSETAS)(FLORESCHOCOLATES)).

NAMORADOS

2.5.

Seis,trs,quatro,quatro,cinco,seis.

2.6.

parnteseForm
()
(())
((()))
(()())
(()(()))

CorrespondenteNILFormulrio
NADA
(NADA)
((NADA))
(NILNIL)
(NIL(NIL))

pgina482

C10

CommonLisp:AGentleIntroduoComputaoSimblica
2.7.

Dentrodomeusegundo,aentradaparaREST(HONKSEVOCGOSTA
Gansos).Asada,(sevoccomogansos),formaaentradapara
PRIMEIRO,quegeraosmboloIF.

2.8.

MYTERCEIRA:

DESCANSAR

DESCANSAR

PRIMEIRO

2.9.

MYTERCEIRA:

DESCANSAR

SEGUNDO

2.10. OCARde(((telefonedecasa)))((telefonedecasa)),eoCDR
NIL.
NADA
NADA
NADA
TELEFONE

pgina483

CASA

C11
ANEXOCRespostasaosexerccios
2.11.
NADA
UMA

NADA

NADA

PEDGIO

NADA
LIGAR

2.12. CADDDRretornaoquartoelementodeumalista.pronunciado
''KaDIHDIHder''.
2.13. FUNoCAAARNOoCAADROoCADADRSUN
oCAADDR.
2.14. CAADRde((cuboazul)(REDPYRAMID))vermelho.Masse
lerasComoeDsnadireoerrada(daesquerdaparaadireita),gostaramos
levarocarrodalista,emseguida,levarocarrodeque,emseguida,tomara
CDRdeque.Oprimeirocarrovoltaria(AZULCUBE),ocarrode
queseriaazul,eoCDRdequecausariaumerro.
2.15. Funo
CARRO
CDDR
CADR
CDAR
CADAR
CDDAR
CAAR
CDADDR
CADADDR

Resultado
(AB)
((FE))
(CD)
(B)
B
NADA
UMA
(F)
F

2.16. CAARlevaocarrodocarro.Ocarro(FREDNIL)FRED,
enaRCAdequeprovocaumerro.

2.17.
(Noafixenenhumaconta)

CARRO

POSTAR

pgina484

C12

CommonLisp:AGentleIntroduoComputaoSimblica

(Noafixenenhumaconta)

((POSTNO)CONTAS)

(CONTAS)

CDR

(semcontas)

CARRO

(POSTNO)

CDR

NADA

CONTAS

CARRO

Erro!Noumalista.

(POST(semcontas))

CDR

((semcontas))

(POST(semcontas))

CDR

NADA

CARRO

NADA

NADA

pgina485

C13
ANEXOCRespostasaosexerccios
2.18.

LISTOFTWO:

CONS

CONS
NADA

2.19.

FRED
E

LISTA

(FREDeWilma)

LISTA

(FRED(eWilma))

WILMA

FRED
(EWilma)

FRED
CONS

(FREDeWilma)

CONS

(NADA)

(EWilma)

NADA
NADA

pgina486

C14

CommonLisp:AGentleIntroduoComputaoSimblica

NADA
LISTA

(NILNIL)

LISTA

(NADA)

LISTA

(TNIL)

NADA
2.20.
NADA

T
NADA

T
CONS

(T)

CONS

((T))

NADA

(T)
NADA

(Emumaorelhae)
LISTA
(Foraosoutros)

((Emumaorelhae)
(Foraosoutros))

(Emumaorelhae)
CONS
(Foraosoutros)

pgina487

((Emumaorelhae)OUT
OOUTRO)

ANEXOCRespostasaosexerccios
C15
PARDEpares:

2.21.

LISTA

LISTA

LISTA

2.22.
DuoCONS:

PATRICK
CONS

SEYMOUR
CONS
(MARVIN)

pgina488

C16

CommonLisp:AGentleIntroduoComputaoSimblica
DOISMAISPROFUNDA:

2.23.

LISTA

LISTA

DOISMAISPROFUNDA:

CONS
NADA

NADA

CONS

2.24. AfunoCAAADR.
2.25. CONSsignifica''construir''.Eleconstrieretornaumanovacons
clula.
2.26. AprimeirafunoretornaocomprimentodeCDRdasuaentrada.o
segundafunoprovocaumerroporqueeletentatomaraCDRdeum
nmero(asadadecomprimento).
2.27. Listasaninhadasexigemmaisclulascontrasdoquealistatemelementosdenvelsuperior.
listasplanassempretemexatamentecomomuitasclulascontrascomoelementos.
2.28. Nopossvelescreverumafunoparaextrairoltimoelementodeumalistade
comprimentodesconhecidousandoapenasCAReCDR,porquensnosabemoscomo
muitasCDRdeusar.Afunoprecisacontinuaratomarsucessiva
CDRsatatingirumaclulacujoCDRnulaemseguida,eledeveretornar
CARdessaclula.VamosaprendercomofazerissonoCaptulo8.

pgina489

C17
ANEXOCRespostasaosexerccios

2.29.

UnrioADD1:
x
CONS

2.30. CDDRsubtraidoisdeumnmerounrio.
2.31. NULLopredicadoZEROPunrio.
2.32.

UnrioGREATERP:

COMPRIMENTO

>

COMPRIMENTO

2.33. CARretornaumvalorverdadeiroparaqualquernmerounriomaiordoquezero,porisso
oequivalenteunriodePLUSP.

pgina490

C18

CommonLisp:AGentleIntroduoComputaoSimblica
2.34.
UMA
CONS

(ABC.D)

B
CONS

C
CONS
D
2.35.

NADA

UMA

UMA
CONS
B

LISTA

((A.B)(C.D))

C
CONS
D
2.36. Marcarasclulasdeum,b,ec.Umavezqueclulasdepontosparaclulasb,eledeveter
foidepoisConsedclulasb,porquebteriadeserumdos
entradasparaCONSquandoaclulaumfoicriado.Porumraciocniosemelhante,clulasb

pgina491

C19
ANEXOCRespostasaosexerccios
devetersidoConsedapsclulac.Portanto,celularumdevetersido
Consedapsclulac.Mascelularcpontosparaacluladeum,porisso,umteriaqueter

foiConsedantesc,nodepois.Estacontradiorevelaquealista
Nopoderiatersidoconstrudausandoapenascontras.
CAPTULO3RESPOSTAS
3.1.

(not(iguala3(abs3)))nil

3.2.

(/(8+12)2)

3.3.

(+(*33)(*44))

3.4.

(82)
8avaliaa8
2avaliaa2
Entercomentradasde8e2
Resultadodade6
(Not(oddp4))
(Oddp4)
4avaliaa4
DigiteODDPcomentrada4
ODDPretornaNIL
DigiteNOcomNILentrada
ResultadodenoT
(>(*25)9)
(*25)
Digite*comentradas2e5
Oresultado*de10
Enter>comentradasde10e9
Resultadoda>T

pgina492

C20

CommonLisp:AGentleIntroduoComputaoSimblica

(No(igual5(+14)))
(Iguala5(1+4))
(1+4)
Digite+comentradas1e4
Oresultadode+5
DigiteEQUALcomentradas5e5
ResultadodaEQUALT
DigiteNOcomaentradaT
ResultadodenoNIL
3.5.

(Defunmetade(N)(N/2))
(Cubodefun(n)(*nnn))
(Defunonemorep(xy)
(Igualx(+y1)))

3.6.

(Defunpythag(xy)
(Sqrt(+(*xx)(*aa))))

3.7.

(defunmilhasporgalo
(Hodmetroleiturainicial
Finalodmetroleitura
galesconsumido)
(/(Finalodmetroleitura

Initialodmetroleitura)
galesconsumido))
3.8.

QUADRADO:

3.9.

(cons5(lista67))(567)
(cons5'(lista67))(5lista67)

pgina493

C21
ANEXOCRespostasaosexerccios
(Lista3'de9'd(93))
(3apartirde9d6)
(+(Comprimento"(1foo2moo))
(terceiro'(1foo2moo)))6

(Descanso"(conscurtoparaconstruo))
(curtoparaconstruo)
3.10. Oargumentodeterceirodevesercitado.
(Terceiro'(Aligeiraraposamarrom))
Smbolosutilizadoscomodadosdevemsercitados.
(Lista2'e2'4)
SemcotaoantesCOMPRIMENTO.
(+1(comprimento(listatttt)))
Listasutilizadascomodadosdevemsercitados.
(Cons'Patrick'(SeymourMarvin))
Smbolosutilizadoscomodadosdevemsercitados.
('Patrick(lista'contrasSeymour'Marvin))
3.11. (Defunmaisdoque(xy)
(>(Comprimentox)(ycomprimento)))
3.12. (Defunaddlength(x)
(Contras(comprimentox)x))
(addlength(addlength'(ABC)))(43abc)
3.13. AfunoCALLUPrequerdoisargumentos,onomedochamadore
Chamado.(CALLUPWANDA"FRED')retorna(OLWANDA
ESTEFREDdechamada).
3.14. AfunoCRANKCALLnofazusodesuasentradas,porqueoseu
Ocorpointeirocitado.Eleretorna(OLreceptorESTECALLER
CHAMADA).
3.15. Apalavrasmbolousadotantocomoumpedaodedados,quandocitado,e,como
umnomedevarivel,quandonocotados.(AARDVARK'SCRABBLE)
retornos(AARDVARKumapalavra).("palavraSCRABBLE)retorna
(WORDumapalavra).
3.16. Oresultado(MOE(MOELARRY)LARRYLARRY).

pgina494

C22

CommonLisp:AGentleIntroduoComputaoSimblica
3.17. TeNILsoosnomesdeconstantesquesempreresultamem
simesmos.Porconseguinte,nopodeserusadoparanomearvariveisquecontm
asentradasparaumafuno.
3.18. notaoEVALconciso,efcildedigitaremumcomputador
teclado.Elenospermiteusaramesmanotaoparaambasasfunese
dados.AlgumasidiasquepodemserexpressosemnotaoEVALnotm
equivalentenanotaodecaixa.
3.19. (cons'uvas'(daira))
(uvasdaira)
(listadet''nonulo)(tnonula)
(first'(listaalcesganso))lista
(primeiro(gansolista'Moose'))alces
('Home('contrasdoce'home))
Erro!"Funoindefinidadoce.
3,20. (mistrio"(DancingBear))(ursodana)
(mistrio'dana'bear)Erro!Demasiadasentradas.
(mistrio"(zowie))(nilzowie)
(Mistrio(listade"primeira"segundo))
(segundoprimeiro)

3.21. Variveisnodevemsercitados:
(Defunfalar(xy)(lista'all'x''y))
Umafunonopodeterduaslistasdeargumentos:
(Falardefun(x)(y)(lista'allx'y))
Noentreparntesesvariveisnalistadeargumentosnocitarvariveis
fazercotaodetodose:
(Defunfalar((x)(y))(listadetodos"x'y))
3.22. ParteA.Nomeucomputador,eudigitolispebateuretorno.
Parteb.
(+35)8

pgina495

C23
ANEXOCRespostasaosexerccios

(3+5)Erro!3funoindefinida.
(+3(56))Erro!5funoindefinida.
(+3(*56))33
'(Manhaomeiodianoite)
(manhaomeiodianoite)

('Dia'domeiodianoite')
Erro!"Funoindefinidamanh.
(Listade"manh"meiodia"noite)
(manhaomeiodianoite)
(nilcarro)nil
(+3foo)Erro!FOOvarivelnoatribuda.
(+3'foo)Erro!Tipodeentradaerrado+.
ParteC.
(DefunMyFun(xy)
(Lista(listax)y))
Parted.
(Defunfirstp(xy)
(Igualx(primeiroy)))
ParteE.
(Defunmeadosdeadd1(x)
(Lista(primeirox)
(1+(xsegundo))
(Terceirox)))
Partef.
(DefunfaC(temperatura)
(*(Temperatura32.0)5/9))
ParteG.Afunotentaadicionarumparaasadavalordeverdadepor
ZEROP(TouNIL).Issofazcomqueumerrodeentradatipoerrado.

pgina496

C24

CommonLisp:AGentleIntroduoComputaoSimblica
3.23. DUPLO:n.N2
QUADRADO:n.nn
ONEMOREP:(x,y).X=(y+1)
3,24.

(Alpha3)
DigiteALPHAcomentrada3
criarvarivelX,comvalor3
(Bravo(+x2)(Charliex1))
(+X2)
5
(Charliex1)
DigiteCHARLIEcomentradas3e1
criarvarivelY,comvalor3
criarvarivelX,comovalor1
(Yx)
2
ResultadodaCHARLIE2
DigiteBRAVOcomentradas5e2
criarvarivelY,comovalorde5
criarvarivelZ,comovalor2
(*Yz)
10
ResultadodaBRAVOde10
ResultadodaALPHAde10

3.25. (lista'contrastnil)(constnil)
(eval(lista'contrastnil))(t)

(eval(eval(lista'contrastnil)))
Erro!Tindefinidofuno.
(aplicar'contras'#(tnil))(t)
(evalnil)nil
(listade'evalnil)(evalnil)
(eval(lista'evalnil))nil

pgina497

C25
ANEXOCRespostasaosexerccios
Captulo4RESPOSTAS
4.1.

(Defuntornareven(n)
(If(evenpn)n
(N+1)))

4.2.

(Defunmais(n)
(Se(<N0)
(N1)
(N+1)))

4.3.

(Defunomeuno(x)
(Sexnilt))

4.4.

(Defunordenou(xy)
(Se(<XY)
(Listadexy)
(Listadeyx)))

4.5.

Aclusulaterceiraasegundaclusulaaprimeiraclusula.

4.6.

(Defunmyabs(n)
(Cond((<N0)(N))
(Tn)))

4.7.

AsegundaexpressoCONDestcorreto.Orestotemumavariedadede
errosparnteses.

4.8.

(Defunemphasize3(x)
(Cond((igual(primeirox)'bom)
(timo(restx'contras)))
((Igual(primeirox)'bad)
(Terrvel(restx'contras)))
(T(muitox"contras))))
(Emphasize3'(diamuitolongo))
(muito,muitolongodia)

4.9.

Afunosempreretornasuaentradainalterada,porqueoprimeiro
clusulaCONDsempreverdade.Asegundaclusulanuncatentado.Consertar
oproblema,troqueasduasclusulas.

4.10. (Defunconstranger(xmaxmin)
(Cond((<xmin)min)
((>Xmax)max)
(TX)))

pgina498

C26

CommonLisp:AGentleIntroduoComputaoSimblica
(Defunconstranger(xmaxmin)
(Se(<xmin)min
(If(>xmax)max
x)))
4.11. (Defunfirstzero(x)
(Cond((zerop(primeirox))'primeiro)
((Zerop(segundox))'segundo)
((Zerop(terceirax))"terceiro)
(T'none)))
ChamandoFIRSTZEROcomtrsnmerosdiferentescomoentrada,emvezde
umalistadetrsnmeros,poderiacausarumnmeroerradodeerrodeentradas.
4.12. (Ciclodedefun(n)
(Cond((igualn99)1)
(T(n+1))))
4.13. (Defunhowcompute(xyz)
(Cond((igual(+xy)z)'sumof)
((Igual(*xy)z)"produtoof)
(T'(mebate))))
4.14. (e'taxa'fieinimigo')inimigo
(ou"taxa"fieinimigo')taxa
(ounil'nilinimigo)inimigo
(e'taxa'nilfie)nil
(e(igual'abc'abc)'sim)sim
(ou(igual'abc'abc)'sim)t
4.15. Humpredicadoincorporadochamado>=quetemessecomportamento,masnspodemos

construironossoprpriopredicadoutilizandoOR.
(DefunGEQ(xy)
(Ou(>xy)(igualXY))
4.16. (Defuncrise(n)
(Cond((e(oddpN)(>N0))(*nn))
((E(oddpN)(<N0))(N*2))
(T(/N2))))

pgina499

C27
ANEXOCRespostasaosexerccios
4.17. (Idadedefun(xy)
(Ou(e(ou(meninoiguais'x)
(Meninaiguais'x))
(Crianaigualy'))
(E(ou(homemiguais'x)
(Mulheriguais'x))
(AdultoigualY'))))
4.18. (Playdefun(xy)
(Cond((igualxy)'tie)
((Ou(e(rockiguais'x)
('tesourayiguais))
(E(tesourasiguais'x)
(Papeligualy'))

(E(papeliguais'x)
(Y'rockeqyal)))
"primeiroswins)
(T'segundawins)))
4.19. (Cond((nox)nil)
((NoY)nil)
((Noz)nil)
(Tw))
(Sex
(Sey
(SeZW)))
4.20. (Defuncomparar(xy)
(Se(x,yigual)
"Nmerossothemesmo
(Se(<XY)
'Primeiramenor
'Primeiramaior)))
(Defuncomparar(xy)
(Ou(e(igualxy)"nmerossothemesmo)
(E(<xy)'primeiramenor)
'Primeiramaior))
4.21. (Defungtest(xy)
(Se(>xy)t
(Se(zeropx)t
(Zeropy)))

pgina500

C28

CommonLisp:AGentleIntroduoComputaoSimblica
(Defungtest(xy)
(Cond((>xy)t)
((Zeropx)t)
(T(zeropy))))
4,22. (Defunboilingp(escalatemp)
(Ou(e(>Temp212)
(Igualescala"Fahrenheit))
(E(>Temp100)
(Celsiusigualescala'))))
4.23. SeONDEESTteveoitoclusulascond,ONDEIS2precisaria7
FI.ONDEIS3serianecessrioumOReseteANDs.
4.24. Condicionaissoimportantesporquepermitemumafunoparavariarasua
comportamentoemrespostaadiferentescondiesdeentrada.
4.25. QuandoIFdadaapenasduasentradas,eleusaNILparaasuaterceiraentrada.
4.26. ACONDcomqualquernmerodeclusulaspodeserreescritoparausarIF
porquepodemosescreverIFsaninhados.
4.27. (COND)avaliaazero,umavezquenotemclusulasverdadeiros.
4.28. Umavezsedeterminaquetesteverdade,elesempreretornaovalorde
trueparte,mesmoseessevalornulo.AtraduousandoANDeOR
notemessapropriedade:umavezque(EVENP7)NIL,oeretorna
NIL,demodoqueoORvaiparaaprximaclusula,que'FOO.Nspodemos
corrigirissoescrevendo:
(ou(everdadeirotesteparte)
(e(noteste)falsoparte))
4.29. (Defunlgicoe(xy)
(Sex(seYT)))
(Defunlgicoe(xy)
(Cond(x(cond(yt)))))
4.30. (Defunlgicoou(xy)
(Cond(xt)

(Yt)
(Tnil)))
4.31. No,noumacondicional:Elesempreavaliasuaentrada.Noum
funobooleanaporqueeleretornaTouNIL,porisso,noprecisa
escreverumafunolgicaNOT.

pgina501

C29
ANEXOCRespostasaosexerccios
4.32.

T
T
NADA
NADA

(ORlgicoxy)

T
NADA
T
NADA

T
T
T
NADA

4.33. Nohaveriadois 3 ouoitolinhasdatabeladeverdade.


4.34.

x
T
T
T
T

y
T
T
NADA
NADA

z
T
NADA
T
NADA

(IFLGICOxyz)
T
T
NADA
NADA

NADA
NADA
NADA

T
NADA
NADA

T
NADA
T
NADA

T
NADA
T
NADA

4,35. (EXYZ)=(no(ou(nox)(yno)(noZ)))
(OuXYZ)=(no(e(nox)(yno)(noZ)))
4.36.

x
T
T
NADA
NADA

y
T
NADA
T
NADA

4.37. (Defunlgicoe(xy)
(NAND(xyNAND)(nexy)))
(Defunlgicoou(xy)
(NAND(xxNAND)(neaa)))
4.38. (Defunnot2(x)
(Nemxx))
(Defunlgicoe(xy)
(NOR(nemxx)(nemaa)))

pgina502

(XyNAND)
NADA
T
T
T

C30

CommonLisp:AGentleIntroduoComputaoSimblica
(Defunlgicoou(xy)
(NOR(nemxy)(nemxy)))
(DefunNAND(xy)
(NOR(NOR(nemxx)(nemyy))
(NOR(nemxx)(nemyy))))
4.39. LGICOEnologicamentecompleto:nohnenhumamaneiradeconstruir
AfunonoapartirdecombinaesdelgicoANDs.portanto
tambmnopodemosconstruirOR,NANDeNOR.

CAPTULO5RESPOSTAS
5.1.

(Defunboastyle(p)
(Vamos((q(+p5)))
(Listade"resultado"q)))

5.2.

Umefeitocolateralalgoqueumafunofazalmderetornarumvalor.
Atribuioumexemplodeumefeitocolateral.

5.3.

Umavarivellocalsacessveldentrodocorpodaformaque
define,taiscomoDefun,LET,oudeixar*.Umavarivelglobaldefinido
nadenvelsuperior,enodentrodeumadessasformas,porissoacessvel
emtodaparte.

5.4.

SETFnopodeserumafunocomum,porquenoavaliaroseu
primeiroargumento.

5.5.

Sim.AdiferenaentreLETedeixe*apenasaparentequando
elessoutilizadosparacriarmaisdoqueumavarivellocal.

5.6.

(Defunjogdie()
(+1(6aleatrio)))
(Defunjogdice()
(Lista(jogdie)(jogdie)))
(Defunsnakeeyesp(lance)
(Iguallance'(11)))

(Defunvagesp(lance)
(Igualatirar"(66)))

pgina503

C31
ANEXOCRespostasaosexerccios
(Defunjogvalue(lance)
(+(Primeirolance)(segundolance)))
LANCEvalorumafunodeajudarutilizadoporvriasdasfunes
quesegue.
(Defunimediatoganhap(lance)
(Membro(reposiovalorjogue)"(711)))
(Defuninstantlossp(lance)
(Membro(reposiovalorjogue)"(2312)))
(Defundizerthrow(arremesso)
(Cond((snakeeyesplance)'snakeeyes)
((Vagesplance)'vages)
(T(reposiovalorjogar))))
(Crapsdefun()
(Vamos((throw(jogdice)))
(acrescentar

(Listade"throw(primeirolance)
"E(segundolance)
'
(Digamosdelancelance)
')
(Cond((instantwinplance)'(ganhar))
((Instantlossplance)'(vocperde))
(T(listade'seu'ponto'
(Lancelancedevalor)))))))
(Defuntentarparaponto(ponto)
(Vamos*((throw(jogdice))
(Val(reposiovalorjogar)))
(acrescentar
(Listade"throw(primeirolance)
"E(segundolance)
'
(Digamosdelancelance)
')
(Cond((pontoigualval)'(ganhar))
((Igualval7)'(vocperde))
(T'(jogardenovo))))))

pgina504

C32

CommonLisp:AGentleIntroduoComputaoSimblica

Captulo6RESPOSTAS
6.1.

(NTH4'(ABC))envolvequatroCDRssucessivasdeumtrselemento
Lista.AquartaCDRproduzumresultadoNIL,eocarrodeque
NADA.

6.2.

(NTH3'(ABC.D))produzumerro.Levatrssucessiva
CDRsdesuaentrada,queproduzosmboloD.levarocarrodeD
emseguida,fazcomqueumerroporqueDnoumalista.

6.3.

retorna('(ROSEBUD)Sobrenome)(ROSEBUD).

6.4.

('((ABC))ltima()retorna(ABC)).Estaumalistadeumelemento,porisso
altimaclulanacadeiadenvelsuperioraprimeiraclula.

6.5.

(Linhasetf'(asrosassovermelhas))
(linhainversa)(vermelhosorosas)
(primeira(ltimalinha))vermelho
(ensima1line)so
(reverso(linhainversa))(asrosassovermelhas)
(Anexarline(lista(primeiralinha)))
(rosassorosasvermelhas)
(Anexar(ltimalinha)Linha)
(rosasvermelhassoovermelho)
(Lista(primeiralinha)(ltimalinha))
(rosas(vermelho))
(Cons(ltimalinha)Linha)
((vermelho)asrosassovermelhas)
(remover'soalinha)(rosasvermelhas)
(Anexarlinha'(violetassoazuis))
(rosassovioletasvermelhassoazuis)

6.6.

(Defunltimoelemento(x)(primeira(ltimax)))

(Defunltimoelemento(X)(emprimeirolugar(xreversa)))

pgina505

C33
ANEXOCRespostasaosexerccios
(Defunltimoelemento(x)
(EX
paralidarcomNILcorretamente
(N((comprimentox)1)x)))
6.7.

(Defunprximaaoltimo(x)(segundo(xreverso)))
(Defunprximaaoltimo(x)
(E(restantex)paralidarcomlistascurtas
(N((comprimentox2))x)))

6.8.

(Defunmybutlast(x)
(Reverso(repouso(reversox))))

6.9.

MISTRIOomesmoquePRIMEIRO.

6.10. (Defunpalindromep(x)
(Igualx(xreverso)))
6.11. (Defuntornarpalindromep(x)
(Anexarx(reversox)))
6.12. Membronuncatemquecopiarsuaentrada.Elesimplesmenteretornaumponteiropara
umadasclulascontrasquecompemasuaentrada,ouNIL.

6.13. OresultadodainterseodeumconjuntocomNILNIL.
6.14. Oresultadodainterseodeumconjuntocomsioconjunto.
6.15. (Defuncontmarticlep(enviada)
(Intersecoenviado'(ouma)))
(Defuncontmarticlep(enviada)
(Ou(membro'oenviado)
(Membrodo"umenviado)
(Membrodo"umenviado)))
(Defuncontmarticlep(enviada)
(No(e(no(membro'oenviado))
(Not(membrodo"umenviado))
(Not(membrodo"umenviado)))))
6.16. AuniodeumconjuntocomNILoconjunto.
6.17. Auniodeumconjuntocomsioconjunto.

pgina506

C34

CommonLisp:AGentleIntroduoComputaoSimblica

6.18. (Defunaddvogais(x)
(Xunio"(aeiou)))
6.19. SeNILaprimeiraentradaparadefinirDIFERENA,oresultadonulo.Ese
NILasegundaentrada,oresultadoaprimeiraentrada.
6.20. Diferenadoconjuntodecpias(departes)asuaprimeiraentrada.Elenuncatemque
copiarasuasegundaentrada,porquenenhumdoselementosdaentradadasegunda
aparecemnoseuresultado.
6.21. (Defunmysubsetp(xy)
(Null(xysetdifference)))
6.22. (Unioa'(semrdiosabo))
(guadesabosemrdio)
(intersecoa(revertera))(guaesabo)
(setdiferenaa'(pararparagua))(sabo)
(aasetdiferena)nil
(membrodo"saboa)(guaesabo)
(membrodo'guaa)(gua)
(membrodo"panoa)nil
6,23. COMPRIMENTOretornaacardinalidadedeumconjunto.
6.24. (Defunsetigual(xy)
(E(subsetpXY)
(Yxsubsetp)))
6,25. (Defunbomsubsetp(xy)
(E(subsetpXY)
(Not(yxsubsetp))))
6.26. (Defundoladodireito(x)
(Repouso(membro'versusx)))
(Ladoesquerdodefun(x)
(Ladodireito(xreverso)))

pgina507

C35
ANEXOCRespostasaosexerccios
(Defuncontamcomum(x)
(Comprimento(interseco(doladoesquerdox)
(Xladodireito))))
(Defuncomparar(x)
(Lista(countcomumx)recursos"comuns"))
6.27. ASSOCpodeserconsideradoumpredicadocomosmesmosfundamentoscomo
MEMBRO.ASSOCdevolveumvalorverdadeiroseumdadodeentradaaparecenuma
mesa.
6.28. (assoc'ProduodeBanana)(banana.fruta)
(rassoc"produzirfrutos)(ma.fruta)
(assoc"produziralface)(alface.veggie)
(rassoc'veggieproduzir)(aipo.veggie)
6.29. COMPRIMENTOretornaonmerodeentradasemumatabela.
6,30. (livrossetf
'((Guerraepazleotolstoy)
(olivertwistCharlesDickens)
(TomSawyer
markTWAIN)

(seqestrado
(Candide

robertlouisStevenson)
Voltaire)))

6.31. (Defunqueescreveu(ttulo)
(Segundo(livrosttuloassoc)))
6.32. AfunoautorOMSvaisecomportarexatamenteomesmo,porqueo
ordemdeentradasemumatabelanoimportantequandoasteclas(nestecaso,o
ttulosdelivros)sonicos.
6.33. Nopodemoscriaroqueescreveuusandoatabelaatual.Noentanto,se
reescrevemosatabelaparausarparespontilhadas,poderamoscriaroque
ESCREVEUusandoRASSOC.
6.34. (setfredesenhadosatlas
'((Pensilvnia(Pittsburghjohnstown))
(Newjersey(NewarkPrincetonTrenton))
(Ohio(Columbus))))

pgina508

C36

CommonLisp:AGentleIntroduoComputaoSimblica
6.35. Esteproblemapodeserresolvidousandoumalistasimples(comEstados)ouum
mesa(comASSOC).

(nerdsestadossetf
'((dormindo
.comendo)
(comendo
.esperando)
(esperando
.programao)
(Programao.Depurao)
(Depurao.Dormir)))
(Defunnerdus(x)
(Cdr(assocxnerdsestados)))
(playingguitar'nerdus)nil
(Defuninsonelerdo(x)
(Vamos((y(nerdusx)))
(If(dormirigualy')
(Nerdusy)
y)))
(Defunlerdoonacafena(x)
(Nerdus(nerdusx)))
ApartirdePROGRAMAOestado,onerdiriadeclarar
Dormir,emseguida,aespera,edepoisparaadepurao.
6.36. (Defuntrocaprimeiropassado(x)
(Vamos*((a(reverse(restantex)))
(B(reverse(descansara))))
(Contras(primeirosa)
(Anexarb(lista(primeirox))))))
6,37. (Defunrodarparaaesquerda(x)
(Anexar(restantex)(lista(primeirox))))
(Defunrodarparaadireita(x)
(Vamos((R(Reversex)))
(Cons(primeirar)
(Reverso(restor)))))
6.38. resultadosiguais:XeYpodemserquaisquerdoisconjuntosidnticos,incluindoNIL.
Aordemdoselementosnonecessitamdeseramesmanosdoisconjuntos.Desigual
Resultados:XeYnodeveserconjuntosiguais,porexemplo,Xpodeser(a)
eYpodeser(AB).

pgina509

C37
ANEXOCRespostasaosexerccios
6.39. APPENDrealizaaadiounria.
6.40. ((ABCD)
(BCD)
(CD)
(D))
6.41. (Escolhasdefun(quarto)
(Repouso(quartoquartosassoc)))
(Defunolhar(quartodir)
(Segundo(assocdir(saladeescolhas))))
(Setfdespensa'loc)
(DefunComoMuitosescolhas()
(Comprimento(escolhasloc)))
(Defunupstairsp(x)
(Ou(bibliotecaiguais'x)
(Noandardecimaquartosiguais'x)))
(Defunonstairsp(x)
(Ou(igualx'backescadas)
(frontescadasiguais'x)))
(Defunonde()

(Se(onstairspLOC)
(Listade'Robbie''on'aloc)
('Robbie'lista
(Se(locupstairsp)
'andardecima
'andardebaixo)
"Na"loc)))
(Defunmovimento(dir)
(Vamos((novaloc(olhardirloc)))
(Cond((nullnovaloc)
"(Ouch!Robbiebateremumaparede))
(T(setRobbielocationnovaloc)
(Onde)))))

pgina510

C38

CommonLisp:AGentleIntroduoComputaoSimblica
6.42. (Defunroyalns(enviada)
(Subst'ns'ienviada))

Captulo7RESPOSTAS

7.1.

(Defunadd1(n)(+1n))
(mapcar#'add1'(13579))(246810)

7.2.

(terceiradiriadoplanetamapcar'#)
(123764535089526787951261438
355167439)

7.3.

(Mapcar#'zerop'(2030456))
(niltnilniltnilnil)

7.4.

(Defunmaiordoqueodecincop(n)(>n5))
(Mapcar#'maiordoqueodecincop
'(2030456))

7.5.

(Lambda(N)(n7))

7.6.

(Lambda(X)
(Ou(nullx)(igualxt)))

7.7.

(Defunflipelemento(e)
(If(iguale'on)'off
'em))
(Defunflip(x)
(Mapcar'#flipelementox))

7.8.

(Defunaproximadamenteigual(EK)
(E(not(<e(k10)))
(No(>E(k+10)))))
(Defunencontrarprimeiroaproximadamenteigual(xk)
(Encontrarse#'(lambda(e)(cercadeigualek))
x))

7.9.

(Defunencontraraninhado(x)
(Encontrarse#'conspx))

pgina511

C39
ANEXOCRespostasaosexerccios
7.10. (Notetablesetf
'((C
.1)(fafiada.7)
(Csharp.2)(g
(d
.3)(gafiada.9)
(Dafiada.4)(a
(e
.5)(aafiada.11)
(f
.6)(b

.8)
.10)
.12)))

(Nmerosdefun(x)
(Mapcar#'(lambda(e)
(Cdr(assocenotatable)))
x))
(Notasdefun(x)
(Mapcar#'(lambda(e)
(Carro(rassocenotatable)))
x))
(NOTES(NOTASX))e(nmeros(nmerosX))retornamum
listadeNILomesmocomprimentoquealistadeentrada.
(Raisedefun(nx)
(Mapcar#'(lambda(e)(+PT))
x))
(Defunnormalize(x)
(Mapcar#'(lambda(e)
(Cond((<E1)(12+E))
((>E12)(E12))

x))

(Te)))

(Defuntransposio(nx)
(Notas(normalize(elevarn(nmerosx)))))
7.11. (Defunpicareta(x)
(Removerseno#'(lambda(X)(<1x5))
x))
7,12. (Defuncontaro(enviada)
(Comprimento(removerseno
#'(Lambda(x)(igualx'a))
enviei)))
UmasoluomaiscurtopossvelusandoCOUNT,oquenocobertoem
estelivro.

pgina512

C40

CommonLisp:AGentleIntroduoComputaoSimblica
7,13. (Defunpickpares(x)
(Removese
#'(Lambda(X)
(No(iguais(comprimentox2))))
x))
7.14. (Defunmyinterseo(xy)
(Removerseno
#'(Lambda(e)

x))

(Eymembro))

(Defunminhaunio(xy)
(Anexarx
(Removese
#'(Lambda(e)
(Membroex))
y)))
7.15. (Classificaodefun(carto)(primeirocarto))
(Defunterno(carto)(segundocarto))
(Defuncontamsuit(slado)
(Comprimento(removerseno
#'(Lambda(carto)
(Igual(cartodeterno)s))
mo)))
UmasoluomaiscurtopossvelusandoCOUNTIF,quenosejacobertapelo
estelivro.
(Defuncorde(cartes)
(segundo(assoc(cartesdeterno)cores)))
(Defunprimeirovermelho(mo)
(Encontrarse#'(lambda(carto)
('Redigual(cordecarto)))
mo))
(Defunpretocards(mo)
(Removerseno
#'(Lambda(carto)
(Igual(cordecarto)'black))
mo))

pgina513

C41
ANEXOCRespostasaosexerccios
(Defunquefileiras(slado)
(Classificaomapcar'#
(Removerseno
#'(Lambda(carto)
(Igual(cartodeterno)s))
mo)))
(Defundemaiorrankp(card1card2)
(Beforep(classificaocard2)
(Classificaocard1)
allfileiras))
(Defundealtacarto(demo)ENCONTRARSEverso
(Assoc(encontrarse
#'(Lambda(R)
(Morassoc))
(Reversotodofileiras))
mo))
(Defundealtacarto(demo)REDUZIRverso
(reduzir
#'(Lambda(card1card2)
(If(superiorrankpcard1card2)
card1
card2))
mo))
7.16. UNIO.
7.17. (Defun(x)nototaldecomprimentoconsesummonte
(Comprimento(reduzir#'anexarx)))

(Defuntotaisdecomprimento(x)consesmenos
(Reduzir#'+(mapcar#'comprimentox)))
7,18. Suponhaquexeysolistas.(REDUZIR#'+(APPENDxy))deve
produziromesmovalorqueasomade(REDUZIR#'+x)e(REDUZIR
#'+Y).Seyzero,ento(APPENDxy)igualax,ento(REDUZIR#'+y)
temdevoltarazero.Zeroovalordeidentidadeparaadio.porisso
vocao+semargumentosretornazero.Damesmaforma,chamando*sem
argumentosretornaum,porqueaidentidademultiplicativo.

pgina514

C42

CommonLisp:AGentleIntroduoComputaoSimblica
7.19. (Defunallmpar(x)
(Cada"#oddpx))
7,20. (Defunnonempar(x)
(Cada"#evenpx))
7,21. (Defunnotodompar(x)
(Encontrarse#'evenpx))
7,22. (Defunnononempar(x)
(Encontrarse#'oddpx))

7,23. Todasasquatrofunessodistintas.NOALLODDdeveserchamado
FINDPAR,enoNONEODDdeveserchamadoFINDODD.
7.24. Umoperadoraplicativoumafunoquelevaoutrafunocomo
entrada,eaplicaaalgunsdados.
7.25. Asexpresseslambdapermitemdefinirfunesannimasquepodemser
passadoparaosoperadoresaplicativas.Nstambmpodemosdefinirfunes
separadamentecomDefun,masnessecasoelesnoseriamcapazesdesereferir
paraqualquerumadasvariveislocaisdafunopai,aformacomoolambda
expressoemMYASSOCreferesetecladevarivellocal.
7.26. (Defunmyencontrarse(predx)
(Primeira(removersenopredx)))
7.27. (Defunmycada(predx)
(Null(removesepredx)))
7.28. Aformadetringuloabaixoindicaumvalordeverdade(TouNIL).

????

7.29. (Defunmatchelemento(eq)
(Ou(igualeq)
(Igualq'?)))
(Defunmatchtripla(xpat)
(Acada#'matchelemento
x
pat))

pgina515

C43
ANEXOCRespostasaosexerccios
(Defunfetch(PAT)
(Removerseno
#'(Lambda(x)(matchtriploxpat))
bancodedados))
(Fetch'(formab4?))
(Fetch'(?Moldartijolo))
(Fetch'(b2?B3))
(Fetch'(?Cores?))
(Fetch'(b4?))
(Defuncorpadro(bloco)
(Listadebloqueio"cor"?))
(Apoiantesdefun(bloco)
(Mapcar#'primeiro
(Fetch(lista'?'Suportabloco))))
(Defunsuppdecubo(bloco)
('Cubomembro
(mapcar
#'(Lambda(b)(terceiro(primeiro(fetch
(Listadeb'forma'?)))))
(Partidriosdobloco))))
(Defundesc1(bloco)
(Fetch(blocklist'?'?)))
(DefunDesc2(bloco)
(Restomapcar'#(blocodesc1)))
(Descriodefun(bloco)
(Reduodeacrscimo'#(blocoDesc2)))
(descrio'b1)

(Cordetijoloformatamanhopequenoverde
apoiouab2suportadoporb3)
(descrio'B4)
(Corpirmideazultamanhogrande
suportadoporB5)
Adicionarabasededadosdaslistas(B1composiodamadeira)e(B2
Composioplstica).

pgina516

C44

CommonLisp:AGentleIntroduoComputaoSimblica
7.30. (Mapcar#'(lambda(xy)(anexarx(listay)))
palavras
'(UnodostresQuatrocinco))

Captulo8RESPOSTAS
8.1.

AsegundaclusulaCONDnuncaverdadeira,umavezquenenhumdosnmeros
mpar.

8.2.

(Defunanyoddp(x)
(Sex
(Se(oddp(primeiraX))
(PrimeiraX)

8.3.

pgina517

(Anyoddp(restantex)))))
Em(FACT20,0),oresultadocalculadousandoaritmticadepontoflutuante,
quetemprecisolimitada.(FACT20)usainteiroschamadosbignums
aoinvs.Bignumstemprecisoilimitada.(FACT0)e(FACT0.0)
tantosatisfazeraprimeiraclusulaCOND,queretornasempreointeiro0.

8.4.

(Defunrir(n)
(Cond((Nzerop)nil)
(Hat('contras(rir(n1))))))

8.5.

(Defunadicionarup(x)
(Cond((nullx)0)
(T(+(primeirox)(adicioneup(restantex))))))

8.6.

(Defunalloddp(x)
(Cond((nullx)t)
((Evenp(primeiraX))nil)
(T(todooddp(restox)))))

8.7.

(Defunrecmembro(ex)
(Cond((nullx)nil)
((Iguale(primeirox))x)
(T(recmembroe(restantex)))))

8.8.

(Defunrecassoc(tabeladechave)
(Cond((tabelanull)nil)
((Igualchave(carro(primeiratabela)))
(Primeiratabela))
(T(chavederecassoc(tabeladedescanso)))))

C45
ANEXOCRespostasaosexerccios
8.9.

(Defunrecn(nx)
(Cond((zeropN)(primeiraX))
(T(recn(n1)(restantex)))))

8,10. (Defunadd1(N)(N+1))
(Defunsub1(N)(N1))
(Defunrecplus(xy)
(Cond((zeropy)x)
(T(recplus(add1x)(sub1y)))))
8.11. (Defunfib(n)
(Cond((igualn0)1)
((Nigual1)1)
(T(+(FIB(n1))
(FIB(N2))))))
8,12. Serquequalquer7Pnoseipararquandosuaentradanulo.Vaifuncionar
corretamente,desdequeasuaentradacontmpelomenosumdesetenessecaso
praeretornaT.Casocontrrio,eleirrecorrerinfinitamente.
8.13. ChamandoFACTcomumnmeronegativofazcomqueumarecursoinfinita.
8,14. (Defuninfinitarecurso()
(Infinitarecurso))
8.15. OcarrodalistaosmboloX,eocdraprprialista.
COUNTFATIASrecorrerinfinitamentequandodadoestalistacomoentrada,
umavezquenuncapodealcanaro''final''dacadeiadeclulascontras.
8.16. AlternandoosprimeiroesegundoclusulasCONDiriacausarumerro:
ODDPseriaumsinalde''inputtipoerrado''quandoXNIL.
8.17. (Defunencontrarprimeirompar(x)
(Cond((nullx)nil)
((Oddp(primeiraX))(primeiraX))
(T(encontrarprimeirompar(restantex)))))
(Defunltimoelemento(x)

8.18.

(Cond((tomo(cdrx))(carrox))
(T(ltimoelemento(CDRx)))))

8.19. ANYODDPirfuncionarcorretamente,desdequehajapelomenosumestranho
nmeronalista.Senoexistiremnmerosmpares,elereceberumerro
quandoeletentacalcularODDPdeNIL.

pgina518

C46

CommonLisp:AGentleIntroduoComputaoSimblica
8.20. FACTusatestenicodeaumentorecurso.Osvaloresdomodeloso:
Endteste:
Valorfinal:
Agodiverso:
Agoval:
Reduziux:

(ZEROPN)
1
*
N
(N1)

8.21. (Defunaddnums(n)
(Cond((zeropN)0)
(T(+n(addnums(n1))))))
8.22. (Defuntudoigual(x)
(Cond((null(restantex))t)
((Not(igual(primeirox)(segundox)))nil)
(T(todoiguais(restox)))))
Esteproblemanorequeraumento,umavezqueovalorderetorno

sempreapenasTouNIL.Eleresolvidocomdoubletestecaudarecurso.
8.23. Atabelatemseisentradas,umaparacadainvocaoderir
(Risos5).
N

primeiraentrada
segundaentrada
paraCONS
paraCONS Resultado

(Risos4)

(HAHAHAHAHA)

(Risos3)

(HAHAHAHA)

(Risos2)

(HAHAHA)

(Risos1)

(HAHA)

(Risos0)

(HA)

NADA

8.24. (Defuncountdown(n)
(Cond((Nzerop)nil)
(T(consn(countdown(n1))))))
8.25. (Defunapplicfact(n)
(Reduzir#'*(countdownn)))

pgina519

C47
ANEXOCRespostasaosexerccios
8.26. (Defuncountdown(n)
(Cond((n1iguais)nil)
(T(consn(countdown(n1))))))
(Defuncountdown(n)
(Cond((zeropn)(lista0))
(T(consn(countdown(n1))))))
8.27. (Defunquadradolist(x)
(Cond((nullx)nil)
(T(cons(*(primeirox)(primeirox))
(Squarelist(restantex))))))
8.28. (Defunmyn(nx)
(Cond((nullx)nil)pararsealistaestvazia
((ZeropN)(primeiraX))
(T(meun(n1)(restantex)))))
8.29. (Defunmymembro(ex)
(Cond((nullx)nil)
((Iguale(primeirox))x)
(T(meumembroe(restantex)))))
8.30. (Defunmyassoc(tabeladechave)
(Cond((tabelanull)nil)
((Igualchave(carro(primeiratabela)))
(Primeiratabela))
(T(meuassocchave(tabeladedescanso)))))
8.31. (Defuncompararcomprimentos(xy)
(Cond((e(nullx)(nully))'domesmocomprimento)
((Nullx)'segundamais)
((Nully)'primeiramais)
(T(comparecomprimentos(restantex)
(Restantey)))))
8.32. (Defunsumnumricoselementos(x)
(Cond((nullx)0)
((Numberp(primeiraX))
(+(PrimeiraX)
(Somanumricoelementos(restantex))))
(T(somanumricoelementos(restantex)))))

pgina520

C48

CommonLisp:AGentleIntroduoComputaoSimblica
8.33. (Defunmyremove(ex)
(Cond((nullx)nil)
((Iguale(primeirox))
(Meuremovee(restantex)))
(T(contrase(meuremovee(restantex))))))
8.34. (Defunmyinterseo(xy)
(Cond((nullx)nil)
((Membro(primeirox)y)
(Cons(primeirox)
(Myinterseo(restantex)y)))
(T(meuinterseo(restantex)y))))
8.35. (Defunmeusetdiferena(xy)
(Cond((nullx)nil)
((Not(membro(primeirox)y))
(Cons(primeirox)
(Meusetdiferena(restantex)y)))
(T(meusetdiferena(restantex)y))))

8.36. (Defuncontammpar(x)
Versoaumentocondicional
(Cond((nullx)nil)
((Oddp(primeiraX))
(+1(countmpar(restantex))))
(T(contagemmpar(restantex)))))
(Defuncontammpar(x)
versoregulardeaumento
(Cond((nullx)nil)
(T(+(se(oddp(primeiraX))
1
0)
(Countmpar(restantex))))))
8.37. (Defuncombinar(xy)(+xy))
(Defunfib(n)
(Cond((igualn0)1)
((Nigual1)1)
(T(combinar(FIB(n1))
(FIB(N2))))))
CadachamadanoterminalparaFIBfazumachamadaparacombinar,ecada
chamarparacombinarcombinaosresultadosdemaisduaschamadasparaFIB.Desde

pgina521

C49
ANEXOCRespostasaosexerccios

terminaldechamadasparaFIBsemprevoltarum,podemosprovarqueototal
nmerodechamadasparacombinarigualaFib(N)1.Aprovabaseada
naconstataodequecadarvorebinriacomknsterminaistem
exactamentek1nodosnoterminais.
8.38. SeaprimeiraclusulaCONDforomitido,oNIL,nofinaldaclulacontras
cadeiastambmserconvertidoparaQs.Ento(TOMOSAQ'(A(B):C))
return(A(B.Q)C.Q).
8.39. (Defuncontagemdetomos(rvore)
(Cond((rvoretomo)1)
(T(+(contagemdetomos(rvoredecarro))
(Counttomos(CDRrvore))))))
8,40. (Defuncontamcons(rvore)
(Cond((rvoretomo)0)
(T(1+
(Contagemdecontras(rvoredecarro))
(Countcontras(CDRrvore))))))
8.41. (Defunsumtree(rvore)
(Cond((rvorenumberp)rvore)
((rvoretomo)0)
(T(+(somatree(rvoredecarro))
(Somatree(rvorecdr))))))
8.42. (Defunmysubst(novarvoredeidade)
(Cond((igualrvorevelha)nova)
((rvoretomo)rvore)
(T(cons(meusubst
novaidade(rvoredecarro))
(Mysubst
novaidade(rvorecdr))))))
8.43. (Defunachatar(rvore)
(Cond((rvoretomo)(listadervore))
(T(anexar(achatar(rvoredecarro))
(Achatar(rvorecdr))))))
8.44. (Defunrvoredeprofundidade(rvore)
(Cond((rvoretomo)0)
(T(+1(max(rvoredeprofundidade
(rvoredecarro))
(rvoredeprofundidade
(rvoreCDR)))))))

(rvoreCDR)))))))

pgina522

C50

CommonLisp:AGentleIntroduoComputaoSimblica
8.45. (Defunparenprofundidade(lista)
(Cond((listatomo)0)
(T(max(+1(parenprofundidade(primeiralista)))
(Parenprofundidade(listaderepouso))))))
8.46. (Defuncontamup(n)
(Cond((Nzerop)nil)
(T(anexar(countup(n1))
(Listan)))))
8.47. (Defuntornarloaf(n)
(Se(zeropN)nil
('Contrasx(makeloaf(n1)))))
8.48. (Defunenterrar(xn)
(Cond((zeropN)x)
(T(lista(enterrx(n1))))))
Estasoluoutilizatestenicodeaumentorecurso,sem
valordereposio.AfunodeaumentoLIST.
8.49. (Emparelhamentosdefun(xy)
(Cond((nullx)nil)
(T(cons(lista(primeirox)(primeiray))

(Emparelhamentos(restantex)
(Restantey))))))
8,50. (Sublistasdefun(x)
(Cond((nullx)nil)
(T(consx(sublists(restantex))))))
8.51. (Defunmeureverse(x)
(Reverserecursivamentexnil))
(Defunreversadeformarecursiva(xy)
(Cond((nullx)y)
(T(reverserecursivamente
(Restantex)
(Cons(primeiraX)y)))))
8.52. (Defunminhaunio(xy)
(Anexarx(xyuniorecursiva)))

pgina523

C51
ANEXOCRespostasaosexerccios

(Unionrecursivamentedefun(xy)
(Cond((nully)nil)
((Membro(primeiray)x)
(Uniorecursivamentex(restantey)))
(T(cons(primeiray)
(Unionrecursivamente
x
(Restantey))))))
EstasoluoretornatodososelementosdeXemsuaordemoriginal,
seguidoporaqueleselementosdeY(emordemoriginal)quenoaparecemno
X.
8.53. (Defunmaiorainda(x)
(Cond((nullx)0)
((Oddp(primeiraX))
(Maiorainda(restantex)))
(T(Max(primeiraX)
(Maiorainda(restantex))))))
8.54. (Defunenorme(x)
(Xxenormehelper))
(Defunenormehelper(xn)
(Cond((igualn0)1)
(T(*X(enormeajudanteX(N1))))))
8,55. Afunorecursivachamaasimesmo,ouchamaoutrafunoqueporsuavez
chama.
8.56. (Defuncadadois(x)
(Cond((nullx)nil)
(T(cons(primeirox)
(Acadadois(restantex))))))
8.57. (Defunmetadeesquerda(x)
(Esquerdameiahelper
X(/(comprimentox)2)))
(Defundeixoumeiahelper(xn)
(Cond((not(pluspn))nil)
(T(cons(primeirox)
(Esquerdameiahelper
(Restantex)
(N1))))))

pgina524

C52

CommonLisp:AGentleIntroduoComputaoSimblica
8.58. (DefunMergelistas(xy)
(Cond((nullx)y)
((Nully)x)
((<(PrimeiraX)(primeiraY))
(Cons(primeirox)
(Fundemlistas(restantex)y)))
(T(cons(primeiray)
(Fundemlistasx(restantey)))))))
8.59. (Defundefeituosofact(n)
(Cond((zeropn)1)
(T(/(fato(+n1))
(N+1)))))
Asequaesestocorrectase,afunoretornarovalorcorreto
paraumaentradaigualazero.Paraentradasmaioresdoquezero,recursesinfinitamente,
porquecadachamadarecursivageraumvalormaiordeN.Issoviola,assim,
aterceiraregraderecurso:Aviagemficamaioracadapasso
emvezdemenor.
8,60. (Defunpai(x)(segundo(assocfamliax)))
(Medefun(x)(terceiro(assocfamliax)))
(Paisdefun(x)
(Unio(e(paix)(lista(paix)))

(E(mex)(lista(mex)))))
(Crianasdefun(pai)
(Epai
(Mapcar#'primeiro
(Removerseno
#'(Lambda(entrada)
(Membropai(entradadedescanso)))
famlia))))
(Irmosdefun(x)
(Setdiferena(unio(crianas(paix))
(Crianas(mex)))
(Listax)))
(Defunmapunion(fnx)
(Reduziraunio#'(mapcarfnx)))
(Avsdefun(x)
(Paismapunion'#(paisx)))

pgina525

C53
ANEXOCRespostasaosexerccios
(Primosdefun(x)
(crianasmapunion'#
(irmosmapunion'#(paisx))))

(Defundesceude(P1P2)
(Cond((nullp1)nil)
((Membrop2(paisp1))t)
(T(ou(desceufrom
(P1pai)p2)
(descendentede
(P1me)P2)))))
(Antepassadosdefun(x)
(Cond((nullx)nil)
(T(unio
(paisx)
(Unio(ancestrais(paix))
(Ancestrais(matrizX)))))))
(Defungeraogap(xy)
(Ggaphelperxy0))
(Defunggaphelper(XYn)
(Cond((nullx)nil)
((Igualxy)n)
(T(ou(ggaphelper
(Paix)y(1+n))
(Ggaphelper
(MatrizX)y(1+n))))))
(desceudeDeirdre'Robert')nil
(Yvettedosantepassados)
(Quentinjuliegeorgeellenarthurkatelinda
FrankbruceSuzanneColinDeirdrewanda
vincentzeldarobert)
(geraodegap'Olivia'frank)3
(primos'peter)(Josurobert)
(Oliviadosavs)
(andrehillaryEllenGeorge)

pgina526

C54

CommonLisp:AGentleIntroduoComputaoSimblica
8.61. (Defuntrcountup(n)
(Trcountup1nnil))
(Defuntrcountup1(nresultar)
(Cond((zeropn)resultado)
(T(trcountup1
(N1)
(Consnresultar)))))
8.62. (Defuntrfato(n)
(TRfact1N1))
(Defuntrfact1(nresultar)
(Cond((zeropn)resultado)
(T(TRfact1(N1)(*resultadon)))))
8.63. (Defuntrunio(xy)
(Cond((nullx)y)
((Membro(primeirox)y)
(TrUnio(restantex)y))
(T(trunion
(Restantex)
(Cons(primeiraX)y)))))
(Defuntrinterseo(xy)
(NilXYTRintersect1))
(Defuntrintersect1(resultadoxy)

(Cond((nullx)resultado)
((Membro(primeirox)y)
(Trintersect1
(Restantex)
y
(Cons(primeiraX)resultado)))
(T(TRintersect1
(Restantex)yresultado))))
(Defuntrsetdiferena(xy)
(NilXYTRsetdiff1))

pgina527

C55
ANEXOCRespostasaosexerccios
(Defuntrsetdiff1(resultadoxy)
(Cond((nullx)resultado)
((Not(membro(primeirox)y))
(Trsetdiff1
(Restantex)
y

(Cons(primeiraX)resultado)))
(T(TRsetdiff1
(Restantex)yresultado))))
8.64. (rvoreencontrarsedefun(rvorepred)
(Cond((ervore
(rvoretomo)
(Funcallrvorepred))
rvore)
((rvoretomo)nil)
(T(ou(rvoreencontrarse
pred(rvoredecarro))
(rvoreencontrarse
pred(rvorecdr))))))
8.65. (Defuntrcountfatias(x)
(Etiquetas((trc1(xn)
(Sex
(Trc1(restantex)
(N+1))
N)))
(Trc1x0)))
(Defuntrreverse(x)
(Etiquetas((trrev1(xr)
(Sex
(trrev1
(Restantex)
(Cons(primeiraX)r))
r)))
(Xtrrev1nil)))
8.66. (Defunaritheval(exp)
(Cond((numberpexp)exp)
(T(funcall(segundaexp)
(Aritheval(primeiraexp))
(Aritheval(terceiraexp))))))

pgina528

C56

CommonLisp:AGentleIntroduoComputaoSimblica
8.67. (Defunlegalp(exp)
(Cond((numberpexp)t)
((Exptomo)nil)
(T(e(iguais(comprimentoexp)3)
(Legalp(primeiraexp))
(Membro(segundaexp)
'(+*/))
(Legalp(terceiraexp))))))
8,68. NILumaboalista,eassimqualquerclulacontrascujacdrumalistaadequada.
8.69. Umnmerointeiropositivomaiordoqueumsejaumprimo,ouoprodutodeum
Primeeumnmerointeiropositivomaiordoqueum.
8.70. (Defunfatorrvore(n)
(Fatorvoreajudan2))
(Defunfatorvoreajuda(np)
(Cond((igualnp)n)
((Zerop(remnp))
(Listadenp(fatorvoreajuda(/np)p)))
(T(fatorvoreajudan(+p1)))))
8.71. Paravisualizarestediagramacomoumarvorebinriaemvezdeumalista,virarapgina45
grausnosentidohorrio.OsnsterminaisdarvoresoostomosdeA,B,
C,D,E,eNIL.Osnsnoterminaissoasclulascontras.
NADA

UMA

NADA
C

8.72. Umlivropodeserdescritocomoumarvorecujosnstmnmerosdiferentes
deramos.Osnsnoterminaissocaptulos,sees,subsees,
pargrafos,frasesepalavras.Osnsterminaissopersonagens.

pgina529

C57
ANEXOCRespostasaosexerccios
Captulo9RESPOSTAS
9.1.

(Defundizendo()
(Formatot"ehpilotosdeidade,%")
(Formatot"ehpilotosemnegrito,%")
(Formatot
"Masnohantigospilotosemnegrito.%"))

9.2.

(Defundesenharline(n)

(Cond((zeropn)(formatot"%"))
(T(tformato"*")
(Drawlinha(N1)))))
9.3.

((Larguraalturadefuncaixadedraw)
(Cond((alturazerop)nil)
(T(drawlinelargura)
(Drawcaixadelargura(Altura1)))))

9.4.

(Defunnoventaenovegarrafas(n)
(Cond((zeropN)
(Formatot"eAwww,nomaiscerveja!"))
(T(fazversen)
(Noventaenovegarrafas(n1)))))
(Defunfazverse(n)
(Formatot
"&Sgarrafasdecervejanaparede,%"n)
(Formatot"garrafasdecervejaS!%"N)
(Formatot"Tomeumparabaixo,passeaemtorno%,%")
(Formatot
"garrafasSdecervejanaparede.%%"
(N1)))

9.5.

(Defunprintboard(b)
(Vamos((B2(sublis'((x

."X")
(O."O")
(nada.""))
b)))

(Formatot"&")
(B2linedeimpresso)
(Formatot"%")
(Printline(nthcdr3b2))
(Formatot"%")
(Linhadeimpresso(nthcdr6b2))))

pgina530

C58

CommonLisp:AGentleIntroduoComputaoSimblica
(Defunprintline(linha)
(FormatodeT"a|A|A%"
(primeiralinha)
(segundalinha)
(Terceiralinha)))
9.6.

(Defuncomputepay()
(Formatot"equeosalrioporhora?")
(Vamos((salrio(leia)))
(Formatot"equantashorastrabalhou?")
(Vamos((horrio(ler)))
(Formatot
"&OtrabalhadorganhoudlaresS".
(*horassalariais)))))

9.7.

(Defuncookiemonstro()
(Formatot"&Medbolinho!!!!%")
("Cookie?"Formatot)
(Vamos((resposta(leia)))
(Cond((respostaigual"cookie)
(Formatot"&Thankyou!")
(Formatot"...MunchMunchMunch")
(Formatot"...BURP"))
(T(formatot"&NoqueroS...%%"
resposta)
(Cookiemonstro)))))

9.8.

Umsmboloumblocodecincoponteiros.Cordasnososmbolos,so
vetores.Cordasavaliamparasimesmos.Elessoescritosfechadoem
aspasduplas,emuitasvezescontmletrasmaisculaseminsculasmista
caracteres,enquantonomesdesmbolosogeralmentetodasasletrasmaisculas.

9.9.

>(Formatot"como"'b)

aB
NADA
>(Formatot"always%quebrou")
sempre
quebrou
NADA
>(Formatot"SS"'alpha'aposta)
ALFABETO
NADA

pgina531

C59
ANEXOCRespostasaosexerccios
9.10. (Espaooverdefun(n)
(Cond((pluspN)
(Formatot"")
(Espaoover(n1)))
((Nzerop)nil)
(T(formatot"Erro!"))))
(Defunenredodeumponto(plotagemstringyval)
(Espaooveryval)
(Formatot"A%"traandostring))

(Defunenredopontos(plotagemcordasyvals)
(mapcar
#'(Lambda(y)
(Loteumpontodeplotagemstringy))
yvals))
(Defungerar(mn)
(Cond((igualmn)(listan))
(T(consm(gerar(+m1)n)))))
(Defuntornargraph()
(Vamos*((func
(Pedirpara"Funoparaogrfico?"))
(comear
(Pedirfor"Iniciandovalorx?"))
(Fim(pedirfor"Acabarcomvalorx?"))
(Plotagemstring
(Pedirpara"Traandocorda?")))
(Enredopontostraandostring
(Mapcarfunc(gerarfinaldapartida)))
t))
(Defunpedirfor(promptdecorda)
(Formatot"A"linhastring)
(ler))
9.11. (Defundotprin1(x)
(Cond((tomoX)(formatoT"S"x))
(T(formatot"(")
(Dotprin1(carrox))
(FormatodeT".")
(Dotprin1(cdrx))
(FormatodeT")"))))

pgina532

C60

CommonLisp:AGentleIntroduoComputaoSimblica
9.12. (DOTPRIN1'(A.(B.C)))deveimprimir(A.(B.C)).
9.13. Lispprefereescrever(A.NIL)emnotaolista,como(A).Mas(A.B)deve
serescritosemnotaodeponto,porqueoCDRdaclulacontrasnoaponta
paraNILououtraclulacontras.impressesLisp(A.B).
9.14. Ambasasestruturascausarciclosinfinitos.Paraoprimeiro,DOT
impressesPRIN1''(foo.(FOO.(FOO....''atquevocparlooualgumtipo
deempilharerrodeestouroocorre.Paraosegundo,tentativasDOTPRIN1
imprimirumasrieinfinitadeparntesesesquerda.
9.15. (Defunhbridoprin1(x)
(Cond((tomoX)(formatoT"S"x))
(T(hbridoprintcar(carrox))
(Hbridoprintcdr(cdrx)))))
(Defunhbridoprintcar(x)
(Formatot"(")
(Hbridoprin1x))
(Defunhbridoprintcdr(x)
(Cond((nullx)(formatot")"))
((tomoX)(formatodeT".S)"x))
(T(formatot"")
(Hbridoprin1(carrox))
(Hbridoprintcdr(cdrx)))))

CAPTULO10RESPOSTAS
10.1. Se*TOTALGLASSES*nofoiinicializado,gostaramosdeteruma
deerrovarivelnoatribudaquandoligamosvender.Seelefoiinicializadoa
osmboloFOOemvezdezero,teramosumaentradadetipoerrado
erroquandoSELLtentouincrementarototal.

10.2. (Defunsell(n)
(INCF*TOTALculos*n)
(Formatot
"&IssofazvidrosSathoje."
*Totalculos*))
10.3. (Setf*metbefore*0)

pgina533

C61
ANEXOCRespostasaosexerccios
(Defunseencontra(pessoa)
(Cond((igualpessoa(primeira*amigos*))
(INCF*combefore*)
'acabamosdenosconhecer)
((*amigosmembropessoa*)
(INCF*combefore*)
'nsnosconhecemos)
(T(pushpessoa*amigos*)
'prazeremconheclo)))
10.4. (Defunesquecer(pessoa)
(Cond((membropessoa*amigos*)
(amigossetf**
(Removerpessoa*amigos*))

'Esquecido)
(T(listade''noseipessoa))))
10.5. (Defunbonita(xy)
(Vamos*((maior(mxxy))
(Menor(minXY))
(Avg(/(+xy)2.0))
(Pct(*100(/avgmaior))))
(Listade"mdioavg'pctporcento'
'De'maiormax)))
10.6. (Setfxnil)
(xxpush)(nil)
(xxempurrar)((nil)nil)
(empurrarxx)(((nil)nil)(nil)nil)
10.7. (Comprimentox)noumadescriovlidalugar:Nocitarumlugar
ondeumapontadorarmazenado.SETFvaireclamarquenotemSETF
mtodoparaCOMPRIMENTO.
10.8. (*Cantossetf*'(1379))
(Setf*lados*'(2468))
(Defunblocksqueezeplay(board)
(SQand2detabuleiro*Computador***12oslados
"Blocosqueeze"))

pgina534

C62

CommonLisp:AGentleIntroduoComputaoSimblica
(Defunblocodedoisemum(bordo)
(SQand2bordo*oponente**cantos*12
"Bloqueardoisemum"))
(Defuntentesqueezeplay(board)
(SQand2bordo*oponente*nil11
"Configurarumsqueeze"))
(Defuntentedoisemum(bordo)
(SQand2bordo*computador*nil11
"Configurarumdoisemum"))
(Defunsqand2(bordojogadordaassociaovestratgia)
(Quando(igual(ensimo5board)dojogador)
(Ou(bordosqhelper19vestratgiadepiscina)
(Bordosqhelper37vpiscinaestratgia))))
(Defunsqhelper(placadaassociaoc1estratgiavalc2)
(Quando(igualval(somatripleto
borda
(Listadec15c2)))
(Vamos((pos(encontraremptyposio
borda
(Oupool(c1c2lista)))))
(Epos(estratgialistapos)))))
(Defunexploraodedoisemum(bordo)
(Quando(igual(ensimo5board)*Computador*)
(Ou(explorardedoisplaca12347)
(Exploraodedoisplaca32619)
(Exploraodedoisplaca74819)
(Explorardedoisplaca96378))))
(Defunexploraredois(placaposd1d2c1c2)
(E(igual(somatripleto
borda
(Listadec15c2))21)
(Zerop(bordoposensimo))

(Zerop(bordod1ensimo))
(Zerop(bordod2ensimo))
(Listadepos"explorardoisemum")))

pgina535

C63
ANEXOCRespostasaosexerccios
(Defunescolherbestmove(board)
(Ou(maketrsemumfilaboard)
(Bordoblocoopositorwin)
(Placadoblocosqueezeplay)
(Blocodedoisemumboard)
(Exploraodedoisemumboard)
(Experimentesqueezejogoboard)
(Experimentedoisemumboard)
(Boardestratgiarandommovimento)))
10.9. (Defuncosteleta(x)
(If(conspx)(setf(cdrx)nil))
x)
10,10. (Defunntack(XE)
(Nconcx(listae)))

10.11. AoperaoSETFconstriumalistacircular,fazendoocdrdo
ltimopontocelularcontrasdevoltaparaaprimeiraclula.

UMA

10.12. (APPENDHH)retornaalista(HIHOHOHI).Elecopiaoseuprimeiro
entradaeaestruturaaesresultadocomH.(NCONCHH)transformao
ListaHemumalistacircularatravsdacriaodestrutivadacdrdaltimaclula
deseuprimeiroargumentoparaapontarparaseusegundoargumento.
CAPTULO11RESPOSTAS
11.1. (Defunitmembro(incisoX)
(Dolist(ex)
(Quando(pontoeiguais)(retornot))))
11.2. (Defunitassoc(tabeladechave)
(Dolist(tabeladeentrada)
(Quando(igualchave(primeiraentrada))
(Entradaderetorno))))

pgina536

C64

CommonLisp:AGentleIntroduoComputaoSimblica
11.3. (Defuncheckallmpar(x)
(Cond((nullx)t)
(T(formatot"&VerificarS..."
(PrimeiraX))
(Amenosque(evenp(primeiraX))
(Checkallmpar(restantex))))))
11.4. (ITdefuncomprimento(x)
(Vamos((n0))
(Dolist(exN)
(INCFN))))
11.5. (Defunitn(nx)
(Dotimes(na(primeiraX))
(Popx)))
11.6. (Defunitunio(xy)
(Dolist(exy)
(Amenos(eymembro)
(Eypush))))
11.7. ITINTERSECTIONfoithroughtoselementosdeXdaesquerdaparaadireita,
eempurrouosselecionadospararesultset.PorqueIMPULSOadiciona
elementosparaafrentedeumalista,oresultadofoiconstrudoacimanaordeminversa.
PodemoscorrigirissoatravsdeITINTERSECTIONreverteroresultado
antesdedevolvlo.
11.8. (Defunloreverse(x)
(Vamos((resultadozero))
(Dolist(exresultado)
(Pusheresultado))))
11.9. (Defuncheckallmpar(x)
(Fazer((zx(restantez)))
((Nullz)t)
(Formatot"&VerificarS..."(primeiraz))
(If(evenp(primeiraz))(retornonil))))
11.10. (Lanamentodefun(n)
(Dotimes(in)
(Formatot"S..."(ni)))
(Formatot"Soprefora!"))

pgina537

C65
ANEXOCRespostasaosexerccios
11.11. (Defunencontrarmaior(listadenmeros)
(Fazer*((maior(primeiralistadenmeros))
(Z(restantelistadenmeros)(restantez))
(Elemento(primeiraz)(primeiraz)))
((Nullz)maior)
(Quando(>elementomaior)
(Omaiorelementosetf))))
11.12. (Defunpotnciade2(n)
(Fazer((resultado1(+resultadoresultado))
(I0(i+1)))
((Igualin)resultado)))
11.13. (Defunprimeiranointeiro(x)
"RetornaoprimeiroelementonointeirodeX."
(Dolist(ex'none)
(Quando(not(integerpe))
(Retornoe))))
11.14. AfunonofuncionariasensmudamosoDO*aumaDO.Quando

avaliaodaexpresso(PRIMEIROX)paraobterovalorinicialparaE,Lisp
iriatentarreferenciaroXvarivelglobal,porqueaexpresso
nodentrodoescopolxicodequalquervarivelchamadaX.locaisEstavontade
provavelmenteresultaremumerrovarivelnoatribuda.
11,15. Seapenasoltimonmeronalistaestranho,estaversodoFFOcom
DOretornarnilemvezdonmero.Devidoaousodeparalelo
atribuio,Eatribudooltimonmeronalista,aomesmotempo
queZtornasenulo.QuandoZNILtestederescisodoDOverdade,
demodoqueocorponuncaavaliadoeoltimoelementodalistanunca
testadoporserestranho.
11.16. AlistadevariveisdeumLETcontmparesdeformulrio(valorvarivel).o
listadevariveisdeumDOcontmtriplosdeforma(inicialdevalorvarivel
updateexpresso).Seoterceiroelementoomitido,avarivelno
atualizadoacadavezatravsdoloop.NestecasoFAZERtrataavarivel
assimcomoLETfaria.
11.17. Ovalordaexpresso5.

pgina538

C66

CommonLisp:AGentleIntroduoComputaoSimblica

11.18. (Fazer((i0(+i1)))
((I5)iigual)
(formatot"%I=S"i))
ODOpassaporseucorpodecincovezes,comavarivelndiceIigual
dezeroaquatro.Oloopterminaquandoatingecinco.Desde
aexpressoaserdevolvidoI,oDOretornacinco.muitosLisp
implementaestraduzautomaticamenteexpressesdotimesemum
FAZERexpressocomo.
11.19. AsentradasnalistadevariveisdeumDOpodemapareceremqualquerordem.Elesso
completamenteindependente,devidoaousodaatribuioparalela.Com
FAZER*,porm,aordemdasentradasimportante,porquesequencial
atribuiopermitedependnciasdeexistirentreasvariveis.
11,20. Seumloopusaapenasumavarivelndice,fazeme*soequivalentes.
11.21. (FIBdefun(n)versocomDO*
(Fazer*((cnt0(+cnt1))
(I1j)
(J1K)
(K2(+ij)))
((Cntnigual)i)))
(FIBdefun(n)versocomDO
(Fazer((cnt0(+cnt1))
(I1j)
(J1(+ij)))
((Cntnigual)i)))
11.22. (Defuncomplementambase(base)
(segundo
(Baseassoc'((at)(ta)(gc)(CG)))))
(Defuncomplementardecadeiasimples(cadeia)
(Fazer((sfio(repousos))
(Resultadonulo
(Cons(complementobase(primeiros))
resultado)))
((Nulls)(resultadoinverso))))

pgina539

C67
ANEXOCRespostasaosexerccios
(Defunmakedouble(vertente)
(Fazer((sfio(repousos))
(Resultadonulo
(Cons(lista(primeiras)
(Complementobase
(Primeiros)))
resultado)))
((Nulls)(resultadoinverso))))
(Defuncontagemdebases(DNA)
(Vamos((ACNT0)(tcnt0)(gcnt0)(CCNT0))
(Etiquetas((countonebase(base)
(Cond((igualbase'a)(INCFACNT))
((Igualbase't)(INCFtcnt))
((Igualbase'g)(INCFgcnt))
((Igualbase'c)(INCFCCNT)))))
(Dolist(elementodeDNA)
(Cond((elementotomo)(contagemdeumelementodebase))
(T(contagemonebase(primeiroelemento))
(Countonebase(segundoelemento)))))
(Lista(lista'aACNT)
(Listade'tcntt)

(Listade'ggcnt)
(Listade'CCNTc)))))
AfunoespecialrtulosusadosnacontagemdeBASESfoidescrita
emTpicosAvanadosseo8.18napgina282.Esseproblemapodeser
resolvidospoucomenoselegantementesemrtulos,porexemplo,por
tornandoCOUNTONEBASEumafunoseparadaemantendoo
contagensemvariveisglobais.
(Defunprefixp(strand1Strand2)
(Fazer((S1strand1(S1repouso))
(S2Strand2(restos2)))
((S1nulo)t)
(Amenosque(igual(primeiroS1)(primeiraS2))
(Nilretorno))))
(Defunappearsp(strand1Strand2)
(Fazer((s2Strand2(s2resto)))
((S2nulo)nil)
(Se(prefixpstrand1S2)
(Retornot))))

pgina540

C68

CommonLisp:AGentleIntroduoComputaoSimblica
(Defuncoverp(strand1Strand2)

(Fazer*((len1(comprimentostrand1))
(S2Strand2(nthcdrlen1s2)))
((S2null)t)
(Amenosque(prefixpstrand1S2)
(Nilretorno))))
(Defunprefixo(nvertente)
(Fazer((i0(+i1))
(Resnulo(cons(vertenteensimai)res)))
((Igualin)(resreverso))))
(Kerneldefun(vertente)
(Fazer((i1(+i1)))
((Coverp(prefixoivertente)Strand)
(Ivertenteprefixo))))
(DefundesenharDNA(cadeia)
(Vamos((n(comprimentofio)))
(Drawstringn"")
(Drawstringn"!")
(Basesdeempatevertente)
(Drawstringn".")
(Drawstringn".")
(Drawbases(vertentecomplementarpassadas))
(Drawstringn"!")
(Drawstringn"")))
(Defundesenharcordas(stringcnt)
(Formatot"&")
(Dotimes(icnt)
(Formatot"A"string)))
(Defundrawbases(vertente)
(Formatot"&")
(Dolist(vertentebase)
(Formatot"A"base)))

pgina541

C69
ANEXOCRespostasaosexerccios
CAPTULO12RESPOSTAS
12.1. OsmboloCAPITOutilizadonaexpressodeDEFSTRUCTnome
umdoscamposdeumanaveestelar.Apalavrachave:CAPTAINusadocomoum
argumentoparaFAASTARSHIPparaespecificarumvalorparaestecampo.o
smboloSTARSHIPCAPITOnomesafunodeacessoque
extraiessecampodeumobjetoestelar.
12.2. (STARSHIPSTARSHIPP')retornaNIL,porqueSTARSHIPapenasum
smbolo,noumaestruturadotipoSTARSHIP.
12.3. (tipode"makenaveestelar)smbolo
(TYPEDE#'FazSTARSHIP)retornaumvalorquedependedo
representaodasfunesnasuaimplementaoLispparticular.
AlgunsvalorespossveissolxicoENCERRAMENTO,COMPILED
FUNO,oumesmoCONS.
(tipode(makenaveestelar))naveestelar
12.4. (Ndefstruct
nome
questo
simacaso
nocaso)

(Setf*listadens*nil)
(Defuninit()
(Setf*listadens*nil)
'Inicializado)
(Defunaddnode(questonomesimcasodenocaso)
(Push(makenode:nomenome
:Question
:Simsimcasoacaso
:Nocasodenocaso)
*Listaden*)
nome)
(Defunencontrarnode(x)
(Encontrarse#'(lambda(n)
((Nnodenameigual)x))
*Listadens*))

pgina542

C70

CommonLisp:AGentleIntroduoComputaoSimblica
(Defunprocessoden(nome)
(Vamos((nd(nomeencontranode)))
(SeND

(If(younp"&A"
(Ndndeinterrogao))
(Nsimcasend)
(Ndnnocaso))
(Formatot
"&AindanonSdefinido."nome))))
(Defunrun()
(Fazer((atualn'start
(Correntedendeprocessonode)))
((Nullatualn)nil)
(Cond((stringpatualn)
(Formatot"&A"natual)
(Nilregresso)))))
(Defuninterativaadd()
(Vamos*((nome(linhapara"Nomedon?"))
(Quest(pedirpara"Pergunta?"))
(Simaction(pedirpara"Seno?"))
(Noaco(pedirpara"Seno?")))
(Nomeaddnodebuscasimdeaonoaco)))
>(Addinterativo)
Onomedon?Motorvontadedegernciabrevemente
Questo?"Serqueatendadomotorquandofrio
masnoquandoquente?"
Sesim?barracasdesomentequandofrias
Seno?barracasevenquandoquentes
MOTORWILLRUNBREVEMENTE
>(Addinterativo)
Onomedon?barracasdesomentequandofrias
Questo?"avelocidadedemarchalentafrio
menosde700rpm?"
Sesim?Coldidlevelocidadenormal
Seno?"Ajusteavelocidadedemarchalentafrio."
TENDASonlyQUANDOFria

pgina543

C71
ANEXOCRespostasaosexerccios
12,5. (SetfS1(makenaveestelar:nomede"Empresa"))
(Defstruct(capito
(:Functionprintprintcapito))
(Nilnome)
(Idadenil)
(Nilnavio))
(Defunprintcapito(xprofundidadestream)
(Streamformato"#<CAPTAINS>"
(Capitonamex)))
(Setfjim(makecapito
:Nome"JamesT.Kirk"
:35anos
:S1navio))
(Setf(navecapitoS1)jim)
CAPTULO13RESPOSTAS
13.1. (Defunsubprop(smbolodepropriedadedoitem)
(Setf(obterapropriedadesmbolo)
(Removeritem(obterapropriedadesmbolo))))
13.2. (Defunesquecerreunio(person1pessoa2)

(Subpropperson1pessoa2'temmet)
(Subproppessoa2person1'temmet)
'Esquecido)
13.3. (Defunmyget(smbolodapropriedade)
(Fazer((p(smbolosmboloplist)(cddrp)))
((Nullp)nil)
(If(igualpropriedade(primeirap))
(Retorno(segundap)))))
13.4. (Defunhasprop(smbolodepropriedade)
(Fazer((p(smbolosmboloplist)(cddrp)))
((Nullp)nil)
(If(igualpropriedade(primeirap))
(Retornot))))

pgina544

C72

CommonLisp:AGentleIntroduoComputaoSimblica
13.5. Vocpodeacessarqualquerelementodeumamatrizemtempoconstante.Paraaslistas,o
quantidadedetempoquedemoraaalcanarumelementoproporcionalsua
distnciaapartirdoinciodalista.Outravantagemdematrizes
queelesgeralmenteusamapenascercademetadedaquantidadedearmazenamentocomolistas.
13.6. Aslistassofceisdecriarumelementodecadavez,usandocontras.Ens

podeemendarnovositensemumalistaemqualquerposio,ourecortelosparafora,usando
operaesdestrutivas.Asmatrizesnopodemserconstrudosoumanipulado
issofacilmente.Almdisso,alistapodecompartilharestruturademaneirasquenosopossveis
paramatrizes.
13.7. Ambasasestruturasrequeremomesmonmerodeclulascontras.Noentanto,seo
listadeassociaonoforampontilhadas,porexemplo,((CATMEOW)(DOG
WOOF))emvezde((CAT.MEOW)(DOG.WOOF)),entoseria
exigemumaclulamaiscontrasporentradadoqueapropriedadecorrespondente
representaolista.
13.8. (Setf*histarray*nil)
(Setf*Totaldepontos*0)
(Defunnovohistograma(lixeiras)
(Setf*Totaldepontos*0)
(*Histarraysetf*
(caixasdemakematriz:inicialdeelemento0))
t)
(Defunrecordedevalor(v)
(INCF*Totaldepontos*)
(Se(e(>=V0)
(<V(*histmatrizdecomprimento*)))
(INCF(aref*histarray*v))
(Erro"ValorSforadoslimites."V)))
(Defunimpressolinehist(i)
(Vamos((val(aref*histarray*i)))
(Formatot"e2D[3D]"ival)
(Dotimes(jVal)
(FormatodeT"*"))))
(Defunprinthistograma()
(Dotimes(i(comprimento*histarray*))
(Printhistlinei))
(Formatot"&totalde3D"*Totaldepontos*))

pgina545

C73
ANEXOCRespostasaosexerccios
13.9. Textodocriptograma:
(Criptotextosetf
'("Zjzekljjlsjfslapziezvlijpibkljufwxujphffvjupijf"
"EnlpopibslafmlPVVbfwkj"))
(Setf*enciphermesa*(makedehashtable))
(Setf*decifrarmesa*(makedehashtable))
(Defunmakesubstituio(cdigoclaro)
(Setf(gethashenciphertable*clara*)Cdigo)
(Setf(cdigogethash*decifrartable*)claro))
(Defundesfazersubstituio(cdigoclaro)
(Setf(gethashclara*enciphertable*)nil)
(Setf(cdigogethash*decifrartable*)nil))
(Defunclear()
(Clrhash*enciphertable*)
(Clrhash*decifrartable*))
(Defundecifrarcordas(string)
(Fazer*((len(cadeiadecomprimento))
(Novastring(certifiquestringlen
:Inicialelemento#\Space))
(I0(1+i)))
((Igualilen)novastring)
(Vamos*((char(arefcadeiai))
(Novachar
(Decifrartablegethashchar**)))
(Quandonovachar

(Setf(arefnovastringi)novachar)))))
(Defunshowline(linha)
(FormatodeT"%A%A%"
linha
(Linhadecifrarstring)))
(Defunshowtext()
(Formatot"&")
(Dolist(linhacriptotexto)
(Linhadeshowline))
(Formatot"&"))

pgina546

C74

CommonLisp:AGentleIntroduoComputaoSimblica
(Defunobterprimeirochar(x)
(Chardowncase
(Char(formatonil"A"x)0)))
(Defunlerletras()
(Vamos((obj(leia)))
(If(objmembro'(undofinal))
obj
(Getprimeirocharobj))))

(Defunsubletra(cdigo)
(Quando(cdigogethash*decifrartable*)
(Formatot"e"um
(Formatot"decifradocomo"um
(Cdigogethash*decifrartable*))
(Retornodasubcartanil))
(Formatot"Oquesignifica'
(Vamos((claro(leiacarta)))
(Cond((not(characterpclaro))
(Formatot"eRespostainvlida."))
((Gethashclara*enciphertable*)
(Formatot"Mas'
(Gethashclara*enciphertable*))
(Formatot"decifracomo"um
Claro))
(T(cdigodesubstituiodedeixarclaro)))))
(Defundesfazercarta()
(Formatot"&Undoqualletra?")
(Vamos*((cdigo(leialetra))
((Cdigogethashclara
*Decifrartable*)))
(Cond((no(cdigocharacterp))
(Formatot"eentradainvlido."))
(Cdigo(desfazersubstituioclaroclaro))
(T(tformato
"&Mas'
cdigo)))))

pgina547

C75
ANEXOCRespostasaosexerccios
(Defunsolve()
(Fazer((respnil))
((Respfinaligual'))
(exposio)
(Formatot"&substituoqualletra?")
(Setfresp(leialetra))
(Cond((characterpresp)(subcartaresp))
((Igualresp'Undo)(cartadesfazer))
((Igualrespfinal')nil)
(T(formatot"eentradainvlido.")))))
Soluoparaocriptograma:melhorpermanecersilenciosoeserpensado
otolodoqueparafalareeliminarqualquerdvida.
CAPTULO14RESPOSTAS
14.1. (POPX)normalmenteseexpandeparaalgocomo(PROG1(CARX)(SETQ
X(XCDR))),masaexpansoexactavariadeumLisp
aplicaoparaaseguinte.
14.2. AexpansodeumaDEFSTRUCTlongoecomplicado,umavezqueexiste
Sotantosdetalhesaseremmanipulados.Vocvaiverdefiniesparaacessor
funes,mtodossetf,umafunodeconstrutor,umtipodepredicado,e
outrascoisas.
14.3. (Defmacrosetnil(var)
(Listade'setfvarnil))
14.4. (Defmacrosimplesrotatef(var1var2)
'(Deixe((temp1,var1)
(Temp2,var2))
(Setf,var1temp2)

(Setf,var2temp1)))
(Defmacrosetmtua(var1var2)
14.5.
'(Progn
(Setf,var1',var2)
(Setf,var2',var1)))

pgina548

C76

CommonLisp:AGentleIntroduoComputaoSimblica
14.6. (Defmacrodecadeiavarivel(&restoVARs)
'(Progn
,@(Fazer((vvars(restov))
(Resnil))
((Null(restov))(resreverso))
(Push'(setf,(primeirav)
',(Segundav))
res))))
14.7. Pararesolveresteproblema,devemoscriarumnovoestado,TEM25,eemseguida
definirtodasastransieslegaisparadentroeforadesteestado.almdecolocar

emtrimestres,tambmpodemoschegaraesteestadocomumacombinaoapropriada
demoedasemoedas.
(Defnodetm25)
(Inciodefarc
trimestretem25"Kerpedao!")
(Defarctm15centavo
tm25"Clink!")
(Defarctm20nqueltm25"Clunk!")
(Defarctem5trimestretem25
"Nqueldevolvido.")
(Defarctm10trimestretem25
"Obtivemosdezcentavos.")
(Defarctm15trimestretem25
"Obtivemosquinzecentavos.")
(Defarctm20trimestretem25
"Obtivemosvintecentavos.")
(Defarctm25trimestretem25
"Quarterretornado.")
(Defarctm25fimbarbotodechocolate
"Entregarbarradechocolate.")
(Defarctm25startcointretorno
"Obtivemosvinteecincocentavos.")
14.8. desaconselhvelaescrevermacrosquetmefeitoscolaterais,porquevocnofaz
necessariamentesaberquandoouquantasvezesamacroserexpandido.
Algumasimplementaesexpandirmacrosumavezesalvaroresultadopara
reusooutrosreexpandamacroemcadachamadamacro.
Alguns
implementaesmesmotentativadeexpandiraschamadasmacroemcorposdefuno
nomomentoemqueafunoDEFUNed.

pgina549

C77
ANEXOCRespostasaosexerccios
14.9. Emmeadosde1989,a24builtinCommonLispfunesespeciaisso:
BLOCK,captura,compiladordeLET,DECLARO,EVALQUANDO,
FLET,funo,GO,SE,etiquetas,DEIXE,DEIXE*,MACROLET,
MLTIPLAVALORCALL,vriosvaloresPROG1,Progn,
PROGV,citaes,DEVOLVADE,SETQ,TAGBODY,O,
JOGUE,edescontrairPROTECT.Estalistapodemudarcomofuturo
revisesdopadroCommonLisp.
14.10. programasLispfuncionamtipicamentede10a100vezesmaisrpidoapsacompilao.
14.11. (Defuncompilararc(arco)
(Vamos((a(arcoarcoaction)))
'((Igualthisinput',(rtuloarcoarco))
(Formatot"&A",a)
(,(Nodename(arcotoARC))
(RestodeentradaSyms)))))
(Defuncompilarnode(n)
(Vamos((nome(nnodename))
(ARCclusulas
(Mapcar#'compilararc
(NNodesadas))))
"(defun,nome(entradaSyms
&AUX(estaentrada
(Primeiraentradasyms)))
(Cond((inputSymsnula)',nome)
,@Arcoclusulas
(T(tformato
"&NoharcodeAcometiquetaS"
',Nomeesteentrada))))))
(Defmacrocompilarmquina()
'(Progn,@(mapcar#'compilarnode*ns*)))
>(Compilemquina)

FIM
>(Start'(dimedimedimegomabutton))
Clink!
Clink!
Dimeretornado.
Entregargoma,mudanadenquel.
FIM

pgina550

C78

CommonLisp:AGentleIntroduoComputaoSimblica

pgina551

Glossrio

umalista
Vejalistadeassociaes.
funodeacesso
Afuno,comoSTARSHIPSPEED,definidaautomaticamenteporDEFSTRUCT,
quelhepermiteacederaumdeterminadocampodeumaestrutura.
endereo
Umnmeroquedescrevealocalizaodeumobjectonamemria.
operadordeaplicativo
Umafunoquelevaumaoutrafunocomoentrada,eaplicaaalgunsdados.
ExemplosincluemmapcareENCONTRARSE.
programaodeaplicativo
Umestilodeprogramaonoqualasfunessofrequentementepassadoscomodadosparaoutros
funeseatribuioexplcitaevitado.operaesrepetitivassoexecutadas
pelapassagemdefunesdeoperadoresaplicativas.
APLICAR
OLispprimitivoqueaplicaumafunoaumconjuntodeargumentos.EVALe
APLICARsoasduasfunesbsicasapartirdoqualosintrpretesLispsoconstrudos.
operadoresApplicativesotodosconstrudosapartirAPLICAR(oudefuncall.)
argumento
Umpedaodedadosqueservecomoentradaparaumafuno,ouumaexpressoque,quando
avaliadas,vaiproduziraquelepedaodedados.Otermotambmusadoparasereferirao
nomesdeumafunousaparasuasentradas,comoem''AVERAGEumafunodedois
argumentos:Xe'Y."

listadeargumentos
Umalistaqueespecificaosnomesdeumafunodacadaumdeseusinsumos,equantas
insumosdequenecessita.Aodefinirumanovafuno,asegundaentradaparaDefun
listadeargumentosdanovafuno.

L1

pgina552

L2

CommonLisp:AGentleIntroduoComputaoSimblica
ordem
Umblococontguodearmazenamentocujoselementossoacessadosporndicesnumricos.
Matrizesunidimensionaissochamadosvetores,esoumtipodesequncia.
cabealhomatriz
UmapequenaquantidadedearmazenamentonoinciodeumamatrizondeLispmantm
informaosobreaorganizaodamatriz,talcomooseucomprimento,eonmero
dedimensesquetem.
estilolivredeatribuio
Umestilodeprogramaoqueevitaaatribuioexplcitadevariveis.umavezqueum
variveldadoumvalor,porexemplo,porumachamadadefunoouporLET,essevalorno
alterar.programaslivredeatribuiosoconsideradosmuitoeleganteefcildeler.
listadeassociao
Umalistadepares,ou,maisgeralmente,delistas,chamadoentradas.Ocarrodecadaentrada
achaveprocurouporASSOC.
tomo

QualquerobjectoquenoLispumaclulacontras.Todososnolistassotomos.Assimovazio
lista,NIL.
aumento
Oprocessodeadiodealgoparaumresultadoparaderivarumanovasequncia.
recursodeaumento
Umtipoderecursoemqueoresultadofinalconstrudapoucoapouco,adicionando
algoparaoresultadodecadachamadarecursiva.
backtrace
Aexibiodapilhadeexecuomostrandoafunoactualmenteaseravaliado,
afunoquechamou,afunoquechamouestafuno,eassimpordiante.
Backtracessoexibidaspelodepuradorsobcomando.
bignum
Umnmerointeirocomumnmeroarbitrriodedgitos.Internamente,bignumssogeralmente
representadacomoumtipoespecialdesequncia.Comparefixnum.
rvorebinria
Umarvoreemquecadannoterminaltemexactamentedoisfilhos.Aslistaspodemser
vistocomorvoresbinriascujosnsnoterminalsocontrasasclulasecujosterminais
nodossotomos.
obrigatrio
Umtermoarcaicocomosusosconflitantes.Essencialmente,osmeiosdeligaocriandoum
variveleatribuindolheumvalor.Vejatambmreligao.
quadra
UmasequnciadechamadadeexpressesLisp,queformaocorpodeumaexpressoBLOCO.
OsblocospodemserencerradousandoRETURNFROM.

pgina553

Glossrio L3
nomedobloco
Umsmboloservecomoonomedeumbloco.Fazer,faze*,dotimeseDOLIST
criarblocosimplcitasnomeadosNIL.Funesdefinidaspordefunourtulos
cercarseuscorposcomblocosimplcitascujonomeomesmoqueafuno.
corpo
Ocorpodeumformulrio,comoadefiniodefunooudeumLET,etiquetasouFAZER
expresso,contmexpressessejamavaliadassequencialmentedentrodolxico
contextodaforma.Normalmente,ovalordaltimaexpressonocorpo
retornadopelaforma.
funobooleana
Umafunocujasentradasesadassovaloresdeverdade.Funesbooleanassoverdade
funes.
balde
Umadasranhurasdeumatabeladehash,emqueumacadeiadeitensarmazenados.Quantomais
baldesumatabelahashtem,menositenscadabaldedevempossuir,equantomaisrpidoo
acessoemtempoparaumitemser.

Você também pode gostar