Escolar Documentos
Profissional Documentos
Cultura Documentos
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¶queocursorgarantidoparaser
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
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.