1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788 |
- @node Types and Classes, Data and Control Flow, Evaluation and Compilation, Top
- @chapter Types and Classes
- @menu
- * Introduction (Types and Classes)::
- * Types::
- * Classes::
- * Types and Classes Dictionary::
- @end menu
- @node Introduction (Types and Classes), Types, Types and Classes, Types and Classes
- @section Introduction
- @c including concept-type-intro
- A @i{type} is a (possibly infinite) set of @i{objects}.
- An @i{object} can belong to more than one @i{type}.
- @i{Types} are never explicitly represented as @i{objects} by @r{Common Lisp}.
- Instead, they are referred to indirectly by the use of @i{type specifiers},
- which are @i{objects} that denote @i{types}.
- New @i{types} can be defined using @b{deftype}, @b{defstruct},
- @b{defclass}, and @b{define-condition}.
- The @i{function} @b{typep}, a set membership test, is used to determine
- whether a given @i{object} is of a given @i{type}. The function
- @b{subtypep}, a subset test, is used to determine whether a
- given @i{type} is a @i{subtype} of another given @i{type}. The
- function @b{type-of} returns a particular @i{type} to
- which a given @i{object} belongs, even though that @i{object}
- must belong to one or more other @i{types} as well.
- (For example, every @i{object} is of @i{type} @b{t},
- but @b{type-of} always returns a @i{type specifier}
- for a @i{type} more specific than @b{t}.)
- @i{Objects}, not @i{variables}, have @i{types}.
- Normally, any @i{variable} can have any @i{object} as its @i{value}.
- It is possible to declare that a @i{variable} takes on only
- values of a given @i{type} by making an explicit @i{type declaration}.
- @i{Types} are arranged in a directed acyclic graph, except
- for the presence of equivalences.
- @i{Declarations} can be made about @i{types} using @b{declare},
- @b{proclaim}, @b{declaim}, or @b{the}.
- For more information about @i{declarations},
- see @ref{Declarations}.
- Among the fundamental @i{objects} of the object system are @i{classes}.
- A @i{class} determines the structure and behavior of a set of
- other @i{objects}, which are called its @i{instances}.
- Every @i{object} is a @i{direct instance} of a @i{class}.
- The @i{class} of an @i{object} determines the set of
- operations that can be performed on the @i{object}.
- For more information, see @ref{Classes}.
- It is possible to write @i{functions} that have behavior @i{specialized}
- to the class of the @i{objects} which are their @i{arguments}.
- For more information, see @ref{Generic Functions and Methods}.
- The @i{class} of the @i{class} of an @i{object}
- is called its @i{metaclass}
- @IGindex{metaclass}
- .
- For more information about @i{metaclasses},
- see @ref{Meta-Objects}.
- @c end of including concept-type-intro
- @node Types, Classes, Introduction (Types and Classes), Types and Classes
- @section Types
- @c including concept-types
- @menu
- * Data Type Definition::
- * Type Relationships::
- * Type Specifiers::
- @end menu
- @node Data Type Definition, Type Relationships, Types, Types
- @subsection Data Type Definition
- Information about @i{type} usage is located in
- the sections specified in @i{Figure~4--1}.
- @i{Figure~4--7} lists some @i{classes}
- that are particularly relevant to the object system.
- @i{Figure~9--1} lists the defined @i{condition} @i{types}.
- @group
- @noindent
- @w{ @b{Section} Data Type }
- @w{ _________________________________________________________________________}
- @w{ @ref{Classes} Object System types }
- @w{ @ref{Slots} Object System types }
- @w{ @ref{Objects} Object System types }
- @w{ @ref{Generic Functions and Methods} Object System types }
- @w{ @ref{Condition System Concepts} Condition System types }
- @w{ @ref{Types and Classes} Miscellaneous types }
- @w{ @ref{Syntax} All types---read and print syntax }
- @w{ @ref{The Lisp Printer} All types---print syntax }
- @w{ @ref{Compilation} All types---compilation issues }
- @noindent
- @w{ Figure 4--1: Cross-References to Data Type Information }
- @end group
- @node Type Relationships, Type Specifiers, Data Type Definition, Types
- @subsection Type Relationships
- @table @asis
- @item @t{*}
- The @i{types} @b{cons}, @b{symbol}, @b{array}, @b{number},
- @b{character}, @b{hash-table},
- @b{function},
- @b{readtable}, @b{package}, @b{pathname}, @b{stream},
- @b{random-state}, @b{condition}, @b{restart},
- and any single other @i{type} created by @b{defstruct},
- @b{define-condition},
- or @b{defclass} are @i{pairwise} @i{disjoint},
- except for type relations explicitly established by specifying
- @i{superclasses} in @b{defclass}
- or @b{define-condition}
- or the @t{:include} option of @b{destruct}.
- @item @t{*}
- Any two @i{types} created by @b{defstruct} are
- @i{disjoint} unless
- one is a @i{supertype} of the other by virtue of
- the @b{defstruct} @t{:include} option.
- [Editorial Note by KMP: The comments in the source say gray suggested some change
- from ``common superclass'' to ``common subclass'' in the following, but the
- result looks suspicious to me.]
- @item @t{*}
- Any two @i{distinct} @i{classes} created by @b{defclass}
- or @b{define-condition}
- are @i{disjoint} unless they have a common @i{subclass} or
- one @i{class} is a @i{subclass} of the other.
- @item @t{*}
- An implementation may be extended to add other @i{subtype}
- relationships between the specified @i{types}, as long as they do
- not violate the type relationships and disjointness requirements
- specified here. An implementation may define additional @i{types}
- that are @i{subtypes} or @i{supertypes} of any
- specified @i{types}, as long as each additional @i{type} is
- a @i{subtype} of @i{type} @b{t} and a @i{supertype} of @i{type} @b{nil} and the disjointness requirements
- are not violated.
- At the discretion of the implementation, either @b{standard-object}
- or @b{structure-object} might appear in any class precedence list
- for a @i{system class} that does not already specify either
- @b{standard-object} or @b{structure-object}. If it does,
- it must precede the @i{class} @b{t} and follow all other @i{standardized} @i{classes}.
- @end table
- @node Type Specifiers, , Type Relationships, Types
- @subsection Type Specifiers
- @i{Type specifiers} can be @i{symbols}, @i{classes}, or @i{lists}.
- @i{Figure~4--2} lists @i{symbols} that are
- @i{standardized} @i{atomic type specifiers}, and
- @i{Figure~4--3} lists
- @i{standardized} @i{compound type specifier} @i{names}.
- For syntax information, see the dictionary entry for the corresponding @i{type specifier}.
- It is possible to define new @i{type specifiers} using
- @b{defclass},
- @b{define-condition},
- @b{defstruct},
- or
- @b{deftype}.
- @group
- @noindent
- @w{ arithmetic-error function simple-condition }
- @w{ array generic-function simple-error }
- @w{ atom hash-table simple-string }
- @w{ base-char integer simple-type-error }
- @w{ base-string keyword simple-vector }
- @w{ bignum list simple-warning }
- @w{ bit logical-pathname single-float }
- @w{ bit-vector long-float standard-char }
- @w{ broadcast-stream method standard-class }
- @w{ built-in-class method-combination standard-generic-function }
- @w{ cell-error nil standard-method }
- @w{ character null standard-object }
- @w{ class number storage-condition }
- @w{ compiled-function package stream }
- @w{ complex package-error stream-error }
- @w{ concatenated-stream parse-error string }
- @w{ condition pathname string-stream }
- @w{ cons print-not-readable structure-class }
- @w{ control-error program-error structure-object }
- @w{ division-by-zero random-state style-warning }
- @w{ double-float ratio symbol }
- @w{ echo-stream rational synonym-stream }
- @w{ end-of-file reader-error t }
- @w{ error readtable two-way-stream }
- @w{ extended-char real type-error }
- @w{ file-error restart unbound-slot }
- @w{ file-stream sequence unbound-variable }
- @w{ fixnum serious-condition undefined-function }
- @w{ float short-float unsigned-byte }
- @w{ floating-point-inexact signed-byte vector }
- @w{ floating-point-invalid-operation simple-array warning }
- @w{ floating-point-overflow simple-base-string }
- @w{ floating-point-underflow simple-bit-vector }
- @noindent
- @w{ Figure 4--2: Standardized Atomic Type Specifiers }
- @end group
- \indent
- If a @i{type specifier} is a @i{list}, the @i{car} of the @i{list}
- is a @i{symbol}, and the rest of the @i{list} is subsidiary
- @i{type} information. Such a @i{type specifier} is called
- a @i{compound type specifier}
- @IGindex{compound type specifier}
- .
- Except as explicitly stated otherwise,
- the subsidiary items can be unspecified.
- The unspecified subsidiary items are indicated
- by writing @t{*}. For example, to completely specify
- a @i{vector}, the @i{type} of the elements
- and the length of the @i{vector} must be present.
- @example
- (vector double-float 100)
- @end example
- The following leaves the length unspecified:
- @example
- (vector double-float *)
- @end example
- The following leaves the element type unspecified:
- @example
- (vector * 100)
- @end example
- Suppose that two @i{type specifiers} are the same except that the first
- has a @t{*} where the second has a more explicit specification.
- Then the second denotes a @i{subtype}
- of the @i{type} denoted by the first.
- If a @i{list} has one or more unspecified items at the end,
- those items can be dropped.
- If dropping all occurrences of @t{*} results in a @i{singleton} @i{list},
- then the parentheses can be dropped as well (the list can be replaced
- by the @i{symbol} in its @i{car}).
- For example,
- @t{(vector double-float *)}
- can be abbreviated to @t{(vector double-float)},
- and @t{(vector * *)} can be abbreviated to @t{(vector)}
- and then to
- @t{vector}.
- @group
- @noindent
- @w{ and long-float simple-base-string }
- @w{ array member simple-bit-vector }
- @w{ base-string mod simple-string }
- @w{ bit-vector not simple-vector }
- @w{ complex or single-float }
- @w{ cons rational string }
- @w{ double-float real unsigned-byte }
- @w{ eql satisfies values }
- @w{ float short-float vector }
- @w{ function signed-byte }
- @w{ integer simple-array }
- @noindent
- @w{ Figure 4--3: Standardized Compound Type Specifier Names}
- @end group
- Figure 4--4 show the @i{defined names} that can be used as
- @i{compound type specifier} @i{names}
- but that cannot be used as @i{atomic type specifiers}.
- @group
- @noindent
- @w{ and mod satisfies }
- @w{ eql not values }
- @w{ member or }
- @noindent
- @w{ Figure 4--4: Standardized Compound-Only Type Specifier Names}
- @end group
- New @i{type specifiers} can come into existence in two ways.
- @table @asis
- @item @t{*}
- Defining a structure by using @b{defstruct} without using
- the @t{:type} specifier or defining a @i{class} by using
- @b{defclass}
- or @b{define-condition}
- automatically causes the name of the structure
- or class to be a new @i{type specifier} @i{symbol}.
- @item @t{*}
- @b{deftype} can be used to define @i{derived type specifiers}
- @IGindex{derived type specifier}
- ,
- which act as `abbreviations' for other @i{type specifiers}.
- @end table
- A @i{class} @i{object} can be used as a @i{type specifier}.
- When used this way, it denotes the set of all members of that @i{class}.
- Figure 4--5 shows some @i{defined names} relating to
- @i{types} and @i{declarations}.
- @group
- @noindent
- @w{ coerce defstruct subtypep }
- @w{ declaim deftype the }
- @w{ declare ftype type }
- @w{ defclass locally type-of }
- @w{ define-condition proclaim typep }
- @noindent
- @w{ Figure 4--5: Defined names relating to types and declarations.}
- @end group
- Figure 4--6 shows all @i{defined names} that are @i{type specifier} @i{names},
- whether for @i{atomic type specifiers} or @i{compound type specifiers};
- this list is the union of the lists in @i{Figure~4--2}
- and @i{Figure~4--3}.
- @group
- @noindent
- @w{ and function simple-array }
- @w{ arithmetic-error generic-function simple-base-string }
- @w{ array hash-table simple-bit-vector }
- @w{ atom integer simple-condition }
- @w{ base-char keyword simple-error }
- @w{ base-string list simple-string }
- @w{ bignum logical-pathname simple-type-error }
- @w{ bit long-float simple-vector }
- @w{ bit-vector member simple-warning }
- @w{ broadcast-stream method single-float }
- @w{ built-in-class method-combination standard-char }
- @w{ cell-error mod standard-class }
- @w{ character nil standard-generic-function }
- @w{ class not standard-method }
- @w{ compiled-function null standard-object }
- @w{ complex number storage-condition }
- @w{ concatenated-stream or stream }
- @w{ condition package stream-error }
- @w{ cons package-error string }
- @w{ control-error parse-error string-stream }
- @w{ division-by-zero pathname structure-class }
- @w{ double-float print-not-readable structure-object }
- @w{ echo-stream program-error style-warning }
- @w{ end-of-file random-state symbol }
- @w{ eql ratio synonym-stream }
- @w{ error rational t }
- @w{ extended-char reader-error two-way-stream }
- @w{ file-error readtable type-error }
- @w{ file-stream real unbound-slot }
- @w{ fixnum restart unbound-variable }
- @w{ float satisfies undefined-function }
- @w{ floating-point-inexact sequence unsigned-byte }
- @w{ floating-point-invalid-operation serious-condition values }
- @w{ floating-point-overflow short-float vector }
- @w{ floating-point-underflow signed-byte warning }
- @noindent
- @w{ Figure 4--6: Standardized Type Specifier Names }
- @end group
- @c end of including concept-types
- @node Classes, Types and Classes Dictionary, Types, Types and Classes
- @section Classes
- @c including concept-classes
- While the object system is general enough to describe all @i{standardized} @i{classes}
- (including, for example, @b{number}, @b{hash-table}, and
- @b{symbol}), Figure 4--7 contains a list of @i{classes} that are
- especially relevant to understanding the object system.
- @group
- @noindent
- @w{ built-in-class method-combination standard-object }
- @w{ class standard-class structure-class }
- @w{ generic-function standard-generic-function structure-object }
- @w{ method standard-method }
- @noindent
- @w{ Figure 4--7: Object System Classes }
- @end group
- @menu
- * Introduction to Classes::
- * Defining Classes::
- * Creating Instances of Classes::
- * Inheritance::
- * Determining the Class Precedence List::
- * Redefining Classes::
- * Integrating Types and Classes::
- @end menu
- @node Introduction to Classes, Defining Classes, Classes, Classes
- @subsection Introduction to Classes
- A @i{class}
- @IGindex{class}
- is an @i{object} that determines the structure and behavior
- of a set of other @i{objects}, which are called its @i{instances}
- @IGindex{instance}
- .
- A @i{class} can inherit structure and behavior from other @i{classes}.
- A @i{class} whose definition refers to other @i{classes} for the purpose
- of inheriting from them is said to be a @i{subclass} of each of
- those @i{classes}. The @i{classes} that are designated for purposes of
- inheritance are said to be @i{superclasses} of the inheriting @i{class}.
- A @i{class} can have a @i{name}. The @i{function} @b{class-name}
- takes a @i{class} @i{object} and returns its @i{name}.
- The @i{name} of an anonymous @i{class} is @b{nil}. A @i{symbol}
- can @i{name} a @i{class}. The @i{function} @b{find-class} takes a
- @i{symbol} and returns the @i{class} that the @i{symbol} names.
- A @i{class} has a @i{proper name} if the @i{name} is a @i{symbol}
- and if the @i{name} of the @i{class} names that @i{class}.
- That is, a @i{class}~C has the @i{proper name}~S if S=
- @t{(class-name C)} and C= @t{(find-class S)}.
- Notice that it is possible for
- @t{(find-class S_1)} = @t{(find-class S_2)}
- and S_1!= S_2.
- If C= @t{(find-class S)}, we say that C is the @i{class} @i{named} S.
- A @i{class} C_1 is
- a @i{direct superclass}
- @IGindex{direct superclass}
- of a @i{class} C_2
- if C_2 explicitly designates C_1
- as a @i{superclass} in its definition.
- In this case C_2 is a @i{direct subclass}
- @IGindex{direct subclass}
- of C_1.
- A @i{class} C_n is a @i{superclass}
- @IGindex{superclass}
- of
- a @i{class} C_1 if there exists a series of
- @i{classes} C_2,...,C_@{n-1@} such that
- C_@{i+1@} is a @i{direct superclass} of C_i for 1 <= i<n.
- In this case, C_1 is a @i{subclass}
- @IGindex{subclass}
- of C_n.
- A @i{class} is considered neither a @i{superclass} nor a @i{subclass} of itself.
- That is, if C_1 is a @i{superclass} of C_2,
- then C_1 != C_2.
- The set of @i{classes} consisting of some given @i{class} C
- along with all of its @i{superclasses} is called ``C and its superclasses.''
- Each @i{class} has a @i{class precedence list}
- @IGindex{class precedence list}
- ,
- which is a total ordering on the set of the given @i{class} and its @i{superclasses}.
- The total ordering is expressed as a list ordered from most specific to least specific.
- The @i{class precedence list} is used in several ways. In general, more
- specific @i{classes} can @i{shadow}
- @IGindex{shadow}
- _1 features that would
- otherwise be inherited from less specific @i{classes}.
- The @i{method} selection and combination process uses
- the @i{class precedence list} to order @i{methods}
- from most specific to least specific.
- When a @i{class} is defined, the order in which its direct @i{superclasses}
- are mentioned in the defining form is important. Each @i{class} has a
- @i{local precedence order}
- @IGindex{local precedence order}
- , which is a @i{list} consisting of the
- @i{class} followed by its @i{direct superclasses} in the order mentioned
- in the defining @i{form}.
- A @i{class precedence list} is always consistent with the
- @i{local precedence order} of each @i{class} in the list.
- The @i{classes} in each @i{local precedence order} appear
- within the @i{class precedence list} in the same order.
- If the @i{local precedence orders} are inconsistent with each other,
- no @i{class precedence list} can be constructed, and an error is signaled.
- The @i{class precedence list} and its computation is discussed
- in @ref{Determining the Class Precedence List}.
- @i{classes} are organized into a directed acyclic graph.
- There are two distinguished @i{classes}, named @b{t} and @b{standard-object}.
- The @i{class} named @b{t} has no @i{superclasses}.
- It is a @i{superclass} of every @i{class} except itself.
- The @i{class} named @b{standard-object} is an @i{instance} of
- the @i{class} @b{standard-class} and is a @i{superclass} of
- every @i{class} that is an @i{instance} of the @i{class} @b{standard-class} except itself.
- [Reviewer Note by Barmar: This or something like it needs to be said in the introduction.]
- There is a mapping from the object system @i{class} space into
- the @i{type} space. Many of the standard @i{types} specified
- in this document have a corresponding @i{class} that has the same
- @i{name} as the @i{type}. Some @i{types} do not have a
- corresponding @i{class}. The integration of the @i{type} and @i{class}
- systems is discussed in @ref{Integrating Types and Classes}.
- @i{Classes} are represented by @i{objects} that are themselves
- @i{instances} of @i{classes}.
- The @i{class} of the @i{class} of an @i{object} is termed
- the @i{metaclass}
- @IGindex{metaclass}
- of that @i{object}. When no misinterpretation is
- possible, the term @i{metaclass} is used to refer to a @i{class}
- that has @i{instances} that are themselves @i{classes}. The @i{metaclass}
- determines the form of inheritance used by the @i{classes} that are its
- @i{instances} and the representation of the @i{instances} of those @i{classes}.
- The object system provides a default @i{metaclass}, @b{standard-class}, that is
- appropriate for most programs.
- Except where otherwise specified, all @i{classes} mentioned in this
- standard are @i{instances} of the @i{class} @b{standard-class},
- all @i{generic functions} are @i{instances}
- of the @i{class} @b{standard-generic-function},
- and all @i{methods} are @i{instances} of the @i{class} @b{standard-method}.
- @menu
- * Standard Metaclasses::
- @end menu
- @node Standard Metaclasses, , Introduction to Classes, Introduction to Classes
- @subsubsection Standard Metaclasses
- The object system provides a number of predefined @i{metaclasses}.
- These include the @i{classes} @b{standard-class},
- @b{built-in-class}, and @b{structure-class}:
- @table @asis
- @item @t{*}
- The @i{class} @b{standard-class} is the default @i{class} of
- @i{classes} defined by @b{defclass}.
- @item @t{*}
- The @i{class} @b{built-in-class} is the @i{class} whose
- @i{instances} are @i{classes} that have special implementations with
- restricted capabilities. Any @i{class} that corresponds to a standard
- @i{type} might be an @i{instance} of @b{built-in-class}.
- The predefined @i{type} specifiers that are required to have
- corresponding @i{classes} are listed in @i{Figure~4--8}.
- It is @i{implementation-dependent} whether each of these @i{classes}
- is implemented as a @i{built-in class}.
- @item @t{*}
- All @i{classes} defined by means of @b{defstruct} are
- @i{instances} of the @i{class} @b{structure-class}.
- @end table
- @node Defining Classes, Creating Instances of Classes, Introduction to Classes, Classes
- @subsection Defining Classes
- The macro @b{defclass} is used to define a new named @i{class}.
- The definition of a @i{class} includes:
- @table @asis
- @item @t{*}
- The @i{name} of the new @i{class}.
- For newly-defined @i{classes} this @i{name} is a @i{proper name}.
- @item @t{*}
- The list of the direct @i{superclasses} of the new @i{class}.
- @item @t{*}
- A set of @i{slot specifiers}
- @IGindex{slot specifier}
- .
- Each @i{slot specifier} includes the @i{name} of the @i{slot}
- and zero or more @i{slot} options. A @i{slot} option pertains
- only to a single @i{slot}. If a @i{class} definition contains
- two @i{slot specifiers} with the same @i{name}, an error is signaled.
- @item @t{*}
- A set of @i{class} options.
- Each @i{class} option pertains to the @i{class} as a whole.
- @end table
- The @i{slot} options and @i{class} options of
- the @b{defclass} form provide mechanisms for the following:
- @table @asis
- @item @t{*}
- Supplying a default initial value @i{form}
- for a given @i{slot}.
- @item @t{*}
- Requesting that @i{methods} for @i{generic functions}
- be automatically generated for reading or writing @i{slots}.
- @item @t{*}
- Controlling whether a given @i{slot} is shared by
- all @i{instances}
- of the @i{class} or whether each
- @i{instance} of the @i{class} has its own @i{slot}.
- @item @t{*}
- Supplying a set of initialization arguments and initialization
- argument defaults to be used in @i{instance} creation.
- @item @t{*}
- Indicating that the @i{metaclass} is to be other
- than the default. The @t{:metaclass} option is reserved for future use;
- an implementation can be extended to make use of the @t{:metaclass}
- option.
- @item @t{*}
- Indicating the expected @i{type} for the value stored
- in the @i{slot}.
- @item @t{*}
- Indicating the @i{documentation string} for the @i{slot}.
- @end table
- @node Creating Instances of Classes, Inheritance, Defining Classes, Classes
- @subsection Creating Instances of Classes
- The generic function @b{make-instance} creates and returns a new
- @i{instance} of a @i{class}.
- The object system provides several mechanisms for
- specifying how a new @i{instance} is to be initialized. For example, it
- is possible to specify the initial values for @i{slots} in newly created
- @i{instances}
- either by giving arguments to @b{make-instance} or by
- providing default initial values. Further initialization activities
- can be performed by @i{methods} written for @i{generic functions}
- that are
- part of the initialization protocol. The complete initialization
- protocol is described in @ref{Object Creation and Initialization}.
- @node Inheritance, Determining the Class Precedence List, Creating Instances of Classes, Classes
- @subsection Inheritance
- A @i{class} can inherit @i{methods}, @i{slots},
- and some @b{defclass} options from its @i{superclasses}.
- Other sections describe the inheritance of @i{methods},
- the inheritance of @i{slots} and @i{slot} options,
- and the inheritance of @i{class} options.
- @menu
- * Examples of Inheritance::
- * Inheritance of Class Options::
- @end menu
- @node Examples of Inheritance, Inheritance of Class Options, Inheritance, Inheritance
- @subsubsection Examples of Inheritance
- @example
- (defclass C1 ()
- ((S1 :initform 5.4 :type number)
- (S2 :allocation :class)))
- (defclass C2 (C1)
- ((S1 :initform 5 :type integer)
- (S2 :allocation :instance)
- (S3 :accessor C2-S3)))
- @end example
- @i{Instances} of the class @t{C1} have a @i{local slot} named @t{S1},
- whose default initial value is 5.4 and
- whose @i{value} should always be a @i{number}.
- The class @t{C1} also has a @i{shared slot} named @t{S2}.
- There is a @i{local slot} named @t{S1} in @i{instances} of @t{C2}.
- The default initial value of @t{S1} is 5.
- The value of @t{S1} should always be of type @t{(and integer number)}.
- There are also @i{local slots} named @t{S2} and @t{S3} in @i{instances} of @t{C2}.
- The class @t{C2} has a @i{method} for @t{C2-S3} for reading the value of slot @t{S3};
- there is also a @i{method} for @t{(setf C2-S3)} that writes the value of @t{S3}.
- @node Inheritance of Class Options, , Examples of Inheritance, Inheritance
- @subsubsection Inheritance of Class Options
- The @t{:default-initargs} class option is inherited. The set of
- defaulted initialization arguments for a @i{class} is the union of the
- sets of initialization arguments supplied in
- the @t{:default-initargs} class options of the @i{class} and its @i{superclasses}.
- When more than one default initial value @i{form} is supplied for a given
- initialization argument, the default initial value @i{form} that is used
- is the one supplied by the @i{class} that is most specific according to
- the @i{class precedence list}.
- If a given @t{:default-initargs} class option specifies an
- initialization argument of the same @i{name} more than once, an
- error of @i{type} @b{program-error} is signaled.
- @node Determining the Class Precedence List, Redefining Classes, Inheritance, Classes
- @subsection Determining the Class Precedence List
- The @b{defclass} form for a @i{class} provides a total ordering
- on that @i{class} and its direct @i{superclasses}. This ordering is
- called the @i{local precedence order}
- @IGindex{local precedence order}
- . It is an ordered list of the
- @i{class} and its direct @i{superclasses}. The
- @i{class precedence list}
- @IGindex{class precedence list}
- for a class C is a total ordering on
- C and its @i{superclasses} that is consistent with the
- @i{local precedence orders} for each of C and its @i{superclasses}.
- A @i{class} precedes its direct @i{superclasses},
- and a direct @i{superclass} precedes all other
- direct @i{superclasses} specified to its right
- in the @i{superclasses} list of the @b{defclass} form.
- For every class C, define
- @center R_C=@{(C,C_1),(C_1,C_2),...,(C_@{n-1@},C_n)@}
- where C_1,...,C_n are
- the direct @i{superclasses} of C in the order in which
- they are mentioned in the @b{defclass} form. These ordered pairs
- generate the total ordering on the class C and its direct
- @i{superclasses}.
- Let S_C be the set of C and its @i{superclasses}. Let R be
- @center R=\bigcup_@{c\in {S_C}@}R_c
- .
- [Reviewer Note by Barmar: ``Consistent'' needs to be defined, or maybe we should say
- ``logically consistent''?]
- The set R might or might not generate a partial ordering, depending on
- whether the R_c, c\in S_C, are
- consistent; it is assumed
- that they are consistent and that R generates a partial ordering.
- When the R_c are not consistent, it is said that R is inconsistent.
- To compute the @i{class precedence list} for~C,
- topologically sort the elements of S_C with respect to the
- partial ordering generated by R. When the topological
- sort must select a @i{class} from a set of two or more
- @i{classes}, none of
- which are preceded by other @i{classes} with respect to~R,
- the @i{class} selected is chosen deterministically, as described below.
- If R is inconsistent, an error is signaled.
- @menu
- * Topological Sorting::
- * Examples of Class Precedence List Determination::
- @end menu
- @node Topological Sorting, Examples of Class Precedence List Determination, Determining the Class Precedence List, Determining the Class Precedence List
- @subsubsection Topological Sorting
- Topological sorting proceeds by finding a class C in~S_C such
- that no other @i{class} precedes that element according to the elements
- in~R. The class C is placed first in the result.
- Remove C from S_C, and remove all pairs of the form (C,D),
- D\in S_C, from R. Repeat the process, adding
- @i{classes} with no predecessors to the end of the result. Stop when no
- element can be found that has no predecessor.
- If S_C is not empty and the process has stopped, the set R is
- inconsistent. If every @i{class} in the finite set of
- @i{classes} is preceded
- by another, then R contains a loop. That is, there is a chain of
- classes C_1,...,C_n such that C_i precedes
- C_@{i+1@}, 1<= i<n, and C_n precedes C_1.
- Sometimes there are several @i{classes} from S_C with no
- predecessors. In this case select the one that has a direct
- @i{subclass} rightmost in the @i{class precedence list} computed so far.
- (If there is no such candidate @i{class}, R does not generate
- a partial ordering---the R_c, c\in S_C, are inconsistent.)
- In more precise terms, let @{N_1,...,N_m@}, m>= 2, be
- the @i{classes} from S_C with no predecessors. Let (C_1... C_n), n>= 1, be the @i{class precedence list}
- constructed so far. C_1 is the most specific @i{class}, and C_n is the least specific. Let 1<= j<= n be the largest number
- such that there exists an i where 1<= i<= m and N_i
- is a direct @i{superclass} of C_j; N_i is placed next.
- The effect of this rule for selecting from a set of @i{classes} with no
- predecessors is that the @i{classes} in a simple @i{superclass} chain are
- adjacent in the @i{class precedence list} and that @i{classes} in each
- relatively separated subgraph are adjacent in the @i{class precedence list}.
- For example, let T_1 and T_2 be subgraphs whose only
- element in common is the class J.
- Suppose that no superclass of J appears in either T_1 or T_2,
- and that J is in the superclass chain of every class in both T_1 and T_2.
- Let C_1 be the bottom of T_1;
- and let C_2 be the bottom of T_2.
- Suppose C is a @i{class} whose direct @i{superclasses}
- are C_1 and C_2 in that order, then the @i{class precedence list}
- for C starts with C and is followed by
- all @i{classes} in T_1 except J.
- All the @i{classes} of T_2 are next.
- The @i{class} J and its @i{superclasses} appear last.
- @node Examples of Class Precedence List Determination, , Topological Sorting, Determining the Class Precedence List
- @subsubsection Examples of Class Precedence List Determination
- This example determines a @i{class precedence list} for the
- class @t{pie}. The following @i{classes} are defined:
- @example
- (defclass pie (apple cinnamon) ())
- (defclass apple (fruit) ())
- (defclass cinnamon (spice) ())
- (defclass fruit (food) ())
- (defclass spice (food) ())
- (defclass food () ())
- @end example
- The set S_@{pie@}~= @{{pie, apple, cinnamon, fruit, spice, food,
- standard-object, t}@}. The set R~= @{{(pie, apple),
- (apple, cinnamon), (apple, fruit), (cinnamon, spice), \break
- (fruit, food), (spice, food), (food, standard-object), (standard-object,
- t)}@}.
- The class @t{pie} is not preceded by anything, so it comes first;
- the result so far is @t{(pie)}. Remove @t{pie} from S and pairs
- mentioning @t{pie} from R to get S~= @{{apple, cinnamon,
- fruit, spice, food, standard-object, t}@} and R~=~@{{(apple, cinnamon), (apple, fruit), (cinnamon, spice),\break (fruit,
- food), (spice, food), (food, standard-object),
- (standard-object, t)}@}.
- The class @t{apple} is not preceded by anything, so it is next; the
- result is @t{(pie apple)}. Removing @t{apple} and the relevant
- pairs results in S~= @{{cinnamon, fruit, spice, food,
- standard-object, t}@} and R~= @{{(cinnamon, spice),
- (fruit, food), (spice, food), (food, standard-object),\break
- (standard-object, t)}@}.
- The classes @t{cinnamon} and @t{fruit} are not preceded by
- anything, so the one with a direct @i{subclass} rightmost in the
- @i{class precedence list} computed so far goes next. The class @t{apple} is a
- direct @i{subclass} of @t{fruit}, and the class @t{pie} is a direct
- @i{subclass} of @t{cinnamon}. Because @t{apple} appears to the right
- of @t{pie} in the @i{class precedence list},
- @t{fruit} goes next, and the
- result so far is @t{(pie apple fruit)}. S~= @{{cinnamon,
- spice, food, standard-object, t}@}; R~= @{{(cinnamon,
- spice), (spice, food),\break (food, standard-object),
- (standard-object, t)}@}.
- The class @t{cinnamon} is next, giving the result so far as @t{(pie apple fruit cinnamon)}. At this point S~= @{{spice,
- food, standard-object, t}@}; R~= @{{(spice, food), (food,
- standard-object), (standard-object, t)}@}.
- The classes @t{spice}, @t{food}, @b{standard-object}, and
- @b{t} are added in that order, and the @i{class precedence list}
- is @t{(pie apple fruit cinnamon spice food standard-object t)}.
- It is possible to write a set of @i{class} definitions that cannot be
- ordered. For example:
- @example
- (defclass new-class (fruit apple) ())
- (defclass apple (fruit) ())
- @end example
- The class @t{fruit} must precede @t{apple}
- because the local ordering of @i{superclasses} must be preserved.
- The class @t{apple} must precede @t{fruit}
- because a @i{class} always precedes its own @i{superclasses}.
- When this situation occurs, an error is signaled, as happens here
- when the system tries to compute the @i{class precedence list}
- of @t{new-class}.
- The following might appear to be a conflicting set of definitions:
- @example
- (defclass pie (apple cinnamon) ())
- (defclass pastry (cinnamon apple) ())
- (defclass apple () ())
- (defclass cinnamon () ())
- @end example
- The @i{class precedence list} for @t{pie} is
- @t{(pie apple cinnamon standard-object t)}.
- The @i{class precedence list} for @t{pastry} is
- @t{(pastry cinnamon apple standard-object t)}.
- It is not a problem for @t{apple} to precede @t{cinnamon} in the
- ordering of the @i{superclasses} of @t{pie} but not in the ordering for
- @t{pastry}. However, it is not possible to build a new @i{class} that
- has both @t{pie} and @t{pastry} as @i{superclasses}.
- @node Redefining Classes, Integrating Types and Classes, Determining the Class Precedence List, Classes
- @subsection Redefining Classes
- A @i{class} that is a @i{direct instance} of @b{standard-class} can
- be redefined if the new @i{class} is also
- a @i{direct instance} of @b{standard-class}.
- Redefining a @i{class} modifies the existing
- @i{class} @i{object} to reflect the new @i{class} definition; it does not
- create a new @i{class} @i{object} for the @i{class}.
- Any @i{method} @i{object} created by a @t{:reader}, @t{:writer},
- or @t{:accessor} option specified by the old @b{defclass} form is
- removed from the corresponding @i{generic function}.
- @i{Methods} specified by the new @b{defclass} form are added.
- When the class C is redefined, changes are propagated to its @i{instances}
- and to @i{instances} of any of its @i{subclasses}. Updating such an
- @i{instance} occurs at an @i{implementation-dependent} time, but no later than
- the next time a @i{slot}
- of that @i{instance} is read or written. Updating an
- @i{instance}
- does not change its identity as defined by the @i{function} @b{eq}.
- The updating process may change the @i{slots} of that
- particular @i{instance},
- but it does not create a new @i{instance}. Whether
- updating an @i{instance} consumes storage is @i{implementation-dependent}.
- Note that redefining a @i{class} may cause @i{slots} to be added or
- deleted. If a @i{class} is redefined in a way that changes the set of
- @i{local slots} @i{accessible} in @i{instances}, the @i{instances}
- are updated. It is @i{implementation-dependent} whether @i{instances}
- are updated if a @i{class} is redefined in a way that does not change
- the set of @i{local slots} @i{accessible} in @i{instances}.
- The value of a @i{slot}
- that is specified as shared both in the old @i{class}
- and in the new @i{class} is retained.
- If such a @i{shared slot} was unbound
- in the old @i{class}, it is unbound in the new @i{class}.
- @i{Slots} that
- were local in the old @i{class} and that are shared in the new
- @i{class} are
- initialized. Newly added @i{shared slots} are initialized.
- Each newly added @i{shared slot} is set to the result of evaluating the
- @i{captured initialization form} for the @i{slot} that was specified
- in the @b{defclass} @i{form} for the new @i{class}.
- If there was no @i{initialization form}, the @i{slot} is unbound.
- If a @i{class} is redefined in such a way that the set of
- @i{local slots} @i{accessible} in an @i{instance} of the @i{class}
- is changed, a two-step process of updating the @i{instances} of the
- @i{class} takes place. The process may be explicitly started by
- invoking the generic function @b{make-instances-obsolete}. This
- two-step process can happen in other circumstances in some implementations.
- For example, in some implementations this two-step process is
- triggered if the order of @i{slots} in storage is changed.
- The first step modifies the structure of the @i{instance} by adding new
- @i{local slots} and discarding @i{local slots} that are not
- defined in the new version of the @i{class}. The second step
- initializes the newly-added @i{local slots} and performs any other
- user-defined actions. These two steps are further specified
- in the next two sections.
- @menu
- * Modifying the Structure of Instances::
- * Initializing Newly Added Local Slots (Redefining Classes)::
- * Customizing Class Redefinition::
- @end menu
- @node Modifying the Structure of Instances, Initializing Newly Added Local Slots (Redefining Classes), Redefining Classes, Redefining Classes
- @subsubsection Modifying the Structure of Instances
- [Reviewer Note by Barmar: What about shared slots that are deleted?]
- The first step modifies the structure of @i{instances} of the redefined
- @i{class} to conform to its new @i{class} definition.
- @i{Local slots} specified
- by the new @i{class} definition that are not specified as either local or
- shared by the old @i{class} are added, and @i{slots}
- not specified as either
- local or shared by the new @i{class} definition that are specified as
- local by the old @i{class} are discarded.
- The @i{names} of these added and discarded
- @i{slots} are passed as arguments
- to @b{update-instance-for-redefined-class}
- as described in the next section.
- The values of @i{local slots} specified by both the new and old
- @i{classes} are retained. If such a @i{local slot} was unbound,
- it remains unbound.
- The value of a @i{slot} that is specified as shared in the old
- @i{class} and as local in the new @i{class} is retained. If such
- a @i{shared slot} was unbound, the @i{local slot} is unbound.
- @node Initializing Newly Added Local Slots (Redefining Classes), Customizing Class Redefinition, Modifying the Structure of Instances, Redefining Classes
- @subsubsection Initializing Newly Added Local Slots
- The second step initializes the newly added @i{local slots} and performs
- any other user-defined actions. This step is implemented by the generic
- function @b{update-instance-for-redefined-class}, which is called after
- completion of the first step of modifying the structure of the
- @i{instance}.
- The generic function @b{update-instance-for-redefined-class} takes
- four required arguments: the @i{instance} being updated after it has
- undergone the first step, a list of the names of @i{local slots} that were
- added, a list of the names of @i{local slots} that were discarded, and a
- property list containing the @i{slot} names and values of
- @i{slots} that were
- discarded and had values. Included among the discarded @i{slots} are
- @i{slots} that were local in the old @i{class} and that are shared in the new
- @i{class}.
- The generic function @b{update-instance-for-redefined-class} also
- takes any number of initialization arguments. When it is called by
- the system to update an @i{instance} whose @i{class}
- has been redefined, no
- initialization arguments are provided.
- There is a system-supplied primary @i{method} for
- @b{update-instance-for-redefined-class} whose @i{parameter specializer}
- for its @i{instance} argument is the @i{class} @b{standard-object}.
- First this @i{method} checks the validity of initialization arguments and signals an
- error if an initialization argument is supplied that is not declared
- as valid. (For more information, see @ref{Declaring the Validity of Initialization Arguments}.)
- Then it calls the generic function
- @b{shared-initialize} with the following arguments: the
- @i{instance},
- the list of @i{names} of
- the newly added @i{slots}, and the initialization
- arguments it received.
- @node Customizing Class Redefinition, , Initializing Newly Added Local Slots (Redefining Classes), Redefining Classes
- @subsubsection Customizing Class Redefinition
- [Reviewer Note by Barmar: This description is hard to follow.]
- @i{Methods} for @b{update-instance-for-redefined-class} may be
- defined to specify actions to be taken when an @i{instance} is updated.
- If only @i{after methods} for @b{update-instance-for-redefined-class} are
- defined, they will be run after the system-supplied primary @i{method} for
- initialization and therefore will not interfere with the default
- behavior of @b{update-instance-for-redefined-class}. Because no
- initialization arguments are passed to @b{update-instance-for-redefined-class}
- when it is called by the system, the
- @i{initialization forms} for @i{slots}
- that are filled by @i{before methods} for @b{update-instance-for-redefined-class}
- will not be evaluated by @b{shared-initialize}.
- @i{Methods} for @b{shared-initialize} may be defined to customize
- @i{class} redefinition. For more information, see @ref{Shared-Initialize}.
- @node Integrating Types and Classes, , Redefining Classes, Classes
- @subsection Integrating Types and Classes
- The object system maps the space of @i{classes} into the space of @i{types}.
- Every @i{class} that has a proper name has a corresponding @i{type}
- with the same @i{name}.
- The proper name of every @i{class} is a valid @i{type specifier}. In
- addition, every @i{class} @i{object} is a valid @i{type specifier}.
- Thus the expression @t{(typep @i{object} @i{class})} evaluates to
- @i{true} if the @i{class} of @i{object} is @i{class} itself or
- a @i{subclass} of @i{class}. The evaluation of the expression
- @t{(subtypep class1 class2)} returns the values
- @i{true} and @i{true} if @t{class1} is a subclass of @t{class2} or if they are the
- same @i{class}; otherwise it returns the values
- @i{false} and @i{true}.
- If I is an @i{instance} of some @i{class} C named S
- and C is an @i{instance} of @b{standard-class},
- the evaluation of the expression @t{(type-of I\/)} returns S
- if S is the @i{proper name} of C;
- otherwise, it returns C.
- Because the names of @i{classes}
- and @i{class} @i{objects} are @i{type specifiers}, they may
- be used in the special form @b{the} and in type declarations.
- Many but not all of the predefined @i{type specifiers} have a
- corresponding @i{class} with
- the same proper name as the @i{type}. These type
- specifiers are listed in @i{Figure~4--8}.
- For example, the @i{type} @b{array} has
- a corresponding @i{class} named @b{array}.
- No @i{type specifier} that is a
- list, such as @t{(vector double-float 100)}, has a corresponding @i{class}.
- The @i{operator} @b{deftype} does not create any @i{classes}.
- Each @i{class} that corresponds to a predefined @i{type specifier} can
- be implemented in one of three ways, at the discretion of each implementation.
- It can be a @i{standard class},
- a @i{structure class},
- or a @i{system class}.
- A @i{built-in class} is one whose @i{generalized instances} have restricted capabilities
- or special representations. Attempting to use @b{defclass} to define
- @i{subclasses} of a @b{built-in-class} signals an error.
- Calling @b{make-instance} to create a @i{generalized instance} of a
- @i{built-in class} signals an error. Calling @b{slot-value} on a
- @i{generalized instance} of a @i{built-in class} signals an error.
- Redefining a @i{built-in class} or using @b{change-class} to change
- the @i{class} of an @i{object} to or from a @i{built-in class} signals an error.
- However, @i{built-in classes} can be used as @i{parameter specializers}
- in @i{methods}.
- It is possible to determine whether a @i{class} is a @i{built-in class}
- by checking the @i{metaclass}.
- A @i{standard class} is an @i{instance} of the @i{class} @b{standard-class},
- a @i{built-in class} is an @i{instance} of the @i{class} @b{built-in-class}, and
- a @i{structure class} is an @i{instance} of the @i{class} @b{structure-class}.
- Each @i{structure} @i{type} created by @b{defstruct} without
- using the @t{:type} option has a corresponding @i{class}.
- This @i{class} is a @i{generalized instance} of the @i{class} @b{structure-class}.
- The @t{:include} option of @b{defstruct} creates a direct
- @i{subclass} of the @i{class}
- that corresponds to the included @i{structure}
- @i{type}.
- It is @i{implementation-dependent} whether @i{slots} are involved in the
- operation of @i{functions} defined in this specification
- on @i{instances} of @i{classes} defined in this specification,
- except when @i{slots} are explicitly defined by this specification.
- If in a particular @i{implementation} a @i{class} defined in this specification
- has @i{slots} that are not defined by this specfication, the names of these @i{slots}
- must not be @i{external symbols} of @i{packages} defined in this specification nor
- otherwise @i{accessible} in the @t{CL-USER} @i{package}.
- The purpose of specifying that many of the standard @i{type specifiers} have a
- corresponding @i{class} is to enable users to write @i{methods} that
- discriminate on these @i{types}. @i{Method} selection requires that a
- @i{class precedence list} can be determined for each @i{class}.
- The hierarchical relationships among the @i{type specifiers} are mirrored by
- relationships among the @i{classes} corresponding to those @i{types}.
- @i{Figure~4--8} lists the set of @i{classes}
- that correspond to predefined @i{type specifiers}.
- @group
- @noindent
- @w{ arithmetic-error generic-function simple-error }
- @w{ array hash-table simple-type-error }
- @w{ bit-vector integer simple-warning }
- @w{ broadcast-stream list standard-class }
- @w{ built-in-class logical-pathname standard-generic-function }
- @w{ cell-error method standard-method }
- @w{ character method-combination standard-object }
- @w{ class null storage-condition }
- @w{ complex number stream }
- @w{ concatenated-stream package stream-error }
- @w{ condition package-error string }
- @w{ cons parse-error string-stream }
- @w{ control-error pathname structure-class }
- @w{ division-by-zero print-not-readable structure-object }
- @w{ echo-stream program-error style-warning }
- @w{ end-of-file random-state symbol }
- @w{ error ratio synonym-stream }
- @w{ file-error rational t }
- @w{ file-stream reader-error two-way-stream }
- @w{ float readtable type-error }
- @w{ floating-point-inexact real unbound-slot }
- @w{ floating-point-invalid-operation restart unbound-variable }
- @w{ floating-point-overflow sequence undefined-function }
- @w{ floating-point-underflow serious-condition vector }
- @w{ function simple-condition warning }
- @noindent
- @w{ Figure 4--8: Classes that correspond to pre-defined type specifiers }
- @end group
- The @i{class precedence list} information specified in the entries for
- each of these @i{classes} are those that are required by the object system.
- Individual implementations may be extended to define other type
- specifiers to have a corresponding @i{class}. Individual implementations
- may be extended to add other @i{subclass} relationships and to add other
- @i{elements} to the @i{class precedence lists} as long as
- they do not violate the type relationships and disjointness
- requirements specified by this standard.
- A standard @i{class} defined with no direct @i{superclasses} is guaranteed to
- be disjoint from all of the @i{classes} in the table, except for the
- class named @b{t}.
- @c end of including concept-classes
- @node Types and Classes Dictionary, , Classes, Types and Classes
- @section Types and Classes Dictionary
- @c including dict-types
- @menu
- * nil (Type)::
- * boolean::
- * function (System Class)::
- * compiled-function::
- * generic-function::
- * standard-generic-function::
- * class::
- * built-in-class::
- * structure-class::
- * standard-class::
- * method::
- * standard-method::
- * structure-object::
- * standard-object::
- * method-combination::
- * t (System Class)::
- * satisfies::
- * member::
- * not (Type Specifier)::
- * and (Type Specifier)::
- * or (Type Specifier)::
- * values (Type Specifier)::
- * eql (Type Specifier)::
- * coerce::
- * deftype::
- * subtypep::
- * type-of::
- * typep::
- * type-error::
- * type-error-datum::
- * simple-type-error::
- @end menu
- @node nil (Type), boolean, Types and Classes Dictionary, Types and Classes Dictionary
- @subsection nil [Type]
- @subsubheading Supertypes::
- all @i{types}
- @subsubheading Description::
- The @i{type} @b{nil} contains no @i{objects} and so is also
- called the @i{empty type}.
- The @i{type} @b{nil} is a @i{subtype} of every @i{type}.
- No @i{object} is of @i{type} @b{nil}.
- @subsubheading Notes::
- The @i{type} containing the @i{object} @b{nil} is the @i{type} @b{null},
- not the @i{type} @b{nil}.
- @node boolean, function (System Class), nil (Type), Types and Classes Dictionary
- @subsection boolean [Type]
- @subsubheading Supertypes::
- @b{boolean},
- @b{symbol},
- @b{t}
- @subsubheading Description::
- The @i{type} @b{boolean} contains the @i{symbols} @b{t} and @b{nil},
- which represent true and false, respectively.
- @subsubheading See Also::
- @b{t} (@i{constant variable}),
- @b{nil} (@i{constant variable}),
- @ref{if}
- ,
- @ref{not}
- ,
- @ref{complement}
- @subsubheading Notes::
- Conditional operations, such as @b{if},
- permit the use of @i{generalized booleans},
- not just @i{booleans};
- any @i{non-nil} value,
- not just @b{t},
- counts as true for a @i{generalized boolean}.
- However, as a matter of convention,
- the @i{symbol} @b{t} is considered the canonical value to use
- even for a @i{generalized boolean} when no better choice presents itself.
- @node function (System Class), compiled-function, boolean, Types and Classes Dictionary
- @subsection function [System Class]
- @subsubheading Class Precedence List::
- @b{function},
- @b{t}
- @subsubheading Description::
- A @i{function} is an @i{object} that represents code
- to be executed when an appropriate number of arguments is supplied.
- A @i{function} is produced by
- the @b{function} @i{special form},
- the @i{function} @b{coerce},
- or
- the @i{function} @b{compile}.
- A @i{function} can be directly invoked by using it as the first argument to
- @b{funcall}, @b{apply}, or @b{multiple-value-call}.
- @subsubheading Compound Type Specifier Kind::
- Specializing.
- @subsubheading Compound Type Specifier Syntax::
- (@code{function}@{@i{@t{[}arg-typespec @r{[}value-typespec@r{]}@t{]}}@})
- @w{@i{arg-typespec} ::=@r{(}@{@i{typespec}@}{*} }
- @w{ @t{[}{&optional} @{@i{typespec}@}{*}@t{]} }
- @w{ @t{[}{&rest} @i{typespec}@t{]} }
- @w{ @t{[}{&key} @{{(}keyword typespec@r{)}@}{*}@t{]}@r{)}}
- @subsubheading Compound Type Specifier Arguments::
- @i{typespec}---a @i{type specifier}.
- @i{value-typespec}---a @i{type specifier}.
- @subsubheading Compound Type Specifier Description::
- [Editorial Note by KMP: Isn't there some context info about ftype declarations to be merged here?]
- [Editorial Note by KMP: This could still use some cleaning up.]
- [Editorial Note by Sandra: Still need clarification about what happens if the
- number of arguments doesn't match the FUNCTION type declaration.]
- The list form of the @b{function} @i{type-specifier}
- can be used only for declaration and not for discrimination.
- Every element of this @i{type} is
- a @i{function} that accepts arguments of the
- types
- specified by the @i{argj-types} and returns values that are
- members of the @i{types} specified by @i{value-type}. The
- @b{&optional}, @b{&rest}, @b{&key},
- and @b{&allow-other-keys}
- markers can appear in the list of argument types.
- The @i{type specifier} provided
- with @b{&rest} is the @i{type}
- of each actual argument, not the @i{type} of the
- corresponding variable.
- The @b{&key} parameters
- should be supplied as lists of the form @t{(@i{keyword} @i{type})}.
- The @i{keyword} must be a valid keyword-name symbol
- as must be supplied in the actual arguments of a
- call.
- This is usually a @i{symbol} in the @t{KEYWORD} @i{package} but can be any @i{symbol}.
- When @b{&key} is given in a
- @b{function} @i{type specifier} @i{lambda list},
- the @i{keyword parameters} given
- are exhaustive unless @b{&allow-other-keys} is also present.
- @b{&allow-other-keys} is an indication
- that other keyword arguments might actually be
- supplied and, if supplied, can be used.
- For example,
- the @i{type} of the @i{function} @b{make-list} could be declared as follows:
- @example
- (function ((integer 0) &key (:initial-element t)) list)
- @end example
- The @i{value-type} can be a @b{values}
- @i{type specifier} in order to indicate the
- @i{types} of @i{multiple values}.
- Consider a declaration of the following form:
- @example
- (ftype (function (arg0-type arg1-type ...) val-type) f))
- @end example
- Any @i{form}
- @t{(f arg0 arg1 ...)}
- within the scope of
- that declaration is equivalent to the following:
- @example
- (the val-type (f (the arg0-type arg0) (the arg1-type arg1) ...))
- @end example
- That is, the consequences are undefined if any of the arguments are
- not of the specified @i{types} or the result is not of the
- specified @i{type}. In particular, if any argument is not of the
- correct @i{type}, the result is not guaranteed to be of the
- specified @i{type}.
- Thus, an @b{ftype} declaration for a @i{function}
- describes @i{calls} to the @i{function}, not the actual definition
- of the @i{function}.
- Consider a declaration of the following form:
- @example
- (type (function (arg0-type arg1-type ...) val-type) fn-valued-variable)
- @end example
- This declaration has the interpretation that, within the scope of the
- declaration, the consequences are unspecified if the value of @t{fn-valued-variable} is called with arguments not of the specified
- @i{types}; the value resulting from a valid call will be of type
- @t{val-type}.
- As with variable type declarations, nested declarations
- imply intersections of @i{types}, as follows:
- @table @asis
- @item @t{*}
- Consider the following two
- declarations of @b{ftype}:
- @example
- (ftype (function (arg0-type1 arg1-type1 ...) val-type1) f))
- @end example
- and
- @example
- (ftype (function (arg0-type2 arg1-type2 ...) val-type2) f))
- @end example
- If both these declarations are in effect,
- then within the shared scope of the declarations, calls to @t{f} can be
- treated as if @t{f} were declared as follows:
- @example
- (ftype (function ((and arg0-type1 arg0-type2) (and arg1-type1 arg1-type2 ...) ...)
- (and val-type1 val-type2))
- f))
- @end example
- It is permitted to ignore one or all of the @b{ftype} declarations in force.
- @item @t{*}
- If two (or more) type declarations are in effect for a variable, and
- they are both @t{function} declarations, the declarations combine similarly.
- @end table
- @node compiled-function, generic-function, function (System Class), Types and Classes Dictionary
- @subsection compiled-function [Type]
- @subsubheading Supertypes::
- @b{compiled-function},
- @b{function},
- @b{t}
- @subsubheading Description::
- Any @i{function} may be considered by an @i{implementation} to be a
- a @i{compiled function} if it contains no references to @i{macros} that
- must be expanded at run time, and it contains no unresolved references
- to @i{load time values}. See @ref{Compilation Semantics}.
- @i{Functions} whose definitions appear lexically within a
- @i{file} that has been @i{compiled} with @b{compile-file} and then
- @i{loaded} with @b{load} are of @i{type} @b{compiled-function}.
- @i{Functions} produced by the @b{compile} function
- are of @i{type} @b{compiled-function}.
- Other @i{functions} might also be of @i{type} @b{compiled-function}.
- @node generic-function, standard-generic-function, compiled-function, Types and Classes Dictionary
- @subsection generic-function [System Class]
- @subsubheading Class Precedence List::
- @b{generic-function},
- @b{function},
- @b{t}
- @subsubheading Description::
- A @i{generic function}
- @IGindex{generic function}
- is a @i{function} whose behavior
- depends on the @i{classes} or identities of the @i{arguments}
- supplied to it. A generic function object contains a set of
- @i{methods}, a @i{lambda list}, a @i{method combination} @i{type},
- and other information. The @i{methods}
- define the class-specific behavior and operations of the @i{generic function};
- a @i{method} is said to @i{specialize} a @i{generic function}.
- When invoked, a @i{generic function} executes a subset of its
- @i{methods} based on the @i{classes} or identities of its @i{arguments}.
- A @i{generic function} can be used in the same ways that an
- ordinary @i{function} can be used; specifically, a @i{generic function} can
- be used as an argument to @b{funcall} and @b{apply},
- and can be given a global or a local name.
- @node standard-generic-function, class, generic-function, Types and Classes Dictionary
- @subsection standard-generic-function [System Class]
- @subsubheading Class Precedence List::
- @b{standard-generic-function},
- @b{generic-function},
- @b{function},
- @b{t}
- @subsubheading Description::
- The @i{class} @b{standard-generic-function} is the default @i{class} of
- @i{generic functions} @i{established} by
- @b{defmethod},
- @b{ensure-generic-function},
- @b{defgeneric},
- and
- @b{defclass} @i{forms}.
- @node class, built-in-class, standard-generic-function, Types and Classes Dictionary
- @subsection class [System Class]
- @subsubheading Class Precedence List::
- @b{class},
- @b{standard-object},
- @b{t}
- @subsubheading Description::
- The @i{type} @b{class} represents @i{objects} that determine the structure
- and behavior of their @i{instances}. Associated with an @i{object}
- of @i{type} @b{class} is information describing its place in the
- directed acyclic graph of @i{classes}, its @i{slots}, and its options.
- @node built-in-class, structure-class, class, Types and Classes Dictionary
- @subsection built-in-class [System Class]
- @subsubheading Class Precedence List::
- @b{built-in-class},
- @b{class},
- @b{standard-object},
- @b{t}
- @subsubheading Description::
- A @i{built-in class} is a @i{class} whose @i{instances} have
- restricted capabilities or special representations.
- Attempting to use
- @b{defclass} to define @i{subclasses} of a @i{built-in class}
- signals an error of @i{type} @b{error}.
- Calling @b{make-instance} to create an @i{instance}
- of a @i{built-in class} signals an error of @i{type} @b{error}.
- Calling @b{slot-value} on an @i{instance} of a @i{built-in class}
- signals an error of @i{type} @b{error}. Redefining a @i{built-in class}
- or using @b{change-class} to change the @i{class} of an @i{instance}
- to or from a @i{built-in class} signals an error of @i{type} @b{error}.
- However, @i{built-in classes} can be used as @i{parameter specializers}
- in @i{methods}.
- @node structure-class, standard-class, built-in-class, Types and Classes Dictionary
- @subsection structure-class [System Class]
- @subsubheading Class Precedence List::
- @b{structure-class},
- @b{class},
- @b{standard-object},
- @b{t}
- @subsubheading Description::
- All @i{classes} defined by means of @b{defstruct}
- are @i{instances} of the @i{class} @b{structure-class}.
- @node standard-class, method, structure-class, Types and Classes Dictionary
- @subsection standard-class [System Class]
- @subsubheading Class Precedence List::
- @b{standard-class},
- @b{class},
- @b{standard-object},
- @b{t}
- @subsubheading Description::
- The @i{class} @b{standard-class} is the default @i{class} of @i{classes}
- defined by @b{defclass}.
- @node method, standard-method, standard-class, Types and Classes Dictionary
- @subsection method [System Class]
- @subsubheading Class Precedence List::
- @b{method},
- @b{t}
- @subsubheading Description::
- A @i{method} is an @i{object} that represents a modular part of the behavior
- of a @i{generic function}.
- A @i{method} contains @i{code} to implement the @i{method}'s
- behavior, a sequence of @i{parameter specializers} that specify when the
- given @i{method} is applicable, and a sequence of @i{qualifiers}
- that is used by the method combination facility to distinguish among
- @i{methods}. Each required parameter of each
- @i{method} has an associated @i{parameter specializer}, and the
- @i{method} will be invoked only on arguments that satisfy its
- @i{parameter specializers}.
- The method combination facility controls the selection of
- @i{methods}, the order in which they are run, and the values that are
- returned by the generic function. The object system offers a default method
- combination type and provides a facility for declaring new types of
- method combination.
- @subsubheading See Also::
- @ref{Generic Functions and Methods}
- @node standard-method, structure-object, method, Types and Classes Dictionary
- @subsection standard-method [System Class]
- @subsubheading Class Precedence List::
- @b{standard-method},
- @b{method},
- @b{standard-object},
- @b{t}
- @subsubheading Description::
- The @i{class} @b{standard-method} is the default @i{class} of
- @i{methods} defined by the
- @b{defmethod} and
- @b{defgeneric} @i{forms}.
- @node structure-object, standard-object, standard-method, Types and Classes Dictionary
- @subsection structure-object [Class]
- @subsubheading Class Precedence List::
- @b{structure-object},
- @b{t}
- @subsubheading Description::
- The @i{class} @b{structure-object} is an @i{instance} of @b{structure-class}
- and is a @i{superclass} of every @i{class}
- that is an @i{instance} of @b{structure-class}
- except itself, and is a @i{superclass} of every @i{class}
- that is defined by @b{defstruct}.
- @subsubheading See Also::
- @ref{defstruct}
- ,
- @ref{Sharpsign S},
- @ref{Printing Structures}
- @node standard-object, method-combination, structure-object, Types and Classes Dictionary
- @subsection standard-object [Class]
- @subsubheading Class Precedence List::
- @b{standard-object},
- @b{t}
- @subsubheading Description::
- The @i{class} @b{standard-object} is an @i{instance} of @b{standard-class}
- and is a @i{superclass} of every @i{class} that is an @i{instance} of
- @b{standard-class} except itself.
- @node method-combination, t (System Class), standard-object, Types and Classes Dictionary
- @subsection method-combination [System Class]
- @subsubheading Class Precedence List::
- @b{method-combination},
- @b{t}
- @subsubheading Description::
- Every @i{method combination} @i{object} is an
- @i{indirect instance} of the @i{class} @b{method-combination}.
- A @i{method combination} @i{object} represents the information about
- the @i{method combination} being used by a @i{generic function}.
- A @i{method combination} @i{object} contains information about
- both the type of @i{method combination} and the arguments being used
- with that @i{type}.
- @node t (System Class), satisfies, method-combination, Types and Classes Dictionary
- @subsection t [System Class]
- @subsubheading Class Precedence List::
- @b{t}
- @subsubheading Description::
- The set of all @i{objects}.
- The @i{type} @b{t} is a @i{supertype} of every @i{type},
- including itself. Every @i{object} is of @i{type} @b{t}.
- @node satisfies, member, t (System Class), Types and Classes Dictionary
- @subsection satisfies [Type Specifier]
- @subsubheading Compound Type Specifier Kind::
- Predicating.
- @subsubheading Compound Type Specifier Syntax::
- (@code{satisfies}@{@i{predicate-name}@})
- @subsubheading Compound Type Specifier Arguments::
- @i{predicate-name}---a @i{symbol}.
- @subsubheading Compound Type Specifier Description::
- This denotes the set of all @i{objects} that satisfy the
- @i{predicate} @i{predicate-name}, which must be a @i{symbol}
- whose global @i{function} definition is a one-argument
- predicate. A name is required for @i{predicate-name};
- @i{lambda expressions} are not allowed.
- For example, the @i{type specifier} @t{(and integer (satisfies evenp))}
- denotes the set of all even integers.
- The form @t{(typep @i{x} '(satisfies @i{p}))} is equivalent to
- @t{(if (@i{p} @i{x}) t nil)}.
- The argument is required.
- The @i{symbol} @b{*} can be the argument, but it
- denotes itself (the @i{symbol} @b{*}),
- and does not represent an unspecified value.
- The symbol @b{satisfies} is not valid as a @i{type specifier}.
- @node member, not (Type Specifier), satisfies, Types and Classes Dictionary
- @subsection member [Type Specifier]
- @subsubheading Compound Type Specifier Kind::
- Combining.
- @subsubheading Compound Type Specifier Syntax::
- (@code{member}@{@i{@{@i{object}@}{*}}@})
- @subsubheading Compound Type Specifier Arguments::
- @i{object}---an @i{object}.
- @subsubheading Compound Type Specifier Description::
- This denotes the set containing the named @i{objects}. An
- @i{object} is of this @i{type} if and only if it is @b{eql}
- to one of the specified @i{objects}.
- The @i{type specifiers} @t{(member)} and @b{nil} are equivalent.
- @b{*} can be among the @i{objects},
- but if so it denotes itself (the symbol @b{*})
- and does not represent an unspecified value.
- The symbol @b{member} is not valid as a @i{type specifier};
- and, specifically, it is not an abbreviation for either @t{(member)} or @t{(member *)}.
- @subsubheading See Also::
- the @i{type} @b{eql}
- @node not (Type Specifier), and (Type Specifier), member, Types and Classes Dictionary
- @subsection not [Type Specifier]
- @subsubheading Compound Type Specifier Kind::
- Combining.
- @subsubheading Compound Type Specifier Syntax::
- (@code{not}@{@i{typespec}@})
- @subsubheading Compound Type Specifier Arguments::
- @i{typespec}---a @i{type specifier}.
- @subsubheading Compound Type Specifier Description::
- This denotes the set of all @i{objects} that are not of the @i{type} @i{typespec}.
- The argument is required, and cannot be @b{*}.
- The symbol @b{not} is not valid as a @i{type specifier}.
- @node and (Type Specifier), or (Type Specifier), not (Type Specifier), Types and Classes Dictionary
- @subsection and [Type Specifier]
- @subsubheading Compound Type Specifier Kind::
- Combining.
- @subsubheading Compound Type Specifier Syntax::
- (@code{and}@{@i{@{@i{typespec}@}{*}}@})
- @subsubheading Compound Type Specifier Arguments::
- @i{typespec}---a @i{type specifier}.
- @subsubheading Compound Type Specifier Description::
- This denotes the set of all @i{objects} of the @i{type}
- determined by the intersection of the @i{typespecs}.
- @b{*} is not permitted as an argument.
- The @i{type specifiers} @t{(and)} and @b{t} are equivalent.
- The symbol @b{and} is not valid as a @i{type specifier},
- and, specifically, it is not an abbreviation for @t{(and)}.
- @node or (Type Specifier), values (Type Specifier), and (Type Specifier), Types and Classes Dictionary
- @subsection or [Type Specifier]
- @subsubheading Compound Type Specifier Kind::
- Combining.
- @subsubheading Compound Type Specifier Syntax::
- (@code{or}@{@i{@{@i{typespec}@}{*}}@})
- @subsubheading Compound Type Specifier Arguments::
- @i{typespec}---a @i{type specifier}.
- @subsubheading Compound Type Specifier Description::
- This denotes the set of all @i{objects} of the
- @i{type} determined by the union of the @i{typespecs}.
- For example, the @i{type} @b{list} by definition is the same as @t{(or null cons)}.
- Also, the value returned by @b{position} is an @i{object} of @i{type} @t{(or null (integer 0 *))};
- @i{i.e.}, either @b{nil} or a non-negative @i{integer}.
- @b{*} is not permitted as an argument.
- The @i{type specifiers} @t{(or)} and @b{nil} are equivalent.
- The symbol @b{or} is not valid as a @i{type specifier};
- and, specifically, it is not an abbreviation for @t{(or)}.
- @node values (Type Specifier), eql (Type Specifier), or (Type Specifier), Types and Classes Dictionary
- @subsection values [Type Specifier]
- @subsubheading Compound Type Specifier Kind::
- Specializing.
- @subsubheading Compound Type Specifier Syntax::
- (@code{values}@{@i{!@i{value-typespec}}@})
- [Reviewer Note by Barmar: Missing @b{&key}]
- @w{@i{value-typespec} ::=@{@i{typespec}@}{*} @t{[}{&optional} {@{@i{typespec}@}{*}}@t{]} @t{[}{&rest} typespec@t{]} @t{[}@b{&allow-other-keys}@t{]}}
- @subsubheading Compound Type Specifier Arguments::
- @i{typespec}---a @i{type specifier}.
- @subsubheading Compound Type Specifier Description::
- This @i{type specifier} can be used only as the @i{value-type} in a
- @b{function} @i{type specifier} or a @b{the}
- @i{special form}. It is used to specify individual @i{types}
- when @i{multiple values} are involved.
- The @b{&optional} and @b{&rest} markers can appear in the @i{value-type} list;
- they indicate the parameter list of a @i{function} that,
- when given to @b{multiple-value-call} along with the values,
- would correctly receive those values.
- The symbol @b{*} may not be among the @i{value-types}.
- The symbol @b{values} is not valid as a @i{type specifier};
- and, specifically, it is not an abbreviation for @t{(values)}.
- @node eql (Type Specifier), coerce, values (Type Specifier), Types and Classes Dictionary
- @subsection eql [Type Specifier]
- @subsubheading Compound Type Specifier Kind::
- Combining.
- @subsubheading Compound Type Specifier Syntax::
- (@code{eql}@{@i{object}@})
- @subsubheading Compound Type Specifier Arguments::
- @i{object}---an @i{object}.
- @subsubheading Compound Type Specifier Description::
- Represents the @i{type} whose only @i{element} is @i{object}.
- The argument @i{object} is required. The @i{object} can be @b{*},
- but if so it denotes itself (the symbol @b{*})
- and does not represent an unspecified value.
- The @i{symbol} @b{eql} is not valid as an @i{atomic type specifier}.
- @node coerce, deftype, eql (Type Specifier), Types and Classes Dictionary
- @subsection coerce [Function]
- @code{coerce} @i{object result-type} @result{} @i{result}
- @subsubheading Arguments and Values::
- @i{object}---an @i{object}.
- @i{result-type}---a @i{type specifier}.
- @i{result}---an @i{object}, of @i{type} @i{result-type}
- except in situations described in @ref{Rule of Canonical Representation for Complex Rationals}.
- @subsubheading Description::
- @i{Coerces} the @i{object} to @i{type} @i{result-type}.
- If @i{object} is already of @i{type} @i{result-type},
- the @i{object} itself is returned, regardless of whether it
- would have been possible in general to coerce an @i{object} of
- some other @i{type} to @i{result-type}.
- Otherwise, the @i{object} is @i{coerced} to @i{type} @i{result-type}
- according to the following rules:
- @table @asis
- @item @b{sequence}
- If the @i{result-type} is a @i{recognizable subtype} of @b{list},
- and the @i{object} is a @i{sequence},
- then the @i{result} is a @i{list}
- that has the @i{same} @i{elements} as @i{object}.
- If the @i{result-type} is a @i{recognizable subtype} of @b{vector},
- and the @i{object} is a @i{sequence},
- then the @i{result} is a @i{vector}
- that has the @i{same} @i{elements} as @i{object}.
- If @i{result-type} is a specialized @i{type},
- the @i{result} has an @i{actual array element type} that is the result of
- @i{upgrading} the element type part of that @i{specialized} @i{type}.
- If no element type is specified, the element type defaults to @b{t}.
- If the @i{implementation} cannot determine the element type, an error is signaled.
- @item @b{character}
- If the @i{result-type} is @b{character}
- and the @i{object} is a @i{character designator},
- the @i{result} is the @i{character} it denotes.
- @item @b{complex}
- If the @i{result-type} is @b{complex}
- and the @i{object} is a @i{number},
- then the @i{result} is obtained by constructing a @i{complex}
- whose real part is the @i{object} and
- whose imaginary part is the result of @i{coercing} an @i{integer} zero
- to the @i{type} of the @i{object} (using @b{coerce}).
- (If the real part is a @i{rational}, however,
- then the result must be represented as a @i{rational} rather
- than a @i{complex}; see @ref{Rule of Canonical Representation for Complex Rationals}.
- So, for example, @t{(coerce 3 'complex)} is permissible,
- but will return @t{3}, which is not a @i{complex}.)
- @item @b{float}
- If the @i{result-type} is any of @b{float},
- @b{short-float},
- @b{single-float},
- @b{double-float},
- @b{long-float},
- and the @i{object} is a
- @i{real},
- then the @i{result} is a @i{float} of @i{type} @i{result-type}
- which is equal in sign and magnitude to the @i{object} to whatever degree of
- representational precision is permitted by that @i{float} representation.
- (If the @i{result-type} is @b{float}
- and @i{object} is not already a @i{float},
- then the @i{result} is a @i{single float}.)
- @item @b{function}
- If the @i{result-type} is @b{function},
- and @i{object} is any
- @i{function name}
- that is @i{fbound}
- but that is globally defined neither as a @i{macro name} nor as a @i{special operator},
- then the @i{result} is the @i{functional value} of @i{object}.
- If the @i{result-type} is @b{function},
- and @i{object} is a @i{lambda expression},
- then the @i{result} is a @i{closure} of @i{object}
- in the @i{null lexical environment}.
- @item @b{t}
- Any @i{object} can be @i{coerced} to an @i{object} of @i{type} @b{t}.
- In this case, the @i{object} is simply returned.
- @end table
- @subsubheading Examples::
- @example
- (coerce '(a b c) 'vector) @result{} #(A B C)
- (coerce 'a 'character) @result{} #\A
- (coerce 4.56 'complex) @result{} #C(4.56 0.0)
- (coerce 4.5s0 'complex) @result{} #C(4.5s0 0.0s0)
- (coerce 7/2 'complex) @result{} 7/2
- (coerce 0 'short-float) @result{} 0.0s0
- (coerce 3.5L0 'float) @result{} 3.5L0
- (coerce 7/2 'float) @result{} 3.5
- (coerce (cons 1 2) t) @result{} (1 . 2)
- @end example
- All the following @i{forms} should signal an error:
- @example
- (coerce '(a b c) '(vector * 4))
- (coerce #(a b c) '(vector * 4))
- (coerce '(a b c) '(vector * 2))
- (coerce #(a b c) '(vector * 2))
- (coerce "foo" '(string 2))
- (coerce #(#\a #\b #\c) '(string 2))
- (coerce '(0 1) '(simple-bit-vector 3))
- @end example
- @subsubheading Exceptional Situations::
- If a coercion is not possible, an error of @i{type} @b{type-error} is signaled.
- @t{(coerce x 'nil)} always signals an error of @i{type} @b{type-error}.
- An error
- of @i{type} @b{error} is signaled
- if the @i{result-type} is @b{function} but
- @i{object} is a @i{symbol} that is not @i{fbound} or
- if the @i{symbol} names a @i{macro} or a @i{special operator}.
- An error of @i{type} @b{type-error} should be signaled if @i{result-type}
- specifies the number of elements and @i{object} is of a different length.
- @subsubheading See Also::
- @ref{rational}
- ,
- @ref{floor; ffloor; ceiling; fceiling; truncate; ftruncate; round; fround}
- ,
- @ref{char-code}
- ,
- @ref{char-int}
- @subsubheading Notes::
- Coercions from @i{floats} to @i{rationals}
- and from @i{ratios} to @i{integers}
- are not provided because of rounding problems.
- @example
- (coerce x 't) @equiv{} (identity x) @equiv{} x
- @end example
- @node deftype, subtypep, coerce, Types and Classes Dictionary
- @subsection deftype [Macro]
- @code{deftype} @i{name lambda-list {[[@{@i{declaration}@}{*} | @i{documentation}]]} @{@i{form}@}{*}} @result{} @i{name}
- @subsubheading Arguments and Values::
- @i{name}---a @i{symbol}.
- @i{lambda-list}---a @i{deftype lambda list}.
- @i{declaration}---a @b{declare} @i{expression}; not evaluated.
- @i{documentation}---a @i{string}; not evaluated.
- @i{form}---a @i{form}.
- @subsubheading Description::
- @b{deftype} defines a @i{derived type specifier} named @i{name}.
- The meaning of the new @i{type specifier} is given in terms of
- a function which expands the @i{type specifier} into another
- @i{type specifier}, which itself will be expanded if it contains
- references to another @i{derived type specifier}.
- The newly defined @i{type specifier} may be referenced as a list of
- the form @t{(@i{name} @i{arg_1} @i{arg_2} ...)\/}.
- The number of arguments must be appropriate to the @i{lambda-list}.
- If the new @i{type specifier} takes no arguments,
- or if all of its arguments are optional,
- the @i{type specifier} may be used as an @i{atomic type specifier}.
- The @i{argument} @i{expressions} to the @i{type specifier},
- @i{arg_1} ... @i{arg_n}, are not @i{evaluated}.
- Instead, these @i{literal objects} become the @i{objects} to which
- corresponding @i{parameters} become @i{bound}.
- The body of the @b{deftype} @i{form}
- (but not the @i{lambda-list})
- is
- implicitly enclosed in a @i{block} named @i{name},
- and is evaluated as an @i{implicit progn},
- returning a new @i{type specifier}.
- The @i{lexical environment} of the body is the one which was current
- at the time the @b{deftype} form was evaluated, augmented by the
- @i{variables} in the @i{lambda-list}.
- Recursive expansion of the @i{type specifier} returned as the expansion
- must terminate, including the expansion of @i{type specifiers} which
- are nested within the expansion.
- The consequences are undefined if the result of fully expanding a
- @i{type specifier} contains any circular structure, except within
- the @i{objects} referred to by @b{member} and @b{eql}
- @i{type specifiers}.
- @i{Documentation} is attached to @i{name} as a @i{documentation string}
- of kind @b{type}.
- If a @b{deftype} @i{form} appears as a @i{top level form},
- the @i{compiler} must ensure that the @i{name} is recognized
- in subsequent @i{type} declarations.
- The @i{programmer} must ensure that the body of a @b{deftype} form
- can be @i{evaluated} at compile time if the @i{name} is
- referenced in subsequent @i{type} declarations.
- If the expansion of a @i{type specifier} is not defined fully at compile time
- (perhaps because it expands into an unknown @i{type specifier} or a
- @b{satisfies} of a named @i{function} that isn't defined in the
- compile-time environment), an @i{implementation} may ignore any references to
- this @i{type} in declarations and/or signal a warning.
- @subsubheading Examples::
- @example
- (defun equidimensional (a)
- (or (< (array-rank a) 2)
- (apply #'= (array-dimensions a)))) @result{} EQUIDIMENSIONAL
- (deftype square-matrix (&optional type size)
- `(and (array ,type (,size ,size))
- (satisfies equidimensional))) @result{} SQUARE-MATRIX
- @end example
- @subsubheading See Also::
- @b{declare},
- @ref{defmacro}
- ,
- @ref{documentation; (setf documentation)}
- ,
- @ref{Type Specifiers},
- @ref{Syntactic Interaction of Documentation Strings and Declarations}
- @node subtypep, type-of, deftype, Types and Classes Dictionary
- @subsection subtypep [Function]
- @code{subtypep} @i{type-1 type-2 {&optional} environment} @result{} @i{subtype-p, valid-p}
- @subsubheading Arguments and Values::
- @i{type-1}---a @i{type specifier}.
- @i{type-2}---a @i{type specifier}.
- @i{environment}---an @i{environment} @i{object}.
- The default is @b{nil}, denoting the @i{null lexical environment}
- and the current @i{global environment}.
- @i{subtype-p}---a @i{generalized boolean}.
- @i{valid-p}---a @i{generalized boolean}.
- @subsubheading Description::
- If @i{type-1} is a @i{recognizable subtype} of @i{type-2},
- the first @i{value} is @i{true}.
- Otherwise, the first @i{value} is @i{false},
- indicating that either
- @i{type-1} is not a @i{subtype} of @i{type-2}, or else
- @i{type-1} is a @i{subtype} of @i{type-2}
- but is not a @i{recognizable subtype}.
- A second @i{value} is also returned indicating the `certainty' of
- the first @i{value}. If this value is @i{true}, then the first
- value is an accurate indication of the @i{subtype} relationship.
- (The second @i{value} is always @i{true} when the first @i{value}
- is @i{true}.)
- Figure 4--9 summarizes the possible combinations of @i{values}
- that might result.
- @group
- @noindent
- @w{ Value 1 Value 2 Meaning }
- @w{ @i{true} @i{true} @i{type-1} is definitely a @i{subtype} of @i{type-2}. }
- @w{ @i{false} @i{true} @i{type-1} is definitely not a @i{subtype} of @i{type-2}. }
- @w{ @i{false} @i{false} @b{subtypep} could not determine the relationship, }
- @w{ so @i{type-1} might or might not be a @i{subtype} of @i{type-2}. }
- @noindent
- @w{ Figure 4--9: Result possibilities for subtypep }
- @end group
- @b{subtypep} is permitted to return the
- @i{values} @i{false} and @i{false} only when at least
- one argument involves one of these @i{type specifiers}:
- @b{and},
- @b{eql},
- the list form of @b{function},
- @b{member},
- @b{not},
- @b{or},
- @b{satisfies},
- or
- @b{values}.
- (A @i{type specifier} `involves' such a @i{symbol} if,
- after being @i{type expanded},
- it contains that @i{symbol} in a position that would call for
- its meaning as a @i{type specifier} to be used.)
- One consequence of this is that if neither @i{type-1} nor @i{type-2}
- involves any of these @i{type specifiers}, then @b{subtypep} is obliged
- to determine the relationship accurately. In particular, @b{subtypep}
- returns the @i{values} @i{true} and @i{true}
- if the arguments are @b{equal} and do not involve
- any of these @i{type specifiers}.
- @b{subtypep} never returns a second value of @b{nil} when both
- @i{type-1} and @i{type-2} involve only
- the names in @i{Figure~4--2}, or
- names of @i{types} defined by @b{defstruct},
- @b{define-condition},
- or @b{defclass}, or
- @i{derived types} that expand into only those names.
- While @i{type specifiers} listed in @i{Figure~4--2} and
- names of @b{defclass} and @b{defstruct} can in some cases be
- implemented as @i{derived types}, @b{subtypep} regards them as primitive.
- The relationships between @i{types} reflected by @b{subtypep}
- are those specific to the particular implementation. For example, if
- an implementation supports only a single type of floating-point numbers,
- in that implementation @t{(subtypep 'float 'long-float)}
- returns the @i{values} @i{true} and @i{true}
- (since the two @i{types} are identical).
- For all @i{T1} and @i{T2} other than @t{*},
- @t{(array @i{T1})} and @t{(array @i{T2})}
- are two different @i{type specifiers} that always refer to the same sets of
- things if and only if they refer to @i{arrays}
- of exactly the same specialized representation, @i{i.e.}, if @t{(upgraded-array-element-type '@i{T1})} and
- @t{(upgraded-array-element-type '@i{T2})}
- return two different @i{type specifiers} that always refer to the same sets of
- @i{objects}.
- This is another way of saying that
- @t{`(array @i{type-specifier})}
- and
- @t{`(array ,(upgraded-array-element-type '@i{type-specifier}))}
- refer to the same
- set of specialized @i{array} representations.
- For all @i{T1} and @i{T2} other than @t{*},
- the intersection of
- @t{(array @i{T1})}
- and @t{(array @i{T2})} is the empty set
- if and only if they refer to @i{arrays} of different,
- distinct specialized representations.
- Therefore,
- @example
- (subtypep '(array T1) '(array T2)) @result{} @i{true}
- @end example
- if and only if
- @example
- (upgraded-array-element-type 'T1) and
- (upgraded-array-element-type 'T2)
- @end example
- return two different @i{type specifiers} that always refer to the same sets of
- @i{objects}.
- For all type-specifiers @i{T1} and @i{T2} other than @t{*},
- @example
- (subtypep '(complex T1) '(complex T2)) @result{} @i{true}, @i{true}
- @end example
- if:
- @table @asis
- @item 1.
- @t{T1} is a @i{subtype} of @t{T2}, or
- @item 2.
- @t{(upgraded-complex-part-type '@i{T1})} and
- @t{(upgraded-complex-part-type '@i{T2})}
- return two different @i{type specifiers} that always refer to the
- same sets of @i{objects}; in this case,
- @t{(complex @i{T1})} and
- @t{(complex @i{T2})} both refer to the
- same specialized representation.
- @end table
- The @i{values} are @i{false} and @i{true} otherwise.
- The form
- @example
- (subtypep '(complex single-float) '(complex float))
- @end example
- must return @i{true} in all implementations, but
- @example
- (subtypep '(array single-float) '(array float))
- @end example
- returns @i{true} only in implementations that do not have a specialized @i{array}
- representation for @i{single floats} distinct from that for other @i{floats}.
- @subsubheading Examples::
- @example
- (subtypep 'compiled-function 'function) @result{} @i{true}, @i{true}
- (subtypep 'null 'list) @result{} @i{true}, @i{true}
- (subtypep 'null 'symbol) @result{} @i{true}, @i{true}
- (subtypep 'integer 'string) @result{} @i{false}, @i{true}
- (subtypep '(satisfies dummy) nil) @result{} @i{false}, @i{implementation-dependent}
- (subtypep '(integer 1 3) '(integer 1 4)) @result{} @i{true}, @i{true}
- (subtypep '(integer (0) (0)) 'nil) @result{} @i{true}, @i{true}
- (subtypep 'nil '(integer (0) (0))) @result{} @i{true}, @i{true}
- (subtypep '(integer (0) (0)) '(member)) @result{} @i{true}, @i{true} ;or @i{false}, @i{false}
- (subtypep '(member) 'nil) @result{} @i{true}, @i{true} ;or @i{false}, @i{false}
- (subtypep 'nil '(member)) @result{} @i{true}, @i{true} ;or @i{false}, @i{false}
- @end example
- Let @t{<aet-x>} and @t{<aet-y>} be two distinct @i{type specifiers} that
- do not always refer to the same sets of
- @i{objects}
- in a given implementation, but for which
- @b{make-array}, will return an
- @i{object} of the same @i{array} @i{type}.
- Thus, in each case,
- @example
- (subtypep (array-element-type (make-array 0 :element-type '<aet-x>))
- (array-element-type (make-array 0 :element-type '<aet-y>)))
- @result{} @i{true}, @i{true}
- (subtypep (array-element-type (make-array 0 :element-type '<aet-y>))
- (array-element-type (make-array 0 :element-type '<aet-x>)))
- @result{} @i{true}, @i{true}
- @end example
- If @t{(array <aet-x>)}
- and @t{(array <aet-y>)} are different names for
- exactly the same set of @i{objects},
- these names should always refer to the same sets of
- @i{objects}.
- That implies that the following set of tests are also true:
- @example
- (subtypep '(array <aet-x>) '(array <aet-y>)) @result{} @i{true}, @i{true}
- (subtypep '(array <aet-y>) '(array <aet-x>)) @result{} @i{true}, @i{true}
- @end example
- @subsubheading See Also::
- @ref{Types}
- @subsubheading Notes::
- The small differences between the @b{subtypep} specification for
- the @b{array} and @b{complex} types are necessary because there
- is no creation function for @i{complexes} which allows
- the specification of the resultant part type independently of
- the actual types of the parts. Thus in the case of the @i{type} @b{complex},
- the actual type of the parts is referred to, although a @i{number}
- can be a member of more than one @i{type}.
- For example, @t{17} is of @i{type} @t{(mod 18)}
- as well as @i{type} @t{(mod 256)} and @i{type} @b{integer};
- and @t{2.3f5} is of @i{type} @b{single-float}
- as well as @i{type} @b{float}.
- @node type-of, typep, subtypep, Types and Classes Dictionary
- @subsection type-of [Function]
- @code{type-of} @i{object} @result{} @i{typespec}
- @subsubheading Arguments and Values::
- @i{object}---an @i{object}.
- @i{typespec}---a @i{type specifier}.
- @subsubheading Description::
- Returns a @i{type specifier}, @i{typespec}, for a @i{type}
- that has the @i{object} as an @i{element}.
- The @i{typespec} satisfies the following:
- @table @asis
- @item 1.
- For any @i{object} that is an @i{element} of some @i{built-in type}:
- @table @asis
- @item a.
- the @i{type} returned is a @i{recognizable subtype} of that @i{built-in type}.
- @item b.
- the @i{type} returned does not involve
- @t{and},
- @t{eql},
- @t{member},
- @t{not},
- @t{or},
- @t{satisfies},
- or @t{values}.
- @end table
- @item 2.
- For all @i{objects}, @t{(typep @i{object} (type-of @i{object}))}
- returns @i{true}.
- Implicit in this is that @i{type specifiers} which are
- not valid for use with @b{typep}, such as the @i{list} form of the
- @b{function} @i{type specifier}, are never returned by @b{type-of}.
- @item 3.
- The @i{type} returned by @b{type-of} is always a @i{recognizable subtype}
- of the @i{class} returned by @b{class-of}. That is,
- @example
- (subtypep (type-of @i{object}) (class-of @i{object})) @result{} @i{true}, @i{true}
- @end example
- @item 4.
- For @i{objects} of metaclass @b{structure-class} or @b{standard-class},
- and for @i{conditions},
- @b{type-of} returns the @i{proper name} of the @i{class} returned
- by @b{class-of} if it has a @i{proper name},
- and otherwise returns the @i{class} itself.
- In particular, for @i{objects} created by the constructor function
- of a structure defined with @b{defstruct} without a @t{:type} option,
- @b{type-of} returns the structure name; and for @i{objects} created
- by @b{make-condition}, the @i{typespec} is the @i{name} of the
- @i{condition} @i{type}.
- @item 5.
- For each of the @i{types}
- @b{short-float},
- @b{single-float},
- @b{double-float},
- or @b{long-float}
- of which the @i{object} is an @i{element},
- the @i{typespec} is a @i{recognizable subtype} of that @i{type}.
- @end table
- @subsubheading Examples::
- @example
- @end example
- @example
- (type-of 'a) @result{} SYMBOL
- (type-of '(1 . 2))
- @result{} CONS
- @i{OR}@result{} (CONS FIXNUM FIXNUM)
- (type-of #c(0 1))
- @result{} COMPLEX
- @i{OR}@result{} (COMPLEX INTEGER)
- (defstruct temp-struct x y z) @result{} TEMP-STRUCT
- (type-of (make-temp-struct)) @result{} TEMP-STRUCT
- (type-of "abc")
- @result{} STRING
- @i{OR}@result{} (STRING 3)
- (subtypep (type-of "abc") 'string) @result{} @i{true}, @i{true}
- (type-of (expt 2 40))
- @result{} BIGNUM
- @i{OR}@result{} INTEGER
- @i{OR}@result{} (INTEGER 1099511627776 1099511627776)
- @i{OR}@result{} SYSTEM::TWO-WORD-BIGNUM
- @i{OR}@result{} FIXNUM
- (subtypep (type-of 112312) 'integer) @result{} @i{true}, @i{true}
- (defvar *foo* (make-array 5 :element-type t)) @result{} *FOO*
- (class-name (class-of *foo*)) @result{} VECTOR
- (type-of *foo*)
- @result{} VECTOR
- @i{OR}@result{} (VECTOR T 5)
- @end example
- @subsubheading See Also::
- @ref{array-element-type}
- ,
- @ref{class-of}
- ,
- @ref{defstruct}
- ,
- @ref{typecase; ctypecase; etypecase}
- ,
- @ref{typep}
- ,
- @ref{Types}
- @subsubheading Notes::
- Implementors are encouraged to arrange for @b{type-of} to return
- a portable value.
- @node typep, type-error, type-of, Types and Classes Dictionary
- @subsection typep [Function]
- @code{typep} @i{object type-specifier {&optional} environment} @result{} @i{generalized-boolean}
- @subsubheading Arguments and Values::
- @i{object}---an @i{object}.
- @i{type-specifier}---any @i{type specifier} except
- @b{values}, or a @i{type specifier} list
- whose first element is either @b{function} or @b{values}.
- @i{environment}---an @i{environment} @i{object}.
- The default is @b{nil}, denoting the @i{null lexical environment}
- and the and current @i{global environment}.
- @i{generalized-boolean}---a @i{generalized boolean}.
- @subsubheading Description::
- Returns @i{true} if @i{object} is of the @i{type} specified by @i{type-specifier};
- otherwise, returns @i{false}.
- A @i{type-specifier} of the form @t{(satisfies fn)}
- is handled by applying the function @t{fn} to @i{object}.
- @t{(typep @i{object} '(array @i{type-specifier}))},
- where @i{type-specifier} is not @t{*},
- returns @i{true} if and only if @i{object} is an @i{array}
- that could be the result
- of supplying @i{type-specifier}
- as the @t{:element-type} argument to @b{make-array}.
- @t{(array *)} refers to all @i{arrays}
- regardless of element type, while @t{(array @i{type-specifier})}
- refers only to those @i{arrays}
- that can result from giving @i{type-specifier} as the
- @t{:element-type} argument to @b{make-array}.
- A similar interpretation applies to @t{(simple-array @i{type-specifier})}
- and @t{(vector @i{type-specifier})}.
- See @ref{Array Upgrading}.
- @t{(typep @i{object} '(complex @i{type-specifier}))}
- returns @i{true} for all @i{complex} numbers that can result from
- giving @i{numbers} of type @i{type-specifier}
- to the @i{function} @b{complex}, plus all other @i{complex} numbers
- of the same specialized representation.
- Both the real and the imaginary parts of any such
- @i{complex} number must satisfy:
- @example
- (typep realpart 'type-specifier)
- (typep imagpart 'type-specifier)
- @end example
- See the @i{function} @b{upgraded-complex-part-type}.
- @subsubheading Examples::
- @example
- (typep 12 'integer) @result{} @i{true}
- (typep (1+ most-positive-fixnum) 'fixnum) @result{} @i{false}
- (typep nil t) @result{} @i{true}
- (typep nil nil) @result{} @i{false}
- (typep 1 '(mod 2)) @result{} @i{true}
- (typep #c(1 1) '(complex (eql 1))) @result{} @i{true}
- ;; To understand this next example, you might need to refer to
- ;; @ref{Rule of Canonical Representation for Complex Rationals}.
- (typep #c(0 0) '(complex (eql 0))) @result{} @i{false}
- @end example
- Let @t{A{{}_x}} and @t{A{{}_y}} be two @i{type specifiers} that
- denote different @i{types}, but for which
- @example
- (upgraded-array-element-type 'A{{}_x})
- @end example
- and
- @example
- (upgraded-array-element-type 'A{{}_y})
- @end example
- denote the same @i{type}. Notice that
- @example
- (typep (make-array 0 :element-type 'A{{}_x}) '(array A{{}_x})) @result{} @i{true}
- (typep (make-array 0 :element-type 'A{{}_y}) '(array A{{}_y})) @result{} @i{true}
- (typep (make-array 0 :element-type 'A{{}_x}) '(array A{{}_y})) @result{} @i{true}
- (typep (make-array 0 :element-type 'A{{}_y}) '(array A{{}_x})) @result{} @i{true}
- @end example
- @subsubheading Exceptional Situations::
- An error of @i{type} @b{error} is signaled if @i{type-specifier} is @t{values},
- or a @i{type specifier} list whose first element is either
- @b{function} or @b{values}.
- The consequences are undefined if
- the @i{type-specifier} is not a @i{type specifier}.
- @subsubheading See Also::
- @ref{type-of}
- ,
- @ref{upgraded-array-element-type}
- ,
- @ref{upgraded-complex-part-type}
- ,
- @ref{Type Specifiers}
- @subsubheading Notes::
- @i{Implementations} are encouraged to recognize and optimize the case of
- @t{(typep @i{x} (the class @i{y}))},
- since it does not involve any need for expansion
- of @b{deftype} information at runtime.
- @example
- @end example
- @node type-error, type-error-datum, typep, Types and Classes Dictionary
- @subsection type-error [Condition Type]
- @subsubheading Class Precedence List::
- @b{type-error},
- @b{error},
- @b{serious-condition},
- @b{condition},
- @b{t}
- @subsubheading Description::
- The @i{type} @b{type-error} represents a situation in which an @i{object} is not
- of the expected type. The ``offending datum'' and ``expected type'' are initialized
- by the initialization arguments named @t{:datum} and @t{:expected-type} to @b{make-condition},
- and are @i{accessed} by the functions
- @b{type-error-datum} and @b{type-error-expected-type}.
- @subsubheading See Also::
- @ref{type-error-datum; type-error-expected-type}
- , @b{type-error-expected-type}
- @node type-error-datum, simple-type-error, type-error, Types and Classes Dictionary
- @subsection type-error-datum, type-error-expected-type [Function]
- @code{type-error-datum} @i{condition} @result{} @i{datum}
- @code{type-error-expected-type} @i{condition} @result{} @i{expected-type}
- @subsubheading Arguments and Values::
- @i{condition}---a @i{condition} of @i{type} @b{type-error}.
- @i{datum}---an @i{object}.
- @i{expected-type}---a @i{type specifier}.
- @subsubheading Description::
- @b{type-error-datum} returns the offending datum in the @i{situation}
- represented by the @i{condition}.
- @b{type-error-expected-type} returns the expected type of the
- offending datum in the @i{situation} represented by the @i{condition}.
- @subsubheading Examples::
- @example
- (defun fix-digits (condition)
- (check-type condition type-error)
- (let* ((digits '(zero one two three four
- five six seven eight nine))
- (val (position (type-error-datum condition) digits)))
- (if (and val (subtypep 'fixnum (type-error-expected-type condition)))
- (store-value 7))))
- (defun foo (x)
- (handler-bind ((type-error #'fix-digits))
- (check-type x number)
- (+ x 3)))
- (foo 'seven)
- @result{} 10
- @end example
- @subsubheading See Also::
- @b{type-error},
- @ref{Conditions}
- @node simple-type-error, , type-error-datum, Types and Classes Dictionary
- @subsection simple-type-error [Condition Type]
- @subsubheading Class Precedence List::
- @b{simple-type-error},
- @b{simple-condition},
- @b{type-error},
- @b{error},
- @b{serious-condition},
- @b{condition},
- @b{t}
- @subsubheading Description::
- @i{Conditions} of @i{type} @b{simple-type-error}
- are like @i{conditions} of @i{type} @b{type-error},
- except that they provide an alternate mechanism for specifying
- how the @i{condition} is to be @i{reported};
- see the @i{type} @b{simple-condition}.
- @subsubheading See Also::
- @b{simple-condition},
- @ref{simple-condition-format-control; simple-condition-format-arguments}
- ,
- @b{simple-condition-format-arguments},
- @ref{type-error-datum; type-error-expected-type}
- ,
- @b{type-error-expected-type}
- @c end of including dict-types
- @c %**end of chapter
|