12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274 |
- % -*- Mode: TeX -*-
- %%Evaluation
- \term{Execution} of \term{code} can be accomplished by a variety of means ranging
- from direct interpretation of a \term{form} representing a \term{program}
- to invocation of \term{compiled code} produced by a \term{compiler}.
-
- \newtermidx{Evaluation}{evaluation} is the process by which a \term{program} is \term{executed} in \clisp.
- The mechanism of \term{evaluation} is manifested
- both implicitly through the effect of the \term{Lisp read-eval-print loop},
- and explicitly through the presence of the \term{functions}
- \funref{eval},
- \funref{compile},
- \funref{compile-file},
- and \funref{load}.
- Any of these facilities might share the same execution strategy,
- or each might use a different one.
- The behavior of a \term{conforming program} processed by \funref{eval}
- and by \funref{compile-file} might differ; \seesection\SemanticConstraints.
- \term{Evaluation} can be understood in terms of a model in which an
- interpreter recursively traverses a \term{form} performing each
- step of the computation as it goes.
- This model, which describes the semantics of \clisp\ \term{programs},
- is described in \secref\EvaluationModel.
- \beginsubSection{Introduction to Environments}
- \DefineSection{IntroToEnvs}
- A \newterm{binding} is an association between a \term{name} and
- that which the name denotes. \term{Bindings} are \term{established}
- in a \term{lexical environment} or a \term{dynamic environment}
- by particular \term{special operators}.
- An \newterm{environment} is a set of \term{bindings} and other information
- used during evaluation (\eg to associate meanings with names).
- \term{Bindings} in an \term{environment} are partitioned into \newtermidx{namespaces}{namespace}.
- A single \term{name} can simultaneously have more than one
- associated \term{binding} per \term{environment},
- but can have only one associated \term{binding} per \term{namespace}.
- %!!!! Moon: There out to be a list of the namespaces!!
- % Do they even have agreed-upon names?
- \beginsubsubsection{The Global Environment}
- The \newterm{global environment} is that part of an \term{environment}
- that contains \term{bindings} with both \term{indefinite scope}
- and \term{indefinite extent}.
- The \term{global environment} contains, among other things, the following:
- \beginlist
- \item{\bull} \term{bindings} of \term{dynamic variables} and \term{constant variables}.
- \item{\bull} \term{bindings} of \term{functions}, \term{macros}, and \term{special operators}.
- \item{\bull}%
- \issue{DEFINE-COMPILER-MACRO:X3J13-NOV89}%
- \term{bindings} of \term{compiler macros}.
- \endissue{DEFINE-COMPILER-MACRO:X3J13-NOV89}%
- \item{\bull} \term{bindings} of \term{type} and \term{class} \term{names}
- \item{\bull} information about \term{proclamations}.
- \endlist
- \endsubsubsection%{The Global Environment}
- \beginsubsubsection{Dynamic Environments}
- A \newterm{dynamic environment} for \term{evaluation} is that part of an
- \term{environment} that contains \term{bindings} whose duration
- is bounded by points of \term{establishment} and \term{disestablishment}
- within the execution of the \term{form} that
- established the \term{binding}.
- A \term{dynamic environment} contains, among other things, the following:
- \beginlist
- \item{\bull} \term{bindings} for \term{dynamic variables}.
- \item{\bull} information about \term{active} \term{catch tags}.
- \item{\bull} information about \term{exit points} established by \specref{unwind-protect}.
- \item{\bull} information about \term{active} \term{handlers} and \term{restarts}.
- \endlist
- The \term{dynamic environment} that is active at any given point
- in the \term{execution} of a \term{program} is referred to by
- definite reference as ``the current \term{dynamic environment},''
- or sometimes as just ``the \term{dynamic environment}.''
- Within a given \term{namespace},
- a \term{name} is said to be \term{bound}
- in a \term{dynamic environment} if there is a \term{binding}
- %or mapping
- associated with its \term{name} in the \term{dynamic environment}
- or, if not, there is a \term{binding}
- %or mapping
- associated with its name in the \term{global environment}.
- \endsubsubsection%{Dynamic Environments}
- \beginsubsubsection{Lexical Environments}
- A \newterm{lexical environment} for \term{evaluation} at some position in a \term{program}
- is that part of the \term{environment} that contains information having
- \term{lexical scope} within the \term{forms} containing that position.
- A \term{lexical environment} contains, among other things, the following:
- \beginlist
- \item{\bull} \term{bindings} of \term{lexical variables} and \term{symbol macros}.
- \item{\bull} \term{bindings} of \term{functions} and \term{macros}.
- (Implicit in this is information about those \term{compiler macros}
- that are locally disabled.)
- %% Replaced by parenthetical remark on previous bullet. -kmp 5-Dec-91
- % \item{\bull} \term{bindings} of \term{compiler macros}
- % (specifically, information about those \term{compiler macros}
- % that are locally disabled)
- \item{\bull} \term{bindings} of \term{block tags}.
- \item{\bull} \term{bindings} of \term{go tags}.
- \item{\bull} information about \term{declarations}.
- \endlist
- The \term{lexical environment} that is active at any given position
- in a \term{program} being semantically processed is referred to by
- definite reference as ``the current \term{lexical environment},''
- or sometimes as just ``the \term{lexical environment}.''
- Within a given \term{namespace},
- a \term{name} is said to be \term{bound} in a \term{lexical environment}
- if there is a \term{binding}
- %or mapping
- associated with its \term{name}
- in the \term{lexical environment} or, if not, there is a \term{binding}
- %or mapping
- associated with its name in the \term{global environment}.
- \beginsubsubsubsection{The Null Lexical Environment}
- \DefineSection{NullLexicalEnv}
- The \newterm{null lexical environment} is equivalent to the \term{global environment}.
- Although in general the representation of an \term{environment} \term{object}
- is \term{implementation-dependent}, \nil\ can be used in any situation where an
- \term{environment} \term{object} is called for in order to denote
- the \term{null lexical environment}.
- \endsubsubsubsection%{The Null Lexical Environment}
- \endsubsubsection%{Lexical Environments}
- \beginsubsubsection{Environment Objects}
- \DefineSection{EnvObjs}
- Some \term{operators} make use of an \term{object},
- called an \newterm{environment object},
- that represents the set of \term{lexical bindings} needed to perform
- semantic analysis on a \term{form} in a given \term{lexical environment}.
- The set of \term{bindings} in an \term{environment object}
- may be a subset of the \term{bindings} that would be needed to actually
- perform an \term{evaluation}; for example, \term{values} associated with
- \term{variable} \term{names} and \term{function names} in the corresponding
- \term{lexical environment} might not be available in an \term{environment object}.
- The \term{type} and nature of an \term{environment object} is \term{implementation-dependent}.
- The \term{values} of \term{environment parameters} to \term{macro functions}
- are examples of \term{environment objects}.
- The \term{object} \nil\ when used as an \term{environment object}
- denotes the \term{null lexical environment};
- \seesection\NullLexicalEnv.
- \endsubsubsection%{Environment Objects}
- \endSubsection%{Introduction to Environments}
- \beginSubsection{The Evaluation Model}
- \DefineSection{EvaluationModel}
- A \clisp\ system evaluates \term{forms} with respect to lexical,
- dynamic, and global \term{environments}. The following sections
- describe the components of the \clisp\ evaluation model.
- \beginsubsubsection{Form Evaluation}
- %% 5.1.0 2
- %% 5.1.1 1
- \term{Forms} fall into three categories:
- %!!!Is this a correct use of self-evaluating? -kmp 09-Apr-91
- \term{symbols}, \term{conses}, and \term{self-evaluating objects}.
- The following sections explain these categories.
-
- \beginsubsubsubsection{Symbols as Forms}
- \DefineSection{SymbolsAsForms}
- If a \term{form} is a \term{symbol},
- then it is either a \term{symbol macro} or a \term{variable}.
- The \term{symbol} names a \term{symbol macro}
- if there is a \term{binding} of the \term{symbol} as a \term{symbol macro}
- in the current \term{lexical environment}
- \issue{ISO-COMPATIBILITY:ADD-SUBSTRATE}
- (see \macref{define-symbol-macro} and \specref{symbol-macrolet}).
- \endissue{ISO-COMPATIBILITY:ADD-SUBSTRATE}
- If the \term{symbol} is a \term{symbol macro},
- its expansion function is obtained.
- The expansion function is a function of two arguments, and is invoked
- by calling the \term{macroexpand hook} with
- the expansion function as its first argument,
- the \term{symbol} as its second argument,
- and an \term{environment object} (corresponding to the current \term{lexical environment})
- as its third argument.
- The \term{macroexpand hook}, in turn, calls the expansion function with the
- \term{form} as its first argument and the \term{environment} as its second argument.
- The \term{value} of the expansion function, which is passed through
- by the \term{macroexpand hook}, is a \term{form}.
- This resulting \term{form} is processed in place of the original \term{symbol}.
- If a \term{form} is a \term{symbol} that is not a \term{symbol macro},
- then it is the \term{name} of a \term{variable}, and the \term{value} of that
- \term{variable} is returned. There are three kinds of variables:
- \term{lexical variables},
- \term{dynamic variables},
- and
- \term{constant variables}.
- % global variables.
- A \term{variable} can store one \term{object}.
- The main operations on a \term{variable} are
- to \term{read}\meaning{1} and
- to \term{write}\meaning{1}
- its \term{value}.
- %% 7.1.1 1
- %% 7.2.0 2
- %% 7.2.0 3
- An error \oftype{unbound-variable} should be signaled if
- an \term{unbound variable} is referenced.
- \term{Non-constant variables} can be \term{assigned} by using \specref{setq}
- or \term{bound}\meaning{3} by using \specref{let}.
- \Thenextfigure\ lists some \term{defined names} that
- are applicable to assigning, binding, and defining \term{variables}.
- \displaythree{Some Defined Names Applicable to Variables}{
- boundp&let&progv\cr
- defconstant&let*&psetq\cr
- defparameter&makunbound&set\cr
- defvar&multiple-value-bind&setq\cr
- lambda&multiple-value-setq&symbol-value\cr
- }
- The following is a description of each kind of variable.
- \beginsubsubsubsubsection{Lexical Variables}
- %!!! Issue of (let ((x x)) (declare (special x)) ...). Is the outer X special? -kmp
- %% 5.1.2 2
- %% Rewritten by KAB and KMP.
- % A \term{variable} that occurs textually within a \term{form}
- % that creates a \term{lexical binding} for a \term{variable}
- % of the same name is a \term{lexical variable} unless the reference is locally
- % declared \declref{special} (see \misc{declare}) or the \term{binding}
- % is shadowed by a \term{form} that creates a \term{dynamic binding} of the same name.
- %% 5.1.2 3
- A \term{lexical variable} is a \term{variable} that can be referenced only within
- the \term{lexical scope} of the \term{form} that establishes that \term{variable};
- \term{lexical variables} have \term{lexical scope}.
- Each time a \term{form} creates a \term{lexical binding} of a \term{variable},
- a \term{fresh} \term{binding} is \term{established}.
- Within the \term{scope} of a \term{binding} for a \term{lexical variable} \term{name},
- uses of that \term{name} as a \term{variable} are considered to be references
- to that \term{binding} except where the \term{variable} is \term{shadowed}\meaning{2}
- by a \term{form} that \term{establishes} a \term{fresh} \term{binding} for that
- \term{variable} \term{name},
- or by a \term{form} that locally \term{declares} the \term{name} \declref{special}.
- A \term{lexical variable} always has a \term{value}.
- There is no \term{operator} that introduces a \term{binding} for a
- \term{lexical variable} without giving it an initial \term{value}, nor
- is there any \term{operator} that can make a \term{lexical variable} be \term{unbound}.
- \term{Bindings} of \term{lexical variables} are found in the \term{lexical environment}.
- \endsubsubsubsubsection%{Lexical Variables}
- \beginsubsubsubsubsection{Dynamic Variables}
- A \term{variable} is a \term{dynamic variable} if one of the following
- conditions hold:
- \beginlist
- \item{\bull} It is locally declared or globally proclaimed \declref{special}.
- \item{\bull} It occurs textually within a \term{form} that
- creates a \term{dynamic binding} for a \term{variable} of the \term{same} \term{name},
- and the \term{binding} is not \term{shadowed}\meaning{2} by a \term{form}
- that creates a \term{lexical binding} of the same \term{variable} \term{name}.
- %% Is this right? Is there an issue that applies to this? -kmp
- %% Removed for now because Barrett and Moon balked, too. -kmp 13-Oct-91
- % \item{\bull} It is not locally declared \declref{special},
- % and it does not occur textually within a \term{form} that creates
- % a lexical \term{binding} for a variable of the same name.
- \endlist
- %!!! Barrett wants to mention "dynamic scope" here someplace.
- A \term{dynamic variable} can be referenced at any time in any \term{program};
- there is no textual limitation on references to \term{dynamic variables}.
- At any given time, all \term{dynamic variables} with a given name refer to
- exactly one \term{binding}, either in the \term{dynamic environment}
- or in the \term{global environment}.
- %% 5.1.2 5
- The \term{value} part of the \term{binding} for a \term{dynamic variable} might
- be empty; in this case, the \term{dynamic variable} is said to have no \term{value},
- or to be \term{unbound}. A \term{dynamic variable} can be made \term{unbound}
- by using \funref{makunbound}.
-
- The effect of \term{binding} a \term{dynamic variable} is to create
- a new \term{binding} to which all references to that \term{dynamic variable}
- in any \term{program} refer for the duration of the \term{evaluation} of the \term{form}
- that creates the \term{dynamic binding}.
- % %!!! Need to merge this in with previous or delete it.
- % %% 5.1.2 4
- % A \term{dynamic variable} that is referenced outside the \term{dynamic extent} of
- % a \term{form} that \term{binds} the \term{symbol} that names the
- % variable is a global variable. A global variable is \term{unbound}
- % unless and until explicitly assigned a value, except for global
- % variables defined in this specification or by an implementation.
- A \term{dynamic variable} can be referenced outside the \term{dynamic extent} of
- a \term{form} that \term{binds} it. Such a \term{variable} is sometimes called
- a ``global variable'' but is still in all respects just a \term{dynamic variable}
- whose \term{binding} happens to exist in the \term{global environment} rather than in some
- \term{dynamic environment}.
- % slight rewording --sjl 3 Mar 92
- A \term{dynamic variable} is \term{unbound}
- unless and until explicitly assigned a value, except for
- those variables whose initial value is
- defined in this specification or by an \term{implementation}.
- %% Pretty much said above.
- % \term{Bindings} of \term{dynamic variables} are found in the \term{dynamic environment}
- % or the \term{global environment}.
- \endsubsubsubsubsection%{Dynamic Variables}
- \beginsubsubsubsubsection{Constant Variables}
- \DefineSection{ConstantVars}
- %% 1.2.5 6
- %% 5.1.2 6
- Certain variables, called \term{constant variables}, are reserved as ``named constants.''
- The consequences are undefined if an attempt is made to
- assign a value to,
- or create
- a \term{binding} for a \term{constant variable},
- except that a `compatible' redefinition of a \term{constant variable}
- using \macref{defconstant} is permitted; \seemac{defconstant}.
- \term{Keywords},
- \term{symbols} defined by \clisp\ or the \term{implementation}
- as constant (such as \nil, \t, and \conref{pi}),
- and \term{symbols} declared as constant using \macref{defconstant}
- are \term{constant variables}.
- \endsubsubsubsubsection%{Constant Variables}
- \beginsubsubsubsubsection{Symbols Naming Both Lexical and Dynamic Variables}
- %A \term{symbol} can name both a \term{lexical variable} and a \term{dynamic variable}.
- %%KAB: The above is a little confusing, as it could be read to mean they
- %% are somehow in different namespaces.
- %%KMP: Replaced by the following section:
- The same \term{symbol} can name both
- a \term{lexical variable}
- and a \term{dynamic variable},
- but never in the same \term{lexical environment}.
- In the following example, the \term{symbol} \f{x} is used,
- at different times,
- as the \term{name} of a \term{lexical variable}
- and as the \term{name} of a \term{dynamic variable}.
-
- \code
- (let ((x 1)) ;Binds a special variable X
- (declare (special x))
- (let ((x 2)) ;Binds a lexical variable X
- (+ x ;Reads a lexical variable X
- (locally (declare (special x))
- x)))) ;Reads a special variable X
- \EV 3
- \endcode
- \endsubsubsubsubsection%{Symbols Naming Both Lexical and Dynamic Variables}
- \endsubsubsubsection%{Symbols as Forms}
- \beginsubsubsubsection{Conses as Forms}
- A \term{cons} that is used as a \term{form} is called a \term{compound form}.
- If the \term{car} of that \term{compound form} is a \term{symbol},
- that \term{symbol} is the \term{name} of an \term{operator},
- and the \term{form} is either a \term{special form}, a \term{macro form},
- or a \term{function form}, depending on the \term{function} \term{binding}
- of the \term{operator} in the current \term{lexical environment}.
- If the \term{operator} is neither a \term{special operator}
- nor a \term{macro name}, it is assumed to be a \term{function name}
- (even if there is no definition for such a \term{function}).
- If the \term{car} of the \term{compound form} is not a \term{symbol},
- then that \term{car} must be a \term{lambda expression},
- in which case the \term{compound form} is a \term{lambda form}.
- How a \term{compound form} is processed depends on whether it is
- classified as a \term{special form}, a \term{macro form},
- a \term{function form}, or a \term{lambda form}.
- \beginsubsubsubsubsection{Special Forms}
- % special form changed to special operator in a few places --sjl 3 Mar 92
- A \term{special form} is a \term{form} with special syntax,
- special evaluation rules, or both, possibly manipulating the
- evaluation environment, control flow, or both.
- % When the operator names a \term{special form},
- % the operation is performed using special purpose code
- % in the current \term{lexical environment} and \term{dynamic environments}.
- %% Simplified for Sandra:
- A \term{special operator} has access to
- the current \term{lexical environment}
- and the current \term{dynamic environment}.
- Each \term{special operator} defines the manner in which its \term{subexpressions}
- are treated---which are \term{forms}, which are special syntax, \etc.
- Some \term{special operators} create new
- lexical or dynamic \term{environments} for use during the
- \term{evaluation} of \term{subforms}
- of the \term{special form}. For example, \specref{block} creates a
- new \term{lexical environment} that is the same as the one in force
- at the point of evaluation of the \specref{block} \term{form}
- with the addition of a \term{binding} of the \specref{block} name
- to an \term{exit point} from the \specref{block}.
- %Moon observes that this is no different than for any other form:
- %
- % Generally, \term{special forms} will return normally, \term{yielding}
- % one or more values, but some \term{special forms} may cause a non-local exit.
- The set of \term{special operator} \term{names} is fixed in \clisp;
- no way is provided for the user to define a \term{special operator}.
- \Thenextfigure\ lists all of the \clisp\ \term{symbols}
- that have definitions as \term{special operators}.
- \DefineFigure{CLSpecialOps}
- %% 5.1.3 2
- %% 7.0.0 5
- %% 7.7.0 1
- %% 7.8.3 3
- %% 7.8.3 5
- %% 7.8.5 3
- %% 7.10.0 1
- \issue{COMPILER-LET-CONFUSION:ELIMINATE}
- \issue{WITH-ADDED-METHODS:DELETE}
- \issue{LOAD-TIME-EVAL:R**2-NEW-SPECIAL-FORM}
- \issue{GENERIC-FLET-POORLY-DESIGNED:DELETE}
- \displaythree{Common Lisp Special Operators}{
- block&let*&return-from\cr
- catch&load-time-value&setq\cr
- eval-when&locally&symbol-macrolet\cr
- flet¯olet&tagbody\cr
- function&multiple-value-call&the\cr
- go&multiple-value-prog1&throw\cr
- if&progn&unwind-protect\cr
- labels&progv&\cr
- let"e&\cr
- }
- %Removed COMPILER-LET -kmp 3-Jan-91
- %Removed WITH-ADDED-METHODS -kmp 7-Jan-91
- %Removed DECLARE per Moon's comments. -kmp 10-Mar-91
- %Added LOAD-TIME-VALUE -kmp 26-May-91
- %Added LOCALLY per Barrett comments. -kmp 13-Oct-91
- \endissue{GENERIC-FLET-POORLY-DESIGNED:DELETE}
- \endissue{LOAD-TIME-EVAL:R**2-NEW-SPECIAL-FORM}
- \endissue{WITH-ADDED-METHODS:DELETE}
- \endissue{COMPILER-LET-CONFUSION:ELIMINATE}
- %% 5.1.3 9
- \endsubsubsubsubsection%{Special Forms}
- \beginsubsubsubsubsection{Macro Forms}
- If the \term{operator} names a \term{macro},
- its associated \term{macro function} is applied
- to the entire \term{form} and the result of that application is
- used in place of the original \term{form}.
- Specifically, a \term{symbol} names a \term{macro} in a given \term{lexical environment} if
- \funref{macro-function} is \term{true} of the
- \term{symbol} and that \term{environment}.
- The \term{function} returned by \funref{macro-function}
- is a \term{function} of two arguments, called the
- expansion function.
- The expansion function is invoked by calling the \term{macroexpand hook} with
- the expansion function as its first argument,
- the entire \term{macro form} as its second argument,
- % and the current \term{lexical environment}
- % %% KAB thinks this is a bogus distinction.
- % % (or with the current compilation \term{environment},
- % % if the \term{form} is being processed by \funref{compile-file})
- %% Trying again... -kmp&kab 8-Feb-92
- and an \term{environment object} (corresponding to the current \term{lexical environment})
- as its third argument.
- The \term{macroexpand hook}, in turn, calls the expansion function with the
- \term{form} as its first argument and the \term{environment} as its second argument.
- The \term{value} of the expansion function, which is passed through
- by the \term{macroexpand hook}, is a \term{form}.
- % (\funref{macroexpand}
- % and \funref{macroexpand-1} attach a second, \term{generalized boolean} return value
- % which is always \term{true} in this context, and hence always ignored.)
- The returned \term{form} is \term{evaluated} in place of the original \term{form}.
- \issue{SELF-MODIFYING-CODE:FORBID}
- The consequences are undefined if a \term{macro function} destructively modifies
- any part of its \term{form} argument.
- \endissue{SELF-MODIFYING-CODE:FORBID}
- %% 8.0.0 6
- A \term{macro name} is not a \term{function designator},
- and cannot be used as the \param{function} argument to \term{functions}
- such as \funref{apply}, \funref{funcall}, or \funref{map}.
- An \term{implementation} is free to implement a \clisp\ \term{special operator}
- as a \term{macro}. An \term{implementation} is free to implement any
- \term{macro} \term{operator} as a \term{special operator}, but only
- if an equivalent definition of the \term{macro} is also provided.
- % I don't think this adds anything to the above, and it's more confusing.
- % So I commented it out. --sjl 3 Mar 92
- % %% 7.1.1 23
- % A \clisp\ \term{symbol} may name both a \term{special operator}
- % and a \term{macro},
- % %I added this: -kmp -kmp 12-Mar-91
- % but in that case the definitions must be semantically equivalent.
- \Thenextfigure\ lists some \term{defined names} that are applicable
- to \term{macros}.
- \displaythree{Defined names applicable to macros}{
- *macroexpand-hook*¯o-function¯oexpand-1\cr
- defmacro¯oexpand¯olet\cr
- }
- %DEFINE-COMPILER-MACRO and COMPILER-MACRO-FUNCTION removed per Moon. -kmp 10-Mar-91
- \endsubsubsubsubsection%{Macro Forms}
- \beginsubsubsubsubsection{Function Forms}
- \DefineSection{FunctionForms}
- If the \term{operator} is a \term{symbol} naming a \term{function},
- the \term{form} represents a \term{function form},
- and the \term{cdr} of the list contains the \term{forms}
- which when evaluated will supply the arguments passed to the \term{function}.
- When a \term{function name} is not defined,
- an error \oftype{undefined-function} should be signaled at run time;
- \seesection\SemanticConstraints.
- A \term{function form} is evaluated as follows:
- The \term{subforms} in the \term{cdr} of the original \term{form}
- are evaluated in left-to-right order in the current lexical and
- dynamic \term{environments}. The \term{primary value} of each
- such \term{evaluation} becomes an \term{argument} to the named \term{function};
- % removed inappropriate reference to Lambda List section. --sjl 3 Mar 92
- any additional \term{values} returned by the \term{subforms} are discarded.
- The \term{functional value} of the \term{operator}
- is retrieved from the \term{lexical environment},
- and that \term{function} is invoked with the indicated arguments.
- %%How the function treats its arguments, what bindings it establishes, etc.
- %% does not belong here. -kmp,moon
- % and a new \term{lexical environment} is created that contains only
- % the \term{bindings} established by \term{binding} each parameter
- % name in the lambda list of the \term{function} with the
- % corresponding value in the evaluated arguments along with a binding of
- % the name of the \term{function} with the \term{exit point} that
- % returns from the \term{function}. This is the lexical
- % \term{environment} used for evaluating the body of the \term{function}.
- \issue{FUNCTION-CALL-EVALUATION-ORDER:MORE-UNSPECIFIED}
- Although the order of \term{evaluation} of
- the \term{argument} \term{subforms} themselves is
- strictly left-to-right, it is not specified whether
- the definition of the \term{operator} in a \term{function form} is looked up
- before the \term{evaluation} of the \term{argument} \term{subforms},
- after the \term{evaluation} of the \term{argument} \term{subforms},
- or between the \term{evaluation} of any two \term{argument} \term{subforms}
- if there is more than one such \term{argument} \term{subform}.
- For example, the following might return 23 or~24.
- \code
- (defun foo (x) (+ x 3))
- (defun bar () (setf (symbol-function 'foo) #'(lambda (x) (+ x 4))))
- (foo (progn (bar) 20))
- \endcode
- \endissue{FUNCTION-CALL-EVALUATION-ORDER:MORE-UNSPECIFIED}
- A \term{binding} for a \term{function name} can be \term{established} in
- one of several ways. A \term{binding} for a \term{function name} in
- the \term{global environment} can be \term{established} by
- \macref{defun},
- \SETFof{fdefinition},
- % added symbol-function --sjl 3 Mar 92
- \SETFof{symbol-function},
- %% KAB: Doesn't belong here.
- %\macref{defmacro},
- %\SETFof{macro-function},
- \funref{ensure-generic-function},
- \macref{defmethod} (implicitly, due to \funref{ensure-generic-function}),
- or
- \macref{defgeneric}.
- A \term{binding} for a \term{function name} in the \term{lexical environment}
- can be \term{established} by
- \specref{flet}
- or \specref{labels}.
- \issue{WITH-ADDED-METHODS:DELETE}
- %\specref{with-added-methods},
- \endissue{WITH-ADDED-METHODS:DELETE}%
- \issue{GENERIC-FLET-POORLY-DESIGNED:DELETE}
- % \specref{generic-flet},
- % or
- % \specref{generic-labels}.
- \endissue{GENERIC-FLET-POORLY-DESIGNED:DELETE}
- %%Moon thinks this is redundant, so asked that it be deleted. -kmp 11-Mar-91
- % If a \term{symbol} that names a \term{function} appears
- % as the first element of a function call \term{form}, then it refers
- % to the definition established by the innermost
- % \specref{flet},
- % \specref{labels},
- % \issue{WITH-ADDED-METHODS:DELETE}
- % %\specref{with-added-methods},
- % \endissue{WITH-ADDED-METHODS:DELETE}%
- % \specref{generic-flet},
- % or
- % \specref{generic-labels}
- % that textually contains the reference, or to the global definition (if any) if there
- % is no such containing \term{form}. As noted earlier, this use
- % of \term{symbols} to name \term{functions} is
- % independent of their use in naming dynamic and lexical variables.
- \Thenextfigure\ lists some \term{defined names} that are applicable to \term{functions}.
- \issue{GENERIC-FLET-POORLY-DESIGNED:DELETE}
- \issue{WITH-ADDED-METHODS:DELETE}
- \displaythree{Some function-related defined names}{
- apply&fdefinition&mapcan\cr
- call-arguments-limit&flet&mapcar\cr
- complement&fmakunbound&mapcon\cr
- constantly&funcall&mapl\cr
- defgeneric&function&maplist\cr
- defmethod&functionp&multiple-value-call\cr
- defun&labels&reduce\cr
- fboundp&map&symbol-function\cr
- }
- %Removed GENERIC-FLET, GENERIC-LABELS. -kmp 7-Feb-92
- %Removed WITH-ADDED-METHODS -kmp 7-Jan-91
- %Added MAPC, MAPCAR, MAPCAN, MAPLIST, MAPL, MAPCON,
- % CONSTANTLY, COMPLEMENT, REDUCE, FDEFINITION.
- %Removed LAMBDA-LIST-KEYWORDS.
- %Not including all the things with :TEST, :TEST-NOT, :KEY arguments, though.
- % -kmp 16-Oct-91
- \endissue{WITH-ADDED-METHODS:DELETE}
- \endissue{GENERIC-FLET-POORLY-DESIGNED:DELETE}
- \endsubsubsubsubsection%{Function Forms}
- \beginsubsubsubsubsection{Lambda Forms}
- \DefineSection{LambdaForms}
- A \term{lambda form} is similar to a \term{function form}, except that
- the \term{function name} is replaced by a \term{lambda expression}.
- A \term{lambda form} is equivalent to using \term{funcall} of a
- \term{lexical closure} of the \term{lambda expression} on the given \term{arguments}.
- (In practice, some compilers are more likely to produce inline code
- for a \term{lambda form} than for an arbitrary named function
- that has been declared \declref{inline}; however, such a difference
- is not semantic.)
- For further information, \seesection\LambdaExpressions.
- \endsubsubsubsubsection%{Lambda Forms}
- \endsubsubsubsection%{Conses as forms}
- \beginsubsubsubsection{Self-Evaluating Objects}
- \issue{EVAL-OTHER:SELF-EVALUATE}
- A \term{form} that is neither a \term{symbol} nor a \term{cons} is
- defined to be a \term{self-evaluating object}. \term{Evaluating}
- such an \term{object} \term{yields} the \term{same} \term{object}
- as a result.
- \endissue{EVAL-OTHER:SELF-EVALUATE}
- Certain specific \term{symbols} and \term{conses} might also happen
- to be ``self-evaluating'' but only as a special case of a more
- general set of rules for the \term{evaluation} of \term{symbols} and
- \term{conses}; such \term{objects} are not considered to be
- \term{self-evaluating objects}.
- % added --sjl 3 Mar 92
- The consequences are undefined if \term{literal objects} (including
- \term{self-evaluating objects}) are destructively modified.
- \beginsubsubsubsubsection{Examples of Self-Evaluating Objects}
- \term{Numbers}, \term{pathnames}, and \term{arrays} are examples of
- \term{self-evaluating objects}.
- \code
- 3 \EV 3
- #c(2/3 5/8) \EV #C(2/3 5/8)
- #p"S:[BILL]OTHELLO.TXT" \EV #P"S:[BILL]OTHELLO.TXT"
- #(a b c) \EV #(A B C)
- "fred smith" \EV "fred smith"
- \endcode
- \endsubsubsubsubsection%{Examples of Self-Evaluating Objects}
- \endsubsubsubsection%{Self-Evaluating Objects}
- \endsubsubsection%{Form Evaluation}
- \endSubsection%{The Evaluation Model}
- \beginsubsection{Lambda Expressions}
- \DefineSection{LambdaExpressions}
- % I found the last paragraph of this section very confusing, so I
- % reworded the first paragraph to make it unnecessary. -- sjl 3 Mar 92
- % In a \term{lambda expression},
- % the current lexical \term{environment} is extended by adding the \term{binding} of
- % each \term{parameter} in the \term{lambda list} of the \term{lambda expression}
- % with the corresponding \term{value} from the \term{arguments}.
- % This is the \term{lexical environment} used for evaluating the body
- % of the \term{lambda expression}.
- In a \term{lambda expression},
- the body is evaluated in a lexical \term{environment} that is formed by
- adding the \term{binding} of
- each \term{parameter} in the \term{lambda list}
- with the corresponding \term{value} from the \term{arguments}
- to the current lexical \term{environment}.
- For further discussion of how \term{bindings} are \term{established}
- based on the \term{lambda list}, \seesection\LambdaLists.
- The body of a \term{lambda expression} is an \term{implicit progn};
- the \term{values} it returns are returned by the \term{lambda expression}.
- % When the \term{function} returns,
- % the \term{lexical environment} that was in effect
- % when the original \term{form} was evaluated
- % is re-established.
- \endsubsection%{Lambda Expressions}
- \beginSubsection{Closures and Lexical Binding}
-
- %% 7.1.1 5
- A \term{lexical closure} is a \term{function} that can refer to and alter
- the values of \term{lexical bindings} \term{established} by \term{binding} \term{forms}
- that textually include the function definition.
-
- Consider this code, where \f{x} is not declared \declref{special}:
-
- \code
- (defun two-funs (x)
- (list (function (lambda () x))
- (function (lambda (y) (setq x y)))))
- (setq funs (two-funs 6))
- (funcall (car funs)) \EV 6
- (funcall (cadr funs) 43) \EV 43
- (funcall (car funs)) \EV 43
- \endcode
- \Thespecform{function} coerces a
- \term{lambda expression} into a \term{closure} in which the
- \term{lexical environment} in effect when the \term{special form} is
- evaluated is captured along with the \term{lambda expression}.
- The function \f{two-funs} returns a \term{list} of two
- \term{functions}, each of which refers to the \term{binding} of the
- variable \f{x} created on entry to the function \f{two-funs} when it
- was called.
- %% For Moon.
- %with argument \f{6}.
- This variable has the value \f{6}
- initially, but \specref{setq} can alter this \term{binding}.
- % %Barrett finds the next sentence confusing.
- % %Moon, too.
- % The \term{lexical closure} created for the first
- % \term{lambda expression} does not capture the value \f{6} for \f{x}
- % when the \term{closure} is created. The second \term{function} can be
- % used to alter the variable binding (to \f{43}, in the example), and
- % this altered variable binding then becomes accessible to the first
- % \term{function}.
- The \term{lexical closure} created for the first
- \term{lambda expression} does not ``snapshot'' the \term{value} \f{6} for \f{x}
- when the \term{closure} is created; rather it captures the \term{binding} of \f{x}.
- The second \term{function} can be used to alter the \term{value} in the same (captured)
- \term{binding} (to \f{43}, in the example), and
- this altered variable binding then affects the value returned by the first \term{function}.
-
- %% 7.1.1 6
- In situations where a \term{closure} of a
- \term{lambda expression} over the same set of \term{bindings} may be
- produced more than once, the various resulting \term{closures} may
- or may not be \term{identical}, at the discretion of the \term{implementation}.
- That is, two \term{functions} that are behaviorally
- indistinguishable might or might not be \term{identical}.
- Two \term{functions} that are behaviorally distinguishable are \term{distinct}.
- For example:
-
- \code
- (let ((x 5) (funs '()))
- (dotimes (j 10)
- (push #'(lambda (z)
- (if (null z) (setq x 0) (+ x z)))
- funs))
- funs)
- \endcode
- The result of the above \term{form} is a \term{list} of ten \term{closures}.
- Each requires only the \term{binding} of \f{x}.
- It is the same \term{binding} in each case,
- but the ten \term{closure} \term{objects} might or might not be \term{identical}.
- On the other hand, the result of the \term{form}
-
- \code
- (let ((funs '()))
- (dotimes (j 10)
- (let ((x 5))
- (push (function (lambda (z)
- (if (null z) (setq x 0) (+ x z))))
- funs)))
- funs)
- \endcode
- is also a \term{list} of ten \term{closures}.
- However, in this case no two of the \term{closure} \term{objects} can
- be \term{identical} because each \term{closure} is closed over a distinct
- \term{binding} of \f{x}, and these \term{bindings} can be behaviorally
- distinguished because of the use of \specref{setq}.
-
- %% 7.1.1 7
- The result of the \term{form}
-
- \code
- (let ((funs '()))
- (dotimes (j 10)
- (let ((x 5))
- (push (function (lambda (z) (+ x z)))
- funs)))
- funs)
- \endcode
- is a \term{list} of ten \term{closure} \term{objects} that
- might or might not be \term{identical}.
- A different \term{binding} of \f{x} is involved for
- each \term{closure}, but the \term{bindings} cannot be distinguished
- because their values are the \term{same} and immutable (there being no occurrence
- of \specref{setq} on \f{x}). A compiler could internally
- transform the \term{form} to
-
- \code
- (let ((funs '()))
- (dotimes (j 10)
- (push (function (lambda (z) (+ 5 z)))
- funs))
- funs)
- \endcode
- where the \term{closures} may be \term{identical}.
- %% Moon thought this was redundant and distracting. -kmp 8-Feb-92
- % In some \term{implementations},
- % two distinct evaluations of the same \specref{function} \term{form} might
- % produce \term{identical} \term{closures} if they must be behaviorally
- % identical with respect to invocation.
-
- %% 7.1.1 9
- It is possible that a \term{closure} does not
- close over any variable bindings.
- In the code fragment
-
- \code
- (mapcar (function (lambda (x) (+ x 2))) y)
- \endcode
- the function \f{(lambda (x) (+ x 2))} contains no references to any outside
- object. In this case, the same \term{closure} might be returned
- for all evaluations of the \specref{function} \term{form}.
- \endSubsection%{Closures and Lexical Binding}
-
- \beginSubsection{Shadowing}
- \DefineSection{Shadowing}
- %% 5.1.3 10
- %% 3.0.0 13
- %
- % If two \term{forms} that establish lexical entities with the same
- % \term{name} are textually nested, then references within the inner
- % \term{form} refer to the entity established by the inner one; the
- % inner one shadows the outer one. Outside the inner \term{form} but
- % inside the outer one, references refer to the entity established by
- % the outer \term{form}. For example:
- %
- %% Rewritten for Sandra:
- If two \term{forms} that \term{establish} \term{lexical bindings} with
- the same \term{name} $N$ are textually nested, then references to $N$
- within the inner \term{form} refer to the \term{binding} established by
- the inner \term{form}; the inner \term{binding} for $N$
- \newtermidx{shadows}{shadow} the outer \term{binding} for $N$. Outside the inner
- \term{form} but inside the outer one, references to $N$ refer to the
- \term{binding} established by the outer \term{form}. For example:
- %!!! Barrett thinks this doesn't explain, and that we should discuss,
- % (let ((x ...)) (let ((x ...)) (declare (special x)) ...))
- \code
- (defun test (x z)
- (let ((z (* x 2)))
- (print z))
- z)
- \endcode
- The \term{binding} of the variable \f{z} by
- \specref{let} shadows
- the \term{parameter} binding for the function \f{test}. The reference to the
- variable \f{z} in the \funref{print} \term{form} refers to the \specref{let} binding.
- The reference to \f{z} at the end of the function \f{test}
- refers to the \term{parameter} named \f{z}.
- %!!! What to do with this use of "construct"? -kmp 3-Sep-91
- %% 3.0.0 26
- Constructs that are lexically scoped act as if new names were
- generated for each \term{object} on each execution. Therefore,
- dynamic shadowing cannot occur. For example:
- \code
- (defun contorted-example (f g x)
- (if (= x 0)
- (funcall f)
- (block here
- (+ 5 (contorted-example g
- #'(lambda () (return-from here 4))
- (- x 1))))))
- \endcode
- Consider the call \f{(contorted-example nil nil 2)}. This produces
- \f{4}. During the course of execution, there are three
- calls to \f{contorted-example}, interleaved with two
- blocks:
- \code
- (contorted-example nil nil 2)
- (block here\ssso ...)
- (contorted-example nil #'(lambda () (return-from here\ssso 4)) 1)
- (block here\ssst ...)
- (contorted-example #'(lambda () (return-from here\ssso 4))
- #'(lambda () (return-from here\ssst 4))
- 0)
- (funcall f)
- where f \EV #'(lambda () (return-from here\ssso 4))
- (return-from here\ssso 4)
- \endcode
- At the time the \f{funcall} is executed
- there are two \specref{block} \term{exit points} outstanding, each apparently
- named \f{here}.
- The \specref{return-from} \term{form} executed as a result of the \f{funcall}
- operation
- refers to the outer outstanding \term{exit point}
- (here\ssso), not the
- inner one (here\ssst).
- It
- refers to that \term{exit point} textually visible at the point of
- execution of \specref{function}
- (here abbreviated by the \f{\#'} syntax) that resulted
- in creation of the \term{function} \term{object} actually invoked by
- \funref{funcall}.
- %% 3.0.0 27
- If, in this example, one were to change the \f{(funcall f)} to
- \f{(funcall g)}, then the value of the call \f{(contorted-example nil nil 2)}
- would be \f{9}. The value would change because
- \funref{funcall} would cause the
- execution of \f{(return-from here\ssst\ 4)}, thereby causing
- a return from the inner \term{exit point} (here\ssst).
- When that occurs, the value \f{4} is returned from the
- middle invocation of \f{contorted-example}, \f{5} is added to that
- to get \f{9}, and that value is returned from the outer block
- and the outermost call to \f{contorted-example}. The point
- is that the choice of \term{exit point}
- returned from has nothing to do with its
- being innermost or outermost; rather,
- it depends on the lexical environment
- that is packaged up with a \term{lambda expression} when
- \specref{function} is executed.
-
- \endSubsection%{Shadowing}
- \beginSubsection{Extent}
- %% 3.0.0 28
- \f{Contorted-example} works only because the
- \term{function} named by \f{f} is invoked during the \term{extent} of the
- \term{exit point}.
- Once the flow of execution has left the block,
- the \term{exit point} is \term{disestablished}. For example:
- \code
- (defun invalid-example ()
- (let ((y (block here #'(lambda (z) (return-from here z)))))
- (if (numberp y) y (funcall y 5))))
- \endcode
- One might expect the call \f{(invalid-example)} to produce \f{5}
- by the following incorrect reasoning:
- \specref{let} binds \f{y} to the
- value of \specref{block}; this value is a \term{function} resulting
- from the \term{lambda expression}. Because \f{y} is not a number, it is
- invoked on the value \f{5}. The \specref{return-from} should then
- return this value from the
- \term{exit point} named \f{here}, thereby
- exiting from the block again and giving \f{y} the value \f{5}
- which, being a number, is then returned as the value of the call
- to \f{invalid-example}.
- %% 3.0.0 29
- The argument fails only because \term{exit points} have
- \term{dynamic extent}. The argument is correct up to the execution of
- \specref{return-from}. The execution of \specref{return-from}
- should signal an error \oftype{control-error}, however, not
- because it cannot refer to the \term{exit point}, but because it
- does correctly refer to an \term{exit point} and that
- \term{exit point} has been \term{disestablished}.
- %% 3.0.0 14
- %% 3.0.0 16
- A reference by name to a dynamic \term{exit point} binding such as
- a \term{catch tag} refers to the most recently
- \term{established} \term{binding} of that name that has not been
- \term{disestablished}. For example:
- \code
- (defun fun1 (x)
- (catch 'trap (+ 3 (fun2 x))))
- (defun fun2 (y)
- (catch 'trap (* 5 (fun3 y))))
- (defun fun3 (z)
- (throw 'trap z))
- \endcode
- Consider the call \f{(fun1 7)}. The result is \f{10}. At the time
- the \specref{throw} is executed, there are two outstanding catchers with the
- name \f{trap}: one established within procedure \f{fun1}, and the other
- within procedure \f{fun2}. The latter is the more recent, and so the
- value \f{7} is returned from \specref{catch} in \f{fun2}.
- Viewed from within \f{fun3}, the \specref{catch}
- in \f{fun2} shadows the one in \f{fun1}.
- Had \f{fun2} been defined as
- \code
- (defun fun2 (y)
- (catch 'snare (* 5 (fun3 y))))
- \endcode
- then the two \term{exit points}
- would have different \term{names}, and therefore the one
- in \f{fun1} would not be shadowed. The result would then have been \f{7}.
- \endSubsection%{Extent}
- \beginSubsection{Return Values}
- Ordinarily the result of calling a \term{function} is a single \term{object}.
- Sometimes, however, it is convenient for a function to compute several
- \term{objects} and return them.
- % slight rewording -- sjl 3 Mar 92
- In order to receive other than exactly one value from a \term{form},
- one of several \term{special forms} or \term{macros} must be used to request those
- values. If a \term{form} produces \term{multiple values} which were not
- requested in this way, then the first value is given to the caller and
- all others are discarded; if the \term{form} produces zero values,
- then the caller receives \nil\ as a value.
- \Thenextfigure\ lists
- some \term{operators} for receiving \term{multiple values}\meaning{2}.
- These \term{operators} can be used to specify
- one or more \term{forms} to \term{evaluate}
- and where to put the \term{values} returned by those \term{forms}.
- \displaythree{Some operators applicable to receiving multiple values}{
- multiple-value-bind&multiple-value-prog1&return-from\cr
- multiple-value-call&multiple-value-setq&throw\cr
- multiple-value-list&return&\cr
- }
- \Thefunction{values} can produce \term{multiple values}\meaning{2}.
- \f{(values)} returns zero values;
- \f{(values \param{form})} returns the \term{primary value} returned by \param{form};
- \f{(values \param{form1} \param{form2})} returns two values,
- the \term{primary value} of \param{form1}
- and the \term{primary value} of \param{form2};
- and so on.
- See \conref{multiple-values-limit} and \funref{values-list}.
- %% This little piece of language analysis isn't useful to the spec.
- %% -kmp&kab 13-Oct-91
- %
- % \term{Multiple values} can result from a \term{form} under precisely these
- % circumstances:
- % \beginlist
- % \itemitem{\b{Evaluation and Application}}
- %
- % \beginlist
- % \itemitem{\funref{eval}}
- %
- % \funref{eval} returns \term{multiple values} if the form given it to
- % evaluate produces \term{multiple values}.
- %
- % \itemitem{\funref{apply}, \funref{funcall}, \specref{multiple-value-call}}
- %
- % \funref{apply}, \funref{funcall}, and \specref{multiple-value-call}
- % can return \term{multiple values} from the function applied or called.
- % \endlist
- %
- % \itemitem{\b{Sequential Forms}}
- %
- % \beginlist
- % \itemitem{\specref{progn}}
- %
- % The special form \specref{progn} can return \term{multiple values} resulting
- % from evaluation of the last \term{subform}.
- %
- % \itemitem{\term{implicit progn}}
- %
- % Other situations are referred to as an \term{implicit progn}, in
- % which several forms are evaluated and the results of all but the last
- % form are discarded. An \term{implicit progn} returns multiple
- % values if the last form does. These situations include the body of a
- % \term{lambda expression}, including those constructed implicitly by
- % \macref{defmethod}, \macref{defun}, \macref{defmacro},
- % \issue{DEFINE-COMPILER-MACRO:X3J13-NOV89}
- % \macref{define-compiler-macro},
- % \endissue{DEFINE-COMPILER-MACRO:X3J13-NOV89}
- % \specref{flet},
- % \specref{macrolet}, \specref{generic-flet}, \specref{labels},
- % \specref{generic-labels}, \macref{deftype}. Also included are
- % bodies of the \specref{eval-when}, \specref{progv},
- % \specref{let}, \specref{let*}, \macref{when},
- % \macref{unless}, \specref{block},
- % \macref{multiple-value-bind}, and \specref{catch} \term{forms}, as well as
- % clauses in such conditional \term{forms} as \macref{case},
- % \macref{typecase}, \macref{ecase}, \macref{etypecase},
- % \macref{ccase}, and \macref{ctypecase}. If a body has no
- % \term{forms}, a single \nil\ is returned.
- % \endlist
- %
- % \itemitem{\b{Conditional Forms}}
- %
- % \beginlist
- % \itemitem{\specref{if}}
- %
- % \specref{if} can return \term{multiple values} from whichever \term{subform} is selected
- % (the \i{then} form or the \i{else} form).
- %
- % \itemitem{\macref{and}, \macref{or}}
- %
- % \macref{and} and \macref{or} can return \term{multiple values} from the last \term{subform}
- % but not from \term{subforms} other than the last.
- %
- % \itemitem{\macref{cond}}
- %
- % \macref{cond} can return \term{multiple values} from the last \term{subform} of
- % the \term{implicit progn} of the selected clause.
- % If, however, the clause selected is a singleton clause,
- % then only a single value (the \term{true} value returned by the predicate)
- % is returned. This is true even if the singleton clause is
- % the last clause of the \macref{cond}. A final clause
- % {\tt (\i{form})} is not equivalent to {\tt (t \i{form})}
- % because the latter returns \term{multiple values} from \i{form}
- % while the former does not; a final clause of {\tt (\i{form})}
- % is instead equivalent to {\tt (t (values \i{forms}))}.
- % \endlist
- %
- % \itemitem{\b{Returning from a Block}}
- %
- % \beginlist
- % \itemitem{\specref{block}}
- %
- % The \specref{block} special form can return \term{multiple values}
- % from its last \term{subform} when it exits normally.
- % If \specref{return-from} (or \macref{return}) is used to terminate
- % the \term{block} prematurely, then \specref{return-from} can
- % return \term{multiple values}
- % %from its \term{subform}
- % as the \term{values} of the terminated \term{block}.
- % Other \term{operators} that implicitly create \term{blocks},
- % such as \macref{do}, \macref{dolist}, \macref{dotimes},
- % \macref{prog}, and \macref{prog*},
- % also can return \term{multiple values} specified by
- % \specref{return-from} (or \macref{return}).
- %
- % \itemitem{\macref{do}}
- %
- % \macref{do} can return \term{multiple values} from the last form of the
- % exit clause, exactly as if the exit clause were a \macref{cond}
- % clause. Similarly, \macref{dolist} and \macref{dotimes} can
- % return \term{multiple values} from the \param{result-form} if that is
- % executed. \macref{loop} can return \term{multiple values} by using
- % \macref{return} and \specref{return-from}. These situations are
- % all examples of implicit uses of \specref{return-from}.
- %
- % \endlist
- %
- % \itemitem{\b{Throwing out of a Catch}}
- %
- % \beginlist
- %
- % \itemitem{\specref{catch}}
- %
- % The \specref{catch} \term{form} returns \term{multiple values} if
- % the result form in a \specref{throw} exiting from
- % such a catch produces \term{multiple values}.
- % \endlist
- %
- % \itemitem{\b{Miscellaneous Situations}}
- %
- % \beginlist
- %
- % \itemitem{\macref{multiple-value-prog1}}
- %
- % \specref{multiple-value-prog1} can return \term{multiple values} from its first
- % \term{subform}. \macref{prog1} always returns a single value.
- %
- % \itemitem{\specref{unwind-protect}}
- %
- % \specref{unwind-protect} returns \term{multiple values} if the form it protects
- % returns \term{multiple values}.
- %
- % \itemitem{\specref{the}}
- %
- % \specref{the} returns \term{multiple values} if the form it contains returns
- % \term{multiple values}.
- % \endlist
- % \endlist
- %
- % Among special forms that never return \term{multiple values} are
- % \specref{setq}, \macref{multiple-value-setq}, \macref{prog1}, and
- % \macref{prog2}.
- %
- % In an ordinary function call,
- % each argument form produces exactly one argument; if such a form
- % returns zero values, \nil\ is used for the argument, and if more than one
- % value, all but the first are discarded.
- % Similarly, conditional \term{forms} (such as \specref{if} \term{forms})
- % that test the value of a form
- % will use exactly one value, the first one, from that form and discard the rest;
- % such \term{forms} will use \nil\ as the test value if zero values are returned.
- %
- \endSubsection%{Return Values}
|