

@node Environment, Glossary (Glossary), System Construction, Top
@chapter Environment

@menu
* The External Environment::	
* Environment Dictionary::	
@end menu

@node The External Environment, Environment Dictionary, Environment, Environment
@section The External Environment

@c including concept-environment

@menu
* Top level loop::		
* Debugging Utilities::		
* Environment Inquiry::		
* Time::			
@end menu

@node Top level loop, Debugging Utilities, The External Environment, The External Environment
@subsection Top level loop

The top level loop is the @r{Common Lisp} mechanism by which the user normally
interacts with the @r{Common Lisp} system. This loop is sometimes referred to 
as the @i{Lisp read-eval-print loop}
because it typically consists of an endless loop that reads an expression,
evaluates it and prints the results.

The top level loop is not completely specified; thus the user
interface is @i{implementation-defined}.
The top level loop 
prints all values resulting from the evaluation of a 
@i{form}.
Figure 25--1 lists variables that are maintained by the @i{Lisp read-eval-print loop}.

@group
@noindent
@w{  *    +    /    -  }
@w{  **   ++   //      }
@w{  ***  +++  ///     }

@noindent
@w{  Figure 25--1: Variables maintained by the Read-Eval-Print Loop}

@end group

@node Debugging Utilities, Environment Inquiry, Top level loop, The External Environment
@subsection Debugging Utilities

Figure 25--2 shows @i{defined names} relating to
debugging.

@group
@noindent
@w{  *debugger-hook*  documentation    step     }
@w{  apropos          dribble          time     }
@w{  apropos-list     ed               trace    }
@w{  break            inspect          untrace  }
@w{  describe         invoke-debugger           }

@noindent
@w{  Figure 25--2: Defined names relating to debugging}

@end group

@node Environment Inquiry, Time, Debugging Utilities, The External Environment
@subsection Environment Inquiry

Environment inquiry @i{defined names} provide information about
the hardware and software configuration on which a @r{Common Lisp} program is
being executed.

Figure 25--3 shows @i{defined names} relating to environment inquiry.

@group
@noindent
@w{  *features*                   machine-instance  short-site-name   }
@w{  lisp-implementation-type     machine-type      software-type     }
@w{  lisp-implementation-version  machine-version   software-version  }
@w{  long-site-name               room                                }

@noindent
@w{    Figure 25--3: Defined names relating to environment inquiry.   }

@end group

@node Time,  , Environment Inquiry, The External Environment
@subsection Time

Time is represented in four different ways in @r{Common Lisp}:
    @i{decoded time},
    @i{universal time},
    @i{internal time},
and seconds.
@i{Decoded time} and @i{universal time} are used primarily to represent calendar time,
and are precise only to one second.
@i{Internal time} is used primarily to represent measurements of computer
time (such as run time) and is precise to some @i{implementation-dependent}
fraction of a second called an @i{internal time unit},
as specified by @b{internal-time-units-per-second}.
An @i{internal time} can be used 
  for either @i{absolute} and @i{relative} @i{time} measurements.
Both a @i{universal time} and a @i{decoded time} can be used 
  only for @i{absolute} @i{time} measurements.
In the case of one function, @b{sleep},
time intervals are represented as a non-negative @i{real} number of seconds.

Figure 25--4 shows @i{defined names} relating to @i{time}.

@group
@noindent
@w{  decode-universal-time   get-internal-run-time           }
@w{  encode-universal-time   get-universal-time              }
@w{  get-decoded-time        internal-time-units-per-second  }
@w{  get-internal-real-time  sleep                           }

@noindent
@w{        Figure 25--4: Defined names involving Time.       }

@end group

@menu
* Decoded Time::		
* Universal Time::		
* Internal Time::		
* Seconds::			
@end menu

@node Decoded Time, Universal Time, Time, Time
@subsubsection Decoded Time

A @i{decoded time}
@IGindex{decoded time}
 is an ordered series of nine values that, taken together,
represent a point in calendar time (ignoring @i{leap seconds}):

@table @asis

@item @b{Second}  
An @i{integer} between 0 and~59, inclusive.

@item @b{Minute}  
An @i{integer} between 0 and~59, inclusive.

@item @b{Hour}  
An @i{integer} between 0 and~23, inclusive.

@item @b{Date}  
An @i{integer} between 1 and~31, inclusive (the upper limit actually
depends on the month and year, of course).

@item @b{Month}  
An @i{integer} between 1 and 12, inclusive;
1~means January, 2~means February, and so on; 12~means December.

@item @b{Year}  
An @i{integer} indicating the year A.D.  However, if this 
@i{integer}
is between 0 and 99, the ``obvious'' year is used; more precisely,
that year is assumed that is equal to the 
@i{integer} modulo 100 and
within fifty years of the current year (inclusive backwards
and exclusive forwards).  
Thus, in the year 1978, year 28 is 1928
but year 27 is 2027.  (Functions that return time in this format always return
a full year number.) 

@item @b{Day of week}  
An @i{integer} between~0 and~6, inclusive;
0~means Monday, 1~means Tuesday, and so on; 6~means Sunday.

@item @b{Daylight saving time flag}  
A @i{generalized boolean} that,
if @i{true}, indicates that daylight saving time is in effect.

@item @b{Time zone}  
A @i{time zone}.

@end table

Figure 25--5 shows @i{defined names} relating to @i{decoded time}.

@group
@noindent
@w{  decode-universal-time  get-decoded-time  }

@noindent
@w{  Figure 25--5: Defined names involving time in Decoded Time.}

@end group

@node Universal Time, Internal Time, Decoded Time, Time
@subsubsection Universal Time

@i{Universal time}
@IGindex{universal time}
 is an @i{absolute} @i{time} represented as a
single non-negative @i{integer}---the number of seconds since
midnight, January 1, 1900 GMT (ignoring @i{leap seconds}).
Thus the time 1 is 00:00:01 (that is, 12:00:01 a.m.) on January 1, 1900 GMT.
Similarly, the time 2398291201 corresponds to time 00:00:01 on January 1,
1976 GMT.
Recall that the year 1900 was not a leap year; for the purposes of
@r{Common Lisp}, a year is a leap year if and only if its number is divisible by 4,
except that years divisible by 100 are not leap years, except that years
divisible by 400 are leap years.  Therefore the year 2000 will
be a leap year.
Because @i{universal time} must be a non-negative @i{integer},
times before the base time of midnight, January 1, 1900 GMT cannot be processed by @r{Common Lisp}.

@group
@noindent
@w{  decode-universal-time  get-universal-time  }
@w{  encode-universal-time                      }

@noindent
@w{  Figure 25--6: Defined names involving time in Universal Time.}

@end group

@node Internal Time, Seconds, Universal Time, Time
@subsubsection Internal Time

@i{Internal time}
@IGindex{internal time}
 represents time as a single @i{integer},
in terms of an @i{implementation-dependent} unit called an @i{internal time unit}.
Relative time is measured as a number of these units.
Absolute time is relative to an arbitrary time base.

Figure 25--7 shows @i{defined names} related to @i{internal time}.

@group
@noindent
@w{  get-internal-real-time  internal-time-units-per-second  }
@w{  get-internal-run-time                                   }

@noindent
@w{  Figure 25--7: Defined names involving time in Internal Time.}

@end group

@node Seconds,  , Internal Time, Time
@subsubsection Seconds

One function, @b{sleep}, takes its argument as a non-negative @i{real} number
of seconds.  Informally, it may be useful to think of this as 
a @i{relative} @i{universal time}, but it differs in one important way:
@i{universal times} are always non-negative @i{integers}, whereas the argument to
@b{sleep} can be any kind of non-negative @i{real}, in order to allow for
the possibility of fractional seconds.

@group
@noindent
@w{  sleep    }

@noindent
@w{  Figure 25--8: Defined names involving time in Seconds.}

@end group

@c end of including concept-environment

@node Environment Dictionary,  , The External Environment, Environment
@section Environment Dictionary

@c including dict-environment

@menu
* decode-universal-time::	
* encode-universal-time::	
* get-universal-time::		
* sleep::			
* apropos::			
* describe::			
* describe-object::		
* trace::			
* step::			
* time::			
* internal-time-units-per-second::  
* get-internal-real-time::	
* get-internal-run-time::	
* disassemble::			
* documentation::		
* room::			
* ed::				
* inspect::			
* dribble::			
* -::				
* +::				
* *::				
* /::				
* lisp-implementation-type::	
* short-site-name::		
* machine-instance::		
* machine-type::		
* machine-version::		
* software-type::		
* user-homedir-pathname::	
@end menu

@node decode-universal-time, encode-universal-time, Environment Dictionary, Environment Dictionary
@subsection decode-universal-time                                            [Function]

@code{decode-universal-time}  @i{universal-time {&optional} time-zone}@*
   @result{}  @i{second, minute, hour, date, month, year, day, daylight-p, zone}

@subsubheading  Arguments and Values::

@i{universal-time}---a @i{universal time}.

@i{time-zone}---a @i{time zone}.

@i{second}, @i{minute}, @i{hour}, @i{date}, @i{month},
@i{year}, @i{day}, @i{daylight-p}, @i{zone}---a @i{decoded time}.

@subsubheading  Description::

Returns the @i{decoded time} represented by the given @i{universal time}.

If @i{time-zone} is not supplied,
it defaults to the current time zone adjusted for daylight saving time.  

If @i{time-zone} is supplied, daylight saving time information is ignored.
The daylight saving time flag is @b{nil} if @i{time-zone} is supplied.

@subsubheading  Examples::

@example
 (decode-universal-time 0 0) @result{}  0, 0, 0, 1, 1, 1900, 0, @i{false}, 0

;; The next two examples assume Eastern Daylight Time.
 (decode-universal-time 2414296800 5) @result{}  0, 0, 1, 4, 7, 1976, 6, @i{false}, 5
 (decode-universal-time 2414293200) @result{}  0, 0, 1, 4, 7, 1976, 6, @i{true}, 5

;; This example assumes that the time zone is Eastern Daylight Time
;; (and that the time zone is constant throughout the example).
 (let* ((here (nth 8 (multiple-value-list (get-decoded-time)))) ;Time zone
        (recently (get-universal-time))
        (a (nthcdr 7 (multiple-value-list (decode-universal-time recently))))
        (b (nthcdr 7 (multiple-value-list (decode-universal-time recently here)))))
   (list a b (equal a b))) @result{}  ((T 5) (NIL 5) NIL)
@end example

@subsubheading  Affected By::

@i{Implementation-dependent} mechanisms for calculating when or if daylight
savings time is in effect for any given session.

@subsubheading  See Also::

@ref{encode-universal-time}
, 
@ref{get-universal-time; get-decoded-time}
, 
@ref{Time}

@node encode-universal-time, get-universal-time, decode-universal-time, Environment Dictionary
@subsection encode-universal-time                                            [function]

@subsubheading  Syntax::

@code{encode-universal-time}  @i{second minute hour date month year
                               {&optional} time-zone}@*
   @result{}  @i{universal-time}

@subsubheading  Arguments and Values::

@i{second}, @i{minute}, @i{hour}, 
@i{date}, @i{month}, @i{year}, 
@i{time-zone}---the corresponding parts of a @i{decoded time}.
 (Note that some of the nine values in a full @i{decoded time} are redundant,
  and so are not used as inputs to this function.)

@i{universal-time}---a @i{universal time}.

@subsubheading  Description::

@b{encode-universal-time} converts a time from Decoded Time format
to a @i{universal time}.

If @i{time-zone} is supplied, no adjustment for daylight savings time is performed.

@subsubheading  Examples::

@example
 (encode-universal-time 0 0 0 1 1 1900 0) @result{}  0
 (encode-universal-time 0 0 1 4 7 1976 5) @result{}  2414296800
;; The next example assumes Eastern Daylight Time.
 (encode-universal-time 0 0 1 4 7 1976) @result{}  2414293200
@end example

@subsubheading  See Also::

@ref{decode-universal-time}
, @b{get-decoded-time}

@node get-universal-time, sleep, encode-universal-time, Environment Dictionary
@subsection get-universal-time, get-decoded-time                             [Function]

@code{get-universal-time}  @i{<@i{no @i{arguments}}>} @result{}  @i{universal-time}

@code{get-decoded-time}  @i{<@i{no @i{arguments}}>}@*
   @result{}  @i{second, minute, hour, date, month, year, day, daylight-p, zone}

@subsubheading  Arguments and Values::

@i{universal-time}---a @i{universal time}.

@i{second}, @i{minute}, @i{hour},
@i{date}, @i{month}, @i{year},
@i{day}, @i{daylight-p}, @i{zone}---a @i{decoded time}.

@subsubheading  Description::

@b{get-universal-time} returns the current time, represented as a @i{universal time}.

@b{get-decoded-time} returns the current time, represented as a @i{decoded time}.

@subsubheading  Examples::

@example
;; At noon on July 4, 1976 in Eastern Daylight Time.
 (get-decoded-time) @result{}  0, 0, 12, 4, 7, 1976, 6, @i{true}, 5
;; At exactly the same instant.
 (get-universal-time) @result{}  2414332800
;; Exactly five minutes later.
 (get-universal-time) @result{}  2414333100
;; The difference is 300 seconds (five minutes)
 (- * **) @result{}  300
@end example

@subsubheading  Affected By::

The time of day (@i{i.e.}, the passage of time),
the system clock's ability to keep accurate time,
and the accuracy of the system clock's initial setting.

@subsubheading  Exceptional Situations::

An error of @i{type} @b{error} might be signaled if the current time cannot be determined.

@subsubheading  See Also::

@ref{decode-universal-time}
,
@ref{encode-universal-time}
,
@ref{Time}

@subsubheading  Notes::

@example
 (get-decoded-time) @equiv{} (decode-universal-time (get-universal-time))
@end example

No @i{implementation} is required to have a way to verify that the
time returned is correct.  However, if an @i{implementation} provides
a validity check (@i{e.g.}, the failure to have properly initialized the system
clock can be reliably detected) and that validity check fails, 
the @i{implementation} is strongly encouraged (but not required)
to signal an error of @i{type} @b{error} (rather than, for example, returning a
known-to-be-wrong value) that is @i{correctable} by allowing the user
to interactively set the correct time.

@node sleep, apropos, get-universal-time, Environment Dictionary
@subsection sleep                                                            [Function]

@code{sleep}  @i{seconds} @result{}  @i{@b{nil}}

@subsubheading  Arguments and Values::

@i{seconds}---a non-negative @i{real}.

@subsubheading  Description::

Causes execution to cease and become dormant for approximately the
seconds of real time indicated by @i{seconds}, 
whereupon execution is resumed.

@subsubheading  Examples::

@example
 (sleep 1) @result{}  NIL 

;; Actually, since SLEEP is permitted to use approximate timing, 
;; this might not always yield true, but it will often enough that
;; we felt it to be a productive example of the intent.
 (let ((then (get-universal-time))
       (now  (progn (sleep 10) (get-universal-time))))
   (>= (- now then) 10))
@result{}  @i{true}
@end example

@subsubheading  Side Effects::

Causes processing to pause.

@subsubheading  Affected By::

The granularity of the scheduler.

@subsubheading  Exceptional Situations::

Should signal an error of @i{type} @b{type-error}
			      if @i{seconds} is not a non-negative @i{real}.

@node apropos, describe, sleep, Environment Dictionary
@subsection apropos, apropos-list                                            [Function]

@code{apropos}  @i{string {&optional} package} @result{}  @i{<@i{no @i{values}}>}

@code{apropos-list}  @i{string {&optional} package} @result{}  @i{symbols}

@subsubheading  Arguments and Values::

@i{string}---a @i{string designator}.

@i{package}---a @i{package designator} or @b{nil}.
 The default is @b{nil}.

@i{symbols}---a @i{list} of @i{symbols}.

@subsubheading  Description::

These functions search for @i{interned} @i{symbols} 
whose @i{names} contain the substring @i{string}.

For @b{apropos}, as each such @i{symbol} is found,
its name is printed on @i{standard output}.
In addition,
if such a @i{symbol} is defined as a @i{function} or @i{dynamic variable},
information about those definitions might also be printed.

For @b{apropos-list},
no output occurs as the search proceeds;
instead a list of the matching @i{symbols} is returned when the search is complete.

If @i{package} is @i{non-nil},
only the @i{symbols} @i{accessible} in that @i{package} are searched;
otherwise all @i{symbols} @i{accessible} in any @i{package} are searched.

Because a @i{symbol} might be available 
by way of more than one inheritance path,
@b{apropos} might print information about the @i{same} @i{symbol} more than once,
or @b{apropos-list} might return a @i{list} containing duplicate @i{symbols}.

Whether or not the search is case-sensitive is @i{implementation-defined}.

@subsubheading  Affected By::

The set of @i{symbols} which are currently @i{interned}
in any @i{packages} being searched.

@b{apropos} is also affected by @b{*standard-output*}.

@node describe, describe-object, apropos, Environment Dictionary
@subsection describe                                                         [Function]

@code{describe}  @i{object {&optional} stream} @result{}  @i{<@i{no @i{values}}>}

@subsubheading  Arguments and Values::

@i{object}---an @i{object}.

@i{stream}---an @i{output} @i{stream designator}.
 The default is @i{standard output}.

@subsubheading  Description::

@b{describe} displays information about @i{object}

to @i{stream}.

For example, @b{describe} of a @i{symbol} might show the
@i{symbol}'s value, its definition, and each of its properties. 
@b{describe} of a @i{float} might show the number's
internal representation in a way that is useful for tracking
down round-off errors.  In all cases, however, the nature and format of the
output of @b{describe} is @i{implementation-dependent}.

@b{describe} can describe something that it finds inside the @i{object};
in such cases, a notational device such as increased indentation or positioning in a
table is typically used in order to visually distinguish such recursive descriptions 
from descriptions of the argument @i{object}.

The actual act of describing the object is implemented by @b{describe-object}.
@b{describe} exists as an interface primarily to manage argument defaulting (including
conversion of arguments @b{t} and @b{nil} into @i{stream} @i{objects}) and to inhibit
any return values from @b{describe-object}.

@b{describe} is not intended to be an interactive function.  In a 
@i{conforming implementation}, @b{describe} must not, by default, 
prompt for user input.  User-defined methods for @b{describe-object}
are likewise restricted.  

@subsubheading  Side Effects::

Output to @i{standard output} or @i{terminal I/O}.

@subsubheading  Affected By::

@b{*standard-output*} and @b{*terminal-io*},
methods on @b{describe-object} and @b{print-object}
for @i{objects} having user-defined @i{classes}.

@subsubheading  See Also::

@ref{inspect}
, 
@ref{describe-object}

@node describe-object, trace, describe, Environment Dictionary
@subsection describe-object                                 [Standard Generic Function]

@subsubheading  Syntax::

@code{describe-object}  @i{object stream} @result{}  @i{@i{implementation-dependent}}

@subsubheading  Method Signatures::

@code{describe-object}  @i{(@i{object} standard-object) @i{stream}}

@subsubheading  Arguments and Values::

@i{object}---an @i{object}.

@i{stream}---a @i{stream}.

@subsubheading  Description::

The generic function @b{describe-object} prints a description of
@i{object} to a @i{stream}.  @b{describe-object} is called 
by @b{describe}; it must not be called by the user.

Each implementation is required to provide a @i{method} on 
the @i{class} @b{standard-object} and @i{methods} on enough other
@i{classes} so as to ensure that there is always an applicable @i{method}.  
Implementations are free to add @i{methods} for other @i{classes}.
Users can write @i{methods} for @b{describe-object} for their
own @i{classes} if they do not wish to inherit an implementation-supplied
@i{method}.

@i{Methods} on @b{describe-object} can recursively call
@b{describe}.  Indentation, depth limits, and circularity detection
are all taken care of automatically, provided that each @i{method} 
handles exactly one level of structure and calls @b{describe} 
recursively if there are more structural levels.  The consequences are 
undefined if this rule is not obeyed.

In some implementations the @i{stream} argument passed to a
@b{describe-object} method is not the original @i{stream}, but is
an intermediate @i{stream} that implements parts of @b{describe}.
@i{Methods} should therefore not depend on the identity of this
@i{stream}.

@subsubheading  Examples::

@example
 (defclass spaceship ()
   ((captain :initarg :captain :accessor spaceship-captain)
    (serial# :initarg :serial-number :accessor spaceship-serial-number)))

 (defclass federation-starship (spaceship) ())

 (defmethod describe-object ((s spaceship) stream)
   (with-slots (captain serial#) s
     (format stream "~&~S is a spaceship of type ~S,~
                     ~
                       and with serial number ~D.~
             s (type-of s) captain serial#)))

 (make-instance 'federation-starship
                :captain "Rachel Garrett"
                :serial-number "NCC-1701-C")
@result{}  #<FEDERATION-STARSHIP 26312465>

 (describe *)
@t{ |> } #<FEDERATION-STARSHIP 26312465> is a spaceship of type FEDERATION-STARSHIP,
@t{ |> } with Rachel Garrett at the helm and with serial number NCC-1701-C.
@result{}  <@i{no @i{values}}>
@end example

@subsubheading  See Also::

@ref{describe}

@subsubheading  Notes::

The same implementation techniques that are applicable to @b{print-object} are
applicable to @b{describe-object}.

The reason for making the return values for @b{describe-object}
unspecified is to  avoid forcing users to include explicit @t{(values)}
in all of their @i{methods}.  @b{describe} takes care of that.

@node trace, step, describe-object, Environment Dictionary
@subsection trace, untrace                                                      [Macro]

@code{trace}  @i{@{@i{function-name}@}{*}} @result{}  @i{trace-result}

@code{untrace}  @i{@{@i{function-name}@}{*}} @result{}  @i{untrace-result}

@subsubheading  Arguments and Values::

@i{function-name}---a @i{function name}.

@i{trace-result}---@i{implementation-dependent},
  unless no @i{function-names} are supplied, 
  in which case @i{trace-result} is a @i{list} of @i{function names}.

@i{untrace-result}---@i{implementation-dependent}.

@subsubheading  Description::

@b{trace} and @b{untrace} control the invocation of the trace facility.  

Invoking @b{trace} with one or more @i{function-names} causes
the denoted @i{functions} to be ``traced.''
Whenever a traced @i{function} is invoked, information
     about the call,
     about the arguments passed,
 and about any eventually returned values
is printed to @i{trace output}.
If @b{trace} is used with no @i{function-names},
no tracing action is performed; 
instead, a list of the @i{functions} currently being traced is returned.

Invoking @b{untrace} with one or more function names causes those
functions to be ``untraced'' (@i{i.e.}, no longer traced).
If @b{untrace} is used with no @i{function-names},
all @i{functions} currently being traced are untraced.

If a @i{function} to be traced has been open-coded
(@i{e.g.}, because it was declared @b{inline}),
a call to that @i{function} might not produce trace output.

@subsubheading  Examples::

@example
 (defun fact (n) (if (zerop n) 1 (* n (fact (- n 1)))))
@result{}  FACT
 (trace fact)
@result{}  (FACT)
;; Of course, the format of traced output is implementation-dependent.
 (fact 3)
@t{ |> } 1 Enter FACT 3
@t{ |> } | 2 Enter FACT 2
@t{ |> } |   3 Enter FACT 1
@t{ |> } |   | 4 Enter FACT 0
@t{ |> } |   | 4 Exit FACT 1
@t{ |> } |   3 Exit FACT 1
@t{ |> } | 2 Exit FACT 2
@t{ |> } 1 Exit FACT 6
@result{}  6
@end example

@subsubheading  Side Effects::

Might change the definitions of the @i{functions} named by @i{function-names}.

@subsubheading  Affected By::

Whether the functions named are defined or already being traced.

@subsubheading  Exceptional Situations::

   Tracing an already traced function,
or untracing a function not currently being traced,
should produce no harmful effects, but might signal a warning.

@subsubheading  See Also::

@b{*trace-output*},
@ref{step}

@subsubheading  Notes::

@b{trace} and @b{untrace} may also accept additional
@i{implementation-dependent} argument formats.  The format of the trace
output is @i{implementation-dependent}.

Although @b{trace} can be extended to permit non-standard options,
@i{implementations} are nevertheless encouraged (but not required)
to warn about the use of syntax or options 
that are neither specified by this standard 
nor added as an extension by the @i{implementation},
since they could be symptomatic of typographical errors
or of reliance on features supported in @i{implementations} 
other than the current @i{implementation}.

@node step, time, trace, Environment Dictionary
@subsection step                                                                [Macro]

@code{step}  @i{form} @result{}  @i{@{@i{result}@}{*}}

@subsubheading  Arguments and Values:: 

@i{form}---a @i{form}; evaluated as described below.

@i{results}---the @i{values} returned by the @i{form}.

@subsubheading  Description::

@b{step} implements a debugging paradigm wherein the programmer
is allowed to @i{step} through the @i{evaluation} of a @i{form}.
The specific nature of the interaction,

including which I/O streams are used and
whether the stepping has lexical or dynamic scope,

is @i{implementation-defined}.

@b{step} evaluates @i{form} in the current @i{environment}.
A call to @b{step} can be compiled, but it is acceptable for an
implementation to interactively step through only those parts of the computation
that are interpreted.

It is technically permissible for a @i{conforming implementation} 
to take no action at all other than normal @i{execution} of the @i{form}.
In such a situation, 
@t{(step @i{form})}
is equivalent to, for example,
@t{(let () @i{form})}. 
In implementations where this is the case, the associated documentation
should mention that fact.

@subsubheading  See Also::

@ref{trace; untrace}

@subsubheading  Notes::

@i{Implementations} are encouraged to respond to the typing of @t{?} 
or the pressing of a ``help key'' by providing help including a list of
commands.

@node time, internal-time-units-per-second, step, Environment Dictionary
@subsection time                                                                [Macro]

@code{time}  @i{form} @result{}  @i{@{@i{result}@}{*}}

@subsubheading  Arguments and Values::

@i{form}---a @i{form}; evaluated as described below.

@i{results}---the @i{values} returned by the @i{form}.

@subsubheading  Description::

@b{time} evaluates @i{form} in the current @i{environment} (lexical and dynamic).
A call to @b{time} can be compiled.

@b{time} prints various timing data and other information to @i{trace output}.
The nature and format of the printed information is @i{implementation-defined}.
Implementations are encouraged to provide such information as 
     elapsed real time,
     machine run time,
 and storage management statistics.

@subsubheading  Affected By::

The accuracy of the results depends, among other things, on the accuracy
of the corresponding functions provided by the underlying operating system.

The magnitude of the results may depend on 
  the hardware,
  the operating system,
  the lisp implementation,
 and the state of the global environment.
Some specific issues which frequently affect the outcome are
  hardware speed,
  nature of the scheduler (if any),
  number of competing processes (if any),
  system paging,
  whether the call is interpreted or compiled,
  whether functions called are compiled,
  the kind of garbage collector involved and whether it runs,
  whether internal data structures (e.g., hash tables) are implicitly reorganized,
  @i{etc.}

@subsubheading  See Also::

@ref{get-internal-real-time}
,
@ref{get-internal-run-time}

@subsubheading  Notes::

In general, these timings are not guaranteed to be reliable enough for
marketing comparisons. Their value is primarily heuristic, for tuning
purposes.

For useful background information on the complicated issues involved in
interpreting timing results, see {Performance and Evaluation of Lisp Programs}.

@node internal-time-units-per-second, get-internal-real-time, time, Environment Dictionary
@subsection internal-time-units-per-second                          [Constant Variable]

@subsubheading  Constant Value::

A positive @i{integer}, the magnitude of which is @i{implementation-dependent}.

@subsubheading  Description::

The number of @i{internal time units} in one second.

@subsubheading  See Also::

@ref{get-internal-run-time}
, 
@ref{get-internal-real-time}

@subsubheading  Notes::

These units form the basis of the Internal Time format representation.

@node get-internal-real-time, get-internal-run-time, internal-time-units-per-second, Environment Dictionary
@subsection get-internal-real-time                                           [Function]

@code{get-internal-real-time}  @i{<@i{no @i{arguments}}>} @result{}  @i{internal-time}

@subsubheading  Arguments and Values::

@i{internal-time}---a non-negative @i{integer}.

@subsubheading  Description::

@b{get-internal-real-time} returns as an @i{integer} the 
current time in @i{internal time units}, relative to an arbitrary 
time base.  The difference between the values of two calls to this
function is the amount of elapsed real time (@i{i.e.}, clock time) between the two calls. 

@subsubheading  Affected By::

Time of day (@i{i.e.}, the passage of time).
The time base affects the result magnitude.

@subsubheading  See Also::

@ref{internal-time-units-per-second}

@node get-internal-run-time, disassemble, get-internal-real-time, Environment Dictionary
@subsection get-internal-run-time                                            [Function]

@code{get-internal-run-time}  @i{<@i{no @i{arguments}}>} @result{}  @i{internal-time}

@subsubheading  Arguments and Values::

@i{internal-time}---a non-negative @i{integer}.

@subsubheading  Description::

Returns as an @i{integer} the current 
run time in @i{internal time units}.  The precise meaning of this quantity is
@i{implementation-defined};  it may measure real time, run time, CPU cycles, or some
other quantity.  The intent is that the difference between the values of two calls
to this function be the amount of time between the two calls during which 
computational effort was expended on behalf of the executing program.

@subsubheading  Affected By::

The @i{implementation},
the time of day (@i{i.e.}, the passage of time).

@subsubheading  See Also::

@ref{internal-time-units-per-second}

@subsubheading  Notes::

Depending on the @i{implementation}, paging time and garbage
collection time might be included in this measurement.  Also, in a
multitasking environment, it might not be possible to show the time for
just the running process, so in some @i{implementations}, time taken
by other processes during the same time interval might be included in
this measurement as well.

@node disassemble, documentation, get-internal-run-time, Environment Dictionary
@subsection disassemble                                                      [Function]

@code{disassemble}  @i{fn} @result{}  @i{@b{nil}}

@subsubheading  Arguments and Values::

@i{fn}---an @i{extended function designator}
	  or a @i{lambda expression}.

@subsubheading  Description::

The @i{function} @b{disassemble} is a debugging aid that composes symbolic 
instructions or expressions in some @i{implementation-dependent} 
language which represent the code used to produce the @i{function}
which is or is named by the argument @i{fn}.  The result is displayed
to @i{standard output} in an @i{implementation-dependent} format.

If @i{fn} is a @i{lambda expression} or @i{interpreted function},
it is compiled first and the result is disassembled.

If the @i{fn} @i{designator} is a @i{function name},
the @i{function} that it @i{names} is disassembled.

(If that @i{function} is an @i{interpreted function},
it is first compiled but the result of this implicit compilation is not installed.)

@subsubheading  Examples::

@example
 (defun f (a) (1+ a)) @result{}  F
 (eq (symbol-function 'f)
     (progn (disassemble 'f)
            (symbol-function 'f))) @result{}  @i{true}
@end example

@subsubheading  Affected By::

@b{*standard-output*}.

@subsubheading  Exceptional Situations::

Should signal an error of @i{type} @b{type-error}
			      if @i{fn} is not an @i{extended function designator}
		  or a @i{lambda expression}.

@node documentation, room, disassemble, Environment Dictionary
@subsection documentation, (setf documentation)             [Standard Generic Function]

@subsubheading  Syntax::

@code{documentation}  @i{x doc-type} @result{}  @i{documentation}

@code{(setf documentation)}  @i{new-value x doc-type} @result{}  @i{new-value}

@subsubheading  Argument Precedence Order::

@i{doc-type}, @i{object}

@subsubheading  Method Signatures::

@subsubheading Functions, Macros, and Special Forms

documentation (@i{x} @code{function}) (doc-type (eql 't))@*
(setf documentation) @i{new-value}(@i{x} @code{function}) (doc-type (eql 't))

documentation (@i{x} @code{function}) (doc-type (eql 'function))@*
(setf documentation) @i{new-value}(@i{x} @code{function}) (doc-type (eql 'function))

documentation (@i{x} @code{list}) (doc-type (eql 'function))@*
(setf documentation) @i{new-value}(@i{x} @code{list}) (doc-type (eql 'function))

documentation (@i{x} @code{list}) (doc-type (eql 'compiler-macro))@*
(setf documentation) @i{new-value}(@i{x} @code{list}) (doc-type (eql 'compiler-macro))

documentation (@i{x} @code{symbol}) (doc-type (eql 'function))@*
(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'function))

documentation (@i{x} @code{symbol}) (doc-type (eql 'compiler-macro))@*
(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'compiler-macro))

documentation (@i{x} @code{symbol}) (doc-type (eql 'setf))@*
(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'setf))

@subsubheading Method Combinations

documentation (@i{x} @code{method-combination}) (doc-type (eql 't))@*
(setf documentation) @i{new-value}(@i{x} @code{method-combination}) (doc-type (eql 't))

documentation (@i{x} @code{method-combination}) (doc-type (eql 'method-combination))@*
(setf documentation) @i{new-value}(@i{x} @code{method-combination}) (doc-type (eql 'method-combination))

documentation (@i{x} @code{symbol}) (doc-type (eql 'method-combination))@*
(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'method-combination))

@subsubheading Methods

documentation (@i{x} @code{standard-method}) (doc-type (eql 't))@*
(setf documentation) @i{new-value}(@i{x} @code{standard-method}) (doc-type (eql 't))

@subsubheading Packages

documentation (@i{x} @code{package}) (doc-type (eql 't))@*
(setf documentation) @i{new-value}(@i{x} @code{package}) (doc-type (eql 't))

@subsubheading Types, Classes, and Structure Names

documentation (@i{x} @code{standard-class}) (doc-type (eql 't))@*
(setf documentation) @i{new-value}(@i{x} @code{standard-class}) (doc-type (eql 't))

documentation (@i{x} @code{standard-class}) (doc-type (eql 'type))@*
(setf documentation) @i{new-value}(@i{x} @code{standard-class}) (doc-type (eql 'type))

documentation (@i{x} @code{structure-class}) (doc-type (eql 't))@*
(setf documentation) @i{new-value}(@i{x} @code{structure-class}) (doc-type (eql 't))

documentation (@i{x} @code{structure-class}) (doc-type (eql 'type))@*
(setf documentation) @i{new-value}(@i{x} @code{structure-class}) (doc-type (eql 'type))

documentation (@i{x} @code{symbol}) (doc-type (eql 'type))@*
(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'type))

documentation (@i{x} @code{symbol}) (doc-type (eql 'structure))@*
(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'structure))

@subsubheading Variables

documentation (@i{x} @code{symbol}) (doc-type (eql 'variable))@*
(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'variable))

@subsubheading  Arguments and Values::

@i{x}---an @i{object}.

@i{doc-type}---a @i{symbol}.

@i{documentation}---a @i{string}, or @b{nil}.

@i{new-value}---a @i{string}.

@subsubheading  Description::

The @i{generic function} @b{documentation} returns the @i{documentation string}
associated with the given @i{object} if it is available;
otherwise it returns @b{nil}.

The @i{generic function} @t{(setf documentation)} updates the 
@i{documentation string} associated with @i{x} to @i{new-value}.
If @i{x} is a @i{list},
it must be of the form @t{(setf @i{symbol})}.

@i{Documentation strings} are made available for debugging purposes.
@i{Conforming programs} are permitted to use @i{documentation strings}
when they are present, but should not depend for their correct behavior on 
the presence of those @i{documentation strings}.
An @i{implementation} is permitted to discard @i{documentation strings} 
at any time for @i{implementation-defined} reasons.

The nature of the @i{documentation string} returned depends on the
@i{doc-type}, as follows:

@table @asis

@item @b{compiler-macro}  
Returns the @i{documentation string} of the @i{compiler macro}
whose @i{name} is the @i{function name} @i{x}.

@item @b{function}  
If @i{x} is a @i{function name},
returns the @i{documentation string} of 
the @i{function}, @i{macro}, or @i{special operator} 
whose @i{name} is @i{x}.

If @i{x} is a @i{function},
returns the @i{documentation string} associated with @i{x}.

@item @b{method-combination}  
If @i{x} is a @i{symbol},
returns the @i{documentation string} of
the @i{method combination}
whose @i{name} is @i{x}.

If @i{x} is a @i{method combination},
returns the @i{documentation string} associated with @i{x}.

@item @b{setf}  
Returns the @i{documentation string} of 

the @i{setf expander}

whose @i{name} is the @i{symbol} @i{x}.

@item @b{structure}  
Returns the @i{documentation string} 
associated with the @i{structure name} @i{x}.

@item @b{t}  
Returns a @i{documentation string} specialized on the @i{class} of
the argument @i{x} itself.
For example, if @i{x} is a @i{function},
the @i{documentation string} associated with the @i{function} @i{x} is returned.

@item @b{type}  
If @i{x} is a @i{symbol},
returns the @i{documentation string} of the @i{class}
whose @i{name} is the @i{symbol} @i{x},
if there is such a @i{class}.
Otherwise, it returns the @i{documentation string} of the @i{type} 
which is the @i{type specifier} @i{symbol} @i{x}.

If @i{x} is a @i{structure class} or @i{standard class},
returns the @i{documentation string} associated with
the @i{class} @i{x}.

@item @b{variable}  
Returns the @i{documentation string} of
the @i{dynamic variable} or @i{constant variable}
whose @i{name} is the @i{symbol} @i{x}.

@end table

A @i{conforming implementation} or a @i{conforming program}
may extend the set of @i{symbols} that are acceptable as the @i{doc-type}.

@subsubheading  Notes::

This standard prescribes no means to retrieve the @i{documentation strings}
for individual slots specified in a @b{defclass} form, but 
@i{implementations} might still provide debugging tools and/or
programming language extensions which manipulate this information.
Implementors wishing to provide such support are encouraged to consult the
@i{Metaobject Protocol} for suggestions about how this might be done.

@node room, ed, documentation, Environment Dictionary
@subsection room                                                             [Function]

@code{room}  @i{{&optional} x} @result{}  @i{@i{implementation-dependent}}

@subsubheading  Arguments and Values:: 

@i{x}---one of @b{t}, @b{nil}, or @t{:default}.

@subsubheading  Description::

@b{room} prints, to @i{standard output},
information about the state of internal storage and its management.
This might include descriptions of the amount of memory in use and 
the degree of memory compaction, possibly broken down by internal data type if that
is appropriate.  The nature and format of the printed information is
@i{implementation-dependent}.
The intent is to provide information that a @i{programmer}
might use to tune a @i{program} for a particular @i{implementation}.

@t{(room nil)} prints out a minimal amount of information.
@t{(room t)} prints out a maximal amount of information.

@t{(room)} or @t{(room :default)} prints out an intermediate amount
of information that is likely to be useful.

@subsubheading  Side Effects::

Output to @i{standard output}.

@subsubheading  Affected By::

@b{*standard-output*}.

@node ed, inspect, room, Environment Dictionary
@subsection ed                                                               [Function]

@code{ed}  @i{{&optional} x} @result{}  @i{@i{implementation-dependent}}

@subsubheading  Arguments and Values::

@i{x}---@b{nil}, a @i{pathname}, a @i{string}, or a @i{function name}.

 The default is @b{nil}.

@subsubheading  Description::

@b{ed} invokes the editor if the @i{implementation} provides a resident editor.

If @i{x} is @b{nil}, the editor is entered.
If the editor had been previously entered, its prior state is resumed, if possible.

If @i{x} is a @i{pathname} or @i{string}, 
it is taken as the @i{pathname designator} for a @i{file} to be edited.

If @i{x} is a @i{function name}, the text of its definition is edited.
The means by which the function text is obtained is @i{implementation-defined}.

@subsubheading  Exceptional Situations::

The consequences are undefined if the @i{implementation} does not provide a resident editor.

Might signal @b{type-error} if its argument is supplied but is not
a @i{symbol}, a @i{pathname}, or @b{nil}. 

If a failure occurs when performing some operation on the @i{file system}
while attempting to edit a @i{file},
an error of @i{type} @b{file-error} is signaled.

An error of @i{type} @b{file-error} might be signaled if @i{x}
is a @i{designator} for a @i{wild} @i{pathname}.

@i{Implementation-dependent} additional conditions might be signaled as well.

@subsubheading  See Also::

@b{pathname},

@b{logical-pathname},

@ref{compile-file}
,
@ref{load}
,

@ref{Pathnames as Filenames}

@node inspect, dribble, ed, Environment Dictionary
@subsection inspect                                                          [Function]

@code{inspect}  @i{object} @result{}  @i{@i{implementation-dependent}}

@subsubheading  Arguments and Values::

@i{object}---an @i{object}.

@subsubheading  Description::

@b{inspect} is an interactive version of @b{describe}.
The nature of the interaction is @i{implementation-dependent},
but the purpose of @b{inspect} is to make it easy to wander
through a data structure, examining and modifying parts of it.

@subsubheading  Side Effects::

@i{implementation-dependent}.

@subsubheading  Affected By::

@i{implementation-dependent}.

@subsubheading  Exceptional Situations::

@i{implementation-dependent}.

@subsubheading  See Also::

@ref{describe}

@subsubheading  Notes::

Implementations are encouraged to respond to the typing
of @t{?} or a ``help key'' by providing help, including a list
of commands.

@node dribble, -, inspect, Environment Dictionary
@subsection dribble                                                          [Function]

@code{dribble}  @i{{&optional} pathname} @result{}  @i{@i{implementation-dependent}}

@subsubheading  Arguments and Values::

@i{pathname}---a @i{pathname designator}.

@subsubheading  Description::

Either @i{binds} @b{*standard-input*} and @b{*standard-output*} 
or takes other appropriate action, 
so as to send a record of the input/output interaction to a file 
named by @i{pathname}.  @b{dribble} is intended to create
a readable record of an interactive session.

If @i{pathname} is a @i{logical pathname}, it is translated
into a physical pathname as if by calling @b{translate-logical-pathname}.

@t{(dribble)} terminates the recording of input and output 
and closes the dribble file.

If @b{dribble} is @i{called} while a @i{stream} to a ``dribble file'' 
is still open from a previous @i{call} to @b{dribble},
the effect is @i{implementation-defined}.  For example, 
    the already-@i{open} @i{stream} might be @i{closed}, 
 or dribbling might occur both to the old @i{stream} and to a new one,
 or the old @i{stream} might stay open but not receive any further output,
 or the new request might be ignored,
 or some other action might be taken.

@subsubheading  Affected By::

The @i{implementation}.

@subsubheading  Exceptional Situations::

If a failure occurs when performing some operation on the @i{file system}
while creating the dribble file, 
an error of @i{type} @b{file-error} is signaled.

An error of @i{type} @b{file-error} might be signaled if @i{pathname}
is a @i{designator} for a @i{wild} @i{pathname}.

@subsubheading  See Also::

@ref{Pathnames as Filenames}

@subsubheading  Notes::

@b{dribble} can return before subsequent 
@i{forms} are executed. It also
can enter a recursive interaction loop, 
returning only when @t{(dribble)} is done.

@b{dribble} is intended primarily for interactive debugging;
its effect cannot be relied upon when used in a program.

@node -, +, dribble, Environment Dictionary
@subsection -                                                              [Variable]

@subsubheading  Value Type::

a @i{form}.

@subsubheading  Initial Value::

@i{implementation-dependent}.

@subsubheading  Description::

The @i{value} of @b{-} is the @i{form} that is currently being evaluated by
the @i{Lisp read-eval-print loop}.

@subsubheading  Examples::

@example
(format t "~&Evaluating ~S~
@t{ |> } Evaluating (FORMAT T "~&Evaluating ~S~
@result{}  NIL
@end example

@subsubheading  Affected By::

@i{Lisp read-eval-print loop}.

@subsubheading  See Also::

@b{+} (@i{variable}),
@b{*} (@i{variable}),
@ref{/}
 (@i{variable}), 
@ref{Top level loop}

@node +, *, -, Environment Dictionary
@subsection +, ++, +++                                                       [Variable]

@subsubheading  Value Type::

an @i{object}.

@subsubheading  Initial Value::

@i{implementation-dependent}.

@subsubheading  Description::

The @i{variables} @b{+}, @b{++}, and @b{+++} are maintained by the
@i{Lisp read-eval-print loop} to save @i{forms} that were
recently @i{evaluated}.

The @i{value} of @b{+}   is the last @i{form} that was @i{evaluated},
the @i{value} of @b{++}  is the previous value of @b{+}, and
the @i{value} of @b{+++} is the previous value of @b{++}.

@subsubheading  Examples::
@example
(+ 0 1) @result{}  1
(- 4 2) @result{}  2
(/ 9 3) @result{}  3
(list + ++ +++) @result{}  ((/ 9 3) (- 4 2) (+ 0 1))
(setq a 1 b 2 c 3 d (list a b c)) @result{}  (1 2 3)
(setq a 4 b 5 c 6 d (list a b c)) @result{}  (4 5 6)
(list a b c) @result{}  (4 5 6)
(eval +++) @result{}  (1 2 3)
#.`(,@@++ d) @result{}  (1 2 3 (1 2 3))
@end example

@subsubheading  Affected By:: 

@i{Lisp read-eval-print loop}.

@subsubheading  See Also::

@ref{-}
 (@i{variable}),
@b{*} (@i{variable}),
@ref{/}
 (@i{variable}), 
@ref{Top level loop}

@node *, /, +, Environment Dictionary
@subsection *, **, ***                                                       [Variable]

@subsubheading  Value Type::

an @i{object}.

@subsubheading  Initial Value::

@i{implementation-dependent}.

@subsubheading  Description::

The @i{variables} @b{*}, @b{**}, and @b{***} are 
maintained by the @i{Lisp read-eval-print loop} to save the 
values of results that are printed each time through the loop.

The @i{value} of @b{*}   is the most recent @i{primary value} that was printed,
the @i{value} of @b{**}  is the previous value of @b{*}, and 
the @i{value} of @b{***} is the previous value of @b{**}.

If several values are produced, @b{*} contains the first value only;
@b{*} contains @b{nil} if zero values are produced.

The @i{values} of @b{*}, @b{**}, and @b{***} are updated immediately
prior to printing the @i{return value} of a top-level @i{form} by the
@i{Lisp read-eval-print loop}.  If the @i{evaluation} of such a @i{form}
is aborted prior to its normal return, the values of @b{*}, @b{**}, and @b{***} 
are not updated.

@subsubheading  Examples::
@example
(values 'a1 'a2) @result{}  A1, A2
'b @result{}  B
(values 'c1 'c2 'c3) @result{}  C1, C2, C3
(list * ** ***) @result{}  (C1 B A1)

(defun cube-root (x) (expt x 1/3)) @result{}  CUBE-ROOT
(compile *) @result{}  CUBE-ROOT
(setq a (cube-root 27.0)) @result{}  3.0
(* * 9.0) @result{}  27.0
@end example

@subsubheading  Affected By::

@i{Lisp read-eval-print loop}.

@subsubheading  See Also::

@ref{-}
 (@i{variable}),
@b{+} (@i{variable}),
@ref{/}
 (@i{variable}), 
@ref{Top level loop}

@subsubheading  Notes::

@example
 *   @equiv{} (car /)
 **  @equiv{} (car //)
 *** @equiv{} (car ///)
@end example

@node /, lisp-implementation-type, *, Environment Dictionary
@subsection /, //, ///                                                       [Variable]

@subsubheading  Value Type::

a @i{proper list}.

@subsubheading  Initial Value::

@i{implementation-dependent}.

@subsubheading  Description::

The @i{variables} @b{/}, @b{//}, and @b{///} are maintained by
the @i{Lisp read-eval-print loop} to save the values of results that
were printed at the end of the loop.

The @i{value} of @b{/}   is a @i{list} of the most recent @i{values} that were printed,
the @i{value} of @b{//}  is the previous value of @b{/}, and
the @i{value} of @b{///} is the previous value of @b{//}.

The @i{values} of @b{/}, @b{//}, and @b{///} are updated immediately
prior to printing the @i{return value} of a top-level @i{form} by the
@i{Lisp read-eval-print loop}.  If the @i{evaluation} of such a @i{form}
is aborted prior to its normal return, the values of @b{/}, @b{//}, and @b{///} 
are not updated.

@subsubheading  Examples::
@example
 (floor 22 7) @result{}  3, 1
 (+ (* (car /) 7) (cadr /)) @result{}  22
@end example

@subsubheading  Affected By::

@i{Lisp read-eval-print loop}.

@subsubheading  See Also::

@ref{-}
 (@i{variable}),
@b{+} (@i{variable}),
@b{*} (@i{variable}),
@ref{Top level loop}

@node lisp-implementation-type, short-site-name, /, Environment Dictionary
@subsection lisp-implementation-type,
@subheading lisp-implementation-version
@flushright
@i{[Function]}
@end flushright

@code{lisp-implementation-type}  @i{<@i{no @i{arguments}}>} @result{}  @i{description}

@code{lisp-implementation-version}  @i{<@i{no @i{arguments}}>} @result{}  @i{description}

@subsubheading  Arguments and Values::

@i{description}---a @i{string} or @b{nil}.

@subsubheading  Description::

@b{lisp-implementation-type} and @b{lisp-implementation-version} 
identify the current implementation of @r{Common Lisp}.

@b{lisp-implementation-type} returns a @i{string} 
that identifies the generic name of
the particular @r{Common Lisp} implementation.

@b{lisp-implementation-version} 
returns a @i{string} that identifies the version of
the particular @r{Common Lisp} implementation.

If no appropriate
and relevant result can be produced, @b{nil} is returned instead
of a @i{string}.

@subsubheading  Examples::

@example
 (lisp-implementation-type)
@result{}  "ACME Lisp"
@i{OR}@result{} "Joe's Common Lisp"
 (lisp-implementation-version)
@result{}  "1.3a"
@result{}  "V2"
@i{OR}@result{} "Release 17.3, ECO #6"
@end example

@node short-site-name, machine-instance, lisp-implementation-type, Environment Dictionary
@subsection short-site-name, long-site-name                                  [Function]

@code{short-site-name}  @i{<@i{no @i{arguments}}>} @result{}  @i{description}

@code{long-site-name}  @i{<@i{no @i{arguments}}>} @result{}  @i{description}

@subsubheading  Arguments and Values:: 

@i{description}---a @i{string} or @b{nil}.

@subsubheading  Description::

@b{short-site-name} and @b{long-site-name} return
a @i{string} that identifies the physical location 
of the computer hardware, 
or @b{nil} if no appropriate @i{description} can be produced.

@subsubheading  Examples::

@example
 (short-site-name)
@result{}  "MIT AI Lab"
@i{OR}@result{} "CMU-CSD"
 (long-site-name)
@result{}  "MIT Artificial Intelligence Laboratory"
@i{OR}@result{} "CMU Computer Science Department"
@end example

@subsubheading  Affected By::

The implementation,
the location of the computer hardware,
and the installation/configuration process.

@node machine-instance, machine-type, short-site-name, Environment Dictionary
@subsection machine-instance                                                 [Function]

@code{machine-instance}  @i{<@i{no @i{arguments}}>} @result{}  @i{description}

@subsubheading  Arguments and Values::

@i{description}---a @i{string} or @b{nil}.

@subsubheading  Description::

Returns a @i{string} that identifies the particular instance of
the computer hardware on which @r{Common Lisp} is running, 
or @b{nil} if no such @i{string} can be computed.

@subsubheading  Examples::

@example
 (machine-instance)
@result{}  "ACME.COM"
@i{OR}@result{} "S/N 123231"
@i{OR}@result{} "18.26.0.179"
@i{OR}@result{} "AA-00-04-00-A7-A4"
@end example

@subsubheading  Affected By::

The machine instance,
and the @i{implementation}.

@subsubheading  See Also::

@ref{machine-type}
, 
@ref{machine-version}

@node machine-type, machine-version, machine-instance, Environment Dictionary
@subsection machine-type                                                     [Function]

@code{machine-type}  @i{<@i{no @i{arguments}}>} @result{}  @i{description}

@subsubheading  Arguments and Values::

@i{description}---a @i{string} or @b{nil}.

@subsubheading  Description::

Returns a @i{string} that identifies the generic name of
the computer hardware on which @r{Common Lisp} is running.

@subsubheading  Examples::

@example
 (machine-type)
@result{}  "DEC PDP-10"
@i{OR}@result{} "Symbolics LM-2"
@end example

@subsubheading  Affected By::

The machine type.
The implementation.

@subsubheading  See Also::

@ref{machine-version}

@node machine-version, software-type, machine-type, Environment Dictionary
@subsection machine-version                                                  [Function]

@code{machine-version}  @i{<@i{no @i{arguments}}>} @result{}  @i{description}

@subsubheading  Arguments and Values::

@i{description}---a @i{string} or @b{nil}.

@subsubheading  Description::

Returns a @i{string} that identifies the version of the computer hardware
on which @r{Common Lisp} is running, or @b{nil} if no such value can be computed.

@subsubheading  Examples::

@example
 (machine-version) @result{}  "KL-10, microcode 9"
@end example

@subsubheading  Affected By::

The machine version, 
and the @i{implementation}.

@subsubheading  See Also::

@ref{machine-type}
, 
@ref{machine-instance}

@node software-type, user-homedir-pathname, machine-version, Environment Dictionary
@subsection software-type, software-version                                  [Function]

@code{software-type}  @i{<@i{no @i{arguments}}>} @result{}  @i{description}

@code{software-version}  @i{<@i{no @i{arguments}}>} @result{}  @i{description}

@subsubheading  Arguments and Values:: 

@i{description}---a @i{string} or @b{nil}.

@subsubheading  Description::

@b{software-type} returns a @i{string} that identifies the
generic name of any relevant supporting software, or @b{nil} if no
appropriate or relevant result can be produced.          

@b{software-version} returns a @i{string} that identifies 
the version of any relevant supporting software, or @b{nil} if no 
appropriate or relevant result can be produced.          

@subsubheading  Examples::

@example
 (software-type) @result{}  "Multics"
 (software-version) @result{}  "1.3x"
@end example

@subsubheading  Affected By::

Operating system environment.

@subsubheading  Notes::

This information should be of use to maintainers of the @i{implementation}.

@node user-homedir-pathname,  , software-type, Environment Dictionary
@subsection user-homedir-pathname                                            [Function]

@code{user-homedir-pathname}  @i{{&optional} host} @result{}  @i{pathname}

@subsubheading  Arguments and Values::

@i{host}---a @i{string}, a @i{list} of @i{strings}, or @t{:unspecific}.

@i{pathname}---a @i{pathname}, or @b{nil}.

@subsubheading  Description::

@b{user-homedir-pathname} determines the @i{pathname} that corresponds
to the user's home directory on @i{host}.  
If @i{host} is not supplied, its value is @i{implementation-dependent}.

For a description of @t{:unspecific}, see @ref{Pathname Components}.

The definition of home directory is @i{implementation-dependent}, 
but defined in @r{Common Lisp} to mean the directory where the user
keeps personal files such as initialization files and mail.  

@b{user-homedir-pathname} returns a @i{pathname} without any name, 
type, or version component (those components are all @b{nil})
for the user's home directory on @i{host}.

If it is impossible to determine the user's home directory on @i{host},
then @b{nil} is returned.
@b{user-homedir-pathname} never returns @b{nil} if @i{host} is not supplied.

@subsubheading  Examples::

@example
 (pathnamep (user-homedir-pathname)) @result{}  @i{true}
@end example

@subsubheading  Affected By::

The host computer's file system,
and the @i{implementation}.

@c end of including dict-environment

@c %**end of chapter

