12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848 |
- @node Conses, Arrays, Characters, Top
- @chapter Conses
- @menu
- * Cons Concepts::
- * Conses Dictionary::
- @end menu
- @node Cons Concepts, Conses Dictionary, Conses, Conses
- @section Cons Concepts
- @c including concept-conses
- A @i{cons}
- @IGindex{cons}
- is a compound data @i{object}
- having two components called the @i{car} and the @i{cdr}.
- @group
- @noindent
- @w{ car cons rplacd }
- @w{ cdr rplaca }
- @noindent
- @w{ Figure 14--1: Some defined names relating to conses.}
- @end group
- Depending on context, a group of connected @i{conses} can be viewed
- in a variety of different ways. A variety of operations is provided to
- support each of these various views.
- @menu
- * Conses as Trees::
- * Conses as Lists::
- @end menu
- @node Conses as Trees, Conses as Lists, Cons Concepts, Cons Concepts
- @subsection Conses as Trees
- A @i{tree}
- @IGindex{tree}
- is a binary recursive data structure made up of
- @i{conses} and @i{atoms}:
- the @i{conses} are themselves also @i{trees}
- (sometimes called ``subtrees'' or ``branches''), and the @i{atoms}
- are terminal nodes (sometimes called @i{leaves}
- @IGindex{leaves}
- ).
- Typically, the @i{leaves} represent data while the branches
- establish some relationship among that data.
- @group
- @noindent
- @w{ caaaar caddar cdar nsubst }
- @w{ caaadr cadddr cddaar nsubst-if }
- @w{ caaar caddr cddadr nsubst-if-not }
- @w{ caadar cadr cddar nthcdr }
- @w{ caaddr cdaaar cdddar sublis }
- @w{ caadr cdaadr cddddr subst }
- @w{ caar cdaar cdddr subst-if }
- @w{ cadaar cdadar cddr subst-if-not }
- @w{ cadadr cdaddr copy-tree tree-equal }
- @w{ cadar cdadr nsublis }
- @noindent
- @w{ Figure 14--2: Some defined names relating to trees.}
- @end group
- @menu
- * General Restrictions on Parameters that must be Trees::
- @end menu
- @node General Restrictions on Parameters that must be Trees, , Conses as Trees, Conses as Trees
- @subsubsection General Restrictions on Parameters that must be Trees
- Except as explicitly stated otherwise,
- for any @i{standardized} @i{function} that takes a @i{parameter}
- that is required to be a @i{tree},
- the consequences are undefined
- if that @i{tree} is circular.
- @node Conses as Lists, , Conses as Trees, Cons Concepts
- @subsection Conses as Lists
- A @i{list}
- @IGindex{list}
- is a chain of @i{conses} in which the @i{car} of each
- @i{cons} is an @i{element} of the @i{list},
- and the @i{cdr} of each @i{cons} is either the next
- link in the chain or a terminating @i{atom}.
- A @i{proper list}
- @IGindex{proper list}
- is a @i{list} terminated by the @i{empty list}.
- The @i{empty list} is a @i{proper list}, but is not a @i{cons}.
- An @i{improper list}
- @IGindex{improper list}
- is a @i{list} that is not a @i{proper list};
- that is, it is a @i{circular list} or a @i{dotted list}.
- A @i{dotted list}
- @IGindex{dotted list}
- is a @i{list} that has a terminating @i{atom}
- that is not the @i{empty list}. A @i{non-nil} @i{atom} by itself
- is not considered to be a @i{list} of any kind---not even a @i{dotted list}.
- A @i{circular list}
- @IGindex{circular list}
- is a chain of @i{conses} that has no termination
- because some @i{cons} in the chain is the @i{cdr} of a later @i{cons}.
- @group
- @noindent
- @w{ append last nbutlast rest }
- @w{ butlast ldiff nconc revappend }
- @w{ copy-alist list ninth second }
- @w{ copy-list list* nreconc seventh }
- @w{ eighth list-length nth sixth }
- @w{ endp make-list nthcdr tailp }
- @w{ fifth member pop tenth }
- @w{ first member-if push third }
- @w{ fourth member-if-not pushnew }
- @noindent
- @w{ Figure 14--3: Some defined names relating to lists.}
- @end group
- @menu
- * Lists as Association Lists::
- * Lists as Sets::
- * General Restrictions on Parameters that must be Lists::
- @end menu
- @node Lists as Association Lists, Lists as Sets, Conses as Lists, Conses as Lists
- @subsubsection Lists as Association Lists
- An @i{association list}
- @IGindex{association list}
- is a @i{list} of @i{conses}
- representing an association of @i{keys} with @i{values},
- where the @i{car} of each @i{cons} is the @i{key}
- and the @i{cdr} is the @i{value} associated with that @i{key}.
- @group
- @noindent
- @w{ acons assoc-if pairlis rassoc-if }
- @w{ assoc assoc-if-not rassoc rassoc-if-not }
- @noindent
- @w{ Figure 14--4: Some defined names related to assocation lists.}
- @end group
- @node Lists as Sets, General Restrictions on Parameters that must be Lists, Lists as Association Lists, Conses as Lists
- @subsubsection Lists as Sets
- @i{Lists} are sometimes viewed as sets by considering their elements
- unordered and by assuming there is no duplication of elements.
- @group
- @noindent
- @w{ adjoin nset-difference set-difference union }
- @w{ intersection nset-exclusive-or set-exclusive-or }
- @w{ nintersection nunion subsetp }
- @noindent
- @w{ Figure 14--5: Some defined names related to sets. }
- @end group
- @node General Restrictions on Parameters that must be Lists, , Lists as Sets, Conses as Lists
- @subsubsection General Restrictions on Parameters that must be Lists
- Except as explicitly specified otherwise,
- any @i{standardized} @i{function} that takes a @i{parameter}
- that is required to be a @i{list} should be prepared to signal
- an error of @i{type} @b{type-error} if the @i{value} received is a @i{dotted list}.
- Except as explicitly specified otherwise,
- for any @i{standardized} @i{function} that takes a @i{parameter}
- that is required to be a @i{list},
- the consequences are undefined
- if that @i{list} is @i{circular}.
- @c end of including concept-conses
- @node Conses Dictionary, , Cons Concepts, Conses
- @section Conses Dictionary
- @c including dict-conses
- @menu
- * list::
- * null (System Class)::
- * cons (System Class)::
- * atom (Type)::
- * cons::
- * consp::
- * atom::
- * rplaca::
- * car::
- * copy-tree::
- * sublis::
- * subst::
- * tree-equal::
- * copy-list::
- * list::
- * list-length::
- * listp::
- * make-list::
- * push::
- * pop::
- * first::
- * nth::
- * endp::
- * null::
- * nconc::
- * append::
- * revappend::
- * butlast::
- * last::
- * ldiff::
- * nthcdr::
- * rest::
- * member::
- * mapc::
- * acons::
- * assoc::
- * copy-alist::
- * pairlis::
- * rassoc::
- * get-properties::
- * getf::
- * remf::
- * intersection::
- * adjoin::
- * pushnew::
- * set-difference::
- * set-exclusive-or::
- * subsetp::
- * union::
- @end menu
- @node list, null (System Class), Conses Dictionary, Conses Dictionary
- @subsection list [System Class]
- @subsubheading Class Precedence List::
- @b{list},
- @b{sequence},
- @b{t}
- @subsubheading Description::
- A @i{list}
- @IGindex{list}
- is a chain of @i{conses} in which the @i{car} of each
- @i{cons} is an @i{element} of the @i{list}, and the @i{cdr} of
- each @i{cons} is either the next link in the chain or a terminating
- @i{atom}.
- A @i{proper list}
- @IGindex{proper list}
- is a chain of @i{conses} terminated by
- the @i{empty list}
- @IGindex{empty list}
- , @t{()}, which is itself a @i{proper list}.
- A @i{dotted list}
- @IGindex{dotted list}
- is a @i{list} which has a terminating @i{atom}
- that is not the @i{empty list}.
- A @i{circular list}
- @IGindex{circular list}
- is a chain of @i{conses} that has no termination
- because some @i{cons} in the chain is the @i{cdr} of a later @i{cons}.
- @i{Dotted lists} and @i{circular lists} are also @i{lists}, but usually
- the unqualified term ``list'' within this specification means @i{proper list}.
- Nevertheless, the @i{type} @b{list} unambiguously includes @i{dotted lists}
- and @i{circular lists}.
- For each @i{element} of a @i{list} there is a @i{cons}.
- The @i{empty list} has no @i{elements} and is not a @i{cons}.
- The @i{types} @b{cons} and @b{null} form an @i{exhaustive partition}
- of the @i{type} @b{list}.
- @subsubheading See Also::
- @ref{Left-Parenthesis},
- @ref{Printing Lists and Conses}
- @node null (System Class), cons (System Class), list, Conses Dictionary
- @subsection null [System Class]
- @subsubheading Class Precedence List::
- @b{null},
- @b{symbol},
- @b{list},
- @b{sequence},
- @b{t}
- @subsubheading Description::
- The only @i{object} of @i{type} @b{null} is @b{nil},
- which represents the @i{empty list} and can also be notated @t{()}.
- @subsubheading See Also::
- @ref{Symbols as Tokens},
- @ref{Left-Parenthesis},
- @ref{Printing Symbols}
- @node cons (System Class), atom (Type), null (System Class), Conses Dictionary
- @subsection cons [System Class]
- @subsubheading Class Precedence List::
- @b{cons},
- @b{list},
- @b{sequence},
- @b{t}
- @subsubheading Description::
- A @i{cons} is a compound @i{object} having two components,
- called the @i{car} and @i{cdr}. These form a @i{dotted pair}.
- Each component can be any @i{object}.
- @subsubheading Compound Type Specifier Kind::
- Specializing.
- @subsubheading Compound Type Specifier Syntax::
- (@code{cons}@{@i{@t{[}car-typespec @r{[}cdr-typespec@r{]}@t{]}}@})
- @subsubheading Compound Type Specifier Arguments::
- @i{car-typespec}---a @i{type specifier},
- or the @i{symbol} @b{*}.
- The default is the @i{symbol} @b{*}.
- @i{cdr-typespec}---a @i{type specifier},
- or the @i{symbol} @b{*}.
- The default is the @i{symbol} @b{*}.
- @subsubheading Compound Type Specifier Description::
- This denotes the set of @i{conses}
- whose @i{car} is constrained to be of @i{type} @i{car-typespec} and
- whose @i{cdr} is constrained to be of @i{type} @i{cdr-typespec}.
- (If either @i{car-typespec} or @i{cdr-typespec} is @b{*},
- it is as if the @i{type} @b{t} had been denoted.)
- @subsubheading See Also::
- @ref{Left-Parenthesis},
- @ref{Printing Lists and Conses}
- @node atom (Type), cons, cons (System Class), Conses Dictionary
- @subsection atom [Type]
- @subsubheading Supertypes::
- @b{atom},
- @b{t}
- @subsubheading Description::
- It is equivalent to @t{(not cons)}.
- @node cons, consp, atom (Type), Conses Dictionary
- @subsection cons [Function]
- @code{cons} @i{object-1 object-2} @result{} @i{cons}
- @subsubheading Arguments and Values::
- @i{object-1}---an @i{object}.
- @i{object-2}---an @i{object}.
- @i{cons}---a @i{cons}.
- @subsubheading Description::
- Creates a @i{fresh} @i{cons}, the @i{car} of which is @i{object-1}
- and the @i{cdr} of which is @i{object-2}.
- @subsubheading Examples::
- @example
- (cons 1 2) @result{} (1 . 2)
- (cons 1 nil) @result{} (1)
- (cons nil 2) @result{} (NIL . 2)
- (cons nil nil) @result{} (NIL)
- (cons 1 (cons 2 (cons 3 (cons 4 nil)))) @result{} (1 2 3 4)
- (cons 'a 'b) @result{} (A . B)
- (cons 'a (cons 'b (cons 'c '@t{()}))) @result{} (A B C)
- (cons 'a '(b c d)) @result{} (A B C D)
- @end example
- @subsubheading See Also::
- @ref{list}
- @subsubheading Notes::
- If @i{object-2} is a @i{list}, @b{cons} can be thought of as
- producing a new @i{list} which is like it but has @i{object-1} prepended.
- @node consp, atom, cons, Conses Dictionary
- @subsection consp [Function]
- @code{consp} @i{object} @result{} @i{generalized-boolean}
- @subsubheading Arguments and Values::
- @i{object}---an @i{object}.
- @i{generalized-boolean}---a @i{generalized boolean}.
- @subsubheading Description::
- Returns @i{true} if @i{object} is of @i{type} @b{cons};
- otherwise, returns @i{false}.
- @subsubheading Examples::
- @example
- (consp nil) @result{} @i{false}
- (consp (cons 1 2)) @result{} @i{true}
- @end example
- The @i{empty list} is not a @i{cons}, so
- @example
- (consp '()) @equiv{} (consp 'nil) @result{} @i{false}
- @end example
- @subsubheading See Also::
- @ref{listp}
- @subsubheading Notes::
- @example
- (consp @i{object}) @equiv{} (typep @i{object} 'cons) @equiv{} (not (typep @i{object} 'atom)) @equiv{} (typep @i{object} '(not atom))
- @end example
- @node atom, rplaca, consp, Conses Dictionary
- @subsection atom [Function]
- @code{atom} @i{object} @result{} @i{generalized-boolean}
- @subsubheading Arguments and Values::
- @i{object}---an @i{object}.
- @i{generalized-boolean}---a @i{generalized boolean}.
- @subsubheading Description::
- Returns @i{true} if @i{object} is of @i{type} @b{atom};
- otherwise, returns @i{false}.
- @subsubheading Examples::
- @example
- (atom 'sss) @result{} @i{true}
- (atom (cons 1 2)) @result{} @i{false}
- (atom nil) @result{} @i{true}
- (atom '()) @result{} @i{true}
- (atom 3) @result{} @i{true}
- @end example
- @subsubheading Notes::
- @example
- (atom @i{object}) @equiv{} (typep @i{object} 'atom) @equiv{} (not (consp @i{object}))
- @equiv{} (not (typep @i{object} 'cons)) @equiv{} (typep @i{object} '(not cons))
- @end example
- @node rplaca, car, atom, Conses Dictionary
- @subsection rplaca, rplacd [Function]
- @code{rplaca} @i{cons object} @result{} @i{cons}
- @code{rplacd} @i{cons object} @result{} @i{cons}
- @subsubheading Pronunciation::
- @b{rplaca}: pronounced ,r\=e 'plak e
- or pronounced ,re 'plak e
- @b{rplacd}: pronounced ,r\=e 'plak de
- or pronounced ,re 'plak de
- or pronounced ,r\=e 'plak d\=e
- or pronounced ,re 'plak d\=e
- @subsubheading Arguments and Values::
- @i{cons}---a @i{cons}.
- @i{object}---an @i{object}.
- @subsubheading Description::
- @b{rplaca} replaces the @i{car} of the @i{cons} with @i{object}.
- @b{rplacd} replaces the @i{cdr} of the @i{cons} with @i{object}.
- @subsubheading Examples::
- @example
- (defparameter *some-list* (list* 'one 'two 'three 'four)) @result{} *some-list*
- *some-list* @result{} (ONE TWO THREE . FOUR)
- (rplaca *some-list* 'uno) @result{} (UNO TWO THREE . FOUR)
- *some-list* @result{} (UNO TWO THREE . FOUR)
- (rplacd (last *some-list*) (list 'IV)) @result{} (THREE IV)
- *some-list* @result{} (UNO TWO THREE IV)
- @end example
- @subsubheading Side Effects::
- The @i{cons} is modified.
- Should signal an error of @i{type} @b{type-error}
- if @i{cons} is not a @i{cons}.
- @node car, copy-tree, rplaca, Conses Dictionary
- @subsection car, cdr,
- @subheading caar, cadr, cdar, cddr,
- @subheading caaar, caadr, cadar, caddr, cdaar, cdadr, cddar, cdddr,
- @subheading caaaar, caaadr, caadar, caaddr, cadaar, cadadr, caddar, cadddr,
- @subheading cdaaar, cdaadr, cdadar, cdaddr, cddaar, cddadr, cdddar, cddddr
- @flushright
- @i{[Accessor]}
- @end flushright
- @code{car} @i{x} @result{} @i{object}
- (setf (@code{car} @i{x}) new-object)@*
- @code{cdr} @i{x} @result{} @i{object}
- (setf (@code{cdr} @i{x}) new-object)@*
- @code{\vksip 5pt} @i{x} @result{} @i{object}
- (setf (@code{\vksip 5pt} @i{x}) new-object)@*
- @code{caar} @i{x} @result{} @i{object}
- (setf (@code{caar} @i{x}) new-object)@*
- @code{cadr} @i{x} @result{} @i{object}
- (setf (@code{cadr} @i{x}) new-object)@*
- @code{cdar} @i{x} @result{} @i{object}
- (setf (@code{cdar} @i{x}) new-object)@*
- @code{cddr} @i{x} @result{} @i{object}
- (setf (@code{cddr} @i{x}) new-object)@*
- @code{\vksip 5pt} @i{x} @result{} @i{object}
- (setf (@code{\vksip 5pt} @i{x}) new-object)@*
- @code{caaar} @i{x} @result{} @i{object}
- (setf (@code{caaar} @i{x}) new-object)@*
- @code{caadr} @i{x} @result{} @i{object}
- (setf (@code{caadr} @i{x}) new-object)@*
- @code{cadar} @i{x} @result{} @i{object}
- (setf (@code{cadar} @i{x}) new-object)@*
- @code{caddr} @i{x} @result{} @i{object}
- (setf (@code{caddr} @i{x}) new-object)@*
- @code{cdaar} @i{x} @result{} @i{object}
- (setf (@code{cdaar} @i{x}) new-object)@*
- @code{cdadr} @i{x} @result{} @i{object}
- (setf (@code{cdadr} @i{x}) new-object)@*
- @code{cddar} @i{x} @result{} @i{object}
- (setf (@code{cddar} @i{x}) new-object)@*
- @code{cdddr} @i{x} @result{} @i{object}
- (setf (@code{cdddr} @i{x}) new-object)@*
- @code{\vksip 5pt} @i{x} @result{} @i{object}
- (setf (@code{\vksip 5pt} @i{x}) new-object)@*
- @code{caaaar} @i{x} @result{} @i{object}
- (setf (@code{caaaar} @i{x}) new-object)@*
- @code{caaadr} @i{x} @result{} @i{object}
- (setf (@code{caaadr} @i{x}) new-object)@*
- @code{caadar} @i{x} @result{} @i{object}
- (setf (@code{caadar} @i{x}) new-object)@*
- @code{caaddr} @i{x} @result{} @i{object}
- (setf (@code{caaddr} @i{x}) new-object)@*
- @code{cadaar} @i{x} @result{} @i{object}
- (setf (@code{cadaar} @i{x}) new-object)@*
- @code{cadadr} @i{x} @result{} @i{object}
- (setf (@code{cadadr} @i{x}) new-object)@*
- @code{caddar} @i{x} @result{} @i{object}
- (setf (@code{caddar} @i{x}) new-object)@*
- @code{cadddr} @i{x} @result{} @i{object}
- (setf (@code{cadddr} @i{x}) new-object)@*
- @code{cdaaar} @i{x} @result{} @i{object}
- (setf (@code{cdaaar} @i{x}) new-object)@*
- @code{cdaadr} @i{x} @result{} @i{object}
- (setf (@code{cdaadr} @i{x}) new-object)@*
- @code{cdadar} @i{x} @result{} @i{object}
- (setf (@code{cdadar} @i{x}) new-object)@*
- @code{cdaddr} @i{x} @result{} @i{object}
- (setf (@code{cdaddr} @i{x}) new-object)@*
- @code{cddaar} @i{x} @result{} @i{object}
- (setf (@code{cddaar} @i{x}) new-object)@*
- @code{cddadr} @i{x} @result{} @i{object}
- (setf (@code{cddadr} @i{x}) new-object)@*
- @code{cdddar} @i{x} @result{} @i{object}
- (setf (@code{cdddar} @i{x}) new-object)@*
- @code{cddddr} @i{x} @result{} @i{object}
- (setf (@code{cddddr} @i{x}) new-object)@*
- @subsubheading Pronunciation::
- @b{cadr}: pronounced 'ka ,de r
- @b{caddr}: pronounced 'kad e ,de r
- or pronounced 'ka ,dude r
- @b{cdr}: pronounced 'ku ,de r
- @b{cddr}: pronounced 'kud e ,de r
- or pronounced 'ke ,dude r
- @subsubheading Arguments and Values::
- @i{x}---a @i{list}.
- @i{object}---an @i{object}.
- @i{new-object}---an @i{object}.
- @subsubheading Description::
- If @i{x} is a @i{cons}, @b{car} returns the @i{car}
- of that @i{cons}. If @i{x} is @b{nil}, @b{car} returns @b{nil}.
- If @i{x} is a @i{cons}, @b{cdr} returns the @i{cdr}
- of that @i{cons}. If @i{x} is @b{nil}, @b{cdr} returns @b{nil}.
- @i{Functions} are provided which perform compositions of up to four
- @b{car} and @b{cdr} operations. Their @i{names} consist of
- a @t{C}, followed by two, three, or four occurrences of @t{A} or @t{D},
- and finally an @t{R}. The series of @t{A}'s and @t{D}'s in each
- @i{function}'s @i{name} is chosen to identify the series of
- @b{car} and @b{cdr} operations that is performed by the function.
- The order in which the @t{A}'s and @t{D}'s appear is the inverse of the
- order in which the corresponding operations are performed. Figure 14--6
- defines the relationships precisely.
- @group
- @noindent
- @w{ This @i{place} ... Is equivalent to this @i{place} ... }
- @w{ @t{(caar @i{x})} @t{(car (car @i{x}))} }
- @w{ @t{(cadr @i{x})} @t{(car (cdr @i{x}))} }
- @w{ @t{(cdar @i{x})} @t{(cdr (car @i{x}))} }
- @w{ @t{(cddr @i{x})} @t{(cdr (cdr @i{x}))} }
- @w{ @t{(caaar @i{x})} @t{(car (car (car @i{x})))} }
- @w{ @t{(caadr @i{x})} @t{(car (car (cdr @i{x})))} }
- @w{ @t{(cadar @i{x})} @t{(car (cdr (car @i{x})))} }
- @w{ @t{(caddr @i{x})} @t{(car (cdr (cdr @i{x})))} }
- @w{ @t{(cdaar @i{x})} @t{(cdr (car (car @i{x})))} }
- @w{ @t{(cdadr @i{x})} @t{(cdr (car (cdr @i{x})))} }
- @w{ @t{(cddar @i{x})} @t{(cdr (cdr (car @i{x})))} }
- @w{ @t{(cdddr @i{x})} @t{(cdr (cdr (cdr @i{x})))} }
- @w{ @t{(caaaar @i{x})} @t{(car (car (car (car @i{x}))))} }
- @w{ @t{(caaadr @i{x})} @t{(car (car (car (cdr @i{x}))))} }
- @w{ @t{(caadar @i{x})} @t{(car (car (cdr (car @i{x}))))} }
- @w{ @t{(caaddr @i{x})} @t{(car (car (cdr (cdr @i{x}))))} }
- @w{ @t{(cadaar @i{x})} @t{(car (cdr (car (car @i{x}))))} }
- @w{ @t{(cadadr @i{x})} @t{(car (cdr (car (cdr @i{x}))))} }
- @w{ @t{(caddar @i{x})} @t{(car (cdr (cdr (car @i{x}))))} }
- @w{ @t{(cadddr @i{x})} @t{(car (cdr (cdr (cdr @i{x}))))} }
- @w{ @t{(cdaaar @i{x})} @t{(cdr (car (car (car @i{x}))))} }
- @w{ @t{(cdaadr @i{x})} @t{(cdr (car (car (cdr @i{x}))))} }
- @w{ @t{(cdadar @i{x})} @t{(cdr (car (cdr (car @i{x}))))} }
- @w{ @t{(cdaddr @i{x})} @t{(cdr (car (cdr (cdr @i{x}))))} }
- @w{ @t{(cddaar @i{x})} @t{(cdr (cdr (car (car @i{x}))))} }
- @w{ @t{(cddadr @i{x})} @t{(cdr (cdr (car (cdr @i{x}))))} }
- @w{ @t{(cdddar @i{x})} @t{(cdr (cdr (cdr (car @i{x}))))} }
- @w{ @t{(cddddr @i{x})} @t{(cdr (cdr (cdr (cdr @i{x}))))} }
- @noindent
- @w{ Figure 14--6: CAR and CDR variants }
- @end group
- @b{setf} can also be used with any of these functions to change an
- existing component of @i{x}, but @b{setf} will not make new
- components. So, for example, the @i{car} of a @i{cons}
- can be assigned with @b{setf} of @b{car},
- but the @i{car} of @b{nil} cannot be assigned with @b{setf} of @b{car}.
- Similarly, the @i{car} of the @i{car} of a @i{cons} whose @i{car}
- is a @i{cons} can be assigned with @b{setf} of @b{caar},
- but neither @b{nil} nor a @i{cons} whose car is @b{nil} can be assigned
- with @b{setf} of @b{caar}.
- The argument @i{x} is permitted to be a @i{dotted list}
- or a @i{circular list}.
- @subsubheading Examples::
- @example
- (car nil) @result{} NIL
- (cdr '(1 . 2)) @result{} 2
- (cdr '(1 2)) @result{} (2)
- (cadr '(1 2)) @result{} 2
- (car '(a b c)) @result{} A
- (cdr '(a b c)) @result{} (B C)
- @end example
- @subsubheading Exceptional Situations::
- The functions @b{car} and @b{cdr}
- should signal @b{type-error} if they receive an argument which is not a
- @i{list}. The other functions (@b{caar}, @b{cadr},
- ... @b{cddddr}) should behave for the purpose of
- error checking as if defined by appropriate calls to @b{car} and
- @b{cdr}.
- @subsubheading See Also::
- @ref{rplaca; rplacd}
- ,
- @ref{first; second; third; fourth; fifth; sixth; seventh; eighth; ninth; tenth}
- ,
- @ref{rest}
- @subsubheading Notes::
- The @i{car} of a @i{cons} can also be altered by using @b{rplaca},
- and the @i{cdr} of a @i{cons} can be altered by using @b{rplacd}.
- @example
- (car @i{x}) @equiv{} (first @i{x})
- (cadr @i{x}) @equiv{} (second @i{x}) @equiv{} (car (cdr @i{x}))
- (caddr @i{x}) @equiv{} (third @i{x}) @equiv{} (car (cdr (cdr @i{x})))
- (cadddr @i{x}) @equiv{} (fourth @i{x}) @equiv{} (car (cdr (cdr (cdr @i{x}))))
- @end example
- @node copy-tree, sublis, car, Conses Dictionary
- @subsection copy-tree [Function]
- @code{copy-tree} @i{tree} @result{} @i{new-tree}
- @subsubheading Arguments and Values::
- @i{tree}---a @i{tree}.
- @i{new-tree}---a @i{tree}.
- @subsubheading Description::
- Creates a @i{copy} of a @i{tree} of @i{conses}.
- If @i{tree} is not a @i{cons}, it is returned;
- otherwise, the result is a new @i{cons} of the results of calling @b{copy-tree}
- on the @i{car} and @i{cdr} of @i{tree}.
- In other words, all @i{conses} in the @i{tree} represented by @i{tree}
- are copied recursively, stopping only when non-@i{conses} are encountered.
- @b{copy-tree} does not preserve circularities and the sharing of substructure.
- @subsubheading Examples::
- @example
- (setq object (list (cons 1 "one")
- (cons 2 (list 'a 'b 'c))))
- @result{} ((1 . "one") (2 A B C))
- (setq object-too object) @result{} ((1 . "one") (2 A B C))
- (setq copy-as-list (copy-list object))
- (setq copy-as-alist (copy-alist object))
- (setq copy-as-tree (copy-tree object))
- (eq object object-too) @result{} @i{true}
- (eq copy-as-tree object) @result{} @i{false}
- (eql copy-as-tree object) @result{} @i{false}
- (equal copy-as-tree object) @result{} @i{true}
- (setf (first (cdr (second object))) "a"
- (car (second object)) "two"
- (car object) '(one . 1)) @result{} (ONE . 1)
- object @result{} ((ONE . 1) ("two" "a" B C))
- object-too @result{} ((ONE . 1) ("two" "a" B C))
- copy-as-list @result{} ((1 . "one") ("two" "a" B C))
- copy-as-alist @result{} ((1 . "one") (2 "a" B C))
- copy-as-tree @result{} ((1 . "one") (2 A B C))
- @end example
- @subsubheading See Also::
- @ref{tree-equal}
- @node sublis, subst, copy-tree, Conses Dictionary
- @subsection sublis, nsublis [Function]
- @code{sublis} @i{alist tree {&key} key test test-not} @result{} @i{new-tree}
- @code{nsublis} @i{alist tree {&key} key test test-not} @result{} @i{new-tree}
- @subsubheading Arguments and Values::
- @i{alist}---an @i{association list}.
- @i{tree}---a @i{tree}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{key}---a @i{designator} for a @i{function} of one argument,
- or @b{nil}.
- @i{new-tree}---a @i{tree}.
- @subsubheading Description::
- @b{sublis} makes substitutions for @i{objects} in @i{tree}
- (a structure of @i{conses}).
- @b{nsublis} is like @b{sublis}
- but destructively modifies the relevant
- parts of the @i{tree}.
- @b{sublis} looks at all subtrees and leaves of @i{tree};
- if a subtree or leaf appears as a key in @i{alist}
- (that is, the key and the subtree or leaf @i{satisfy the test}),
- it is replaced by the @i{object} with which that key is associated.
- This operation is non-destructive. In effect, @b{sublis} can
- perform several @b{subst} operations simultaneously.
- If @b{sublis} succeeds, a new copy of @i{tree} is returned in
- which each occurrence of such a subtree or leaf is replaced by the
- @i{object} with which it is associated. If no changes are made, the
- original tree is returned. The original @i{tree} is left unchanged,
- but the result tree may share cells with it.
- @b{nsublis} is permitted to modify @i{tree}
- but otherwise returns the same values as @b{sublis}.
- @subsubheading Examples::
- @example
- (sublis '((x . 100) (z . zprime))
- '(plus x (minus g z x p) 4 . x))
- @result{} (PLUS 100 (MINUS G ZPRIME 100 P) 4 . 100)
- (sublis '(((+ x y) . (- x y)) ((- x y) . (+ x y)))
- '(* (/ (+ x y) (+ x p)) (- x y))
- :test #'equal)
- @result{} (* (/ (- X Y) (+ X P)) (+ X Y))
- (setq tree1 '(1 (1 2) ((1 2 3)) (((1 2 3 4)))))
- @result{} (1 (1 2) ((1 2 3)) (((1 2 3 4))))
- (sublis '((3 . "three")) tree1)
- @result{} (1 (1 2) ((1 2 "three")) (((1 2 "three" 4))))
- (sublis '((t . "string"))
- (sublis '((1 . "") (4 . 44)) tree1)
- :key #'stringp)
- @result{} ("string" ("string" 2) (("string" 2 3)) ((("string" 2 3 44))))
- tree1 @result{} (1 (1 2) ((1 2 3)) (((1 2 3 4))))
- (setq tree2 '("one" ("one" "two") (("one" "Two" "three"))))
- @result{} ("one" ("one" "two") (("one" "Two" "three")))
- (sublis '(("two" . 2)) tree2)
- @result{} ("one" ("one" "two") (("one" "Two" "three")))
- tree2 @result{} ("one" ("one" "two") (("one" "Two" "three")))
- (sublis '(("two" . 2)) tree2 :test 'equal)
- @result{} ("one" ("one" 2) (("one" "Two" "three")))
- (nsublis '((t . 'temp))
- tree1
- :key #'(lambda (x) (or (atom x) (< (list-length x) 3))))
- @result{} ((QUOTE TEMP) (QUOTE TEMP) QUOTE TEMP)
- @end example
- @subsubheading Side Effects::
- @b{nsublis} modifies @i{tree}.
- @subsubheading See Also::
- @ref{subst; subst-if; subst-if-not; nsubst; nsubst-if; nsubst-if-not}
- ,
- @ref{Compiler Terminology},
- @ref{Traversal Rules and Side Effects}
- @subsubheading Notes::
- The @t{:test-not} parameter is deprecated.
- Because the side-effecting variants (@i{e.g.}, @b{nsublis}) potentially
- change the path that is being traversed, their effects in the presence
- of shared or circular structure structure may vary in surprising ways
- when compared to their non-side-effecting alternatives. To see this,
- consider the following side-effect behavior, which might be exhibited by
- some implementations:
- @example
- (defun test-it (fn)
- (let* ((shared-piece (list 'a 'b))
- (data (list shared-piece shared-piece)))
- (funcall fn '((a . b) (b . a)) data)))
- (test-it #'sublis) @result{} ((B A) (B A))
- (test-it #'nsublis) @result{} ((A B) (A B))
- @end example
- @node subst, tree-equal, sublis, Conses Dictionary
- @subsection subst, subst-if, subst-if-not, nsubst, nsubst-if, nsubst-if-not
- @flushright
- @i{[Function]}
- @end flushright
- @code{subst} @i{new old tree {&key} key test test-not} @result{} @i{new-tree}
- @code{subst-if} @i{new predicate tree {&key} key} @result{} @i{new-tree}
- @code{subst-if-not} @i{new predicate tree {&key} key} @result{} @i{new-tree}
- @code{nsubst} @i{new old tree {&key} key test test-not} @result{} @i{new-tree}
- @code{nsubst-if} @i{new predicate tree {&key} key} @result{} @i{new-tree}
- @code{nsubst-if-not} @i{new predicate tree {&key} key} @result{} @i{new-tree}
- @subsubheading Arguments and Values::
- @i{new}---an @i{object}.
- @i{old}---an @i{object}.
- @i{predicate}---a @i{symbol} that names a @i{function},
- or a @i{function} of one argument
- that returns a @i{generalized boolean} value.
- @i{tree}---a @i{tree}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{key}---a @i{designator} for a @i{function} of one argument,
- or @b{nil}.
- @i{new-tree}---a @i{tree}.
- @subsubheading Description::
- @b{subst}, @b{subst-if}, and @b{subst-if-not} perform
- substitution operations on @i{tree}.
- Each function searches @i{tree} for occurrences of a
- particular @i{old} item of an element or subexpression that
- @i{satisfies the test}.
- @b{nsubst}, @b{nsubst-if}, and @b{nsubst-if-not} are
- like @b{subst},
- @b{subst-if}, and @b{subst-if-not} respectively, except that the
- original @i{tree} is modified.
- @b{subst} makes a copy of @i{tree},
- substituting @i{new} for every subtree or leaf of @i{tree}
- (whether the subtree or leaf is a @i{car} or a @i{cdr} of its parent)
- such that @i{old} and the subtree or leaf @i{satisfy the test}.
- @b{nsubst} is a destructive version of @b{subst}.
- The list structure of
- @i{tree} is altered by destructively replacing with @i{new}
- each leaf of the @i{tree} such that @i{old} and the leaf
- @i{satisfy the test}.
- For @b{subst}, @b{subst-if},
- and @b{subst-if-not},
- if the functions succeed, a new
- copy of the tree is returned in which each occurrence of such an
- element is replaced by the
- @i{new} element or subexpression. If no changes are made, the original
- @i{tree} may be returned.
- The original @i{tree} is left unchanged, but the result tree
- may share storage with it.
- For @b{nsubst}, @b{nsubst-if},
- and @b{nsubst-if-not}
- the original @i{tree} is modified and returned as the function result,
- but the result may not be @b{eq} to @i{tree}.
- @subsubheading Examples::
- @example
- (setq tree1 '(1 (1 2) (1 2 3) (1 2 3 4))) @result{} (1 (1 2) (1 2 3) (1 2 3 4))
- (subst "two" 2 tree1) @result{} (1 (1 "two") (1 "two" 3) (1 "two" 3 4))
- (subst "five" 5 tree1) @result{} (1 (1 2) (1 2 3) (1 2 3 4))
- (eq tree1 (subst "five" 5 tree1)) @result{} @i{implementation-dependent}
- (subst 'tempest 'hurricane
- '(shakespeare wrote (the hurricane)))
- @result{} (SHAKESPEARE WROTE (THE TEMPEST))
- (subst 'foo 'nil '(shakespeare wrote (twelfth night)))
- @result{} (SHAKESPEARE WROTE (TWELFTH NIGHT . FOO) . FOO)
- (subst '(a . cons) '(old . pair)
- '((old . spice) ((old . shoes) old . pair) (old . pair))
- :test #'equal)
- @result{} ((OLD . SPICE) ((OLD . SHOES) A . CONS) (A . CONS))
- (subst-if 5 #'listp tree1) @result{} 5
- (subst-if-not '(x) #'consp tree1)
- @result{} (1 X)
- tree1 @result{} (1 (1 2) (1 2 3) (1 2 3 4))
- (nsubst 'x 3 tree1 :key #'(lambda (y) (and (listp y) (third y))))
- @result{} (1 (1 2) X X)
- tree1 @result{} (1 (1 2) X X)
- @end example
- @subsubheading Side Effects::
- @b{nsubst}, @b{nsubst-if}, and @b{nsubst-if-not}
- might alter the @i{tree structure} of @i{tree}.
- @subsubheading See Also::
- @ref{substitute; substitute-if; substitute-if-not; nsubstitute; nsubstitute-if; nsubstitute-if-not}
- ,
- @b{nsubstitute},
- @ref{Compiler Terminology},
- @ref{Traversal Rules and Side Effects}
- @subsubheading Notes::
- The @t{:test-not} parameter is deprecated.
- The functions @b{subst-if-not} and @b{nsubst-if-not} are deprecated.
- One possible definition of @b{subst}:
- @example
- (defun subst (old new tree &rest x &key test test-not key)
- (cond ((satisfies-the-test old tree :test test
- :test-not test-not :key key)
- new)
- ((atom tree) tree)
- (t (let ((a (apply #'subst old new (car tree) x))
- (d (apply #'subst old new (cdr tree) x)))
- (if (and (eql a (car tree))
- (eql d (cdr tree)))
- tree
- (cons a d))))))
- @end example
- @node tree-equal, copy-list, subst, Conses Dictionary
- @subsection tree-equal [Function]
- @code{tree-equal} @i{tree-1 tree-2 {&key} test test-not} @result{} @i{generalized-boolean}
- @subsubheading Arguments and Values::
- @i{tree-1}---a @i{tree}.
- @i{tree-2}---a @i{tree}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{generalized-boolean}---a @i{generalized boolean}.
- @subsubheading Description::
- @b{tree-equal} tests whether two trees are of the same shape
- and have the same leaves.
- @b{tree-equal} returns @i{true} if @i{tree-1} and @i{tree-2} are
- both @i{atoms} and @i{satisfy the test},
- or if they are both @i{conses} and
- the @i{car} of @i{tree-1} is @b{tree-equal} to
- the @i{car} of @i{tree-2} and
- the @i{cdr} of @i{tree-1} is @b{tree-equal} to
- the @i{cdr} of @i{tree-2}.
- Otherwise, @b{tree-equal} returns @i{false}.
- @b{tree-equal} recursively compares @i{conses} but not any
- other @i{objects} that have components.
- The first argument to the @t{:test} or @t{:test-not}
- function is @i{tree-1} or a @i{car} or @i{cdr} of @i{tree-1};
- the second argument is @i{tree-2} or a @i{car}
- or @i{cdr} of @i{tree-2}.
- @subsubheading Examples::
- @example
- (setq tree1 '(1 (1 2))
- tree2 '(1 (1 2))) @result{} (1 (1 2))
- (tree-equal tree1 tree2) @result{} @i{true}
- (eql tree1 tree2) @result{} @i{false}
- (setq tree1 '('a ('b 'c))
- tree2 '('a ('b 'c))) @result{} ('a ('b 'c))
- @result{} ((QUOTE A) ((QUOTE B) (QUOTE C)))
- (tree-equal tree1 tree2 :test 'eq) @result{} @i{true}
- @end example
- @subsubheading Exceptional Situations::
- The consequences are undefined
- if both @i{tree-1} and @i{tree-2} are circular.
- @subsubheading See Also::
- @ref{equal}
- ,
- @ref{Traversal Rules and Side Effects}
- @subsubheading Notes::
- The @t{:test-not} parameter is deprecated.
- @node copy-list, list, tree-equal, Conses Dictionary
- @subsection copy-list [Function]
- @code{copy-list} @i{list} @result{} @i{copy}
- @subsubheading Arguments and Values::
- @i{list}---a @i{proper list} or a @i{dotted list}.
- @i{copy}---a @i{list}.
- @subsubheading Description::
- Returns a @i{copy} of @i{list}.
- If @i{list} is a @i{dotted list},
- the resulting @i{list} will also be a @i{dotted list}.
- Only the @i{list structure} of @i{list} is copied;
- the @i{elements} of the resulting list are
- the @i{same} as the corresponding @i{elements} of the given @i{list}.
- @subsubheading Examples::
- @example
- (setq lst (list 1 (list 2 3))) @result{} (1 (2 3))
- (setq slst lst) @result{} (1 (2 3))
- (setq clst (copy-list lst)) @result{} (1 (2 3))
- (eq slst lst) @result{} @i{true}
- (eq clst lst) @result{} @i{false}
- (equal clst lst) @result{} @i{true}
- (rplaca lst "one") @result{} ("one" (2 3))
- slst @result{} ("one" (2 3))
- clst @result{} (1 (2 3))
- (setf (caadr lst) "two") @result{} "two"
- lst @result{} ("one" ("two" 3))
- slst @result{} ("one" ("two" 3))
- clst @result{} (1 ("two" 3))
- @end example
- @subsubheading Exceptional Situations::
- The consequences are undefined if @i{list} is a @i{circular list}.
- @subsubheading See Also::
- @ref{copy-alist}
- ,
- @ref{copy-seq}
- ,
- @ref{copy-tree}
- @subsubheading Notes::
- The copy created is @b{equal} to @i{list}, but not @b{eq}.
- @node list, list-length, copy-list, Conses Dictionary
- @subsection list, list* [Function]
- @code{list} @i{{&rest} objects} @result{} @i{list}
- @code{list*} @i{{&rest} objects^+} @result{} @i{result}
- @subsubheading Arguments and Values::
- @i{object}---an @i{object}.
- @i{list}---a @i{list}.
- @i{result}---an @i{object}.
- @subsubheading Description::
- @b{list} returns a @i{list} containing the supplied @i{objects}.
- @b{list*} is like @b{list} except that
- the last @i{argument} to @b{list} becomes
- the @i{car} of the last @i{cons} constructed, while
- the last @i{argument} to @b{list*} becomes
- the @i{cdr} of the last @i{cons} constructed.
- Hence, any given call to @b{list*} always produces one fewer @i{conses}
- than a call to @b{list} with the same number of arguments.
- If the last @i{argument} to @b{list*} is a @i{list},
- the effect is to construct a new @i{list} which is similar, but
- which has additional elements added to the front corresponding to
- the preceding @i{arguments} of @b{list*}.
- If @b{list*} receives only one @i{object},
- that @i{object} is returned, regardless of whether or not it is a @i{list}.
- @subsubheading Examples::
- @example
- (list 1) @result{} (1)
- (list* 1) @result{} 1
- (setq a 1) @result{} 1
- (list a 2) @result{} (1 2)
- '(a 2) @result{} (A 2)
- (list 'a 2) @result{} (A 2)
- (list* a 2) @result{} (1 . 2)
- (list) @result{} NIL ;@i{i.e.}, ()
- (setq a '(1 2)) @result{} (1 2)
- (eq a (list* a)) @result{} @i{true}
- (list 3 4 'a (car '(b . c)) (+ 6 -2)) @result{} (3 4 A B 4)
- (list* 'a 'b 'c 'd) @equiv{} (cons 'a (cons 'b (cons 'c 'd))) @result{} (A B C . D)
- (list* 'a 'b 'c '(d e f)) @result{} (A B C D E F)
- @end example
- @subsubheading See Also::
- @ref{cons}
- @subsubheading Notes::
- @example
- (list* @i{x}) @equiv{} @i{x}
- @end example
- @node list-length, listp, list, Conses Dictionary
- @subsection list-length [Function]
- @code{list-length} @i{list} @result{} @i{length}
- @subsubheading Arguments and Values::
- @i{list}---a @i{proper list} or a @i{circular list}.
- @i{length}---a non-negative @i{integer}, or @b{nil}.
- @subsubheading Description::
- Returns the @i{length} of @i{list} if @i{list} is a @i{proper list}.
- Returns @b{nil} if @i{list} is a @i{circular list}.
- @subsubheading Examples::
- @example
- (list-length '(a b c d)) @result{} 4
- (list-length '(a (b c) d)) @result{} 3
- (list-length '()) @result{} 0
- (list-length nil) @result{} 0
- (defun circular-list (&rest elements)
- (let ((cycle (copy-list elements)))
- (nconc cycle cycle)))
- (list-length (circular-list 'a 'b)) @result{} NIL
- (list-length (circular-list 'a)) @result{} NIL
- (list-length (circular-list)) @result{} 0
- @end example
- @subsubheading Exceptional Situations::
- Should signal an error of @i{type} @b{type-error}
- if @i{list} is not a @i{proper list} or a @i{circular list}.
- @subsubheading See Also::
- @ref{length}
- @subsubheading Notes::
- @b{list-length} could be implemented as follows:
- @example
- (defun list-length (x)
- (do ((n 0 (+ n 2)) ;Counter.
- (fast x (cddr fast)) ;Fast pointer: leaps by 2.
- (slow x (cdr slow))) ;Slow pointer: leaps by 1.
- (nil)
- ;; If fast pointer hits the end, return the count.
- (when (endp fast) (return n))
- (when (endp (cdr fast)) (return (+ n 1)))
- ;; If fast pointer eventually equals slow pointer,
- ;; then we must be stuck in a circular list.
- ;; (A deeper property is the converse: if we are
- ;; stuck in a circular list, then eventually the
- ;; fast pointer will equal the slow pointer.
- ;; That fact justifies this implementation.)
- (when (and (eq fast slow) (> n 0)) (return nil))))
- @end example
- @node listp, make-list, list-length, Conses Dictionary
- @subsection listp [Function]
- @code{listp} @i{object} @result{} @i{generalized-boolean}
- @subsubheading Arguments and Values::
- @i{object}---an @i{object}.
- @i{generalized-boolean}---a @i{generalized boolean}.
- @subsubheading Description::
- Returns @i{true} if @i{object} is of @i{type} @b{list};
- otherwise, returns @i{false}.
- @subsubheading Examples::
- @example
- (listp nil) @result{} @i{true}
- (listp (cons 1 2)) @result{} @i{true}
- (listp (make-array 6)) @result{} @i{false}
- (listp t) @result{} @i{false}
- @end example
- @subsubheading See Also::
- @ref{consp}
- @subsubheading Notes::
- If @i{object} is a @i{cons},
- @b{listp} does not check whether @i{object} is a @i{proper list};
- it returns @i{true} for any kind of @i{list}.
- @example
- (listp @i{object}) @equiv{} (typep @i{object} 'list) @equiv{} (typep @i{object} '(or cons null))
- @end example
- @node make-list, push, listp, Conses Dictionary
- @subsection make-list [Function]
- @code{make-list} @i{size {&key} initial-element} @result{} @i{list}
- @subsubheading Arguments and Values::
- @i{size}---a non-negative @i{integer}.
- @i{initial-element}---an @i{object}.
- The default is @b{nil}.
- @i{list}---a @i{list}.
- @subsubheading Description::
- Returns a @i{list} of @i{length} given by @i{size},
- each of the @i{elements} of which is @i{initial-element}.
- @subsubheading Examples::
- @example
- (make-list 5) @result{} (NIL NIL NIL NIL NIL)
- (make-list 3 :initial-element 'rah) @result{} (RAH RAH RAH)
- (make-list 2 :initial-element '(1 2 3)) @result{} ((1 2 3) (1 2 3))
- (make-list 0) @result{} NIL ;@i{i.e.}, ()
- (make-list 0 :initial-element 'new-element) @result{} NIL
- @end example
- @subsubheading Exceptional Situations::
- Should signal an error of @i{type} @b{type-error}
- if @i{size} is not a non-negative @i{integer}.
- @subsubheading See Also::
- @ref{cons}
- ,
- @ref{list}
- @node push, pop, make-list, Conses Dictionary
- @subsection push [Macro]
- @code{push} @i{item place} @result{} @i{new-place-value}
- @subsubheading Arguments and Values::
- @i{item}---an @i{object}.
- @i{place}---a @i{place}, the @i{value} of which may be any @i{object}.
- @i{new-place-value}---a @i{list} (the new @i{value} of @i{place}).
- @subsubheading Description::
- @b{push} prepends @i{item} to the @i{list} that is stored
- in @i{place}, stores the resulting @i{list} in @i{place},
- and returns the @i{list}.
- For information about the @i{evaluation} of @i{subforms} of @i{place},
- see @ref{Evaluation of Subforms to Places}.
- @subsubheading Examples::
- @example
- (setq llst '(nil)) @result{} (NIL)
- (push 1 (car llst)) @result{} (1)
- llst @result{} ((1))
- (push 1 (car llst)) @result{} (1 1)
- llst @result{} ((1 1))
- (setq x '(a (b c) d)) @result{} (A (B C) D)
- (push 5 (cadr x)) @result{} (5 B C)
- x @result{} (A (5 B C) D)
- @end example
- @subsubheading Side Effects::
- The contents of @i{place} are modified.
- @subsubheading See Also::
- @ref{pop}
- ,
- @ref{pushnew}
- ,
- @ref{Generalized Reference}
- @subsubheading Notes::
- The effect of @t{(push @i{item} @i{place})}
- is equivalent to
- @example
- (setf place (cons @i{item} @i{place}))
- @end example
- except that the @i{subforms} of @i{place}
- are evaluated only once, and @i{item} is evaluated
- before @i{place}.
- @node pop, first, push, Conses Dictionary
- @subsection pop [Macro]
- @code{pop} @i{place} @result{} @i{element}
- @subsubheading Arguments and Values::
- @i{place}---a @i{place}, the @i{value} of which is a @i{list}
- (possibly, but necessarily, a @i{dotted list} or @i{circular list}).
- @i{element}---an @i{object} (the @i{car} of the contents of @i{place}).
- @subsubheading Description::
- @b{pop} @i{reads} the @i{value} of @i{place},
- remembers the @i{car} of the @i{list} which was retrieved,
- @i{writes} the @i{cdr} of the @i{list} back into the @i{place},
- and finally @i{yields} the @i{car} of the originally retrieved @i{list}.
- For information about the @i{evaluation} of @i{subforms} of @i{place},
- see @ref{Evaluation of Subforms to Places}.
- @subsubheading Examples::
- @example
- (setq stack '(a b c)) @result{} (A B C)
- (pop stack) @result{} A
- stack @result{} (B C)
- (setq llst '((1 2 3 4))) @result{} ((1 2 3 4))
- (pop (car llst)) @result{} 1
- llst @result{} ((2 3 4))
- @end example
- @subsubheading Side Effects::
- The contents of @i{place} are modified.
- @subsubheading See Also::
- @ref{push}
- ,
- @ref{pushnew}
- ,
- @ref{Generalized Reference}
- @subsubheading Notes::
- The effect of @t{(pop @i{place})} is roughly equivalent to
- @example
- (prog1 (car @i{place}) (setf @i{place} (cdr @i{place})))
- @end example
- except that the latter would evaluate any @i{subforms} of @i{place}
- three times, while @b{pop} evaluates them only once.
- @node first, nth, pop, Conses Dictionary
- @subsection first, second, third, fourth, fifth,
- @subheading sixth, seventh, eighth, ninth, tenth
- @flushright
- @i{[Accessor]}
- @end flushright
- @code{first} @i{list} @result{} @i{object}
- (setf (@code{first} @i{list}) new-object)@*
- @code{second} @i{list} @result{} @i{object}
- (setf (@code{second} @i{list}) new-object)@*
- @code{third} @i{list} @result{} @i{object}
- (setf (@code{third} @i{list}) new-object)@*
- @code{fourth} @i{list} @result{} @i{object}
- (setf (@code{fourth} @i{list}) new-object)@*
- @code{fifth} @i{list} @result{} @i{object}
- (setf (@code{fifth} @i{list}) new-object)@*
- @code{sixth} @i{list} @result{} @i{object}
- (setf (@code{sixth} @i{list}) new-object)@*
- @code{seventh} @i{list} @result{} @i{object}
- (setf (@code{seventh} @i{list}) new-object)@*
- @code{eighth} @i{list} @result{} @i{object}
- (setf (@code{eighth} @i{list}) new-object)@*
- @code{ninth} @i{list} @result{} @i{object}
- (setf (@code{ninth} @i{list}) new-object)@*
- @code{tenth} @i{list} @result{} @i{object}
- (setf (@code{tenth} @i{list}) new-object)@*
- @subsubheading Arguments and Values::
- @i{list}---a @i{list},
- which might be a @i{dotted list} or a @i{circular list}.
- @i{object}, @i{new-object}---an @i{object}.
- @subsubheading Description::
- The functions
- @b{first},
- @b{second},
- @b{third},
- @b{fourth},
- @b{fifth},
- @b{sixth},
- @b{seventh},
- @b{eighth},
- @b{ninth},
- and
- @b{tenth}
- @i{access} the first, second, third, fourth, fifth, sixth, seventh, eighth,
- ninth, and tenth @i{elements} of @i{list}, respectively.
- Specifically,
- @example
- (first @i{list}) @equiv{} (car @i{list})
- (second @i{list}) @equiv{} (car (cdr @i{list}))
- (third @i{list}) @equiv{} (car (cddr @i{list}))
- (fourth @i{list}) @equiv{} (car (cdddr @i{list}))
- (fifth @i{list}) @equiv{} (car (cddddr @i{list}))
- (sixth @i{list}) @equiv{} (car (cdr (cddddr @i{list})))
- (seventh @i{list}) @equiv{} (car (cddr (cddddr @i{list})))
- (eighth @i{list}) @equiv{} (car (cdddr (cddddr @i{list})))
- (ninth @i{list}) @equiv{} (car (cddddr (cddddr @i{list})))
- (tenth @i{list}) @equiv{} (car (cdr (cddddr (cddddr @i{list}))))
- @end example
- @b{setf} can also be used with any of these functions to change an
- existing component. The same equivalences apply. For example:
- @example
- (setf (fifth @i{list}) @i{new-object}) @equiv{} (setf (car (cddddr @i{list})) @i{new-object})
- @end example
- @subsubheading Examples::
- @example
- (setq lst '(1 2 3 (4 5 6) ((V)) vi 7 8 9 10))
- @result{} (1 2 3 (4 5 6) ((V)) VI 7 8 9 10)
- (first lst) @result{} 1
- (tenth lst) @result{} 10
- (fifth lst) @result{} ((V))
- (second (fourth lst)) @result{} 5
- (sixth '(1 2 3)) @result{} NIL
- (setf (fourth lst) "four") @result{} "four"
- lst @result{} (1 2 3 "four" ((V)) VI 7 8 9 10)
- @end example
- @subsubheading See Also::
- @ref{car; cdr; caar; cadr; cdar; cddr; caaar; caadr; cadar; caddr; cdaar; cdadr; cddar; cdddr; caaaar; caaadr; caadar; caaddr; cadaar; cadadr; caddar; cadddr; cdaaar; cdaadr; cdadar; cdaddr; cddaar; cddadr; cdddar; cddddr}
- ,
- @ref{nth}
- @subsubheading Notes::
- @b{first} is functionally equivalent to @b{car},
- @b{second} is functionally equivalent to @b{cadr},
- @b{third} is functionally equivalent to @b{caddr}, and
- @b{fourth} is functionally equivalent to @b{cadddr}.
- The ordinal numbering used here is one-origin,
- as opposed to the zero-origin numbering used by @b{nth}:
- @example
- (fifth x) @equiv{} (nth 4 x)
- @end example
- @node nth, endp, first, Conses Dictionary
- @subsection nth [Accessor]
- @code{nth} @i{n list} @result{} @i{object}
- (setf (@code{ nth} @i{n list}) new-object)@*
- @subsubheading Arguments and Values::
- @i{n}---a non-negative @i{integer}.
- @i{list}---a @i{list},
- which might be a @i{dotted list} or a @i{circular list}.
- @i{object}---an @i{object}.
- @i{new-object}---an @i{object}.
- @subsubheading Description::
- @b{nth} locates the @i{n}th element of @i{list},
- where the @i{car} of the @i{list} is the ``zeroth'' element.
- Specifically,
- @example
- (nth @i{n} @i{list}) @equiv{} (car (nthcdr @i{n} @i{list}))
- @end example
- @b{nth} may be used to specify a @i{place} to @b{setf}.
- Specifically,
- @example
- (setf (nth @i{n} @i{list}) @i{new-object}) @equiv{} (setf (car (nthcdr @i{n} @i{list})) @i{new-object})
- @end example
- @subsubheading Examples::
- @example
- (nth 0 '(foo bar baz)) @result{} FOO
- (nth 1 '(foo bar baz)) @result{} BAR
- (nth 3 '(foo bar baz)) @result{} NIL
- (setq 0-to-3 (list 0 1 2 3)) @result{} (0 1 2 3)
- (setf (nth 2 0-to-3) "two") @result{} "two"
- 0-to-3 @result{} (0 1 "two" 3)
- @end example
- @subsubheading See Also::
- @ref{elt}
- ,
- @ref{first; second; third; fourth; fifth; sixth; seventh; eighth; ninth; tenth}
- ,
- @ref{nthcdr}
- @node endp, null, nth, Conses Dictionary
- @subsection endp [Function]
- @code{endp} @i{list} @result{} @i{generalized-boolean}
- @subsubheading Arguments and Values::
- @i{list}---a @i{list},
- which might be a @i{dotted list} or a @i{circular list}.
- @i{generalized-boolean}---a @i{generalized boolean}.
- @subsubheading Description::
- Returns @i{true} if @i{list} is the @i{empty list}.
- Returns @i{false} if @i{list} is a @i{cons}.
- @subsubheading Examples::
- @example
- (endp nil) @result{} @i{true}
- (endp '(1 2)) @result{} @i{false}
- (endp (cddr '(1 2))) @result{} @i{true}
- @end example
- @subsubheading Exceptional Situations::
- Should signal an error of @i{type} @b{type-error}
- if @i{list} is not a @i{list}.
- @subsubheading Notes::
- The purpose of @b{endp} is to test for the end of @i{proper list}.
- Since @b{endp} does not descend into a @i{cons},
- it is well-defined to pass it a @i{dotted list}.
- However, if shorter ``lists'' are iteratively produced
- by calling @b{cdr} on such a @i{dotted list}
- and those ``lists'' are tested with @b{endp},
- a situation that has undefined consequences will eventually result
- when the @i{non-nil} @i{atom} (which is not in fact a @i{list})
- finally becomes the argument to @b{endp}.
- Since this is the usual way in which @b{endp} is used,
- it is conservative programming style
- and consistent with the intent of @b{endp}
- to treat @b{endp} as simply a function on @i{proper lists}
- which happens not to enforce an argument type of @i{proper list} except
- when the argument is @i{atomic}.
- @node null, nconc, endp, Conses Dictionary
- @subsection null [Function]
- @code{null} @i{object} @result{} @i{boolean}
- @subsubheading Arguments and Values::
- @i{object}---an @i{object}.
- @i{boolean}---a @i{boolean}.
- @subsubheading Description::
- Returns @b{t} if @i{object} is the @i{empty list};
- otherwise, returns @b{nil}.
- @subsubheading Examples::
- @example
- (null '()) @result{} T
- (null nil) @result{} T
- (null t) @result{} NIL
- (null 1) @result{} NIL
- @end example
- @subsubheading See Also::
- @ref{not}
- @subsubheading Notes::
- @b{null} is intended to be used to test for the @i{empty list}
- whereas @b{not} is intended to be used to invert a @i{boolean}
- (or @i{generalized boolean}).
- Operationally, @b{null} and @b{not} compute the same result;
- which to use is a matter of style.
- @example
- (null @i{object}) @equiv{} (typep @i{object} 'null) @equiv{} (eq @i{object} '@t{()})
- @end example
- @node nconc, append, null, Conses Dictionary
- @subsection nconc [Function]
- @code{nconc} @i{{&rest} lists} @result{} @i{concatenated-list}
- @subsubheading Arguments and Values::
- @i{list}---each but the last must be a @i{list}
- (which might be a @i{dotted list} but must not be a @i{circular list});
- the last @i{list} may be any @i{object}.
- @i{concatenated-list}---a @i{list}.
- @subsubheading Description::
- Returns a @i{list} that is the concatenation of @i{lists}.
- If no @i{lists} are supplied, @t{(nconc)} returns @b{nil}.
- @b{nconc} is defined using the following recursive relationship:
- @example
- (nconc) @result{} ()
- (nconc nil . @i{lists}) @equiv{} (nconc . @i{lists})
- (nconc @i{list}) @result{} @i{list}
- (nconc @i{list-1} @i{list-2}) @equiv{} (progn (rplacd (last @i{list-1}) @i{list-2}) @i{list-1})
- (nconc @i{list-1} @i{list-2} . @i{lists}) @equiv{} (nconc (nconc @i{list-1} @i{list-2}) . @i{lists})
- @end example
- @subsubheading Examples::
- @example
- (nconc) @result{} NIL
- (setq x '(a b c)) @result{} (A B C)
- (setq y '(d e f)) @result{} (D E F)
- (nconc x y) @result{} (A B C D E F)
- x @result{} (A B C D E F)
- @end example
- Note, in the example, that the value of @t{x} is now different,
- since its last @i{cons}
- has been @b{rplacd}'d to the value of @t{y}.
- If @t{(nconc x y)} were evaluated again,
- it would yield a piece of a @i{circular list},
- whose printed representation would be
- @t{(A B C D E F D E F D E F ...)}, repeating forever;
- if the @b{*print-circle*} switch were @i{non-nil},
- it would be printed as @t{(A B C . #1=(D E F . #1#))}.
- @example
- (setq foo (list 'a 'b 'c 'd 'e)
- bar (list 'f 'g 'h 'i 'j)
- baz (list 'k 'l 'm)) @result{} (K L M)
- (setq foo (nconc foo bar baz)) @result{} (A B C D E F G H I J K L M)
- foo @result{} (A B C D E F G H I J K L M)
- bar @result{} (F G H I J K L M)
- baz @result{} (K L M)
- (setq foo (list 'a 'b 'c 'd 'e)
- bar (list 'f 'g 'h 'i 'j)
- baz (list 'k 'l 'm)) @result{} (K L M)
- (setq foo (nconc nil foo bar nil baz)) @result{} (A B C D E F G H I J K L M)
- foo @result{} (A B C D E F G H I J K L M)
- bar @result{} (F G H I J K L M)
- baz @result{} (K L M)
- @end example
- @subsubheading Side Effects::
- The @i{lists} are modified rather than copied.
- @subsubheading See Also::
- @ref{append}
- ,
- @ref{concatenate}
- @node append, revappend, nconc, Conses Dictionary
- @subsection append [Function]
- @code{append} @i{{&rest} lists} @result{} @i{result}
- @subsubheading Arguments and Values::
- @i{list}---each must be a @i{proper list} except the last,
- which may be any @i{object}.
- @i{result}---an @i{object}. This will be a @i{list}
- unless the last @i{list} was not a @i{list}
- and all preceding @i{lists} were @i{null}.
- @subsubheading Description::
- @b{append} returns a new @i{list} that is the concatenation of
- the copies. @i{lists} are left unchanged; the @i{list structure}
- of each of @i{lists} except the last is copied.
- The last argument is not copied; it becomes the @i{cdr} of the
- final @i{dotted pair} of the concatenation of the preceding @i{lists},
- or is returned directly if there are no preceding
- @i{non-empty}
- @i{lists}.
- @subsubheading Examples::
- @example
- (append '(a b c) '(d e f) '() '(g)) @result{} (A B C D E F G)
- (append '(a b c) 'd) @result{} (A B C . D)
- (setq lst '(a b c)) @result{} (A B C)
- (append lst '(d)) @result{} (A B C D)
- lst @result{} (A B C)
- (append) @result{} NIL
- (append 'a) @result{} A
- @end example
- @subsubheading See Also::
- @ref{nconc}
- ,
- @ref{concatenate}
- @node revappend, butlast, append, Conses Dictionary
- @subsection revappend, nreconc [Function]
- @code{revappend} @i{list tail} @result{} @i{result-list}
- @code{nreconc} @i{list tail} @result{} @i{result-list}
- @subsubheading Arguments and Values::
- @i{list}---a @i{proper list}.
- @i{tail}---an @i{object}.
- @i{result-list}---an @i{object}.
- @subsubheading Description::
- @b{revappend} constructs a @i{copy}_2 of @i{list},
- but with the @i{elements} in reverse order. It then appends (as if
- by @b{nconc}) the @i{tail} to that reversed list and returns the result.
- @b{nreconc} reverses the order of @i{elements} in @i{list}
- (as if by @b{nreverse}). It then appends (as if by @b{nconc})
- the @i{tail} to that reversed list and returns the result.
- The resulting @i{list} shares @i{list structure} with @i{tail}.
- @subsubheading Examples::
- @example
- (let ((list-1 (list 1 2 3))
- (list-2 (list 'a 'b 'c)))
- (print (revappend list-1 list-2))
- (print (equal list-1 '(1 2 3)))
- (print (equal list-2 '(a b c))))
- @t{ |> } (3 2 1 A B C)
- @t{ |> } T
- @t{ |> } T
- @result{} T
- (revappend '(1 2 3) '()) @result{} (3 2 1)
- (revappend '(1 2 3) '(a . b)) @result{} (3 2 1 A . B)
- (revappend '() '(a b c)) @result{} (A B C)
- (revappend '(1 2 3) 'a) @result{} (3 2 1 . A)
- (revappend '() 'a) @result{} A ;degenerate case
- (let ((list-1 '(1 2 3))
- (list-2 '(a b c)))
- (print (nreconc list-1 list-2))
- (print (equal list-1 '(1 2 3)))
- (print (equal list-2 '(a b c))))
- @t{ |> } (3 2 1 A B C)
- @t{ |> } NIL
- @t{ |> } T
- @result{} T
- @end example
- @subsubheading Side Effects::
- @b{revappend} does not modify either of its @i{arguments}.
- @b{nreconc} is permitted to modify @i{list} but not @i{tail}.
- Although it might be implemented differently,
- @b{nreconc} is constrained to have side-effect behavior equivalent to:
- @example
- (nconc (nreverse @i{list}) @i{tail})
- @end example
- @subsubheading See Also::
- @ref{reverse; nreverse}
- ,
- @b{nreverse},
- @ref{nconc}
- @subsubheading Notes::
- The following functional equivalences are true,
- although good @i{implementations} will typically use a faster algorithm for
- achieving the same effect:
- @example
- (revappend @i{list} @i{tail}) @equiv{} (nconc (reverse @i{list}) @i{tail})
- (nreconc @i{list} @i{tail}) @equiv{} (nconc (nreverse @i{list}) @i{tail})
- @end example
- @node butlast, last, revappend, Conses Dictionary
- @subsection butlast, nbutlast [Function]
- @code{butlast} @i{list {&optional} n} @result{} @i{result-list}
- @code{nbutlast} @i{list {&optional} n} @result{} @i{result-list}
- @subsubheading Arguments and Values::
- @i{list}---a @i{list},
- which might be a @i{dotted list} but must not be a @i{circular list}.
- @i{n}---a non-negative @i{integer}.
- @i{result-list}---a @i{list}.
- @subsubheading Description::
- @b{butlast} returns a copy of @i{list} from which the last
- @i{n}
- conses
- have been omitted.
- If @i{n} is not supplied, its value is 1.
- If there are fewer than @i{n}
- conses
- in @i{list},
- @b{nil} is returned and, in the case of @b{nbutlast},
- @i{list} is not modified.
- @b{nbutlast} is like @b{butlast}, but @b{nbutlast}
- may modify @i{list}.
- It changes the @i{cdr} of
- the @i{cons} @i{n}+1 from the end of the @i{list} to @b{nil}.
- @subsubheading Examples::
- @example
- (setq lst '(1 2 3 4 5 6 7 8 9)) @result{} (1 2 3 4 5 6 7 8 9)
- (butlast lst) @result{} (1 2 3 4 5 6 7 8)
- (butlast lst 5) @result{} (1 2 3 4)
- (butlast lst (+ 5 5)) @result{} NIL
- lst @result{} (1 2 3 4 5 6 7 8 9)
- (nbutlast lst 3) @result{} (1 2 3 4 5 6)
- lst @result{} (1 2 3 4 5 6)
- (nbutlast lst 99) @result{} NIL
- lst @result{} (1 2 3 4 5 6)
- (butlast '(a b c d)) @result{} (A B C)
- (butlast '((a b) (c d))) @result{} ((A B))
- (butlast '(a)) @result{} NIL
- (butlast nil) @result{} NIL
- (setq foo (list 'a 'b 'c 'd)) @result{} (A B C D)
- (nbutlast foo) @result{} (A B C)
- foo @result{} (A B C)
- (nbutlast (list 'a)) @result{} NIL
- (nbutlast '()) @result{} NIL
- @end example
- @subsubheading Exceptional Situations::
- Should signal an error of @i{type} @b{type-error}
- if @i{list} is not a @i{proper list} or a @i{dotted list}.
- Should signal an error of @i{type} @b{type-error}
- if @i{n} is not a non-negative @i{integer}.
- @subsubheading Notes::
- @example
- (butlast @i{list} @i{n}) @equiv{} (ldiff @i{list} (last @i{list} @i{n}))
- @end example
- @node last, ldiff, butlast, Conses Dictionary
- @subsection last [Function]
- @code{last} @i{list {&optional} n} @result{} @i{tail}
- @subsubheading Arguments and Values::
- @i{list}---a @i{list},
- which might be a @i{dotted list} but must not be a @i{circular list}.
- @i{n}---a non-negative @i{integer}.
- The default is @t{1}.
- @i{tail}---an @i{object}.
- @subsubheading Description::
- @b{last} returns the last @i{n} @i{conses}
- (not the last @i{n} elements) of @i{list}).
- If @i{list} is @t{()}, @b{last} returns @t{()}.
- If @i{n} is zero,
- the atom that terminates @i{list} is returned.
- If @i{n} is greater than or equal to the number of @i{cons} cells in @i{list},
- the result is @i{list}.
- @subsubheading Examples::
- @example
- (last nil) @result{} NIL
- (last '(1 2 3)) @result{} (3)
- (last '(1 2 . 3)) @result{} (2 . 3)
- (setq x (list 'a 'b 'c 'd)) @result{} (A B C D)
- (last x) @result{} (D)
- (rplacd (last x) (list 'e 'f)) x @result{} (A B C D E F)
- (last x) @result{} (F)
- (last '(a b c)) @result{} (C)
- (last '(a b c) 0) @result{} ()
- (last '(a b c) 1) @result{} (C)
- (last '(a b c) 2) @result{} (B C)
- (last '(a b c) 3) @result{} (A B C)
- (last '(a b c) 4) @result{} (A B C)
- (last '(a . b) 0) @result{} B
- (last '(a . b) 1) @result{} (A . B)
- (last '(a . b) 2) @result{} (A . B)
- @end example
- @subsubheading Exceptional Situations::
- The consequences are undefined if @i{list} is a @i{circular list}.
- Should signal an error of @i{type} @b{type-error}
- if @i{n} is not a non-negative @i{integer}.
- @subsubheading See Also::
- @ref{butlast; nbutlast}
- ,
- @ref{nth}
- @subsubheading Notes::
- The following code could be used to define @b{last}.
- @example
- (defun last (list &optional (n 1))
- (check-type n (integer 0))
- (do ((l list (cdr l))
- (r list)
- (i 0 (+ i 1)))
- ((atom l) r)
- (if (>= i n) (pop r))))
- @end example
- @node ldiff, nthcdr, last, Conses Dictionary
- @subsection ldiff, tailp [Function]
- @code{ldiff} @i{list object} @result{} @i{result-list}
- @code{tailp} @i{object list} @result{} @i{generalized-boolean}
- @subsubheading Arguments and Values::
- @i{list}---a @i{list},
- which might be a @i{dotted list}.
- @i{object}---an @i{object}.
- @i{result-list}---a @i{list}.
- @i{generalized-boolean}---a @i{generalized boolean}.
- @subsubheading Description::
- If @i{object} is the @i{same} as some @i{tail} of @i{list},
- @b{tailp} returns @i{true};
- otherwise, it returns @i{false}.
- If @i{object} is the @i{same} as some @i{tail} of @i{list},
- @b{ldiff} returns a @i{fresh} @i{list}
- of the @i{elements} of @i{list}
- that precede @b{object} in the @i{list structure} of @i{list};
- otherwise, it returns a @i{copy}_2 of @i{list}.
- @subsubheading Examples::
- @example
- (let ((lists '#((a b c) (a b c . d))))
- (dotimes (i (length lists)) ()
- (let ((list (aref lists i)))
- (format t "~2&list=~S ~21T(tailp object list)~
- ~44T(ldiff list object)~
- (let ((objects (vector list (cddr list) (copy-list (cddr list))
- '(f g h) '() 'd 'x)))
- (dotimes (j (length objects)) ()
- (let ((object (aref objects j)))
- (format t "~& object=~S ~21T~S ~44T~S"
- object (tailp object list) (ldiff list object))))))))
- @t{ |> }
- @t{ |> } list=(A B C) (tailp object list) (ldiff list object)
- @t{ |> } object=(A B C) T NIL
- @t{ |> } object=(C) T (A B)
- @t{ |> } object=(C) NIL (A B C)
- @t{ |> } object=(F G H) NIL (A B C)
- @t{ |> } object=NIL T (A B C)
- @t{ |> } object=D NIL (A B C)
- @t{ |> } object=X NIL (A B C)
- @t{ |> }
- @t{ |> } list=(A B C . D) (tailp object list) (ldiff list object)
- @t{ |> } object=(A B C . D) T NIL
- @t{ |> } object=(C . D) T (A B)
- @t{ |> } object=(C . D) NIL (A B C . D)
- @t{ |> } object=(F G H) NIL (A B C . D)
- @t{ |> } object=NIL NIL (A B C . D)
- @t{ |> } object=D T (A B C)
- @t{ |> } object=X NIL (A B C . D)
- @result{} NIL
- @end example
- @subsubheading Side Effects::
- Neither @b{ldiff} nor @b{tailp} modifies either of its @i{arguments}.
- @subsubheading Exceptional Situations::
- Should be prepared to signal an error of @i{type} @b{type-error}
- if @i{list} is not a @i{proper list} or a @i{dotted list}.
- @subsubheading See Also::
- @ref{set-difference; nset-difference}
- @subsubheading Notes::
- If the @i{list} is a @i{circular list},
- @b{tailp} will reliably @i{yield} a @i{value}
- only if the given @i{object} is in fact a @i{tail} of @i{list}.
- Otherwise, the consequences are unspecified:
- a given @i{implementation} which detects the circularity must return @i{false},
- but since an @i{implementation} is not obliged to detect such a @i{situation},
- @b{tailp} might just loop indefinitely without returning in that case.
- @b{tailp} could be defined as follows:
- @example
- (defun tailp (object list)
- (do ((list list (cdr list)))
- ((atom list) (eql list object))
- (if (eql object list)
- (return t))))
- @end example
- and @b{ldiff} could be defined by:
- @example
- (defun ldiff (list object)
- (do ((list list (cdr list))
- (r '() (cons (car list) r)))
- ((atom list)
- (if (eql list object) (nreverse r) (nreconc r list)))
- (when (eql object list)
- (return (nreverse r)))))
- @end example
- @node nthcdr, rest, ldiff, Conses Dictionary
- @subsection nthcdr [Function]
- @code{nthcdr} @i{n list} @result{} @i{tail}
- @subsubheading Arguments and Values::
- @i{n}---a non-negative @i{integer}.
- @i{list}---a @i{list},
- which might be a @i{dotted list} or a @i{circular list}.
- @i{tail}---an @i{object}.
- @subsubheading Description::
- Returns the @i{tail} of @i{list} that would be obtained by calling @b{cdr}
- @i{n} times in succession.
- @subsubheading Examples::
- @example
- (nthcdr 0 '()) @result{} NIL
- (nthcdr 3 '()) @result{} NIL
- (nthcdr 0 '(a b c)) @result{} (A B C)
- (nthcdr 2 '(a b c)) @result{} (C)
- (nthcdr 4 '(a b c)) @result{} ()
- (nthcdr 1 '(0 . 1)) @result{} 1
- (locally (declare (optimize (safety 3)))
- (nthcdr 3 '(0 . 1)))
- Error: Attempted to take CDR of 1.
- @end example
- @subsubheading Exceptional Situations::
- Should signal an error of @i{type} @b{type-error}
- if @i{n} is not a non-negative @i{integer}.
- For @i{n} being an integer greater than @t{1},
- the error checking done by @t{(nthcdr @i{n} @i{list})}
- is the same as for @t{(nthcdr (- @i{n} 1) (cdr @i{list}))};
- see the @i{function} @b{cdr}.
- @subsubheading See Also::
- @b{cdr},
- @ref{nth}
- ,
- @ref{rest}
- @node rest, member, nthcdr, Conses Dictionary
- @subsection rest [Accessor]
- @code{rest} @i{list} @result{} @i{tail}
- (setf (@code{ rest} @i{list}) new-tail)@*
- @subsubheading Arguments and Values::
- @i{list}---a @i{list},
- which might be a @i{dotted list} or a @i{circular list}.
- @i{tail}---an @i{object}.
- @subsubheading Description::
- @b{rest} performs the same operation as @b{cdr},
- but mnemonically complements @b{first}.
- Specifically,
- @example
- (rest @i{list}) @equiv{} (cdr @i{list})
- (setf (rest @i{list}) @i{new-tail}) @equiv{} (setf (cdr @i{list}) @i{new-tail})
- @end example
- @subsubheading Examples::
- @example
- (rest '(1 2)) @result{} (2)
- (rest '(1 . 2)) @result{} 2
- (rest '(1)) @result{} NIL
- (setq *cons* '(1 . 2)) @result{} (1 . 2)
- (setf (rest *cons*) "two") @result{} "two"
- *cons* @result{} (1 . "two")
- @end example
- @subsubheading See Also::
- @b{cdr},
- @ref{nthcdr}
- @subsubheading Notes::
- @b{rest} is often preferred stylistically over @b{cdr}
- when the argument is to being subjectively viewed as a @i{list}
- rather than as a @i{cons}.
- @node member, mapc, rest, Conses Dictionary
- @subsection member, member-if, member-if-not [Function]
- @code{member} @i{item list {&key} key test test-not} @result{} @i{tail}
- @code{member-if} @i{predicate list {&key} key} @result{} @i{tail}
- @code{member-if-not} @i{predicate list {&key} key} @result{} @i{tail}
- @subsubheading Arguments and Values::
- @i{item}---an @i{object}.
- @i{list}---a @i{proper list}.
- @i{predicate}---a @i{designator} for
- a @i{function} of one @i{argument}
- that returns a @i{generalized boolean}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{key}---a @i{designator} for a @i{function} of one argument,
- or @b{nil}.
- @i{tail}---a @i{list}.
- @subsubheading Description::
- @b{member}, @b{member-if}, and @b{member-if-not} each
- search @i{list} for @i{item} or for a top-level element that
- @i{satisfies the test}. The argument to the @i{predicate} function
- is an element of @i{list}.
- If some element @i{satisfies the test},
- the tail of @i{list} beginning
- with this element is returned; otherwise @b{nil} is returned.
- @i{list} is searched on the top level only.
- @subsubheading Examples::
- @example
- (member 2 '(1 2 3)) @result{} (2 3)
- (member 2 '((1 . 2) (3 . 4)) :test-not #'= :key #'cdr) @result{} ((3 . 4))
- (member 'e '(a b c d)) @result{} NIL
- @end example
- @example
- (member-if #'listp '(a b nil c d)) @result{} (NIL C D)
- (member-if #'numberp '(a #\Space 5/3 foo)) @result{} (5/3 FOO)
- (member-if-not #'zerop
- '(3 6 9 11 . 12)
- :key #'(lambda (x) (mod x 3))) @result{} (11 . 12)
- @end example
- @subsubheading Exceptional Situations::
- Should be prepared to signal an error of @i{type} @b{type-error}
- if @i{list} is not a @i{proper list}.
- @subsubheading See Also::
- @ref{find; find-if; find-if-not}
- ,
- @ref{position; position-if; position-if-not}
- ,
- @ref{Traversal Rules and Side Effects}
- @subsubheading Notes::
- The @t{:test-not} parameter is deprecated.
- The @i{function} @b{member-if-not} is deprecated.
- In the following
- @example
- (member 'a '(g (a y) c a d e a f)) @result{} (A D E A F)
- @end example
- the value returned by @b{member} is @i{identical} to the portion
- of the @i{list} beginning with @t{a}. Thus @b{rplaca} on the
- result of @b{member} can be used to alter the part of the @i{list}
- where @t{a} was found (assuming a check has been made that @b{member}
- did not return @b{nil}).
- @node mapc, acons, member, Conses Dictionary
- @subsection mapc, mapcar, mapcan, mapl, maplist, mapcon [Function]
- @code{mapc} @i{function {&rest} lists^+} @result{} @i{list-1}
- @code{mapcar} @i{function {&rest} lists^+} @result{} @i{result-list}
- @code{mapcan} @i{function {&rest} lists^+} @result{} @i{concatenated-results}
- @code{mapl} @i{function {&rest} lists^+} @result{} @i{list-1}
- @code{maplist} @i{function {&rest} lists^+} @result{} @i{result-list}
- @code{mapcon} @i{function {&rest} lists^+} @result{} @i{concatenated-results}
- @subsubheading Arguments and Values::
- @i{function}---a @i{designator} for a @i{function}
- that must take as many @i{arguments} as there are @i{lists}.
- @i{list}---a @i{proper list}.
- @i{list-1}---the first @i{list} (which must be a @i{proper list}).
- @i{result-list}---a @i{list}.
- @i{concatenated-results}---a @i{list}.
- @subsubheading Description::
- The mapping operation involves applying @i{function} to
- successive sets of arguments in which
- one argument is obtained from each @i{sequence}.
- Except for @b{mapc} and @b{mapl},
- the result contains the results returned by @i{function}.
- In the cases of @b{mapc} and @b{mapl},
- the resulting @i{sequence} is @i{list}.
- @i{function} is called
- first on all the elements with index @t{0}, then on all those
- with index @t{1}, and so on.
- @i{result-type} specifies the @i{type} of
- the
- resulting @i{sequence}.
- If @i{function} is a @i{symbol}, it is @b{coerce}d
- to a @i{function} as if by @b{symbol-function}.
- @b{mapcar} operates on successive @i{elements} of the @i{lists}.
- @i{function} is applied to the first @i{element} of each @i{list},
- then to the second @i{element} of each @i{list}, and so on.
- The iteration terminates when the shortest @i{list} runs out,
- and excess elements in other lists are ignored.
- The value returned by @b{mapcar} is a @i{list}
- of the results of successive calls to @i{function}.
- @b{mapc} is like @b{mapcar} except that the results of
- applying @i{function} are not accumulated.
- The @i{list} argument is returned.
- @b{maplist} is like @b{mapcar} except that
- @i{function} is applied to successive sublists of the @i{lists}.
- @i{function}
- is first applied to the @i{lists} themselves,
- and then to the @i{cdr} of each
- @i{list}, and then to the @i{cdr} of the @i{cdr}
- of each @i{list}, and so on.
- @b{mapl} is like @b{maplist} except that the results of
- applying @i{function} are not accumulated;
- @i{list-1} is returned.
- @b{mapcan} and @b{mapcon} are like @b{mapcar} and
- @b{maplist} respectively, except that the results of
- applying @i{function} are combined
- into a @i{list} by the use of @b{nconc}
- rather than @b{list}.
- That is,
- @example
- (mapcon f x1 ... xn)
- @equiv{} (apply #'nconc (maplist f x1 ... xn))
- @end example
- and similarly for the relationship between @b{mapcan}
- and @b{mapcar}.
- @subsubheading Examples::
- @example
- (mapcar #'car '((1 a) (2 b) (3 c))) @result{} (1 2 3)
- (mapcar #'abs '(3 -4 2 -5 -6)) @result{} (3 4 2 5 6)
- (mapcar #'cons '(a b c) '(1 2 3)) @result{} ((A . 1) (B . 2) (C . 3))
- (maplist #'append '(1 2 3 4) '(1 2) '(1 2 3))
- @result{} ((1 2 3 4 1 2 1 2 3) (2 3 4 2 2 3))
- (maplist #'(lambda (x) (cons 'foo x)) '(a b c d))
- @result{} ((FOO A B C D) (FOO B C D) (FOO C D) (FOO D))
- (maplist #'(lambda (x) (if (member (car x) (cdr x)) 0 1)) '(a b a c d b c))
- @result{} (0 0 1 0 1 1 1)
- ;An entry is 1 if the corresponding element of the input
- ; list was the last instance of that element in the input list.
- (setq dummy nil) @result{} NIL
- (mapc #'(lambda (&rest x) (setq dummy (append dummy x)))
- '(1 2 3 4)
- '(a b c d e)
- '(x y z)) @result{} (1 2 3 4)
- dummy @result{} (1 A X 2 B Y 3 C Z)
- (setq dummy nil) @result{} NIL
- (mapl #'(lambda (x) (push x dummy)) '(1 2 3 4)) @result{} (1 2 3 4)
- dummy @result{} ((4) (3 4) (2 3 4) (1 2 3 4))
- (mapcan #'(lambda (x y) (if (null x) nil (list x y)))
- '(nil nil nil d e)
- '(1 2 3 4 5 6)) @result{} (D 4 E 5)
- (mapcan #'(lambda (x) (and (numberp x) (list x)))
- '(a 1 b c 3 4 d 5))
- @result{} (1 3 4 5)
- @end example
- In this case the function serves as a filter;
- this is a standard @r{Lisp} idiom using @b{mapcan}.
- @example
- (mapcon #'list '(1 2 3 4)) @result{} ((1 2 3 4) (2 3 4) (3 4) (4))
- @end example
- @subsubheading Exceptional Situations::
- Should be prepared to signal an error of @i{type} @b{type-error}
- if any @i{list} is not a @i{proper list}.
- @subsubheading See Also::
- @ref{dolist}
- ,
- @ref{map}
- ,
- @ref{Traversal Rules and Side Effects}
- @node acons, assoc, mapc, Conses Dictionary
- @subsection acons [Function]
- @code{acons} @i{key datum alist} @result{} @i{new-alist}
- @subsubheading Arguments and Values::
- @i{key}---an @i{object}.
- @i{datum}---an @i{object}.
- @i{alist}---an @i{association list}.
- @i{new-alist}---an @i{association list}.
- @subsubheading Description::
- Creates a @i{fresh} @i{cons},
- the @i{cdr} of which is @i{alist} and
- the @i{car} of which is another @i{fresh} @i{cons},
- the @i{car} of which is @i{key} and
- the @i{cdr} of which is @i{datum}.
- @subsubheading Examples::
- @example
- (setq alist '()) @result{} NIL
- (acons 1 "one" alist) @result{} ((1 . "one"))
- alist @result{} NIL
- (setq alist (acons 1 "one" (acons 2 "two" alist))) @result{} ((1 . "one") (2 . "two"))
- (assoc 1 alist) @result{} (1 . "one")
- (setq alist (acons 1 "uno" alist)) @result{} ((1 . "uno") (1 . "one") (2 . "two"))
- (assoc 1 alist) @result{} (1 . "uno")
- @end example
- @subsubheading See Also::
- @ref{assoc; assoc-if; assoc-if-not}
- ,
- @ref{pairlis}
- @subsubheading Notes::
- @example
- (acons @i{key} @i{datum} @i{alist}) @equiv{} (cons (cons @i{key} @i{datum}) @i{alist})
- @end example
- @node assoc, copy-alist, acons, Conses Dictionary
- @subsection assoc, assoc-if, assoc-if-not [Function]
- @code{assoc} @i{item alist {&key} key test test-not} @result{} @i{entry}
- @code{assoc-if} @i{predicate alist {&key} key} @result{} @i{entry}
- @code{assoc-if-not} @i{predicate alist {&key} key} @result{} @i{entry}
- @subsubheading Arguments and Values::
- @i{item}---an @i{object}.
- @i{alist}---an @i{association list}.
- @i{predicate}---a @i{designator} for
- a @i{function} of one @i{argument}
- that returns a @i{generalized boolean}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{key}---a @i{designator} for a @i{function} of one argument,
- or @b{nil}.
- @i{entry}---a @i{cons} that is an @i{element} of @i{alist},
- or @b{nil}.
- @subsubheading Description::
- @b{assoc}, @b{assoc-if}, and @b{assoc-if-not}
- return the first @i{cons} in @i{alist} whose @i{car} @i{satisfies the test},
- or @b{nil} if no such @i{cons} is found.
- For @b{assoc}, @b{assoc-if}, and @b{assoc-if-not}, if @b{nil} appears
- in @i{alist} in place of a pair, it is ignored.
- @subsubheading Examples::
- @example
- (setq values '((x . 100) (y . 200) (z . 50))) @result{} ((X . 100) (Y . 200) (Z . 50))
- (assoc 'y values) @result{} (Y . 200)
- (rplacd (assoc 'y values) 201) @result{} (Y . 201)
- (assoc 'y values) @result{} (Y . 201)
- (setq alist '((1 . "one")(2 . "two")(3 . "three")))
- @result{} ((1 . "one") (2 . "two") (3 . "three"))
- (assoc 2 alist) @result{} (2 . "two")
- (assoc-if #'evenp alist) @result{} (2 . "two")
- (assoc-if-not #'(lambda(x) (< x 3)) alist) @result{} (3 . "three")
- (setq alist '(("one" . 1)("two" . 2))) @result{} (("one" . 1) ("two" . 2))
- (assoc "one" alist) @result{} NIL
- (assoc "one" alist :test #'equalp) @result{} ("one" . 1)
- (assoc "two" alist :key #'(lambda(x) (char x 2))) @result{} NIL
- (assoc #\o alist :key #'(lambda(x) (char x 2))) @result{} ("two" . 2)
- (assoc 'r '((a . b) (c . d) (r . x) (s . y) (r . z))) @result{} (R . X)
- (assoc 'goo '((foo . bar) (zoo . goo))) @result{} NIL
- (assoc '2 '((1 a b c) (2 b c d) (-7 x y z))) @result{} (2 B C D)
- (setq alist '(("one" . 1) ("2" . 2) ("three" . 3)))
- @result{} (("one" . 1) ("2" . 2) ("three" . 3))
- (assoc-if-not #'alpha-char-p alist
- :key #'(lambda (x) (char x 0))) @result{} ("2" . 2)
- @end example
- @subsubheading Exceptional Situations::
- Should be prepared to signal an error of @i{type} @b{type-error}
- if @i{alist} is not an @i{association list}.
- @subsubheading See Also::
- @ref{rassoc; rassoc-if; rassoc-if-not}
- ,
- @ref{find; find-if; find-if-not}
- ,
- @ref{member; member-if; member-if-not}
- ,
- @ref{position; position-if; position-if-not}
- ,
- @ref{Traversal Rules and Side Effects}
- @subsubheading Notes::
- The @t{:test-not} parameter is deprecated.
- The @i{function} @b{assoc-if-not} is deprecated.
- It is possible to @b{rplacd} the result of @b{assoc}, provided
- that it is not @b{nil},
- in order to ``update'' @i{alist}.
- The two expressions
- @example
- (assoc item list :test fn)
- @end example
- and
- @example
- (find item list :test fn :key #'car)
- @end example
- are equivalent in meaning with one exception:
- if @b{nil} appears in @i{alist} in place of a pair,
- and @i{item} is @b{nil},
- @b{find} will compute the @i{car} of the @b{nil} in @i{alist},
- find that it is equal to @i{item}, and return @b{nil},
- whereas @b{assoc} will ignore the @b{nil} in @i{alist} and continue
- to search for an actual @i{cons} whose @i{car} is @b{nil}.
- @node copy-alist, pairlis, assoc, Conses Dictionary
- @subsection copy-alist [Function]
- @code{copy-alist} @i{alist} @result{} @i{new-alist}
- @subsubheading Arguments and Values::
- @i{alist}---an @i{association list}.
- @i{new-alist}---an @i{association list}.
- @subsubheading Description::
- @b{copy-alist} returns a @i{copy} of @i{alist}.
- The @i{list structure} of @i{alist} is copied,
- and the @i{elements} of @i{alist} which are @i{conses} are
- also copied (as @i{conses} only).
- Any other @i{objects} which are referred to,
- whether directly or indirectly,
- by the @i{alist} continue to be shared.
- @subsubheading Examples::
- @example
- (defparameter *alist* (acons 1 "one" (acons 2 "two" '())))
- *alist* @result{} ((1 . "one") (2 . "two"))
- (defparameter *list-copy* (copy-list *alist*))
- *list-copy* @result{} ((1 . "one") (2 . "two"))
- (defparameter *alist-copy* (copy-alist *alist*))
- *alist-copy* @result{} ((1 . "one") (2 . "two"))
- (setf (cdr (assoc 2 *alist-copy*)) "deux") @result{} "deux"
- *alist-copy* @result{} ((1 . "one") (2 . "deux"))
- *alist* @result{} ((1 . "one") (2 . "two"))
- (setf (cdr (assoc 1 *list-copy*)) "uno") @result{} "uno"
- *list-copy* @result{} ((1 . "uno") (2 . "two"))
- *alist* @result{} ((1 . "uno") (2 . "two"))
- @end example
- @subsubheading See Also::
- @ref{copy-list}
- @node pairlis, rassoc, copy-alist, Conses Dictionary
- @subsection pairlis [Function]
- @code{pairlis} @i{keys data {&optional} alist} @result{} @i{new-alist}
- @subsubheading Arguments and Values::
- @i{keys}---a @i{proper list}.
- @i{data}---a @i{proper list}.
- @i{alist}---an @i{association list}.
- The default is the @i{empty list}.
- @i{new-alist}---an @i{association list}.
- @subsubheading Description::
- Returns an @i{association list} that associates
- elements of @i{keys} to corresponding elements of @i{data}.
- The consequences are undefined if @i{keys} and @i{data} are
- not of the same @i{length}.
- If @i{alist} is supplied, @b{pairlis} returns
- a modified @i{alist} with the
- new pairs prepended to it.
- The new pairs may appear in the resulting @i{association list} in
- either forward or backward order.
- The result of
- @example
- (pairlis '(one two) '(1 2) '((three . 3) (four . 19)))
- @end example
- might be
- @example
- ((one . 1) (two . 2) (three . 3) (four . 19))
- @end example
- or
- @example
- ((two . 2) (one . 1) (three . 3) (four . 19))
- @end example
- @subsubheading Examples::
- @example
- (setq keys '(1 2 3)
- data '("one" "two" "three")
- alist '((4 . "four"))) @result{} ((4 . "four"))
- (pairlis keys data) @result{} ((3 . "three") (2 . "two") (1 . "one"))
- (pairlis keys data alist)
- @result{} ((3 . "three") (2 . "two") (1 . "one") (4 . "four"))
- alist @result{} ((4 . "four"))
- @end example
- @subsubheading Exceptional Situations::
- Should be prepared to signal an error of @i{type} @b{type-error}
- if @i{keys} and @i{data} are not @i{proper lists}.
- @subsubheading See Also::
- @ref{acons}
- @node rassoc, get-properties, pairlis, Conses Dictionary
- @subsection rassoc, rassoc-if, rassoc-if-not [Function]
- @code{rassoc} @i{item alist {&key} key test test-not} @result{} @i{entry}
- @code{rassoc-if} @i{predicate alist {&key} key} @result{} @i{entry}
- @code{rassoc-if-not} @i{predicate alist {&key} key} @result{} @i{entry}
- @subsubheading Arguments and Values::
- @i{item}---an @i{object}.
- @i{alist}---an @i{association list}.
- @i{predicate}---a @i{designator} for
- a @i{function} of one @i{argument}
- that returns a @i{generalized boolean}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{key}---a @i{designator} for a @i{function} of one argument,
- or @b{nil}.
- @i{entry}---a @i{cons} that is an @i{element} of the @i{alist},
- or @b{nil}.
- @subsubheading Description::
- @b{rassoc}, @b{rassoc-if}, and @b{rassoc-if-not}
- return the first @i{cons} whose @i{cdr}
- @i{satisfies the test}.
- If no such @i{cons} is found, @b{nil}
- is returned.
- If @b{nil} appears in @i{alist} in place of a pair, it is ignored.
- @subsubheading Examples::
- @example
- (setq alist '((1 . "one") (2 . "two") (3 . 3)))
- @result{} ((1 . "one") (2 . "two") (3 . 3))
- (rassoc 3 alist) @result{} (3 . 3)
- (rassoc "two" alist) @result{} NIL
- (rassoc "two" alist :test 'equal) @result{} (2 . "two")
- (rassoc 1 alist :key #'(lambda (x) (if (numberp x) (/ x 3)))) @result{} (3 . 3)
- (rassoc 'a '((a . b) (b . c) (c . a) (z . a))) @result{} (C . A)
- (rassoc-if #'stringp alist) @result{} (1 . "one")
- (rassoc-if-not #'vectorp alist) @result{} (3 . 3)
- @end example
- @subsubheading See Also::
- @ref{assoc; assoc-if; assoc-if-not}
- ,
- @ref{Traversal Rules and Side Effects}
- @subsubheading Notes::
- The @t{:test-not} parameter is deprecated.
- The @i{function} @b{rassoc-if-not} is deprecated.
- It is possible to @b{rplaca} the result of @b{rassoc},
- provided that it is not @b{nil}, in order to ``update'' @i{alist}.
- The expressions
- @example
- (rassoc item list :test fn)
- @end example
- and
- @example
- (find item list :test fn :key #'cdr)
- @end example
- are equivalent in meaning, except when the @t{item} is @b{nil}
- and @b{nil} appears in place of a pair in the @i{alist}.
- See the @i{function} @b{assoc}.
- @node get-properties, getf, rassoc, Conses Dictionary
- @subsection get-properties [Function]
- @code{get-properties} @i{plist indicator-list} @result{} @i{indicator, value, tail}
- @subsubheading Arguments and Values::
- @i{plist}---a @i{property list}.
- @i{indicator-list}---a @i{proper list} (of @i{indicators}).
- @i{indicator}---an @i{object} that is an @i{element} of @i{indicator-list}.
- @i{value}---an @i{object}.
- @i{tail}---a @i{list}.
- @subsubheading Description::
- @b{get-properties} is used to look up any of several
- @i{property list} entries all at once.
- It searches the @i{plist} for the first entry whose @i{indicator}
- is @i{identical} to one of the @i{objects} in @i{indicator-list}.
- If such an entry is found, the @i{indicator} and @i{value} returned
- are the @i{property indicator} and its associated @i{property value},
- and the @i{tail} returned is the @i{tail} of the @i{plist}
- that begins with the found entry (@i{i.e.}, whose @i{car} is the @i{indicator}).
- If no such entry is found, the @i{indicator}, @i{value}, and @i{tail}
- are all @b{nil}.
- @subsubheading Examples::
- @example
- (setq x '()) @result{} NIL
- (setq *indicator-list* '(prop1 prop2)) @result{} (PROP1 PROP2)
- (getf x 'prop1) @result{} NIL
- (setf (getf x 'prop1) 'val1) @result{} VAL1
- (eq (getf x 'prop1) 'val1) @result{} @i{true}
- (get-properties x *indicator-list*) @result{} PROP1, VAL1, (PROP1 VAL1)
- x @result{} (PROP1 VAL1)
- @end example
- @subsubheading See Also::
- @ref{get}
- ,
- @ref{getf}
- @node getf, remf, get-properties, Conses Dictionary
- @subsection getf [Accessor]
- @code{getf} @i{plist indicator {&optional} default} @result{} @i{value}
- (setf (@code{ getf} @i{place indicator {&optional} default}) new-value)@*
- @subsubheading Arguments and Values::
- @i{plist}---a @i{property list}.
- @i{place}---a @i{place}, the @i{value} of which is a @i{property list}.
- @i{indicator}---an @i{object}.
- @i{default}---an @i{object}.
- The default is @b{nil}.
- @i{value}---an @i{object}.
- @i{new-value}---an @i{object}.
- @subsubheading Description::
- @b{getf} finds a @i{property} on the @i{plist}
- whose @i{property indicator} is @i{identical} to @i{indicator},
- and returns its corresponding @i{property value}.
- If there are multiple @i{properties}_1 with that @i{property indicator},
- @b{getf} uses the first such @i{property}.
- If there is no @i{property} with that @i{property indicator},
- @i{default} is returned.
- @b{setf} of @b{getf} may be used to associate a new @i{object}
- with an existing indicator in the @i{property list} held by @i{place},
- or to create a new assocation if none exists.
- If there are multiple @i{properties}_1 with that @i{property indicator},
- @b{setf} of @b{getf} associates the @i{new-value}
- with the first such @i{property}.
- When a @b{getf} @i{form} is used as a @b{setf} @i{place},
- any @i{default} which is supplied is evaluated according to normal
- left-to-right evaluation rules, but its @i{value} is ignored.
- @b{setf} of @b{getf} is permitted to either
- @i{write} the @i{value} of @i{place} itself,
- or modify of any part, @i{car} or @i{cdr},
- of the @i{list structure} held by @i{place}.
- @subsubheading Examples::
- @example
- (setq x '()) @result{} NIL
- (getf x 'prop1) @result{} NIL
- (getf x 'prop1 7) @result{} 7
- (getf x 'prop1) @result{} NIL
- (setf (getf x 'prop1) 'val1) @result{} VAL1
- (eq (getf x 'prop1) 'val1) @result{} @i{true}
- (getf x 'prop1) @result{} VAL1
- (getf x 'prop1 7) @result{} VAL1
- x @result{} (PROP1 VAL1)
- ;; Examples of implementation variation permitted.
- (setq foo (list 'a 'b 'c 'd 'e 'f)) @result{} (A B C D E F)
- (setq bar (cddr foo)) @result{} (C D E F)
- (remf foo 'c) @result{} @i{true}
- foo @result{} (A B E F)
- bar
- @result{} (C D E F)
- @i{OR}@result{} (C)
- @i{OR}@result{} (NIL)
- @i{OR}@result{} (C NIL)
- @i{OR}@result{} (C D)
- @end example
- @subsubheading See Also::
- @ref{get}
- ,
- @ref{get-properties}
- ,
- @ref{setf; psetf}
- ,
- @ref{Function Call Forms as Places}
- @subsubheading Notes::
- There is no way (using @b{getf}) to distinguish an absent property
- from one whose value is @i{default}; but see @b{get-properties}.
- Note that while supplying a @i{default} argument to @b{getf}
- in a @b{setf} situation is sometimes not very interesting,
- it is still important because some macros, such as @b{push} and
- @b{incf}, require a @i{place} argument which data is both @i{read}
- from and @i{written} to. In such a context, if a @i{default}
- argument is to be supplied for the @i{read} situation, it must be
- syntactically valid for the @i{write} situation as well. For example,
- @example
- (let ((plist '()))
- (incf (getf plist 'count 0))
- plist) @result{} (COUNT 1)
- @end example
- @node remf, intersection, getf, Conses Dictionary
- @subsection remf [Macro]
- @code{remf} @i{place indicator} @result{} @i{generalized-boolean}
- @subsubheading Arguments and Values::
- @i{place}---a @i{place}.
- @i{indicator}---an @i{object}.
- @i{generalized-boolean}---a @i{generalized boolean}.
- @subsubheading Description::
- @b{remf} removes from the @i{property list} stored in @i{place}
- a @i{property}_1 with a @i{property indicator}
- @i{identical} to @i{indicator}.
- If there are multiple @i{properties}_1 with the @i{identical} key,
- @b{remf} only removes the first such @i{property}.
- @b{remf} returns @i{false} if no such @i{property} was found,
- or @i{true} if a property was found.
- The @i{property indicator}
- and the corresponding @i{property value}
- are removed in an undefined order
- by destructively splicing the property list.
- @b{remf} is permitted to either @b{setf} @i{place} or to
- @b{setf} any part, @b{car} or @b{cdr},
- of the @i{list structure} held by that @i{place}.
- For information about the @i{evaluation} of @i{subforms} of @i{place},
- see @ref{Evaluation of Subforms to Places}.
- @subsubheading Examples::
- @example
- (setq x (cons () ())) @result{} (NIL)
- (setf (getf (car x) 'prop1) 'val1) @result{} VAL1
- (remf (car x) 'prop1) @result{} @i{true}
- (remf (car x) 'prop1) @result{} @i{false}
- @end example
- @subsubheading Side Effects::
- The property list stored in @i{place} is modified.
- @subsubheading See Also::
- @ref{remprop}
- ,
- @ref{getf}
- @node intersection, adjoin, remf, Conses Dictionary
- @subsection intersection, nintersection [Function]
- @code{intersection} @i{list-1 list-2 {&key} key test test-not} @result{} @i{result-list}
- @code{nintersection} @i{list-1 list-2 {&key} key test test-not} @result{} @i{result-list}
- @subsubheading Arguments and Values::
- @i{list-1}---a @i{proper list}.
- @i{list-2}---a @i{proper list}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{key}---a @i{designator} for a @i{function} of one argument,
- or @b{nil}.
- @i{result-list}---a @i{list}.
- @subsubheading Description::
- @b{intersection} and @b{nintersection} return a @i{list}
- that contains every element that occurs in both @i{list-1} and @i{list-2}.
- @b{nintersection} is the destructive version of @b{intersection}.
- It performs the same operation,
- but may destroy @i{list-1} using its cells to construct the result.
- @i{list-2} is not destroyed.
- The intersection operation is described as follows.
- For all possible ordered pairs consisting of
- one @i{element} from @i{list-1}
- and one @i{element} from @i{list-2},
- @t{:test} or @t{:test-not} are used
- to determine whether they @i{satisfy the test}.
- The first argument to the @t{:test} or @t{:test-not}
- function is an element of @i{list-1}; the second argument is an
- element of @i{list-2}.
- If @t{:test} or @t{:test-not} is not supplied, @b{eql}
- is used.
- It is an error if @t{:test} and @t{:test-not} are supplied in
- the same function call.
- If @t{:key} is supplied (and not @b{nil}), it is used to
- extract the part to be tested from the @i{list} element.
- The argument to the @t{:key} function
- is an element of either @i{list-1} or @i{list-2};
- the @t{:key} function typically returns part of the supplied element.
- If @t{:key} is not supplied or @b{nil}, the @i{list-1} and
- @i{list-2} elements are used.
- For every pair that @i{satifies the test},
- exactly one of the two elements of the pair will be put in the result.
- No element from either @i{list} appears in the result that does not
- @i{satisfy the test} for
- an element from the other @i{list}.
- If one of the @i{lists} contains duplicate
- elements, there may be duplication in the result.
- There is no guarantee that the order of elements in the result will
- reflect the ordering of the arguments in any particular way.
- The result @i{list} may share cells with,
- or be @b{eq} to, either @i{list-1} or @i{list-2}
- if appropriate.
- @subsubheading Examples::
- @example
- (setq list1 (list 1 1 2 3 4 a b c "A" "B" "C" "d")
- list2 (list 1 4 5 b c d "a" "B" "c" "D"))
- @result{} (1 4 5 B C D "a" "B" "c" "D")
- (intersection list1 list2) @result{} (C B 4 1 1)
- (intersection list1 list2 :test 'equal) @result{} ("B" C B 4 1 1)
- (intersection list1 list2 :test #'equalp) @result{} ("d" "C" "B" "A" C B 4 1 1)
- (nintersection list1 list2) @result{} (1 1 4 B C)
- list1 @result{} @i{implementation-dependent} ;@i{e.g.}, (1 1 4 B C)
- list2 @result{} @i{implementation-dependent} ;@i{e.g.}, (1 4 5 B C D "a" "B" "c" "D")
- (setq list1 (copy-list '((1 . 2) (2 . 3) (3 . 4) (4 . 5))))
- @result{} ((1 . 2) (2 . 3) (3 . 4) (4 . 5))
- (setq list2 (copy-list '((1 . 3) (2 . 4) (3 . 6) (4 . 8))))
- @result{} ((1 . 3) (2 . 4) (3 . 6) (4 . 8))
- (nintersection list1 list2 :key #'cdr) @result{} ((2 . 3) (3 . 4))
- list1 @result{} @i{implementation-dependent} ;@i{e.g.}, ((1 . 2) (2 . 3) (3 . 4))
- list2 @result{} @i{implementation-dependent} ;@i{e.g.}, ((1 . 3) (2 . 4) (3 . 6) (4 . 8))
- @end example
- @subsubheading Side Effects::
- @b{nintersection} can modify @i{list-1},
- but not @i{list-2}.
- @subsubheading Exceptional Situations::
- Should be prepared to signal an error of @i{type} @b{type-error}
- if @i{list-1} and @i{list-2} are not @i{proper lists}.
- @subsubheading See Also::
- @ref{union; nunion}
- ,
- @ref{Compiler Terminology},
- @ref{Traversal Rules and Side Effects}
- @subsubheading Notes::
- The @t{:test-not} parameter is deprecated.
- Since the @b{nintersection} side effect is not required,
- it should not be used in for-effect-only
- positions in portable code.
- @node adjoin, pushnew, intersection, Conses Dictionary
- @subsection adjoin [Function]
- @code{adjoin} @i{item list {&key} key test test-not} @result{} @i{new-list}
- @subsubheading Arguments and Values::
- @i{item}---an @i{object}.
- @i{list}---a @i{proper list}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{key}---a @i{designator} for a @i{function} of one argument,
- or @b{nil}.
- @i{new-list}---a @i{list}.
- @subsubheading Description::
- Tests whether @i{item} is the same as an existing element of @i{list}.
- If the @i{item} is not an existing element,
- @b{adjoin} adds it to @i{list} (as if by @b{cons})
- and returns the resulting @i{list};
- otherwise, nothing is added and the original @i{list} is returned.
- The @i{test}, @i{test-not}, and @i{key}
- affect how it is determined whether @i{item} is the same as an @i{element} of @i{list}.
- For details, see @ref{Satisfying a Two-Argument Test}.\ifvmode\else\endgraf
- \ifdim \prevdepth>-1000pt
- \NIS\parskip \normalparskip\relax\fi
- @subsubheading Examples::
- @example
- (setq slist '()) @result{} NIL
- (adjoin 'a slist) @result{} (A)
- slist @result{} NIL
- (setq slist (adjoin '(test-item 1) slist)) @result{} ((TEST-ITEM 1))
- (adjoin '(test-item 1) slist) @result{} ((TEST-ITEM 1) (TEST-ITEM 1))
- (adjoin '(test-item 1) slist :test 'equal) @result{} ((TEST-ITEM 1))
- (adjoin '(new-test-item 1) slist :key #'cadr) @result{} ((TEST-ITEM 1))
- (adjoin '(new-test-item 1) slist) @result{} ((NEW-TEST-ITEM 1) (TEST-ITEM 1))
- @end example
- @subsubheading Exceptional Situations::
- Should be prepared to signal an error of @i{type} @b{type-error}
- if @i{list} is not a @i{proper list}.
- @subsubheading See Also::
- @ref{pushnew}
- ,
- @ref{Traversal Rules and Side Effects}
- @subsubheading Notes::
- The @t{:test-not} parameter is deprecated.
- @example
- (adjoin item list :key fn)
- @equiv{} (if (member (fn item) list :key fn) list (cons item list))
- @end example
- @node pushnew, set-difference, adjoin, Conses Dictionary
- @subsection pushnew [Macro]
- @code{pushnew} @i{item place {&key} key test test-not}@*
- @result{} @i{new-place-value}
- @subsubheading Arguments and Values::
- @i{item}---an @i{object}.
- @i{place}---a @i{place}, the @i{value} of which is a @i{proper list}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{key}---a @i{designator} for a @i{function} of one argument,
- or @b{nil}.
- @i{new-place-value}---a @i{list} (the new @i{value} of @i{place}).
- @subsubheading Description::
- @b{pushnew} tests whether @i{item} is the same as any existing
- element of the @i{list} stored in @i{place}. If @i{item} is not,
- it is prepended to the @i{list}, and the new @i{list} is stored in
- @i{place}.
- @b{pushnew} returns the new @i{list} that is stored in @i{place}.
- Whether or not @i{item} is already a member of the @i{list} that is
- in @i{place} is determined by comparisons using @t{:test} or @t{:test-not}.
- The first argument to the @t{:test} or @t{:test-not}
- function is @i{item}; the second argument is
- an element of the @i{list} in @i{place} as returned by
- the @t{:key} function (if supplied).
- If @t{:key} is supplied, it is used to extract the part to be tested from
- both @i{item} and the @i{list} element,
- as for @b{adjoin}.
- The argument to the @t{:key} function
- is an element of the @i{list} stored in
- @i{place}. The @t{:key} function typically returns part
- part of the element of the @i{list}.
- If @t{:key} is not supplied or @b{nil}, the @i{list}
- element is used.
- For information about the @i{evaluation} of @i{subforms} of @i{place},
- see @ref{Evaluation of Subforms to Places}.
- It is @i{implementation-dependent} whether or not @b{pushnew}
- actually executes the storing form for its @i{place} in the
- situation where the @i{item} is already a member of the @i{list}
- held by @i{place}.
- @subsubheading Examples::
- @example
- (setq x '(a (b c) d)) @result{} (A (B C) D)
- (pushnew 5 (cadr x)) @result{} (5 B C)
- x @result{} (A (5 B C) D)
- (pushnew 'b (cadr x)) @result{} (5 B C)
- x @result{} (A (5 B C) D)
- (setq lst '((1) (1 2) (1 2 3))) @result{} ((1) (1 2) (1 2 3))
- (pushnew '(2) lst) @result{} ((2) (1) (1 2) (1 2 3))
- (pushnew '(1) lst) @result{} ((1) (2) (1) (1 2) (1 2 3))
- (pushnew '(1) lst :test 'equal) @result{} ((1) (2) (1) (1 2) (1 2 3))
- (pushnew '(1) lst :key #'car) @result{} ((1) (2) (1) (1 2) (1 2 3))
- @end example
- @subsubheading Side Effects::
- The contents of @i{place} may be modified.
- @subsubheading See Also::
- @ref{push}
- ,
- @ref{adjoin}
- ,
- @ref{Generalized Reference}
- @subsubheading Notes::
- The effect of
- @example
- (pushnew item place :test p)
- @end example
- is roughly equivalent to
- @example
- (setf place (adjoin item place :test p))
- @end example
- except that the @i{subforms} of @t{place} are evaluated only once,
- and @t{item} is evaluated before @t{place}.
- @node set-difference, set-exclusive-or, pushnew, Conses Dictionary
- @subsection set-difference, nset-difference [Function]
- @code{set-difference} @i{list-1 list-2 {&key} key test test-not} @result{} @i{result-list}
- @code{nset-difference} @i{list-1 list-2 {&key} key test test-not} @result{} @i{result-list}
- @subsubheading Arguments and Values::
- @i{list-1}---a @i{proper list}.
- @i{list-2}---a @i{proper list}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{key}---a @i{designator} for a @i{function} of one argument,
- or @b{nil}.
- @i{result-list}---a @i{list}.
- @subsubheading Description::
- @b{set-difference} returns a @i{list}
- of elements of @i{list-1}
- that do not appear in @i{list-2}.
- @b{nset-difference} is the destructive
- version of @b{set-difference}.
- It may destroy @i{list-1}.
- For all possible ordered pairs consisting of
- one element from @i{list-1} and one element from @i{list-2}, the
- @t{:test} or @t{:test-not} function is
- used to determine whether they @i{satisfy the test}.
- The first argument to the @t{:test} or @t{:test-not} function
- is the part of an element of @i{list-1} that is returned by
- the @t{:key} function (if supplied); the second argument is the part of
- an element of @i{list-2} that is
- returned by the @t{:key} function (if supplied).
- If @t{:key} is supplied, its argument is a @i{list-1} or
- @i{list-2} element. The @t{:key} function
- typically returns part of
- the supplied element.
- If @t{:key} is not supplied, the @i{list-1} or @i{list-2}
- element is used.
- An element of @i{list-1}
- appears in the result if and only if it does not match any element
- of @i{list-2}.
- There is no guarantee that the order of elements in the result will
- reflect the ordering of the arguments in any particular way.
- The result @i{list}
- may share cells with, or be @b{eq} to, either of @i{list-1}
- or @i{list-2},
- if appropriate.
- @subsubheading Examples::
- @example
- (setq lst1 (list "A" "b" "C" "d")
- lst2 (list "a" "B" "C" "d")) @result{} ("a" "B" "C" "d")
- (set-difference lst1 lst2) @result{} ("d" "C" "b" "A")
- (set-difference lst1 lst2 :test 'equal) @result{} ("b" "A")
- (set-difference lst1 lst2 :test #'equalp) @result{} NIL
- (nset-difference lst1 lst2 :test #'string=) @result{} ("A" "b")
- (setq lst1 '(("a" . "b") ("c" . "d") ("e" . "f")))
- @result{} (("a" . "b") ("c" . "d") ("e" . "f"))
- (setq lst2 '(("c" . "a") ("e" . "b") ("d" . "a")))
- @result{} (("c" . "a") ("e" . "b") ("d" . "a"))
- (nset-difference lst1 lst2 :test #'string= :key #'cdr)
- @result{} (("c" . "d") ("e" . "f"))
- lst1 @result{} (("a" . "b") ("c" . "d") ("e" . "f"))
- lst2 @result{} (("c" . "a") ("e" . "b") ("d" . "a"))
- @end example
- @example
- ;; Remove all flavor names that contain "c" or "w".
- (set-difference '("strawberry" "chocolate" "banana"
- "lemon" "pistachio" "rhubarb")
- '(#\c #\w)
- :test #'(lambda (s c) (find c s)))
- @result{} ("banana" "rhubarb" "lemon") ;One possible ordering.
- @end example
- @subsubheading Side Effects::
- @b{nset-difference} may destroy @i{list-1}.
- @subsubheading Exceptional Situations::
- Should be prepared to signal an error of @i{type} @b{type-error}
- if @i{list-1} and @i{list-2} are not @i{proper lists}.
- @subsubheading See Also::
- @ref{Compiler Terminology},
- @ref{Traversal Rules and Side Effects}
- @subsubheading Notes::
- The @t{:test-not} parameter is deprecated.
- @node set-exclusive-or, subsetp, set-difference, Conses Dictionary
- @subsection set-exclusive-or, nset-exclusive-or [Function]
- @code{set-exclusive-or} @i{list-1 list-2 {&key} key test test-not} @result{} @i{result-list}
- @code{nset-exclusive-or} @i{list-1 list-2 {&key} key test test-not} @result{} @i{result-list}
- @subsubheading Arguments and Values::
- @i{list-1}---a @i{proper list}.
- @i{list-2}---a @i{proper list}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{key}---a @i{designator} for a @i{function} of one argument,
- or @b{nil}.
- @i{result-list}---a @i{list}.
- @subsubheading Description::
- @b{set-exclusive-or} returns a @i{list} of elements that appear
- in exactly one of @i{list-1} and @i{list-2}.
- @b{nset-exclusive-or}
- is the @i{destructive} version of @b{set-exclusive-or}.
- For all possible ordered pairs consisting of
- one element from @i{list-1} and one element from @i{list-2}, the
- @t{:test} or @t{:test-not} function is
- used to determine whether they @i{satisfy the test}.
- If @t{:key} is supplied, it is used to
- extract the part to be tested from the @i{list-1} or @i{list-2} element.
- The first argument to the @t{:test} or @t{:test-not} function
- is the part of an element of @i{list-1} extracted by the @t{:key}
- function (if supplied); the second argument is the part of an
- element of @i{list-2} extracted by the @t{:key} function (if supplied).
- If @t{:key} is not supplied or @b{nil}, the @i{list-1} or
- @i{list-2} element is used.
- The result contains precisely
- those elements of @i{list-1} and @i{list-2}
- that appear in no matching pair.
- The result @i{list} of @b{set-exclusive-or}
- might share storage with one of @i{list-1} or @i{list-2}.
- @subsubheading Examples::
- @example
- (setq lst1 (list 1 "a" "b")
- lst2 (list 1 "A" "b")) @result{} (1 "A" "b")
- (set-exclusive-or lst1 lst2) @result{} ("b" "A" "b" "a")
- (set-exclusive-or lst1 lst2 :test #'equal) @result{} ("A" "a")
- (set-exclusive-or lst1 lst2 :test 'equalp) @result{} NIL
- (nset-exclusive-or lst1 lst2) @result{} ("a" "b" "A" "b")
- (setq lst1 (list (("a" . "b") ("c" . "d") ("e" . "f"))))
- @result{} (("a" . "b") ("c" . "d") ("e" . "f"))
- (setq lst2 (list (("c" . "a") ("e" . "b") ("d" . "a"))))
- @result{} (("c" . "a") ("e" . "b") ("d" . "a"))
- (nset-exclusive-or lst1 lst2 :test #'string= :key #'cdr)
- @result{} (("c" . "d") ("e" . "f") ("c" . "a") ("d" . "a"))
- lst1 @result{} (("a" . "b") ("c" . "d") ("e" . "f"))
- lst2 @result{} (("c" . "a") ("d" . "a"))
- @end example
- @subsubheading Side Effects::
- @b{nset-exclusive-or} is permitted to modify any part,
- @i{car} or @i{cdr}, of the @i{list structure} of @i{list-1} or @i{list-2}.
- @subsubheading Exceptional Situations::
- Should be prepared to signal an error of @i{type} @b{type-error}
- if @i{list-1} and @i{list-2} are not @i{proper lists}.
- @subsubheading See Also::
- @ref{Compiler Terminology},
- @ref{Traversal Rules and Side Effects}
- @subsubheading Notes::
- The @t{:test-not} parameter is deprecated.
- Since the @b{nset-exclusive-or} side effect is not required,
- it should not be used in for-effect-only
- positions in portable code.
- @node subsetp, union, set-exclusive-or, Conses Dictionary
- @subsection subsetp [Function]
- @code{subsetp} @i{list-1 list-2 {&key} key test test-not} @result{} @i{generalized-boolean}
- @subsubheading Arguments and Values::
- @i{list-1}---a @i{proper list}.
- @i{list-2}---a @i{proper list}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{key}---a @i{designator} for a @i{function} of one argument,
- or @b{nil}.
- @i{generalized-boolean}---a @i{generalized boolean}.
- @subsubheading Description::
- @b{subsetp} returns @i{true} if every element of @i{list-1}
- matches some element of @i{list-2},
- and @i{false} otherwise.
- Whether a list element is the same as another list element is
- determined by the functions specified by the keyword arguments.
- The first argument to the @t{:test} or @t{:test-not}
- function is
- typically
- part of an element of @i{list-1} extracted by
- the @t{:key} function; the second argument is typically part of
- an element of @i{list-2} extracted by
- the @t{:key} function.
- The argument to the @t{:key} function is an element of either
- @i{list-1} or @i{list-2}; the return value is part of the element
- of the supplied list element.
- If @t{:key} is not supplied or @b{nil},
- the @i{list-1} or @i{list-2}
- element itself is supplied to the @t{:test} or @t{:test-not}
- function.
- @subsubheading Examples::
- @example
- (setq cosmos '(1 "a" (1 2))) @result{} (1 "a" (1 2))
- (subsetp '(1) cosmos) @result{} @i{true}
- (subsetp '((1 2)) cosmos) @result{} @i{false}
- (subsetp '((1 2)) cosmos :test 'equal) @result{} @i{true}
- (subsetp '(1 "A") cosmos :test #'equalp) @result{} @i{true}
- (subsetp '((1) (2)) '((1) (2))) @result{} @i{false}
- (subsetp '((1) (2)) '((1) (2)) :key #'car) @result{} @i{true}
- @end example
- @subsubheading Exceptional Situations::
- Should be prepared to signal an error of @i{type} @b{type-error}
- if @i{list-1} and @i{list-2} are not @i{proper lists}.
- @subsubheading See Also::
- @ref{Traversal Rules and Side Effects}
- @subsubheading Notes::
- The @t{:test-not} parameter is deprecated.
- @node union, , subsetp, Conses Dictionary
- @subsection union, nunion [Function]
- @code{union} @i{list-1 list-2 {&key} key test test-not} @result{} @i{result-list}
- @code{nunion} @i{list-1 list-2 {&key} key test test-not} @result{} @i{result-list}
- @subsubheading Arguments and Values::
- @i{list-1}---a @i{proper list}.
- @i{list-2}---a @i{proper list}.
- @i{test}---a @i{designator} for a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{test-not}---a @i{designator} for
- a @i{function} of two @i{arguments}
- that returns a @i{generalized boolean}.
- @i{key}---a @i{designator} for a @i{function} of one argument,
- or @b{nil}.
- @i{result-list}---a @i{list}.
- @subsubheading Description::
- @b{union} and @b{nunion} return a @i{list}
- that contains every element that occurs in either @i{list-1}
- or @i{list-2}.
- For all possible ordered pairs consisting of one
- element from @i{list-1}
- and one element from @i{list-2}, @t{:test} or @t{:test-not} is used
- to determine whether they @i{satisfy the test}.
- The first argument to the @t{:test} or @t{:test-not}
- function is the part of the element of @i{list-1} extracted by the
- @t{:key} function (if supplied); the second argument
- is the part of the element of @i{list-2} extracted by the
- @t{:key} function (if supplied).
- The argument to the @t{:key} function is an element of
- @i{list-1} or @i{list-2}; the return value is part of the supplied
- element.
- If @t{:key} is not supplied or @b{nil},
- the element of @i{list-1} or @i{list-2}
- itself is supplied to the @t{:test} or @t{:test-not} function.
- For every matching pair,
- one of the two elements of the pair will be in the result. Any
- element from either @i{list-1} or @i{list-2}
- that matches no element of the other will appear
- in the result.
- If there is a duplication between @i{list-1}
- and @i{list-2},
- only one of the duplicate instances will be in the result.
- If either @i{list-1}
- or @i{list-2} has duplicate entries within it,
- the redundant entries
- might or might not appear in the result.
- The order of elements in the result do not have to
- reflect the ordering of @i{list-1} or @i{list-2} in any way.
- The result @i{list} may be @b{eq} to either
- @i{list-1} or @i{list-2} if appropriate.
- @subsubheading Examples::
- @example
- (union '(a b c) '(f a d))
- @result{} (A B C F D)
- @i{OR}@result{} (B C F A D)
- @i{OR}@result{} (D F A B C)
- (union '((x 5) (y 6)) '((z 2) (x 4)) :key #'car)
- @result{} ((X 5) (Y 6) (Z 2))
- @i{OR}@result{} ((X 4) (Y 6) (Z 2))
- (setq lst1 (list 1 2 '(1 2) "a" "b")
- lst2 (list 2 3 '(2 3) "B" "C"))
- @result{} (2 3 (2 3) "B" "C")
- (nunion lst1 lst2)
- @result{} (1 (1 2) "a" "b" 2 3 (2 3) "B" "C")
- @i{OR}@result{} (1 2 (1 2) "a" "b" "C" "B" (2 3) 3)
- @end example
- @subsubheading Side Effects::
- @b{nunion} is permitted to modify any part, @i{car} or @i{cdr},
- of the @i{list structure} of @i{list-1} or @i{list-2}.
- @subsubheading Exceptional Situations::
- Should be prepared to signal an error of @i{type} @b{type-error}
- if @i{list-1} and @i{list-2} are not @i{proper lists}.
- @subsubheading See Also::
- @ref{intersection; nintersection}
- ,
- @ref{Compiler Terminology},
- @ref{Traversal Rules and Side Effects}
- @subsubheading Notes::
- The @t{:test-not} parameter is deprecated.
- Since the @b{nunion} side effect is not required,
- it should not be used in for-effect-only positions in portable code.
- @c end of including dict-conses
- @c %**end of chapter
|