% -*- Mode: TeX -*-
%%Implementation-defined Features

\editornote{KMP: I have made no effort to keep this up to date.
		 When the document is nearly complete, I'll search for
		 occurrences of ``implementation-defined'' and
		 ``implementation-dependent'' and bring this up to date.
		 Don't worry about consistency issues here for now; the main document
		 takes precedence.   But do feel free
		 to comment on things which are mentioned in the running text
		 of the main document that are not marked as implementation-defined
		 but should not be, etc.}

The following sections contain lists of \term{implementation-dependent} 
language characteristics.
For more
information about each of these implementation dependencies, 
see the dictionary entries for the description of the \term{defined name} being qualified.

\beginsubSection{Values}
%%\item{2.}
\beginlist
\item{1.}
An implementation determines the initial values of the \term{defined names}
in \thenextfigure.

\displaytwo{Implementation-defined values}{
boole-1&boole-nand\cr
boole-2&boole-nor\cr
boole-and&boole-orc1\cr
boole-c1&boole-orc2\cr
boole-c2&boole-set\cr
boole-clr&boole-xor\cr
boole-eqv&\cr
&\cr
*features*&char-code-limit\cr
array-dimension-limit&internal-time-units-per-second\cr
array-rank-limit&lambda-parameters-limit\cr
array-total-size-limit&multiple-values-limit\cr
call-arguments-limit&\cr
&\cr
double-float-negative-epsilon&most-negative-fixnum\cr
least-negative-double-float&most-negative-long-float\cr
least-negative-long-float&most-negative-short-float\cr
least-negative-short-float&most-negative-single-float\cr
least-negative-single-float&most-positive-double-float\cr
least-positive-double-float&most-positive-fixnum\cr
least-positive-long-float&most-positive-long-float\cr
least-positive-short-float&most-positive-short-float\cr
least-positive-single-float&most-positive-single-float\cr
long-float-negative-epsilon&short-float-negative-epsilon\cr
most-negative-double-float&single-float-negative-epsilon\cr
&\cr
*load-verbose*&*random-state*\cr
*print-array*&*read-default-float-format*\cr
*print-pretty*&\cr
}
      
%%\item{42.}        
\item{2.} The implementation determines the defaults for the arguments
to the keywords
\kwd{rehash-size} and 
\kwd{rehash-threshold} 
for \funref{make-hash-table}.

%%\item{44.} 
\item{3.} The implementation determines the way in which a 
\term{sequence} is initialized if an \kwd{initial-element} 
argument is not supplied. See \funref{make-sequence}.
The implementation determines the way in which a 
\term{string} is initialized if an \kwd{initial-element} 
argument is not supplied. See \funref{make-string}.
Also, the implementation determines the way in which an
\term{array} is initialized if \kwd{initial-element},
\kwd{initial-contents}, or \kwd{displaced-to}
arguments are not supplied. See \funref{make-array}.

%%\item{58.} 
%\item{4.} Valid values for the argument to
%\funref{char-bit} and \funref{set-char-bit}
%are \term{implementation-dependent}.

\endlist
\endsubSection%{Values}

\beginsubSection{Results}
\beginlist
\item{1.}
%%12.5.2 7
An implementation may return the result of the absolute value of 
a \term{complex} number composed of \term{integer} real
and imaginary parts as either a \term{float} 
or an \term{integer}. See \funref{abs}.

%%\item{7.}
\item{2.}
An implementation determines the result returned from 
\funref{lisp-implementation-type},
\funref{type-of},
 \funref{lisp-implementation-version}, and \funref{software-version}.

%%\item{18.} 
\item{3.} An implementation determines the result of \funref{digit-char}
when more than one character object can encode the supplied weight in
the given radix.

%%\item{20.} 
\item{4.} An implementation may determine the consequences in 
\macref{do} and
\macref{do*} when the index variable is changed within the iteration
loop.

%%\item{30.} 
\item{5.}
The result of \funref{file-position} for a character file
is \term{implementation-dependent}.

%%\item{34.} 
\item{6.}
An implementation determines the order of elements in the results 
of \funref{intersection},  \funref{set-difference}, and \funref{union}
%!!! derivatives?? gads. maybe make that a glossary word?  functions dependent
%   on that function, i guess it means. -kmp 3-Jan-91
and derivatives of those functions.
\editornote{KMP: ``derivatives??'' terminology to be worked on.}
Some element-processing aspects of sorting are \term{implementation-dependent}.
See \funref{sort}.

%%\item{36.} 
\item{7.}  
Whether or not \funref{length} or any sequence operation returns when given 
a \term{circular list} is \term{implementation-dependent}.

%%\item{39.} 
\item{8.}
The implementation determines the \term{type} of the result of \funref{log}
(\typeref{integer} or \typeref{float}) when its arguments are both
\term{integers} and the result is a whole number.
 
%%\item{41.} 
%\item{9.} The implementation determines the result of \funref{make-char}.

%%\item{46.} 
\item{9.} An implementation determines the result of 
{\tt (eq (symbol-name (make-symbol x)) x)}.
                                       
%%\item{47.} 
\item{10.} 
An implementation determines the \term{type} 
of the result of \funref{max} and \funref{min} in the following cases.
\beginlist
\itemitem{a.}
If the arguments are a mixture of \term{rationals} and \term{floats}
and the largest argument is a \term{rational}.
\itemitem{b.} If the largest argument is a \term{float} number of a smaller format
than the largest format of any \term{float} argument.
\endlist
In addition, if one or more of the arguments are equal, then any one
of them may be chosen as the value to return.
%%\item{62.} 
%\issue{SPECIAL-FORM-P-MISNOMER:RENAME}
%\item{12.} \funref{special-operator-p} can return a \term{non-nil} value,
%the identity of which is \term{implementation-dependent}.
%\endissue{SPECIAL-FORM-P-MISNOMER:RENAME}

%%\item{63.} 
\item{11.} If the argument to \funref{sqrt} is an \term{integer},
the result may be either an \term{integer} or a \term{float} depending on the
\term{implementation}.  Also, if the argument to \funref{sqrt}
is a negative \term{integer}, the result may be either
a \term{complex} with \term{integer} components or
a \term{complex} with \term{float} components.

%%\item{64.} 
\item{12.} If no characters in the argument to \funref{string-trim},
\funref{string-left-trim}, \funref{string-right-trim}, 
\funref{string-upcase}, \funref{string-downcase}, and
\funref{string-capitalize} need to be changed, then the implementation can
either return the argument itself or a copy of it.
This is true for all destructive \term{sequence functions}.

%%\item{71.} 
\item{13.} When the arguments to the mathematical \term{functions}
in \thenextfigure\ are all \term{rational} and the true mathematical result
is also (mathematically) rational, then unless otherwise noted
an implementation is free to return either an accurate result \oftype{rational}
or a \term{single float} approximation.
If the arguments are all \term{rational} 
but the result cannot be expressed
as a \term{rational} number, then a \term{single float} 
approximation is always returned.

\displaythree{Irrational and transcendental functions}{
abs&cis&phase\cr
acos&cos&signum\cr
acosh&cosh&sin\cr
asin&exp&sinh\cr
asinh&expt&sqrt\cr
atan&isqrt&tan\cr
atanh&log&tanh\cr
}

\endlist
\endsubSection%{Results}


\beginsubSection{Data Representation and Typing}
\beginlist
%%\item{5.}
\item{1.}
An implementation determines the representation of a byte specifier.

%%\item{9.}
\item{2.}
Type upgrading may occur when \funref{coerce} is used.
%\Seesection\TypeUpgrading.
%%\item{27.} 
\item{3.} An implementation determines the structure of the 
\term{environment}
object.     
%%\item{75.} 
%\item{4.} The existence of 
%\term{types} that are not \term{subtypes} of \typeref{common}
%is \term{implementation-dependent}.

\item{4.} Whether or not \thetypes{short-float}, \typeref{long-float},
\typeref{single-float}, and \typeref{double-float} are
\term{disjoint} is \term{implementation-dependent}.
%!!! But subject to certain constraints, no? -kmp 9-May-91
%\Seesection\TypeUpgrading.

\endlist
\endsubSection%{Data Representation and Typing}

\beginsubSection{Program and Control Structure}
\beginlist

%%\item{13.}
%\item{1.}
%An implementation 
%might or might not check for any dynamic \term{bindings}
%of the first argument to \macref{defconstant} at the time 
%\macref{defconstant} is executed.



%%\item{14.}
\item{1.}
An implementation determines the way that \macref{defmacro}
actually installs a macro function.

%%\item{15.}
\item{2.}
An implementation determines the code generated by \macref{defsetf}.

%%\item{16.}
\item{3.}
The following are \term{implementation-dependent} features of \macref{defstruct}:
\beginlist
\itemitem{a.} The initial contents of a slot, when they have not been provided,
are specified by the implementation.
\itemitem{b.} The \term{access} \term{functions} may be declared \declref{inline}.
\itemitem{c.} The incorrect use of \term{access} \term{functions} might or might not be checked
by an implementation.
\itemitem{d.} %For included slots, 
An implementation might or might not enforce the declared \term{type} information
for a slot.
%!!! Is this still true under CLOS?? -kmp 9-May-91
\itemitem{e.} If the \kwd{type} option is not supplied,
the implementation determines the representation of the \term{structure}. 
%%(see clean-up issue)
\endlist

%%\item{35.} 
\item{4.} The permissibility of non-standard lambda-list
keywords is \term{implementation-dependent}.

%%\item{40.} 
\item{5.} 
An implementation is free to implement as a \term{special operator}
any \term{operator} described in this standard as a \term{macro},
if an equivalent macro definition is also provided.
See \funref{macro-function}.

%%\item{60.} 
\item{6.} 
The exact expansion for any particular form given to \macref{setf} 
may be \term{implementation-dependent}.

%%\item{76.} 
\item{7.} The internal representation of 
a backquoted \term{form} is \term{implementation-dependent}.

\endlist
\endsubSection%{Program and Control Structure}

\beginsubSection{Comparisons}
%\beginlist
%%\item{6.}
%\item{1.}
%An implementation determines the way font information is compared in the
%functions \funref{char-equal}, 
%\funref{char-not-equal}, \funref{char-lessp}, 
%\funref{char-greaterp},
%\funref{char-not-greaterp}, and \funref{char-not-lessp}. Where not
%specified by this standard, the ordering of 
%characters is \term{implementation-dependent}.
%\endlist
\endsubSection%{Comparisons}




\beginsubSection{Numerical Calculations}
\beginlist
%%\item{8.} 
\item{1.} 
  \funref{minusp}, \funref{eql}, \funref{float-sign}, and \funref{zerop}
  are affected by the presence of {\tt $-0.0$} in an implementation.

%%\item{24.} 
\item{2.}
  Whether or not two \term{numbers} or \term{characters}
  that are \funref{eql} are \funref{eq} depends on the implementation.

%%%\item{29.} 
%\item{3.} An implementation may use different algorithms
%for the cases of a \term{rational} second 
%argument and a \term{float}
%second argument to \funref{expt}.

%%\item{55.} 
\item{3.} Random number generation is \term{implementation-dependent}.


%%\item{70.} 
\item{4.} For the \term{operators} in \thenextfigure,
an implementation may process the arguments in any manner consistent
with associative (and possibly commutative) rearrangement.

\displaythree{Mathematically associative operators}{
*&boole&lognand\cr
+&gcd&lognor\cr
/=&lcm&logorc1\cr
<&logand&logorc2\cr
<=&logandc1&logxor\cr
=&logandc2&max\cr
>&logeqv&min\cr
>=&logior&\cr
}

Implementations may differ in 
which automatic coercions are applied because of differing
orders of argument processing. 

%%\item{72.} 
\item{5.} 
The precise definitions of \typeref{short-float},
\typeref{long-float}, \typeref{single-float}, and 
\typeref{double-float} are \term{implementation-dependent}
(but subject to certain constraints imposed by this specification).

\endlist
\endsubSection%{Numerical Calculations}


\beginsubSection{User Interface}
\beginlist
%%\item{.}
\item{1.}
\Thenextfigure\ shows the names of \term{operators} which have
an \term{implementation-dependent} user interface.

\displaythree{Operators with Implementation-Dependent User Interfaces}{
break&ctypecase&step\cr
ccase&describe&warn\cr
ccase&disassemble&y-or-n-p\cr
cerror&error&yes-or-no-p\cr
check-type&inspect&\cr
}
%I removed "Anything that uses CERROR" as unnecessary. In general you don't
%know what really uses CERROR and what doesn't anyway. -kmp 13-Feb-91

\endlist
\endsubSection%{User Interface}


\beginsubSection{Input/Output}
\beginlist

%%\item{17.} 
\item{1.} An implementation determines whether an attempt by 
\funref{delete-file} to delete a non-existent file is considered to be successful.

%%\item{19.} 
\item{2.} An implementation may define keywords to be used with
\funref{directory}.

%%\item{31.} 
\item{3.} An implementation determines the precise actions of
\funref{finish-output}, \funref{clear-output}, and
\funref{force-output}. 

%%\item{31a.} 
\item{4.} \term{Streams} 
may be implemented in an asynchronous or buffered manner.

%%\item{32.} 
\item{5.} \funref{format} has the following \term{implementation-defined}
features:
\beginlist
%% CLean-up item on this
\itemitem{a.} \f{~C} prints a character in an \term{implementation-dependent}
abbreviated format.  

\itemitem{b.} The precise output for \f{~:@C} depends 
on the implementation.
\itemitem{c.} When rounding up and rounding down would produce printed values
equidistant from the scaled value of the argument, then the implementation
is free to use either one.  
\itemitem{d.} For the \f{~\$} operation, if the magnitude of the argument is so large or small 
that more than 100 digits would have to
be printed, then an implementation is free, at its discretion, to print
the number using exponential notation.
\itemitem{e.} For the \f{~\$} operation, if 
the argument is a \term{rational} number, 
then it is coerced to be a \term{single float}
or processed by any other method that has essentially the
same behavior. 
Only a finite number of digits may be printed.
\itemitem{f.} The range of numbers and the font of the printed output
for the \f{~R} operation are \term{implementation-dependent}. 
The English words printed as a result of the \f{~R} operation are
\term{implementation-dependent}. 
\endlist
%%\item{37.} 
\item{6.} The means by which a text (character file) 
is distinguished from an object (binary) file by \funref{load} is
\term{implementation-dependent}. 

%%\item{38.} 
\item{7.} The selection by \funref{load} of a file type when there
is a choice is \term{implementation-dependent}.

%%\item{43.} 
\item{8.} The implementation determines the internal representation
of a \term{pathname}. See \funref{make-pathname}.

%%\item{48.} 
\item{9.} The following aspects of \funref{open}
are \term{implementation-dependent}:
\beginlist
\itemitem{a.} The meaning of the keyword \kwd{supersede}.
%\itemitem{b.} An implementation is required to recognize all of 
%the following \kwd{if-exists} keywords
%and to do something reasonable in the context of the host operating
%system:
%\kwd{error},
%\kwd{new-version},
%\kwd{rename},
%\kwd{rename-and-delete},
%\kwd{overwrite},
%\kwd{append},
%\kwd{supersede}, or
%\nil.       

\itemitem{b.} If it is impossible for an implementation to handle some option
in a manner close to what is specified in this manual, an error may be
signaled.
\endlist                                             

%%\item{50.} 
\item{10.} \funref{parse-namestring}
might or might not signal an error if
the representation of a \term{pathname} 
is surrounded on either side by
\term{whitespace}\meaning{1} characters, depending on the \term{implementation}.
Whether or not \funref{parse-namestring} supplies 
the
standard default device as the device component
of the resulting \term{pathname} depends on the implementation.

%%\item{51.} 
\item{11.} The \term{pathname} namestring
syntax is \term{implementation-dependent}.
The printed representation of a pathname
typically designates \kwd{wild} by an asterisk; however, this is
\term{implementation-dependent}.    

%%\item{52.} 
\item{12.} A \term{character} name or a \term{pathname} that is printed
is acceptable as input in only the implementation which typed it.  
Which names for characters are chosen to print is
\term{implementation-dependent}, although standard names are
chosen over non-standard names. See \funref{write}.
        
%%\item{53.} 
%\item{13.} The printed representation of a
%\term{random state} \term{object} is \term{implementation-dependent}.

%%\item{54.} 
\item{13.} \term{Objects} which do not have a specific syntax
specified in this manual are printed in an \term{implementation-dependent} manner.  

%%\item{68.} 
\item{14.} The \param{host} argument to \funref{user-homedir-pathname}
defaults in an \term{implementation-dependent} manner.

%% Following two are affected by the character set proposal.
%%\item{77.} 
\item{15.} Whether the following 
character names are supported is \term{implementation-dependent}:
\f{rubout}, \f{page}, \f{tab}, \f{backspace}, \f{return}, and \f{linefeed}.
%%\item{78.} 
%\item{17.} Whether 
%characters with non-zero \param{bits} and \param{font} \term{attributes}
%syntax
%descriptions are in the \term{readtable} is \term{implementation-dependent}.

\endlist
\endsubSection%{Input/Output}
                           

\beginsubSection{Compiling}
\beginlist
%%\item{10.}
\item{1.}
An implementation determines the following for \funref{compile-file}:
\beginlist
\itemitem{a.} The contents of the file created by \funref{compile-file}.
\itemitem{b.} The file 
specification (if one is not supplied)
for the file created by \funref{compile-file}.
\endlist
%%\item{12.}
\item{2.}
An implementation's compiler can ignore declaration specifiers
except for \declref{declaration}, \declref{special}, and \declref{notinline}.

%%\item{25.} 
\item{3.} An implementation may coalesce constants or portions of constants
in code to be compiled if they appear to be \funref{eq}
or \funref{eql} and are \funref{equal}.
\Seesection\Compilation.

\endlist
\endsubSection%{Compiling}


\beginsubSection{Miscellaneous}
\beginlist
%%\item{4.}
\item{1.}
An implementation determines the specifics of the
debugger that \funref{break} enters.

%%\item{74.} 
\item{2.} Although functions that manipulate \term{packages}
generally signal
name conflict errors before making any change to the package structure, an
implementation may \funref{export} 
each of a given list of \term{symbols} separately.

%%\item{49.} 
%\item{3.} The contents of \thepackage{system} are determined by
%the implementation.

%%\item{57.} 
\item{3.} 
 The frequency of execution of \param{test} and \param{key}
 functions for all \term{sequence functions} is \term{implementation-dependent}. 
 The implementation of \funref{search} may choose to search the \term{sequence} 
 in any order.
\reviewer{Is the order of other things specified??}

%%\item{65.} 
\item{4.} The manner in which a 
hash code is computed by \funref{sxhash}
is \term{implementation-dependent}. 

%% clean-up pending for this
%%\item{69.} 
\item{5.} The optional argument \param{extension}
for \funref{vector-push-extend}
defaults to a ``reasonable'' \term{implementation-dependent}
value.

%%\item{73.} 
\item{6.} A \term{symbol}'s \term{property list} may have defined components.

%%\item{11.}
\item{7.}
An implementation can define declaration specifiers other than the ones
given in the description of \misc{declare}.

\endlist
\endsubSection%{Miscellaneous}


\beginsubSection{Programming Environment}
\beginlist
%%\item{22.} 
\item{1.} An implementation might or might not provide a resident editor.
See \funref{ed}.

%%\item{23.} 
\item{2.} An implementation determines the means by which
function text is obtained when \f{(ed \i{symbol})} is invoked.

%%\item{33.} 
\item{3.} An implementation determines the units used in representing
Internal Time.
See \funref{get-internal-run-time}.

%%\item{56.} 
\item{4.} The information \funref{room} prints is
\term{implementation-dependent}.  
%%\item{66.} 
\item{5.} The nature and
format of the information printed by \funref{time} 
is \term{implementation-dependent}.  
           
%%\item{67.} 
\item{6.} The following are implementation dependencies of
tracing.
\beginlist
\itemitem{a.} \macref{trace} and \macref{untrace} may accept 
\term{implementation-dependent} argument formats.  
\itemitem{b.} The format of the \macref{trace}
output is \term{implementation-dependent}.
\endlist        
\endlist        
\endsubSection%{Programming Environment}

