XLISP-PLUS: Another Object-oriented Lisp
 
 
                                May 27, 1994
 
                                  Tom Almy
                              tom.almy@tek.com
 
 
Portions of 
this manual and software are from XLISP which is Copyright (c)
1988,  by  David 
Michael  Betz,  all 
rights  reserved.  Mr. 
Betz  grants
permission for unrestricted non-commercial use. Portions
of XLISP-PLUS from
XLISP-STAT are Copyright (c) 1988, Luke Tierney. UNIXSTUF.C
is from Winterp
1.0, 
Copyright  1989  Hewlett-Packard  Company  (by  Niels 
Mayer).  Other
enhancements 
and bug fixes are  provided
without restriction  by Tom Almy,
Mikael 
Pettersson,  Neal  Holtz, 
Johnny Greenblatt,  Ken  Whedbee, 
Blake
McBride, Pete Yadlowsky, and Richard Zidlicky. See
source code for details.
 
 
 
 
 
 
Table of Contents
 
INTRODUCTION  .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .   1
 
XLISP COMMAND LOOP 
. . . . . . . . . . . . . . . . . . . . . . . . . .   2
 
BREAK COMMAND LOOP 
. . . . . . . . . . . . . . . . . . . . . . . . . .   4
 
DATA TYPES  . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .   5
 
THE EVALUATOR . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .   7
 
HOOK FUNCTIONS 
. . . . . . . . . . . . . . . . . . . . . . . . . . . .   8
 
LEXICAL CONVENTIONS . . . . . . . . . . . . . . . . .
. . . . . . . . .   9
 
8 BIT ASCII CHARACTERS  . . . . . . . . . . . . . . . . . . . . . . . .  11
 
READTABLES  . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .  12
 
SYMBOL CASE CONTROL . . . . . . . . . . . . . . . . .
. . . . . . . . .  14
 
PACKAGES  . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .  16
 
LAMBDA LISTS  .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .  17
 
OBJECTS . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .  19
 
SYMBOLS . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .  23
 
EVALUATION FUNCTIONS 
. . . . . . . . . . . . . . . . . . . . . . . . .  25
 
MULTIPLE VALUE FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . .  27
 
SYMBOL FUNCTIONS 
. . . . . . . . . . . . . . . . . . . . . . . . . . .  28
 
PACKAGE FUNCTIONS . . . . . . . . . . . . . . . . . .
. . . . . . . . .  32
 
PROPERTY LIST FUNCTIONS . . . . . . . . . . . . . . .
. . . . . . . . .  36
 
HASH TABLE FUNCTIONS 
. . . . . . . . . . . . . . . . . . . . . . . . .  37
 
ARRAY FUNCTIONS . . . . . . . . . . . . . . . . . . .
. . . . . . . . .  38
 
SEQUENCE FUNCTIONS 
. . . . . . . . . . . . . . . . . . . . . . . . . .  39
 
LIST FUNCTIONS 
. . . . . . . . . . . . . . . . . . . . . . . . . . . .  44
 
DESTRUCTIVE LIST FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . .  48
 
ARITHMETIC FUNCTIONS 
. . . . . . . . . . . . . . . . . . . . . . . . .  49
 
BITWISE LOGICAL FUNCTIONS . . . . . . . . . . . . . .
. . . . . . . . .  54
 
STRING FUNCTIONS 
. . . . . . . . . . . . . . . . . . . . . . . . . . .  55
 
CHARACTER FUNCTIONS . . . . . . . . . . . . . . . . .
. . . . . . . . .  57
 
 
 
 
XLISP 2.1g                   Table of Contents
 
 
STRUCTURE FUNCTIONS . . . . . . . . . . . . . . . . .
. . . . . . . . .  59
 
OBJECT FUNCTIONS 
. . . . . . . . . . . . . . . . . . . . . . . . . . .  61
 
PREDICATE FUNCTIONS . . . . . . . . . . . . . . . . .
. . . . . . . . .  63
 
CONTROL CONSTRUCTS 
. . . . . . . . . . . . . . . . . . . . . . . . . .  67
 
LOOPING CONSTRUCTS 
. . . . . . . . . . . . . . . . . . . . . . . . . .  70
 
THE PROGRAM FEATURE . . . . . . . . . . . . . . . . .
. . . . . . . . .  71
 
INPUT/OUTPUT FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . .  73
 
THE FORMAT FUNCTION . . . . . . . . . . . . . . . . .
. . . . . . . . .  75
 
FILE I/O FUNCTIONS 
. . . . . . . . . . . . . . . . . . . . . . . . . .  78
 
STRING STREAM FUNCTIONS . . . . . . . . . . . . . . .
. . . . . . . . .  82
 
DEBUGGING AND ERROR HANDLING FUNCTIONS  . . . . . . . . . . . . . . . .  83
 
SYSTEM FUNCTIONS 
. . . . . . . . . . . . . . . . . . . . . . . . . . .  85
 
ADDITIONAL FUNCTIONS AND UTILITIES  . . . . . . . . . . . . . . . . . .  91
 
BUG FIXES AND EXTENSIONS  . . . . . . . . . . . . . . . . . . . . . . .  95
 
EXAMPLES: FILE I/O FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . 104
 
INDEX . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . 106
 
 
 
 
XLISP 2.1g                      INTRODUCTION                         Page 1
 
 
 
 
INTRODUCTION
 
XLISP-PLUS  is
an enhanced  version of David  Michael Betz's  XLISP to have
additional 
features of Common Lisp. XLISP-PLUS is distributed for the IBM-
PC family  and
for  UNIX,  but can  be easily  ported 
to other  platforms.
Complete source code 
is provided (in "C") 
to allow easy  modification and
extension.
 
Since XLISP-PLUS is based on XLISP,  most XLISP programs will run on XLISP-
PLUS. Since XLISP-PLUS incorporates many more features
of Common Lisp, many
small 
Common  Lisp  applications  will  run   on 
XLISP-PLUS  with  little
modification. 
See  the section  starting on 
page  95 for  details 
of the
differences between XLISP and XLISP-PLUS.
 
Many  Common
Lisp functions are  built into
XLISP-PLUS.  In addition, XLISP
defines the objects 
'Object' and  'Class' as
primitives.  'Object' is  the
only  class
that  has no  superclass and  hence
is  the 
root of  the class
heirarchy tree. 'Class' is the class of which all classes
are instances (it
is the only object that is an instance of itself).
 
This 
document  is  a brief 
description  of  XLISP-PLUS. 
It assumes  some
knowledge of LISP and some understanding of the
concepts of object-oriented
programming.
 
You will probably also need a copy of "Common
Lisp: The Language" by Guy L.
Steele, Jr., published by Digital Press  to use as a reference for  some of
the Common Lisp functions that are described only
briefly in this document.
 
XLISP-PLUS has 
a number of compilation  options
to to eliminate  groups of
functions and 
to tailor itself  to various
environments.  Unless otherwise
indicated  this
manual  assumes  all options 
are  enabled and  the 
system
dependent code is as complete as that provided for the
MS/DOS  environment.
Assistance for 
using or porting XLISP-PLUS  can
be obtained  on the USENET
newsgroup 
comp.lang.lisp.x,  or by  writing to 
Tom  Almy at  the Internet
address tom.almy@tek.com. You can also reach Tom by
writing to him at 17830
SW Shasta Trail, Tualatin, OR 97062, USA.
 
 
 
 
XLISP 2.1g                   XLISP COMMAND LOOP                      Page 2
 
 
 
XLISP COMMAND LOOP
 
When XLISP is started, it first tries to load the
workspace "xlisp.wks", or
an alternative 
file  specified  with 
the "-wfilename" 
option,  from  the
current directory. If that file doesn't  exist, or the "-w" flag is in  the
command 
line,  XLISP builds  an initial 
workspace,  empty except  for the
built-in functions and symbols.
 
Then, 
providing  no workspace  file was 
loaded,   XLISP attempts  to load
"init.lsp" from a path in XLPATH or the
current directory. This file can be
modified 
to  suit  the 
user's  requirements.  It 
contains  a  number 
of
preference items.
 
If *startup-functions* is non-nil (default  is nil), it is taken as  a list
of functions with no arguments which are executed in
sequence at this time.
This allows automatically starting applications stored
in workspaces.
 
If  the
variable *load-file-arguments* is non-nil (default is "t"), it then
loads any 
files named as parameters  on the
command line  (after appending
".lsp" to their names). If the  "-v" flag is in the command
line,  then the
files are loaded verbosely. 
 
The option "-tfilename" will open a
transcript file of the name "filename".
At this time 
the top level command  loop is
entered. This  is the function
TOP-LEVEL-LOOP, by default.
 
XLISP  then
issues  the following  prompt (unless  standard input  has been
redirected):
 
>
 
This indicates that XLISP is waiting for an  expression to be typed. If the
current package is other than USER, the the package
name  is printed before
the ">".
 
When a complete 
expression has  been entered,
XLISP  attempts to  evaluate
that expression. If the expression evaluates
successfully, XLISP prints the
result and then returns for another expression.
 
The following 
control characters  can be
used  while XLISP is  waiting for
input:
 
     Backspace
delete last character
     Del       delete last character
     tab       tabs over (treated as space by XLISP
reader)
     ctrl-C   
goto top level
     ctrl-G    cleanup and return one level
     ctrl-Z    end of file (returns one level or exits
program)
     ctrl-P    proceed (continue)
     ctrl-T    print information
 
Under MS-DOS (at least) the following control
characters can be typed while
XLISP is executing (providing  standard input has not been  redirected away
from the console):
 
 
 
 
XLISP 2.1g                   XLISP COMMAND LOOP                      Page 3
 
 
     ctrl-B    BREAK -- enter break loop
     ctrl-S    Pause until another key is struck
     ctrl-C    go to top level
     ctrl-T    print information
 
Under MS-DOS if the global variable *dos-input* is set
non-NIL, DOS is used
to read entire input lines. Operation this way is
convenient if certain DOS
utilities, such as 
CED, are used, or if XLISP is 
run under an editor like
EPSILON. In 
this case, normal command  line
editing is available,  but the
control keys will not work (in particular, ctrl-C will
cause the program to
exit!). Use the XLISP 
functions top-level, clean-up, and continue  instead
of ctrl-C, ctrl-G, and ctrl-P.
 
Under MS-DOS if the 
global variable *dos-input* is NIL, a special internal
line editor is used. In this case the  last 20 lines are saved, and can  be
recalled  and
viewed using the up and  down arrow
keys. Duplicate lines are
not saved.
 
An  additional
feature  is  symbol name  lookup.  This command  takes  what
appears to be 
an incomplete  symbol name  to the 
left of  the cursor  and
prints 
all  interned  symbol 
names  that  match. 
Case  is  ignored. 
The
printnames of the symbols are printed without
processing.
 
The control keys for the editor are:
 
     Up
Arrow  Previous command in queue
     Down
Arrow          Next command in queue
     Left
Arrow          Move cursor to left
     Right
Arrow         Move cursor to right
     Home      Move cursor to start of line
     End       Move cursor to end of line
     Delete    Delete character at cursor
     Backspace
Delete character to left of cursor
     Escape    Delete current line
     Tab       Look up partial symbol name to left of
cursor
 
Characters are inserted at  the current cursor position. Lines  are limited
in length  to
the width  of the display,  and invalid keystrokes  cause the
bell to ring.
 
 
 
 
XLISP 2.1g                   BREAK COMMAND LOOP                      Page 4
 
 
 
BREAK COMMAND LOOP
 
When  XLISP
encounters an error while evaluating an expression, it attempts
to handle the error in the following way:
 
If the symbol 
'*breakenable*' is  true, the
message  corresponding to  the
error is printed. 
If the error is  correctable, the
correction  message is
printed.
 
If the symbol 
'*tracenable*' is true, a trace back 
is printed. The number
of entries printed depends  on the value  of the
symbol '*tracelimit*'.  If
this symbol is set to something other than a number,
the entire  trace back
stack is printed.
 
XLISP  then
enters a read/eval/print loop to  allow
the user to examine the
state of  the
interpreter in  the context of  the error. This  loop differs
from  the
normal top-level read/eval/print loop in that if the user invokes
the function 'continue', XLISP  will continue from a correctable  error. If
the user invokes 
the function 'clean-up', XLISP will abort  the break loop
and return to the top level or the next  lower numbered break loop. When in
a break loop, XLISP prefixes the break level to the
normal prompt.
 
If the  symbol
'*breakenable*' is NIL, XLISP looks for a surrounding errset
function. If one is 
found, XLISP examines the value of 
the print flag. If
this flag is true, the error message is printed. In
any case,  XLISP causes
the errset function call to return NIL.
 
If  there is no
surrounding errset function, XLISP prints the error message
and returns to the top level.
 
If XLISP was invoked with the command line argument
"-b" then XLISP assumes
it is running in 
batch mode. In batch  mode any
uncaught error  will cause
XLISP to exit after printing the error message.
 
 
 
 
XLISP 2.1g                       DATA TYPES                          Page 5
 
 
 
DATA TYPES
 
There are several different data types available to
XLISP-PLUS programmers.
Typical implementation limits are shown for 32
bit  word systems. Values in
square brackets apply to 16 bit MS-DOS
implementations.
 
All data nodes 
are effectively cons cells 
consisting of two  pointers and
one or two 
bytes of identification flags  (9
or 10  bytes per cell).  Node
space is managed and 
garbage collected by XLISP. Array and 
string storage
is either allocated 
by the C runtime or managed  and
garbaged collected by
XLISP (compilation option). If C  does the allocation, memory fragmentation
can  occur.
Fragmentation  can  be 
eliminated  by  saving 
the  image  and
restarting XLISP-PLUS.
 
 
˘    NIL
    
Unlike  the original  XLISP, 
NIL is  a  symbol (although  not  in the
     *obarray*),
to allowing setting its properties.
˘    lists
     Either
NIL  or a CDR-linked list of cons cells,
terminated by a symbol
     (typically
NIL). Circular lists are allowable,  but
can cause problems
     with some
functions so they must be used with care.
˘   
arrays
     The CDR
field  of an  array points to  the
dynamically allocated  data
     array,  while 
the  CAR contains  the 
integer  length  of the 
array.
     Elements
in the data array  are pointers to other
cells [Size  limited
     to about
16360].
˘   
character strings
     Implemented  like arrays,  except  string array  is 
byte indexed  and
     contains
the actual characters. Note that unlike the underlying C, the
     null
character (value 0) is valid. [Size limited to about 65500]
˘   
symbols
    
Implemented  as  a  4
element  array.  The 
elements  are value  cell,
     function  cell, property  list,  and print  name 
(a character  string
     node).
Print names are limited to 100 characters. There are also flags
     for
constant and  special. Values bound  to special symbols  (declared
     with
DEFVAR or DEFPARAMETER) are always dynamically bound, rather than
     being
lexically bound.
˘   
fixnums (integers)
     Small
integers (> -129 and <256) are statically allocated and are thus
     always  EQ integers of the  same value. The CAR field 
is used to hold
     the value,
which is a 32 bit signed integer.
˘   
ratios
     The  CAR field is used  to hold the  numerator
while the  CDR field is
     used  to hold the denominator. The numerator  is a 32 bit signed value
     while the
denominator is a 31 bit positive value.
˘   
characters
     All  characters are statically allocated and are
thus EQ characters of
     the
same  value. The CAR  field is 
used to hold  the value.  In XLISP
     characters
are "unsigned" and thus range in value from 0 to 255.
˘   
flonums (floating point numbers)
     The
CAR  and CDR fields hold  the value, which  is typically a  64 bit
     IEEE
floating point number.
 
 
 
 
XLISP 2.1g                       DATA TYPES                          Page 6
 
 
˘   
complex numbers
     Part of
the math  extension compilation option. Internally
implemented
     as an
array of  the real and imaginary parts. The
parts  can be either
     both  fixnums 
or both  flonums. Any  function 
which would  return an
     fixnum  complex number  with a  zero
imaginary  part returns  just the
     fixnum.
˘   
objects
    
Implemented  as an array of
instance variable count plus one elements.
     The first
element is the object's class, while the remaining arguments
     are the
instance variables.
˘   
streams (file)
     The  CAR and CDR fields are  used in a system dependent  way as a file
     pointer.
˘   
streams (unnamed -- string)
     Implemented
as a tconc-style list of characters.
˘    subrs
(built-in functions)
     The
CAR  field points  to the 
actual code to  execute,
while  the CDR
     field is
an internal pointer to the name of the function.
˘   
fsubrs (special forms)
     Same
implementation as subrs.
˘   
closures (user defined functions)
     Implemented
as an array of 11 elements:
     1.   name symbol or NIL
     2.   'lambda or 'macro
     3.   list of required arguments
     4.   optional 
arguments  as  list 
of  (<arg>  <init>  <specified-p>)
          triples.
     5.   &rest argument
     6.   &key 
arguments as  list  of (<key>  <arg> <init> 
<specified-p>)
          quadruples.
     7.   &aux arguments as list of (<arg>
<init>) pairs.
     8.   function body
     9.   value environment (see page 84 for format)
     10.  function environment
     11.  argument list (unprocessed)
˘   
structures
    
Implemented as  an array  with first 
element being  a pointer  to the
     structure
name  string, and the remaining elements
being the structure
     elements.
˘   
hash-tables
    
Implemented  as a  structure 
of varying  length  with no 
generalized
     accessing  functions, 
but  with   a 
special  print  function 
(print
     functions
not available for standard structures).
˘   
random-states
    
Implemented as a  structure with
a single element  which is the random
     state  (here 
a  fixnum,  but 
could  change  without 
impacting xlisp
     programs).
˘   
packages
    
Implemented using a structure. Packages must  only be manipulated with
     the
functions provided.
 
 
 
 
XLISP 2.1g                     THE EVALUATOR                         Page 7
 
 
 
THE EVALUATOR
 
The process of evaluation in XLISP:
 
Strings, 
characters, numbers  of  any type, 
objects, arrays,  structures,
streams, subrs, fsubrs and closures evaluate to
themselves.
 
Symbols  act
as  variables  and  are  evaluated 
by  retrieving  the 
value
associated with their current binding.
 
Lists  are
evaluated by  examining the first  element of the  list and then
taking one of the following actions:
 
     If it is a
symbol, the functional binding of the symbol is retrieved.
 
     If  it 
is a  lambda  expression, a  closure  is  constructed for  the
     function
described by the lambda expression.
 
     If it is a
subr, fsubr or closure, it stands for itself.
 
     Any other
value is an error.
 
Then, the value produced by the previous step is
examined:
 
     If it is a
subr or  closure, the remaining list
elements are evaluated
     and the
subr or closure is applied to these evaluated expressions.
 
     If  it is 
an  fsubr, the  fsubr 
is called  with  the remaining  list
     elements
as arguments (unevaluated).
 
     If  it is 
a macro,  the  macro is 
expanded with  the remaining  list
     elements  as 
arguments (unevaluated).  The  macro 
expansion is  then
     evaluated  in 
place  of  the 
original  macro  call. 
If  the  symbol
    
*displace-macros*   is  not  
NIL,  then   the 
expanded   macro  will
     (destructively)
replace the original macro expression. This means that
     the
macro  will only be expanded  once, but the original  code will be
     lost.  The displacement will not  take place unless  the macro expands
     into a
list. The standard XLISP practice is the macro will be expanded
     each  time 
the expression  is
evaluated,  which  negates some  of the
     advantages
of using macros.
 
 
 
 
XLISP 2.1g                     HOOK FUNCTIONS                        Page 8
 
 
 
HOOK FUNCTIONS
 
The evalhook and applyhook  facility are useful for 
implementing debugging
programs or 
just  observing the  operation 
of XLISP.  It is  possible 
to
control evaluation of forms in any context.
 
If the symbol '*evalhook*' is bound  to a function closure, then every call
of eval  will
call this  function. The  function takes two  arguements, the
form to be 
evaluated and  execution
environment. During  the execution  of
this function, *evalhook* (and *applyhook*) are
dynamically bound to NIL to
prevent undesirable recursion.  This "hook" function returns  the result of
the evaluation.
 
If the  symbol
'*applyhook*' is  bound to  a function, then  every function
application within an eval will call this
function  (note that the function
apply, and 
others which do  not use eval,
will  not invoke the  apply hook
function). The function takes  two arguments, the function closure  and the
argument list (which is  already evaluated). During execution of  this hook
function, *applyhook* 
(and *evalhook*)  are
dynamically  bound  to NIL 
to
prevent undesired recursion. This  function is to return the result  of the
function application.
 
Note that the hook functions cannot reset *evalhook*
or *applyhook* to NIL,
because 
upon  exit these  values will 
be  reset. An  excape 
mechanism is
provided -- 
execution of 'top-level', or  any
error that causes  return to
the  top level,
will unhook  the functions. Applications  should bind these
values either via 'progv', 'evalhook', or 'applyhook'.
 
The functions 'evalhook' and 'applyhook' allowed for
controlled application
of  the hook
functions. The form supplied  as an
argument to 'evalhook', or
the  function
application given to 'applyhook',  are
not hooked themselves,
but  any
subsidiary forms and  applications are. In  addition, by supplying
NIL values for the hook functions, 'evalhook' can be
used to execute a form
within a specific environment passed as an argument.
 
An additional hook function exists for the garbage
collector. If the symbol
'*gc-hook*'  is
bound to  a function,  then this 
function is  called after
every garbage collection. The function has two
arguments. The first  is the
total  number
of nodes,  and the second  is the 
number of nodes  free. The
return value is ignored. During the execution of the
function, *gc-hook* is
dynamically bound to NIL to prevent undesirable
recursion.
 
 
 
 
XLISP 2.1g                  LEXICAL CONVENTIONS                      Page 9
 
 
 
LEXICAL CONVENTIONS
 
The following conventions must be followed when
entering XLISP programs:
 
Comments in XLISP 
code begin with  a semi-colon
character and  continue to
the end of the line.
 
Except when escape sequences are used, symbol names in
XLISP can consist of
any sequence of non-blank printable characters except
the terminating macro
characters:
 
     ( ) ' ` ,
" ;
 
and the escape characters:
 
     \ |
 
In  addition,
the  first character  may not 
be '#'  (non-terminating macro
character), 
nor  may  the symbol 
have  identical  syntax 
with a  numeric
literal. Uppercase 
and lowercase  characters are
not  distinguished within
symbol 
names  because,  by default, 
lowercase  characters  are mapped 
to
uppercase on input.
 
Any printing character, including  whitespace, may be part of a symbol name
when 
escape  characters are  used. 
The  backslash escapes  the 
following
character, while multiple characters can be escaped by
placing them between
vertical bars. At 
all times the  backslash must
be  used to escape  either
escape characters.
 
For  semantic
reasons,  certain chararacter  sequences should/can  never be
used as symbols in XLISP. A  single period is used to denote dotted  lists.
The  symbol T
is also reserved  for use as the
truth  value. The symbol NIL
represents an empty list. 
 
Symbols starting with 
a colon  are keywords, and  will always evaluate  to
themselves. When the package facility is  compiled as part of XLISP, colons
have a special 
significance. Thus colons should 
not be used as  part of a
symbol name, except for these special uses.
 
Fixnum (integer) 
literals  consist  of  a
sequence  of  digits  optionally
beginning  with
a sign  ('+' or  '-'). The range  of values  an integer can
represent is 
limited by the  size of a  C 'long' on 
the machine  on which
XLISP is running. 
 
Ratio 
literals  consist  of two 
integer  literals  separated 
by a  slash
character ('/'). 
The second  number, the  denominator,  must be  positive.
Ratios  are
automatically  reduced to  their cannonical  form; if  they are
integral, then they are reduced to an integer.
 
Flonum (floating point) literals consist of a sequence
of digits optionally
beginning with a sign ('+' or '-') and including one
or both of an embedded
decimal point or 
a trailing exponent. The optional exponent  is denoted by
an  'E' or
'e'  followed by an  optional sign and  one or more  digits. The
 
 
 
 
XLISP 2.1g                  LEXICAL CONVENTIONS                     Page 10
 
 
range of values 
a floating point  number can
represent  is limited by  the
size of a C 'double' on most machines on which XLISP
is running.
 
Numeric literals cannot have  embedded escape characters. If they  do, they
are treated as symbols. Thus '12\3' is a symbol even
though it would appear
to be identical to '123'.
 
Complex literals are 
constructed using a read-macro of the format #C(r i),
where r is  the
real part and i  is the imaginary part. The  numeric fields
can  be any
valid fixnum, ratio,  or flonum literal.
If  either field has a
ratio or flonum literal, then both values are
converted  to flonums. Fixnum
complex 
literals with a zero  imaginary
part are  automatically reduced to
fixnums.
 
Character literals are handled via the #\ read-macro
construct:
 
     #\<char>       == the ASCII code of the printing
character
     #\newline      == ASCII linefeed character
     #\space        == ASCII space character
    
#\rubout       == ASCII rubout
(DEL)
     #\C-<char>     == ASCII control character
    
#\M-<char>     == ASCII
character with msb set (Meta character)
    
#\M-C-<char>   == ASCII
control character with msb set
 
 
Literal strings 
are sequences  of characters  surrounded by  double quotes
(the  "
read-macro). Within  quoted strings  the '\' 
character is  used to
allow non-printable characters to be included. The
codes
recognized are:
 
     \\        means the character '\'
     \n        means newline
     \t        means tab
     \r        means return
     \f        means form feed
     \nnn      means the character whose octal code is
nnn
 
 
 
 
XLISP 2.1g                 8 BIT ASCII CHARACTERS                   Page 11
 
 
 
8 BIT ASCII CHARACTERS
 
When  used
in  an IBM  PC environment  (or
perhaps  others), XLISP-PLUS  is
compiled  by
default to allow the full use of the IBM 8 bit ASCII character
set,  including
all characters with  diacritic marks. Note  that using such
characters will make 
programs non-portable. XLISP-PLUS can be compiled for
standard 7 bit ASCII if desired for portability.
 
When 8 bit ASCII is enabled, the following system
characteristics change:
 
Character 
codes 128 to  254 are marked  as :constituent in  the readtable.
This  means
that  any of  the new  characters  (except for 
the nonprinting
character 
255)  can be  symbol 
constituent.  Alphabetic
characters  which
appear in both cases, such  as Ç and ê,  are
considered to be  alphabetical
for  purposes
of symbol case control, while 
characters such as † that have
no coresponding upper case are not considered to be
alphabetical.
 
The 
reader  is extended  for 
the character  data  type to 
allow  all the
additional 
characters  (except  code 255) 
to  be  entered  literally, for
instance "#\Ç".  These characters are  also
printed literally,  rather than
using  the
"M-" construct. Code  255 must
still be  entered as, and will be
printed as, "#\M-Rubout".
 
Likewise strings 
do  not  need  and  will not 
use  the  backslash 
escape
mechanism for codes 128 to 254.
 
The functions alphanumericp,  alpha-char-p, upper-case-p, and 
lower-case-p
perform 
as  would be  expected on 
the  extended characters,  treating the
diacritic characters 
as their  unadorned
counterparts.  As per  the Common
Lisp definition, both-case-p will only indicate  T for characters available
in both cases.
 
 
 
 
XLISP 2.1g                       READTABLES                         Page 12
 
 
 
READTABLES
 
The  behaviour
of  the reader is  controlled by  a data  structure called a
"readtable". The reader uses  the symbol *readtable* to locate  the current
readtable. This table controls the interpretation of
input characters -- if
it is  changed
then  the section  LEXICAL 
CONVENTIONS may  not apply.  The
readtable is an array with 256 entries, one for each
of the extended  ASCII
character codes. Each entry contains one  of the following values, with the
initial entries assigned to the values indicated:
 
     :white-space        A whitespace character - tab, cr, lf,
ff, space
     (:tmacro .
fun)     terminating readmacro - ( )
" , ; ' `
     (:nmacro .
fun)     non-terminating readmacro - #
     :sescape            Single escape character - \
     :mescape            Multiple escape character - |
    
:constituent       
Indicating  a  symbol 
constituent  (all  printing
                         characters not listed above)
     NIL                 Indicating an invalid
character (everything else)
 
In the case of :TMACRO and :NMACRO, the
"fun" component is a function. This
can either  be
a built-in  readmacro function or  a lambda 
expression. The
function takes two parameters. The first is the input
stream and the second
is the character that caused the invocation of the
readmacro. The readmacro
function should return NIL to indicate that the
character should be treated
as white space 
or a value consed with  NIL to
indicate that  the readmacro
should be 
treated as an occurance  of the
specified value.  Of course, the
readmacro code is free to read additional characters
from the input stream.
A  :nmacro
is  a symbol  constituent  except
as  the first  character of  a
symbol.
 
As an  example,
the following read  macro allows the
square  brackets to be
used as a more visibly appealing alternative to the
SEND function:
 
(setf (aref *readtable* (char-int #\[)) ; #\[ table
entry
      (cons
:tmacro
           
(lambda (f c &aux ex) ; second arg is not used
                   
(do ()
                        ((eq (peek-char t f)
#\]))
                        (setf ex (append ex (list (read f)))))
                   
(read-char f) ; toss the trailing #\]
                   
(cons (cons 'send ex) NIL))))
 
(setf (aref *readtable* (char-int #\]))
      (cons
:tmacro
           
(lambda (f c)
                   
(error "misplaced right bracket"))))
 
 
 
 
XLISP 2.1g                       READTABLES                         Page 13
 
 
XLISP defines several useful read macros:
 
     '<expr>             == (quote <expr>)
     `<expr>             == (backquote <expr>)
     ,<expr>             == (comma <expr>)
     ,@<expr>            ==
(comma-at <expr>)
     #'<expr>            == (function <expr>)
     #(<expr>...)        == an array of the specified
expressions
     #S(<structtype>
[<slotname> <value>]...)
                         == structure of specified type and initial
values
     #.<expr>            == result of evaluating
<expr>
     #x<hdigits>         == a hexadecimal number (0-9,A-F)
    
#o<odigits>         == an
octal number (0-7)
     #b<bdigits>         == a binary number (0-1)
     #|  |#              == a comment
    
#:<symbol>          == an
uninterned symbol
     #C(r
i)             == a complex number
    
#+<expr>            ==
conditional on feature expression true
     #-<expr>            == conditional on feature
expression false
 
A feature expression 
is either a symbol or a list 
where the first element
is AND,  OR, or
NOT and  any remaining elements
(NOT  requires exactly one)
are  feature
expressions.  A  symbol is 
true if  it is  a member 
(by test
function  EQ)
of the list  in global variable  *FEATURES*. Init.lsp defines
one initial feature, 
:XLISP, and the  features :TIMES,
:GENERIC,  :POSFCNS
(various position 
functions), :MATH (complex math), 
:PC8 (character set),
:PACKAGES, and :MULVALS depending on  the coresponding feature having  been
compiled into the XLISP executable. Utility files
supplied with  XLISP-PLUS
generally add new features which are EQ to the keyword
made from their file
names.
 
 
 
 
XLISP 2.1g                  SYMBOL CASE CONTROL                     Page 14
 
 
 
SYMBOL CASE CONTROL
 
XLISP-PLUS  
uses  two  variables, 
*READTABLE-CASE*  and  *PRINT-CASE*  to
deturmine 
case   conversion  during 
reading  and   printing 
of  symbols.
*READTABLE-CASE* 
can  have  the 
values  :UPCASE  :DOWNCASE 
:PRESERVE  or
:INVERT, while 
*PRINT-CASE*  can  have the 
values  :UPCASE  :DOWNCASE 
or
:CAPITALIZE. By default, or when other values have
been specified, both are
:UPCASE.
 
When *READTABLE-CASE* 
is :UPCASE,  all unescaped
lowercase  characters are
converted 
to  uppercase when  read. When 
it  is :DOWNCASE,  all unescaped
uppercase 
characters are  converted to  lowercase. This  mode is  not very
useful  because
the predefined symbols are all 
uppercase and would need to
be  escaped to
read them. When *READTABLE-CASE* is :PRESERVE, no conversion
takes  place.
This allows case sensitive input with predefined functions in
uppercase. The final 
choice, :INVERT, will  invert the
case of  any symbol
that is not mixed case. This provides case sensitive
input while making the
predefined functions and variables appear to be in
lowercase.
 
The  printing
of symbols involves the settings of both *READTABLE-CASE* and
*PRINT-CASE*. When 
*READTABLE-CASE* is  :UPCASE,
lowercase  characters are
escaped (unless PRINC is used), and uppercase characters
are printed in the
case 
specified  by  *PRINT-CASE*.   When 
*READTABLE-CASE*  is  :DOWNCASE,
uppercase 
characters are escaped (unless PRINC is used), and lowercase are
printed  in the
case specified  by *PRINT-CASE*. The  *PRINT-CASE* value of
:CAPITALIZE means that the first character of the
symbol, and any character
in  the symbol
immediately following a non-alphabetical character are to be
in  uppercase,
while  all  other  alphabetical  characters 
are  to  be  in
lowercase. The remaining *READTABLE-CASE*  modes ignore *PRINT-CASE* and do
not 
escape  alphabetic
characters.  :PRESERVE  never changes  the  case of
characters while :INVERT inverts the case of any non
mixed-case symbols.
 
There are five major useful combinations of these
modes:
 
A: 
*READTABLE-CASE* :UPCASE 
*PRINT-CASE* :UPCASE
 
"Traditional" mode.  Case insensitive input;  must escape to  put lowercase
characters in symbol names. Symbols print exactly as
they are  stored, with
lowercase characters escaped when PRIN1 is used.
 
B: 
*READTABLE-CASE* :UPCASE 
*PRINT-CASE* :DOWNCASE
 
"Eyesaver" 
mode. Case  insensitive  input; must 
escape  to put  lowercase
characters in 
symbol  name. Symbols  print 
entirely in  lowercase  except
symbols escaped when lowercase characters present with
PRIN1.
 
C: 
*READTABLE-CASE* :PRESERVE
 
"Oldfashioned 
case  sensitive"  mode. 
Case  sensitive  input. 
Predefined
symbols  must
be typed in uppercase. No alpha quoting needed. Symbols print
exactly as stored.
 
 
 
 
XLISP 2.1g                  SYMBOL CASE CONTROL                     Page 15
 
 
D: 
*READTABLE-CASE* :INVERT
 
"Modern case sensitive" mode. Case sensitive
input. Predefined symbols must
be  typed in
lowercase. Alpha quoting should be avoided. Predefined symbols
print in lower case, other symbols print as they were
entered.
 
E: *READTABLE-CASE* :UPCASE  *PRINT-CASE* :CAPITALIZE
 
Like case B, except symbol names print capitalized.
 
As far as compatibility between these modes are
concerned,  data printed in
mode A can be read in A, B, C, or E. Data  printed in mode B can be read in
A,  B, D, or
E.  Data printed in mode  C can be 
read in mode C,  and if no
lowercase symbols in 
modes A, B and E as well.  Data
printed in mode D can
be read in mode D, and if no (internally) lowercase
symbols in modes  A, B,
and E as well. Data printed in  mode E can be read in modes A, B, and E. In
addition, symbols 
containing characters  requiring
quoting  are compatible
among all modes.
 
 
 
 
XLISP 2.1g                        PACKAGES                          Page 16
 
 
 
PACKAGES
 
When compiled in, XLISP-PLUS  provides the "Packages" name  hiding facility
of Common 
Lisp.  When in  use, 
there  are multiple  object 
arrays  (name
spaces). Each package 
has internal and external symbols. 
Internal symbols
can only normally be accessed while in that package,
while external symbols
can  be
imported  into the  current 
package and  used as  though they 
are
members of the current  package. There are three standard  packages, XLISP,
KEYWORD, and USER. In addition, some of the utility
programs are in package
TOOLS. 
Normally one  is  in package 
USER, which  is initally  empty. USER
imports all external symbols  from XLISP, which contains all 
the functions
and variables described in the body of this document. Symbols
which are not
imported into the current package, but are declared to
be external in their
home package, can be referenced with the syntax
"packageName:symbolName" to
identify symbol s_y_m_b_o_l_N_a_m_e_  in package p_a_c_k_a_g_e_N_a_m_e_.
Those symbols which are
internal  in
their  home package  need the 
slightly more  difficult syntax
"packageName::symbolName".
 
The KEYWORD 
package is referenced by  a
symbol name with  a leading colon.
All keywords are 
in this  package. All
keywords  are automatically  marked
external, and are interned as constants with
themselves as their values.
 
To build an application in a package (to avoid name
clashes, for instance),
use 
MAKE-PACKAGE to  create a
new  package (only  if the 
package does not
already  exist,
use  FIND-PACKAGE  to test 
first),  and then  preceed 
the
application with the IN-PACKAGE command to set
the  package. Use the EXPORT
function to 
indicate the symbols that will 
be accessable from outside the
package.
 
To  use an  application in a  package, either  use
IMPORT  to make specific
symbols 
accessable as local internal symbols, use USE-PACKAGE to make them
all accessable, or explicitly reference the symbols
with the colon syntax.
 
For the 
subtleties of the package facility, read Common Lisp the Language,
second edition.
 
 
 
 
XLISP 2.1g                      LAMBDA LISTS                        Page 17
 
 
 
LAMBDA LISTS
 
There  are
several  forms in  XLISP that 
require that  a "lambda  list" be
specified. A 
lambda list is  a definition
of  the arguments accepted  by a
function. There are four different types of arguments.
 
The  lambda
list starts with required arguments. Required arguments must be
specified in every call to the function.
 
The required 
arguments are followed  by the
&optional  arguments. Optional
arguments 
may  be  provided  or  omitted 
in  a  call.  An  initialization
expression  may
be  specified to provide  a default value  for an &optional
argument if it 
is omitted from a call. If  no
initialization expression is
specified, an omitted 
argument is initialized to NIL. It 
is also possible
to 
provide  the name  of 
a  'supplied-p' variable  that 
can  be used  to
determine 
if  a  call  provided  a 
value  for  the 
argument  or  if 
the
initialization expression  was used. If specified, 
the supplied-p variable
will be bound to 
T if a  value was specified  in the call 
and NIL if  the
default value was used.
 
The 
&optional  arguments are  followed by 
the  &rest argument.  The &rest
argument 
gets  bound  to the 
remainder  of the  argument 
list  after the
required and &optional arguments have been
removed.
 
The  &rest
argument  is  followed by  the
&key  arguments.  When a 
keyword
argument is passed to 
a function, a pair of values appears in the argument
list. The first expression in the pair should evaluate
to  a keyword symbol
(a  symbol that begins with  a ':'). The value of  the second expression is
the value of the
keyword argument. Like &optional arguments, &key arguments
can  have 
initialization  expressions  and 
supplied-p  variables.  It 
is
possible  to specify 
the keyword  to be  used in 
a  function call.  If no
keyword is specified,
the keyword obtained by adding a ':' to the beginning
of  the keyword 
argument symbol is  used. In  other words,  if the keyword
argument symbol is
'foo', the keyword will be ':foo'. 
 
If  identical 
keywords occur,  those after  the 
first are  ignored. Extra
keywords will signal
an error unless &allow-other-keys is present, in which
case the extra
keywords are ignored. Also, if the keyword :allow-other-keys
is used  in 
the  function/macro  call, 
and  has  a 
non-nil  value,  then
additional keys will
be ignored.
 
The &key
arguments  are followed  by the 
&aux variables.  These are  local
variables that are
bound during the  evaluation of the
function body. It is
possible to have
initialization expressions for the &aux variables.
 
 
 
 
XLISP 2.1g                      LAMBDA LISTS                        Page 18
 
 
Here is the complete
syntax for lambda lists:
 
     (<rarg>...
      [&optional [<oarg> |
(<oarg> [<init> [<svar>]])]...]
      [&rest <rarg>]
      [&key
       [<karg>  |  ([<karg>  | 
(<key>  <karg>)]  [<init>  [<svar>]])]  ...
     [&allow-other-keys]]
      [&aux [<aux> | (<aux>
[<init>])]...])
 
    where:
 
     <rarg>    is a required argument symbol
     <oarg>    is an &optional argument symbol
     <rarg>    is the &rest argument symbol
     <karg>    is a &key argument symbol
     <key>     is a keyword symbol (starts with ':')
     <aux>     is an auxiliary variable symbol
     <init>    is an initialization expression
     <svar>    is a supplied-p variable symbol
 
 
 
 
XLISP 2.1g                        OBJECTS                           Page 19
 
 
 
OBJECTS
 
Definitions:
 
˘    selector - a symbol used to select an
appropriate method
˘    message - a selector and a list of actual
arguments
˘    method - the code that implements a
message
 
Since XLISP was  created to provide a  simple basis for experimenting  with
object-oriented
programming,  one of the  primitive data types  included is
'object'.  In XLISP, an  object consists of  a data
structure  containing a
pointer to the
object's class as well as an array containing the  values of
the object's instance
variables.
 
Officially, there is  no way to see inside an object (look at the
values of
its instance
variables).  The only way to communicate
with  an object is by
sending it a message.
 
You  can send 
a  message to  an 
object using  the  'send' function.  This
function takes
the  object as its first  argument, the message selector  as
its  second argument (which must be a  symbol) and the message arguments as
its remaining
arguments.
 
The  'send' function  determines  the class  of 
the receiving  object  and
attempts to find a
method corresponding  to the message
selector in the set
of  messages defined for  that class. If  the message  is not found  in the
object's class
and  the class has  a super-class, the  search continues  by
looking at the
messages defined for the super-class. This process continues
from one super-class
to  the next until a method for  the message is found.
If no method is found,
an error occurs.
 
To perform a  method lookup  starting with the 
method's superclass  rather
than  the 
object's class,  use the  function 
'send-super'. This  allows a
subclass to  invoke a standard  method in its  parent
class even  though it
overrides that method
with its own specialized version.
 
When a  method is found,  the evaluator binds  the
receiving object  to the
symbol 'self' and
evaluates the method using the remaining elements  of the
original  list as 
arguments  to the  method. 
These arguments  are  always
evaluated prior to
being bound to their corresponding formal arguments. The
result of evaluating
the method becomes the result of the expression.
 
Two  objects, both classes, are  predefined: Object and  Class. Both Object
and Class  are of class  Class. The  superclass of
Class  is Object,  while
Object has no
superclass. Typical use is to create new 
classes (by sending
:new  to Class) to represent application objects.
Objects of these classes,
created by  sending :new to  the appropriate  new
class, are  subclasses of
Object. The  Object method :show  can be used 
to view the contents  of any
object.
 
 
 
 
XLISP 2.1g                        OBJECTS                           Page 20
 
 
THE 'Object' CLASS
 
Object  THE TOP OF THE CLASS HEIRARCHY
 
Messages:
 
     :show                              SHOW AN OBJECT'S INSTANCE VARIABLES
               returns   the object
 
     :class                                   RETURN THE CLASS OF AN OBJECT
               returns   the class of the object
 
     :prin1 [<stream>]                                     PRINT THE
OBJECT
               <stream>  T 
is  *terminal-io*,  NIL 
does  not  print 
(for
                         FLATSIZE
calculation), and  default is  *standard-
                         output*
               returns   the object
 
     :isnew                       THE DEFAULT OBJECT INITIALIZATION ROUTINE
               returns   the object
 
     :superclass                           GET THE SUPERCLASS OF THE OBJECT
               returns   NIL
               (Defined in classes.lsp, see
:superclass below)
 
     :ismemberof <class>                                   CLASS MEMBERSHIP
               <class>   class name
               returns   T if object member of class, else NIL
               (defined in classes.lsp)
 
     :iskindof <class>                                     CLASS
MEMBERSHIP
               <class>   class name
               returns   T 
if object member of class or subclass of class,
                         else NIL
               (defined in classes.lsp)
 
     :respondsto <sel>                                   SELECTOR
KNOWLEDGE
               <sel>     message selector
               returns   T if 
object responds  to  message selector,  else
                         NIL.
               (defined in classes.lsp)
 
     :storeon                                           READ REPRESENTATION
               returns   a list, that  when executed will create 
a copy of
                         the  object. Only  works  for  members of 
classes
                         created with
defclass.
               (defined in classes.lsp)
 
 
 
 
XLISP 2.1g                        OBJECTS                           Page 21
 
 
THE 'Class' CLASS
 
Class   THE CLASS OF ALL OBJECT CLASSES (including
itself)
 
Messages:
 
     :new                                  CREATE A NEW INSTANCE OF A CLASS
               returns   the new class object
 
     :isnew <ivars> [<cvars>
[<super>]]              INITIALIZE
A NEW CLASS
               <ivars>   the list of instance variable symbol
               <cvars>   the list of class variable symbols
               <super>   the superclass (default is Object)
               returns   the new class object
 
     :answer <msg> <fargs>
<code>                  ADD A
MESSAGE TO A CLASS
               <msg>     the message symbol
               <fargs>   the formal argument list (lambda list)
               <code>    a list of executable expressions
               returns   the object
 
     :superclass                           GET THE SUPERCLASS OF THE OBJECT
               returns   the superclass (of the class)
               (defined in classes.lsp)
 
     :messages                        GET THE LIST OF MESSAGES OF THE CLASS
               returns   association list of message selectors and
closures
                         for messages.
               (defined in classes.lsp)
 
     :storeon                                           READ REPRESENTATION
               returns   a 
list,  that when  executed 
will re-create  the
                         class and its
methods.
               (defined in classes.lsp)
 
When a new instance of
a class is created by sending the message 
':new' to
an  existing class,  the message ':isnew' 
followed by  whatever parameters
were passed  to the 
':new' message  is sent to  the newly 
created object.
Therefore, when a new
class  is created by sending ':new'
to  class 'Class'
the message ':isnew'
is sent to Class automatically. To create a new class,
a function of the
following format is used:
    (setq <newclassname> (send Class
:new <ivars> [<cvars> [<super>]]))
 
When  a new 
class  is created,  an 
optional  parameter may  be 
specified
indicating the
superclass  of the new class. If  this parameter is omitted,
the new class will be
a subclass of 'Object'. A class inherits all instance
variables,  and methods 
from its  super-class. Only  class variables  of a
method's class are
accessable.
 
 
 
 
XLISP 2.1g                        OBJECTS                           Page 22
 
 
INSTANCE VARIABLES OF
CLASS 'CLASS':
 
     MESSAGES 
-  An  association  list   of 
message  names  and 
closures
               implementing the messages.
 
     IVARS - List of names of instance
variables.
 
     CVARS - List of names of class variables.
 
     CVAL - Array of class variable values.
 
     SUPERCLASS -  The superclass  of this
class  or NIL  if no  superclass
               (only for class OBJECT).
 
     IVARCNT - instance variables in this
class (length of IVARS)
 
     IVARTOTAL  -  total   instance 
variables  for  this  
class  and  all
               superclasses of this class.
 
     PNAME - printname string for this class.
 
 
 
 
XLISP 2.1g                        SYMBOLS                           Page 23
 
 
 
SYMBOLS
 
All  values are initially NIL  unless otherwise specified.  All are special
variables unless
indicated to be constants.
 
˘    NIL - 
represents empty list  and the
boolean  value for "false".  The
     value of NIL is  NIL, and cannot be changed 
(it is a constant).  (car
     NIL) and (cdr NIL) are also defined to be
NIL.
˘    t - boolean value "true" is
constant with value t.
˘    self - 
within a method  context,
the  current object  (see page 
19),
     otherwise initially unbound.
˘    object - constant, value is the class
'Object.'
˘    class - constant, value is the class
'Class'.
˘    internal-time-units-per-second  - integer constant  to divide returned
     times by to get time in seconds.
˘    pi - floating  point aproximation  of pi
(constant  defined when  math
     extension is compiled).
˘    *obarray* - the  object hash table. Length 
of array is  a compilation
     option. Objects are hashed using the hash
function and are placed on a
     list in the appropriate array slot. This
variable does note exist when
     the package feature is compiled in.
˘    *package* 
- the current  package. Do
not  alter. Part of  the package
     feature.
˘    *terminal-io* - stream bound to keyboard
and display. Do not alter.
˘    *standard-input*  - the  standard  input stream,  initially stdin.  If
     stdin is not  redirected on  the command
line,  then *terminal-io*  is
     used so that all interactive i/o uses the
same stream.
˘    *standard-output* -  the standard output stream,  initially stdout. If
     stdout is not  redirected on  the command
line  then *terminal-io*  is
     used so that all interactive i/o uses the
same stream.
˘    *error-output* - the error output stream
(used by all error messages),
     initially same as *terminal-io*.
˘    *trace-output* - the trace output stream
(used by the trace function),
     initially same as *terminal-io*.
˘    *debug-io*   -  the  break  
loop  i/o   stream, 
initially   same  as
     *terminal-io*. System messages  (other than error messages) also print
     out on this stream.
˘    *breakenable* -  flag controlling entering 
break loop on  errors (see
     page 4)
˘    *tracelist* -  list of names  of
functions to  trace, as set  by trace
     function.
˘    *tracenable* - enable trace back printout
on errors (see page 4).
˘    *tracelimit*  - number of levels  of
trace back  information (see page
     4).
˘    *evalhook* - user substitute  for the evaluator function (see  page 8,
     and evalhook and applyhook functions).
˘    *applyhook* -  user substitute for 
function application (see  page
8,
     and evalhook and applyhook functions).
˘    *readtable* - the current readtable (see
page 12).
˘    *gc-flag* 
- controls  the printing  of gc 
messages. When  non-NIL, a
     message 
is printed  after each  garbage collection  giving  the total
     number of nodes and the number of nodes
free.
˘    *gc-hook* - function to call after garbage
collection (see page 8).
 
 
 
 
XLISP 2.1g                        SYMBOLS                           Page 24
 
 
˘    *integer-format* - format for  printing integers (when not bound  to a
     string, defaults to "%d" or
"%ld" depending on implementation)
˘    *ratio-format*  -  format for  printing ratios  (when  not bound  to a
     string, defaults to "%d/%d" or
"%ld/%ld" depending on implementation)
˘    *float-format*  -  format for  printing floats  (when  not bound  to a
     string, defaults to "%g")
˘    *readtable-case*  - symbol  read  and output 
case.  See page  14 
for
     details
˘    *print-case*  -  symbol output  case when 
printing.  See page  14 for
     details
˘    *print-level* - When bound to a number,
list levels  beyond this value
     are printed as '#'. Used by all printing
functions. Good precaution to
     avoid getting caught in circular lists.
˘    *print-length* - When bound  to a number, lists longer than this value
     are 
printed as '...'. Used by all printing functions. Good precaution
     to avoid getting caught in circular
lists.
˘    *dos-input* - When not NIL, uses dos line
input function for read (see
     page 3).
˘    *displace-macros*  - 
When  not  NIL, 
macros  are  replaced 
by their
     expansions when exectuted (see page 7).
˘    *random-state* - the default random-state
used by the random function.
˘    *features* - list of features, initially
(:xlisp), used for  #+ and #-
     reader macros.
˘    *startup-functions*  - list of functions to be executed when
workspace
     started
˘    *command-line* -  the xlisp  command
line,  in the form  of a 
list of
     strings, one string per argument.
˘    *load-file-arguments* - When  not NIL, file  arguements are loaded  at
     startup.
˘    *top-level-loop* - Top  level loop to utilize,  defaults to TOP-LEVEL-
     LOOP. Note that this function can  only be restarted by executing TOP-
     LEVEL, and it never exits.
˘    *read-suppress* -  When not 
NIL, inhibits certain  parts of  reading.
     Used by the #+ and #- macroes.
 
There are  several 
symbols maintained  by  the read/eval/print  loop. 
The
symbols  '+', '++', 
and '+++'  are bound  to the 
most recent  three input
expressions. The
symbols  '*', '**' and '***' are
bound  to the most recent
three results.
The  symbol '-' is  bound to the expression  currently being
evaluated. It becomes
the value of '+' at the end of the evaluation.
 
 
 
 
XLISP 2.1g                  EVALUATION FUNCTIONS                    Page 25
 
 
 
EVALUATION FUNCTIONS
 
(eval
<expr>)                                 
EVALUATE AN XLISP EXPRESSION
     <expr>    the expression to be evaluated
     returns  
the result of evaluating the expression
 
(apply <fun>
<arg>...<args>)        APPLY
A FUNCTION TO A LIST OF ARGUMENTS
     <fun>     the function to apply (or function symbol). May not be macro
               or fsubr.
     <arg>     initial arguments, which are CONSed to...
     <args>    the argument list
     returns  
the result of applying the function to the arguments
 
(funcall <fun>
<arg>...)                     CALL
A FUNCTION WITH ARGUMENTS
     <fun>     the  function to call
(or function symbol). May not be macro
               or fsubr.
     <arg>     arguments to pass to the function
     returns  
the result of calling the function with the arguments
 
(quote
<expr>)                            
RETURN AN EXPRESSION UNEVALUATED
     fsubr
     <expr>    the expression to be quoted (quoted)
     returns  
<expr> unevaluated
 
(function
<expr>)                        
GET THE FUNCTIONAL INTERPRETATION
     fsubr
     <expr>    the symbol or lambda expression (quoted)
     returns  
the functional interpretation
 
(complement
<fun>)                           
MAKE A COMPLEMENTARY FUNCTION
     This 
function is intended to eliminate the need for -IF-NOT functions
     and :TEST-NOT keys by providing a way to
make complementary functions.
     <fun>     the function or closure (not macro or fsubr)
     returns  
a new function closure that returns NOT of the result of the
               original function.
 
(identity
<expr>)                                     RETURN THE
EXPRESSION
     <expr>    the expression
     returns  
the expression
 
(backquote
<expr>)                                       FILL IN A TEMPLATE
     fsubr. Note: an improved backquote
facility, which works properly when
     nested, is available by loading the file
backquot.lsp.
     <expr>    the template (quoted)
     returns  
a copy  of the template with
comma  and comma-at expressions
               expanded.
 
(comma
<expr>)                               
             COMMA EXPRESSION
     (Never 
executed)  As  the 
object  of  a 
backquote   expansion,  the
     expression is evaluated and becomes an
object in the enclosing list.
 
 
 
 
XLISP 2.1g                  EVALUATION FUNCTIONS                    Page 26
 
 
(comma-at
<expr>)                                       COMMA-AT EXPRESSION
     (Never 
executed)   As  the 
object  of  a 
backquote  expansion,  the
     expression is  evaluated (and  must
evaluate  to a  list) and is  then
     spliced into the enclosing list.
 
(lambda <args>
<expr>...)                          
MAKE A FUNCTION CLOSURE
     fsubr
     <args>    formal argument list (lambda list) (quoted)
     <expr>    expressions of the function body (quoted)
     returns  
the function closure
 
(get-lambda-expression
<closure>)                 GET THE
LAMBDA EXPRESSION
     <closure> the closure
     returns  
the original  lambda expression,
or  NIL if  not a  closure.
               Second return  value 
is  T  if  closure  has 
a  non-global
               environment, and the third  return value is the name  of the
               closure.
 
(macroexpand
<form>)                        
RECURSIVELY EXPAND MACRO CALLS
     <form>    the form to expand
     returns  
the macro expansion
 
(macroexpand-1
<form>)                                 
EXPAND A MACRO CALL
     <form>    the macro call form
     returns  
the macro expansion
 
 
 
 
XLISP 2.1g                MULTIPLE VALUE FUNCTIONS                  Page 27
 
 
 
MULTIPLE VALUE
FUNCTIONS
 
XLISP-PLUS supports
multiple return values (via a compilation option) as in
Common Lisp. Note  that most 
FSUBR control structure 
functions will  pass
back multiple return
values, with the exceptions being PROG1 and PROG2.
 
(multiple-value-bind
<varlist> <vform> [<form>...])
                                      BIND
RETURN VALUES INTO LOCAL CONTEXT
     defined as macro in common.lsp
     <vform>   form to be evaluated
     <varlist> list of variables to bind
to return values of vform
     <form>    forms  evaluated   sequentially,  as  in  LET, 
using  local
               bindings
     returns  
values of last form evaluated, or NIL if no forms
 
(multiple-value-call
<fun> <form> ...)    COLLECT
VALUES AND APPLY FUNCTION
     fsubr
     <fun>     function to apply
     <form>    forms, which are evaluated, with result values collected
     returns  
result of applying fun to all of 
the returned values of the
               forms
 
(multiple-value-list
<form>)   COLLECT MULTIPLE
RETURNED VALUES INTO A LIST
     defined as macro in common.lsp
     <form>    form to be evaluated
     returns  
list of returned values
 
(multiple-value-prog1
<form> [<form> ...])     
RETURN VALUES OF FIRST FORM
     fsubr
     <form>    one or more forms, which are evaluated sequentially
     returns  
the result values of the first form
 
(multiple-value-setq
<varlist> <form>)      BIND
RETURN VALUES TO VARIABLES
     defined as macro in common.lsp
     <form>    form to be evaluated
     <varlist> list of variables to bind
to return values of form
     returns  
(undefined, implementation dependent)
 
(nth-value
<index> <form>)                           EXTRACT A RETURN VALUE
     fsubr
     <index>   index into return values
     <form>    form which gets evaluated
     returns  
the nth result value of exectuing the form
 
(values
[<expr>])                                    RETURN MULTIPLE VALUES
     <expr>    expression(s) to be evaluated
     returns  
each argument as a separate value
 
(values-list
<list>)                      
RETURN MULTIPLE VALUES FROM LIST
     defined in common.lsp
     <list>    a list
     returns  
each list element as a separate value
 
 
 
 
XLISP 2.1g                    SYMBOL FUNCTIONS                      Page 28
 
 
 
SYMBOL FUNCTIONS
 
(set <sym>
<expr>)                        
SET THE GLOBAL VALUE OF A SYMBOL
     <sym>     the symbol being set
     <expr>    the new value
     returns  
the new value
 
(setq [<sym>
<expr>]...)                         
SET THE VALUE OF A SYMBOL
     fsubr
     <sym>     the symbol being set (quoted)
     <expr>    the new value
     returns  
the last new value or NIL if no arguments
 
(psetq [<sym>
<expr>]...)                         
PARALLEL VERSION OF SETQ
     fsubr. All  expressions are evaluated before 
any assignments are
     made.
     <sym>     the symbol being set (quoted)
     <expr>    the new value
     returns  
NIL
 
(setf [<place>
<expr>]...)                        
SET THE VALUE OF A FIELD
     fsubr
     <place> the field specifier  (if a macro it is expanded, then the form
             arguments are evaluated):
             <sym>                 set value of a symbol
             (car <expr>)          set car of a cons node
             (cdr <expr>)          set cdr of a cons node
             (nth <n> <expr>)      set nth car of a list
             (aref <expr>
<n>)     set nth element of an
array or string
             (elt <expr> <n>)      set nth element of a sequence
             (get <sym> <prop>
[<dflt>])     set   value  
of  a   symbol's
                                             property
             (getf <pl> <prop>
[<dflt>])     set value of a  property. <pl>
                                            
must   be    a  
valid   field
                                            
specifier.
             (symbol-value <sym>)  set global value of a symbol
             (symbol-function
<sym>)         set  functional  
value  of  a
                                            
symbol
             (symbol-plist <sym>)  set property list of a symbol
             (gethash <key> <tbl> <def>)     add 
or   replace  hash 
table
             entry. <def> is ignored
             (send <obj>
:<ivar>)  (When  classes.lsp 
used), set  instance
                                   variable of
object.
             (<sym>-<element>
<struct>)      set  the element 
of structure
                                            
struct, type sym.
             (<fieldsym>
<args>)   the function stored  in property 
*setf*
                                   in  symbol 
<fieldsym>  is   applied 
to
                                  
(<args> <expr>). As an 
alternative, the
                                  
function     stored      in    
property
                                  
*setf-lambda*    is  applied, 
then  the
                                   result is
evaled in the current context.
     <expr>  the new value
     returns the last new value, or NIL if no
arguments
 
 
 
 
XLISP 2.1g                    SYMBOL FUNCTIONS                      Page 29
 
 
(psetf [<place>
<expr>]...)                        PARALLEL VERSION OF SETF
     fsubr. All  expressions are evaluated 
and macro place  forms expanded
     before any assignments are made.
     <place>   the field specifier (see SETF, above)
     <expr>    the new value
     returns  
NIL
 
(defsetf <sym>
<fcn>)                        
DEFINE A SETF FIELD SPECIFIER
(defsetf <sym>
<fargs> (<value>) <expr>...)
     Defined 
as macro  in common.lsp.  Convenient, Common  Lisp compatible
     alternative to setting *setf* or
*setf-lambda* property directly.
     <sym>     field specifier symbol (quoted)
     <fcn>     function  to  use 
(quoted  symbol)  which 
takes  the  same
               arguments as the field
specifier plus an additional argument
               for the value. The value must
be returned.
     <fargs>   formal argument list of unevaluated arguments (lambda  list)
               (quoted)
     <value>   symbol bound to value to store (quoted).
     <expr>    The last expression 
must an expression  to evaluate
in  the
               setf  context.In
this  respect, defsetf  works like 
a macro
               definition.
     returns  
the field specifier symbol
 
(push  <expr> <place>)                                      CONS TO
A FIELD
     Defined as macro  in common.lsp. Only  evaluates place form  arguments
     one time. It is recommended that
*displace-macros* be non-NIL for best
     performance.
     <place>   field specifier being modified (see setf)
     <expr>    value to cons to field
     returns  
the new value which is (CONS <expr> <place>)
 
(pushnew <expr>
<place> &key :test :test-not :key)      CONS NEW TO A FIELD
     Defined 
as macro in  common.lsp. Only
evaluates  place form arguments
     one time. It is recommended that
*displace-macros* be non-NIL for best
     performance.
     <place>   field specifier being modified (see setf)
     <expr>    value to cons to field, if not already MEMBER of field
     :test    
the test function (defaults to eql)
     :test-not the test function (sense
inverted)
     :key     
function to  apply to test
function  list argument (defaults
               to identity)
     returns  
the new value which is (CONS <expr> <place>) or
<place>
 
(pop
<place>)                              
REMOVE FIRST ELEMENT OF A FIELD
     Defined 
as macro in  common.lsp. Only
evaluates  place form arguments
     one time. It is recommended that
*displace-macros* be non-NIL for best
     performance.
     <place>   the field being modified (see setf)
     returns  
(CAR <place>), field changed to (CDR <place>)
 
 
 
 
XLISP 2.1g                    SYMBOL FUNCTIONS                      Page 30
 
 
(incf <place>
[<value>])                                  INCREMENT A FIELD
(decf <place>
[<value>])                                  DECREMENT A FIELD
     Defined as  macro in common.lsp.  Only
evaluates place  form arguments
     one time. It is recommended that
*displace-macros* be non-NIL for best
     performance.
     <place>   field specifier being modified (see setf)
     <value>   Numeric value (default 1)
     returns  
the new value  which is  (+ <place> <value>)  or (- 
<place>
               <value>)
 
(defun <sym>
<fargs> <expr>...)                           DEFINE A FUNCTION
(defmacro <sym>
<fargs> <expr>...)                           DEFINE A MACRO
     fsubr
     <sym>     symbol being defined (quoted)
     <fargs>   formal argument list (lambda list) (quoted)
     <expr>    expressions constituting the body of the function (quoted)
     returns  
the function symbol
 
(gensym
[<tag>])                                          GENERATE A
SYMBOL
     <tag>     string or number
     returns  
the new symbol, uninterned
 
(intern <pname>
[<package>])                       
MAKE AN INTERNED SYMBOL
     <pname>   the symbol's print name string
     <package> the package (defaults to
current package)
     returns  
the new symbol.  A second value
is returned which  is NIL if
               the symbol did not pre-exist,
:internal if it is an internal
               symbol, :external if it is an
external symbol, or :inherited
               if it inherited via
USE-PACKAGE.
 
(make-symbol
<pname>)                            
MAKE AN UNINTERNED SYMBOL
     <pname>   the symbol's print name string
     returns  
the new symbol
 
(symbol-name
<sym>)                         
GET THE PRINT NAME OF A SYMBOL
     <sym>     the symbol
     returns  
the symbol's print name
 
(symbol-value
<sym>)                             
GET THE VALUE OF A SYMBOL
     <sym>     the symbol
     returns  
the symbol's value
 
(symbol-function
<sym>)                GET THE
FUNCTIONAL VALUE OF A SYMBOL
     <sym>     the symbol
     returns  
the symbol's functional value
 
(symbol-plist
<sym>)                      GET
THE PROPERTY LIST OF A SYMBOL
     <sym>     the symbol
     returns  
the symbol's property list
 
(hash <expr>
<n>)                                   
COMPUTE THE HASH INDEX
     <expr>    the object to hash
     <n>       the table size (positive integer)
     returns  
the hash index (integer 0 to n-1)
 
 
 
 
XLISP 2.1g                    SYMBOL FUNCTIONS                      Page 31
 
 
(makunbound
<sym>)                          
MAKE A SYMBOL VALUE BE UNBOUND
     You cannot unbind constants.
     <sym>     the symbol
     returns  
the symbol
 
(fmakunbound
<sym>)                       MAKE
A SYMBOL FUNCTION BE UNBOUND
     <sym>     the symbol
     returns  
the symbol
 
(unintern <sym>
[<package>])                             
UNINTERN A SYMBOL
     Defined in common.lsp if package feature
not compiled.
     <sym>     the symbol
     <package> the package to look in
for the symbol
     returns  
t if successful, NIL if symbol not interned
 
(defconstant
<sym> <val> [<comment>])                     DEFINE A CONSTANT
     fsubr.
     <sym>     the symbol
     <val>     the value
     <comment> optional comment string
(ignored)
     returns  
the value
 
(defparameter
<sym> <val> [<comment>])                   DEFINE A PARAMETER
     fsubr.
     <sym>     the symbol
     <val>     the value
     <comment> optional comment string
(ignored)
     returns  
the value
 
(defvar <sym>
[<val> [<comment>]])                        DEFINE A VARIABLE
     fsubr. Variable only initialized if not
previously defined.
     <sym>     the symbol
     <val>     the initial value, or NIL if absent.
     <comment> optional comment string
(ignored)
     returns  
the current value
 
(mark-as-special
<sym> [<flag>])                      SET SPECIAL ATTRIBUTE
     Also see definition of PROCLAIM and
DECLARE.
     <sym>     symbol to mark
     <flag>    non-nil to make into a constant
     returns  
nil,  with  symbol 
marked  as  special 
and  possibly as  a
               constant.
 
(declare
[<declaration> ...])                  
DECLARE ARGUMENT ATTRIBUTES
     Macro 
in  common.lsp  provided 
to  assist  in 
porting  Common  Lisp
     applications to XLISP-PLUS.
     <declaration>       list of local variable and attributes
     returns  
nil, produces an error message if attribute SPECIAL is used.
 
(proclaim
<proc>)                        
PROCLAIM GLOBAL SYMBOL ATTRIBUTES
     Function in  common.lsp  provided
to  assist  in porting  Common  Lisp
     applications to XLISP-PLUS.
     <proc>    a list of  symbols. If
the CAR of the  list is SPECIAL, then
               the remaining symbols are
marked as special variables.
 
 
 
 
XLISP 2.1g                   PACKAGE FUNCTIONS                      Page 32
 
 
 
PACKAGE FUNCTIONS
 
These  functions 
are defined  when the  packages 
option is  compiled. The
<package>
argument can be either  a string,
symbol, or package object.  The
default  when 
no package  is given  is the 
current  package (as  bound to
*package*),  unless otherwise  specified in  the
definition.  The <symbols>
argument  may be either a  single symbol or  a list
of symbols.  In case of
name conflicts, a
correctable error occurs.
 
(apropos
<string> [<package>])                SEARCH SYMBOLS FOR NAME MATCH
(apropos-list
<string> [<package>])
     Functions in common.lsp.
     <string>  find symbols which contain this string as substring of print
               name
     <package> package to search, if
absent, or NIL, search all packages
     returns  
apropos-list returns  list of
symbols, apropos  prints them,
               along with some information,
and returns nothing.
 
(defpackage
<package> [<option>...])                   (RE)DEFINE A PACKAGE
     Macro in common.lsp. Use to define a
package, or redefine a package.
     <package> the name of the package
to (re)define
     <option>  any one or more of the following, none evaluated, applied in
               this order:
     (:shadow <symbol>...)
               one or more symbols to shadow,
as in function SHADOW
     (:shadowing-import-from
<symbol>...)
               one   or   more   symbols  
to  shadow,   as  
in   function
               SHADOWING-IMPORT
     (:use <package>...)
               one or more packages to
"use", as in function USE-PACKAGE
     (:import-from <package>
<symbol>...)
               one  or more  symbols  to import 
from  the package,  as 
in
               function IMPORT
     (:intern <symbol>...)
               one  or  more  symbols to 
be  located  or 
created in  this
               package, as in function INTERN
     (:export <symbol>...)
               one or more symbols to be
exported from this package,  as in
               function EXPORT
     returns  
the new or redefined package
 
(delete-package
<package>)                                 DELETE A PACKAGE
     Deletes 
a package  by uninterning  all its 
symbols and  removing the
     package.
     <package> package to delete
     returns  
T if successful
 
 
 
 
XLISP 2.1g                   PACKAGE FUNCTIONS                      Page 33
 
 
(do-symbols
(<var> [<package> [<result>]]) <expr>...)) ITERATE OVER
SYMBOLS
(do-external-symbols
(<var> [<package> [<result>]]) <expr>...)
(do-all-symbols
(<var> [<result>]) <expr>...)
     Implemented  as macros  in  common.lsp. DO-SYMBOLS  iterates over  all
     symbols in  a single  package,
DO-EXTERNAL-SYMBOLS iterates  only over
     the 
external symbols, and DO-ALL-SYMBOLS iterates over all symbols in
     all packages.
     <var>     variable to bind to symbol
     <package> the package to search
     <result>  a single result form
     <expr>    expressions to evaluate (implicit tag-body)
     returns  
result of result form, or NIL if not specified
 
(export
<symbols> [<package>])                     DECLARE EXTERNAL SYMBOLS
     <symbols> symbols to declare as
external
     <package> package symbol is in
     returns  
T
 
(find-all-symbols
<string>)                FIND SYMBOLS
WITH SPECIFIED NAME
     <string>  string or symbol (if latter, print name string is used)
     returns  
list of all symbols having that print-name
 
(find-package
<package>)                   FIND
PACKAGE WITH SPECIFIED NAME
     <package> package to find
     returns  
package with name or nickname <package>, or NIL if not found
 
(find-symbol
<string> [<package>])                         LOOK UP A SYMBOL
     <string>  print name to search for
     <package> package to search in
     returns  
two values, the first being the symbol, and the second being
               :internal  if 
the  symbol   is 
internal  in  the 
package,
               :external  if 
it  is  external,  or  :inherited 
if  it  is
               inherited via USE-PACKAGE. If
the symbol was not found, then
               both return values are NIL.
 
(import
<symbols> [<package>])                IMPORT SYMBOLS INTO A PACKAGE
     <symbols> symbols to import (fully
qualified names)
     <package> package to import symbols
into
     returns   T
 
(in-package
<package>)                                  SET CURRENT PACKAGE
     FSUBR which sets the current package
until next call or end of current
     LOAD.
     <package> the package to enter
     returns  
the package
 
(list-all-packages)                                   GET ALL
PACKAGE NAMES
     returns  
list of all currently existing packages
 
(make-package
<package> &key :nicknames :use)            MAKE A NEW PACKAGE
     <package> name of new package to
create
     :nicknames          list of package
nicknames
     :use     
list of packages to use (as in USE-PACKAGE)
     returns  
the new package
 
 
 
 
XLISP 2.1g                   PACKAGE FUNCTIONS                      Page 34
 
 
(package-name
<package>)                           
GET PACKAGE NAME STRING
     <package> package name
     returns  
package name string
 
(package-nicknames
<package>)                  GET
PACKAGE NICKNAME STRINGS
     <package> package name
     returns  
list of package nickname strings
 
(package-obarray
<package> [<external>])                     GET AN OBARRAY
     <package> package to use
     <external>          non-nil  for  external   obarray, 
else   internal
                         obarray (default)
     returns  
the obarray (array of lists of symbols in package)
 
(package-shadowing-symbols
<package>)         GET LIST OF
SHADOWING SYMBOLS
     <package> the package
     returns  
list of shadowing symbols in package
 
(package-use-list
<package>)                 GET
PACKAGES USED BY A PACKAGE
    
<package> the package
     returns  
list of packages used by this package (as in USE-PACKAGE)
 
(package-used-by-list
<package>)         GET PACKAGES
THAT USE THIS PACKAGE
     <package> the package
     returns  
list of packages that use this package (as in USE-PACKAGE)
 
(package-valid-p
<package>)                        
IS THIS A GOOD PACKAGE?
     <package> object to check
     returns  
T if a valid package, else NIL
 
(rename-package
<package> <new> [<nick>])                  RENAME A PACKAGE
     <package> original package
     <new>     new package name (may be same as original name)
     <nick>    list of new package nicknames
     returns  
the new package
 
(shadow
<symbols> [<package>])                       MAKE SHADOWING SYMBOLS
     If a symbol is not already in  the package, it is interned. The symbol
     is placed in the shadowing symbols list
for the package.
     <symbols> the symbol or symbols to
shadow
     <package> package to put symbols in
     returns  
T
 
(shadowing-import
<symbols> [<package>])         
IMPORT SYMBOLS AND SHADOW
     If a 
symbol exists in the package, it is first uninterned. The symbol
     is imported, and then made shadowing.
     <symbols> the symbol or symbols to
import and shadow
     <package> package to put symbols in
     returns  
T
 
(symbol-package
<symbol>)                     
FIND THE PACKAGE OF A SYMBOL
     <symbol>  the symbol
     returns  
the home package of the symbol, or NIL if none
 
 
 
 
XLISP 2.1g                   PACKAGE FUNCTIONS                      Page 35
 
 
(unexport
<symbols> [<package>])          
MAKE SYMBOLS INTERNAL TO PACKAGE
     <symbols> symbol or symbols to make
internal
     <package> package for symbols
     returns  
T
 
(unuse-package
<pkgs> [<package>])           
REMOVE PACKAGES FROM USE LIST
     <pkgs>    A single package or list of packages
     <package> Package  in which 
to  un-use packages  (default is 
current
               package)
     returns  
T
 
(use-package
<pkgs> [<package>])                   ADD PACKAGES TO USE LIST
     <pkgs>    A single package or list of packages
     <package> Package  in which 
to  use packages  in (default 
is current
               package)
     returns  
T
 
 
 
 
XLISP 2.1g                PROPERTY LIST FUNCTIONS                   Page 36
 
 
 
PROPERTY LIST
FUNCTIONS
 
Note that property
names are not limited to symbols. All functions handle a
symbol's property  lists 
except for  GETF  and REMF 
which work  with  any
property list.
 
(get <sym>
<prop> [<dflt>])           
GET THE VALUE OF A SYMBOL'S PROPERTY
     Use SETF with GET to add or change
properties.
     <sym>     the symbol
     <prop>    the property name
     <dflt>    value to return if property not found, default is NIL
     returns  
the property value or <dflt> if property doesn't exist.
 
(getf <place>
<prop> [<dflt>])                 
GET THE VALUE OF A PROPERTY
     Use SETF with GETF to add or change  properties. (NOTE--when used with
     SETF, 
<place> must  be a
valid  place form.  It gets 
executed twice,
     contrary to Common Lisp standard.)
     <place>   where the property list is stored
     <prop>    the property name
     <dflt>    value to return if property not found, default is NIL
     returns  
the property value or <dflt> if property doesn't exist.
 
(putprop <sym>
<val> <prop>)            PUT
A PROPERTY ONTO A PROPERTY LIST
     Modern practice is to use (SETF
(GET...)...) rather than PUTPROP.
     <sym>     the symbol
     <val>     the property value
     <prop>    the property name
     returns  
the property value
 
(remf <place>
<prop>)                                     DELETE A PROPERTY
     Defined as a macro in COMMON.LSP
     <place>   where the property list is stored
     <prop>    the property name
     returns  
T if property existed, else NIL
 
(remprop <sym>
<prop>)                          
DELETE A SYMBOL'S PROPERTY
     <sym>     the symbol
     <prop>    the property name
     returns  
NIL
 
 
 
 
XLISP 2.1g                  HASH TABLE FUNCTIONS                    Page 37
 
 
 
HASH TABLE FUNCTIONS
 
A hash table is
implemented as an structure of type 
hash-table. No general
accessing functions
are provided, and hash tables print out using the angle
bracket  convention 
(not  readable by  READ). 
The  first  element is 
the
comparison
function.  The remaining  elements contain association  lists of
keys (that hash to the
same value) and their data.
 
(make-hash-table
&key :size :test)                       
MAKE A HASH TABLE
     :size    
size  of hash table --
should  be a prime number. Default is
               31.
     :test    
comparison function. Defaults to eql.
     returns  
the hash table
 
(gethash <key>
<table> [<def>])                     EXTRACT FROM HASH TABLE
     See also gethash in SETF.
     <key>     hash key
     <table>   hash table
     <def>     value to return on no match (default is NIL)
     returns  
associated data, if found, or <def> if not found.
 
(remhash <key>
<table>)                             
DELETE FROM HASH TABLE
     <key>     hash key
     <table>   hash table
     returns  
T if deleted, NIL if not in table
 
(clrhash
<table>)                                      CLEAR THE HASH TABLE
     <table>   hash table
     returns  
NIL, all entries cleared from table
 
(hash-table-count
<table>)                  NUMBER
OF ENTRIES IN HASH TABLE
     <table>   hash table
     returns  
integer number of entries in table
 
(maphash <fcn>
<table>)                     MAP
FUNCTION OVER TABLE ENTRIES
     <fcn>     the function or function name, a function of two  arguments,
               the first is  bound to the key, and the  second the value of
               each table entry in turn.
     <table>   hash table
     returns  
NIL
 
 
 
 
XLISP 2.1g                    ARRAY FUNCTIONS                       Page 38
 
 
 
ARRAY FUNCTIONS
 
Note that sequence
functions also work on arrays.
 
(aref <array>
<n>)                          GET
THE NTH ELEMENT OF AN ARRAY
     See setf for setting elements of arrays
     <array>   the array (or string)
     <n>       the array index (integer, zero based)
     returns  
the value of the array element
 
(make-array
<size> &key :initial-element :initial-contents)  MAKE A NEW ARRAY
     <size>    the size of the new array (integer)
     :initial-element
               value to initialize all array
elements, default NIL
     :initial-contents
               sequence used to
initialize  all array elements,
consecutive
               sequence  elements 
are used  for  each 
array element.  The
               length  of the sequence must be the  same as the size of the
               array
     returns  
the new array
 
(vector
<expr>...)                              
MAKE AN INITIALIZED VECTOR
     <expr>    the vector elements
     returns  
the new vector
 
 
 
 
XLISP 2.1g                   SEQUENCE FUNCTIONS                     Page 39
 
 
 
SEQUENCE FUNCTIONS
 
These functions work
on sequences -- lists, arrays, or strings.
 
(concatenate
<type> <expr> ...)                       CONCATENATE SEQUENCES
     If result type is string, sequences must
contain only characters.
     <type>    result type, one of CONS, LIST, ARRAY, or STRING
     <expr>    zero or more sequences to concatenate
     returns  
a  sequence  which is 
the  concatenation  of the 
arguement
               sequences
 
(elt <expr>
<n>)                          GET
THE NTH ELEMENT OF A SEQUENCE
     <expr>    the sequence
     <n>       the index of element to return
     returns  
the element if the index is in bounds, otherwise error
 
(map <type>
<fcn> <expr> ...)        
APPLY FUNCTION TO SUCCESSIVE ELEMENTS
(map-into
<target> <fcn> [<expr> ...])
     <type>    result type, one of CONS, LIST, ARRAY, STRING, or NIL
     <target>  destination sequence to modify
     <fcn>     the function or function name
     <expr>    a sequence for each argument of the function
     returns  
a  new sequence  of type 
<type> for  MAP, and  <target> for
               MAP-INTO.
 
(every <fcn>
<expr> ...)             APPLY
FUNCTION TO ELEMENTS UNTIL FALSE
(notevery <fcn>
<expr> ...)
     <fcn>     the function or function name
     <expr>    a sequence for each argument of the function
     returns  
every returns last evaluated function result
               notevery returns T if  there is a NIL function  result, else
               NIL
 
(some <fcn>
<expr> ...)               APPLY
FUNCTION TO ELEMENTS UNTIL TRUE
(notany <fcn>
<expr> ...)
     <fcn>     the function or function name
     <expr>    a sequence for each argument of the function
     returns  
some returns first non-NIL function result, or NIL
               notany returns NIL 
if there is  a non-NIL
function  result,
               else T
 
(length
<expr>)                              
FIND THE LENGTH OF A SEQUENCE
     Note that a circular list causes  an error. To detect a circular list,
     use LIST-LENGTH.
     <expr>    the list, vector or string
     returns  
the length of the list, vector or string
 
(reverse
<expr>)                                         REVERSE A SEQUENCE
(nreverse
<expr>)                         
DESTRUCTIVELY REVERSE A SEQUENCE
     <expr>    the sequence to reverse
     returns  
a new sequence in the reverse order
 
 
 
 
XLISP 2.1g                   SEQUENCE FUNCTIONS                     Page 40
 
 
(subseq <seq>
<start> [<end>])                        EXTRACT A SUBSEQUENCE
     <seq>     the sequence
     <start>   the starting position (zero origin)
     <end>     the ending position + 1 (defaults to end) or NIL  for end of
               sequence
     returns  
the sequence between <start> and <end>
 
(sort <seq>
<test> &key :key)                
DESTRUCTIVELY SORT A SEQUENCE
     <seq>     the sequence to sort
     <test>    the comparison function
     :key     
function to apply to comparison function arguments (defaults
               to identity)
     returns  
the sorted sequence
 
(search
<seq1>  <seq2>  &key :test  :test-not  :key :start1  :end1 
:start2
:end2)
                                                        SEARCH FOR
SEQUENCE
     <seq1>    the sequence to search for
     <seq2>    the sequence to search in
     :test     the test
function (defaults to eql)
     :test-not the test function (sense
inverted)
     :key     
function to  apply to  test function arguments  (defaults to
               identity)
     :start1  
starting index in <seq1>
     :end1    
index of end+1 in <seq1> or NIL for end of sequence
     :start2  
starting index in <seq2>
     :end2    
index of end+1 in <seq2> or NIL for end of sequence
     returns  
position of first match
 
(remove <expr>
<seq> &key :test :test-not :key :start :end)
                                           
REMOVE ELEMENTS FROM A SEQUENCE
     <expr>    the element to remove
     <seq>     the sequence
     :test    
the test function (defaults to eql)
     :test-not the test function (sense
inverted)
     :key     
function  to  apply 
to   test  function 
sequence  argument
               (defaults to identity)
     :start   
starting index
     :end     
index of end+1, or NIL for (length <seq>)
     returns  
copy of sequence with matching expressions removed
 
(remove-if
<test> <seq> &key :key :start :end)
                                            
REMOVE ELEMENTS THAT PASS TEST
(remove-if-not
<test> <seq> &key :key :start :end)
                                            
REMOVE ELEMENTS THAT FAIL TEST
     <test>    the test predicate
     <seq>     the sequence
     :key     
function  to apply  to test 
function argument  (defaults to
               identity)
     :start   
starting index
     :end     
index of end+1, or NIL for (length <seq>)
     returns   copy  of sequence  with 
matching  or non-matching  elements
               removed
 
 
 
 
XLISP 2.1g                   SEQUENCE FUNCTIONS                     Page 41
 
 
(count <expr>
<seq> &key :test :test-not :key :start :end)
                                      COUNT
MATCHING ELEMENTS IN A SEQUENCE
     <expr>    element to count
     <seq>     the sequence
     :test    
the test function (defaults to eql)
     :test-not the test function (sense
inverted)
     :key     
function  to  apply 
to  each <seq>  argument 
(defaults  to
               identity)
     :start   
starting index
     :end     
index of end+1, or NIL for (length <seq>)
     returns  
count of matching elements
 
(count-if <test>
<seq> &key :key :start :end)
                                             
COUNT ELEMENTS THAT PASS TEST
(count-if-not
<test> <seq> &key :key :start :end)
                                             
COUNT ELEMENTS THAT FAIL TEST
     <test>    the test predicate
     <seq>     the sequence
     :key     
function  to apply  to test 
function argument  (defaults to
               identity)
     :start   
starting index
     :end     
index of end+1, or NIL for (length <seq>)
     returns  
count of matching/non-matching elements
 
(find <expr>
<seq> &key :test :test-not :key :start :end)
                                    FIND FIRST
MATCHING ELEMENT IN SEQUENCE
     <expr>    element to search for
     <seq>     the sequence
     :test    
the test function (defaults to eql)
     :test-not the test function (sense
inverted)
     :key     
function  to  apply 
to  each <seq>  argument 
(defaults  to
               identity)
     :start   
starting index
     :end     
index of end+1, or NIL for (length <seq>)
     returns  
first matching element of sequence, or NIL
 
(find-if <test>
<seq> &key :key :start :end)
                                        FIND
FIRST ELEMENT THAT PASSES TEST
(find-if-not
<test> <seq> &key :key :start :end)
                                         FIND
FIRST ELEMENT THAT FAILS TEST
     <test>    the test predicate
     <seq>     the sequence
     :key     
function  to apply  to test 
function argument  (defaults to
               identity)
     :start   
starting index
     :end     
index of end+1, or NIL for (length <seq>)
     returns  
first element of sequence that passes/fails test, or NIL
 
 
 
 
XLISP 2.1g                   SEQUENCE FUNCTIONS                     Page 42
 
 
(position <expr>
<seq> &key :test :test-not :key :start :end)
                        FIND POSITION OF FIRST
MATCHING ELEMENT IN SEQUENCE
     <expr>    element to search for
     <seq>     the sequence
     :test    
the test function (defaults to eql)
     :test-not the test function (sense
inverted)
     :key     
function  to  apply 
to  each <seq>  argument 
(defaults  to
               identity)
     :start   
starting index
     :end     
index of end+1, or NIL for (length <seq>)
     returns  
position of first matching element of sequence, or NIL
 
(position-if
<test> <seq> &key :key :start :end)
                            FIND POSITION OF FIRST ELEMENT THAT PASSES TEST
(position-if-not
<test> <seq> &key :key :start :end)
                         FIND POSITION OF
FIRST ELEMENT THAT FAILS TEST
     <test>    the test predicate
     <seq>     the sequence
     :key     
function  to apply  to test 
function argument  (defaults to
               identity)
     :start   
starting index
     :end     
index of end+1, or NIL for (length <seq>)
     returns  
position  of first  element 
of sequence  that  passes/fails
               test, or NIL.
 
(delete <expr>
<seq> &key :key :test :test-not :start :end)
                                           
DELETE ELEMENTS FROM A SEQUENCE
     <expr>    the element to delete
     <seq>     the sequence
     :test    
the test function (defaults to eql)
     :test-not the test function (sense
inverted)
     :key     
function   to  apply 
to  test  function 
sequence  argument
               (defaults to identity)
     :start   
starting index
     :end     
index of end+1, or NIL for (length <seq>)
     returns  
the sequence with the matching expressions deleted
 
(delete-if
<test> <seq> &key :key :start :end)
                                            
DELETE ELEMENTS THAT PASS TEST
(delete-if-not
<test> <seq> &key :key :start :end)
                                            
DELETE ELEMENTS THAT FAIL TEST
     <test>    the test predicate
     <seq>     the sequence
     :key     
function  to apply  to test 
function argument  (defaults to
               identity)
     :start   
starting index
     :end     
index of end+1, or NIL for (length <seq>)
     returns  
the sequence with matching or non-matching elements deleted
 
 
 
 
XLISP 2.1g                   SEQUENCE FUNCTIONS                     Page 43
 
 
(reduce <fcn>
<seq> &key :initial-value :start :end)
                                           
REDUCE SEQUENCE TO SINGLE VALUE
     <fcn>     function (of two 
arguments) to apply to  result of
previous
               function application  (or first element) and  each member of
               sequence.
     <seq>     the sequence
     :initial-value      value to  use as first
argument  in first function
                         application rather
than using the first element of
                         the sequence.
     :start   
starting index
     :end     
index of end+1, or NIL for (length <seq>)
     returns  
if  sequence is empty and there
is no initial value, returns
               result of applying function to
zero  arguements. If there is
               a single element, returns the
element. Otherwise returns the
               result of the last function
application.
 
(remove-duplicates
<seq> &key :test :test-not :key :start :end)
                                           
REMOVE DUPLICATES FROM SEQUENCE
     <seq>     the sequence
     :test    
comparison function (default eql)
     :test-not comparison function (sense
inverted)
     :key     
function to  apply to  test function arguments  (defaults to
               identity)
     :start   
starting index
     :end      index of end+1,
or NIL for (length <seq>)
     returns  
copy of sequence with duplicates removed.
 
(fill <seq>
<expr> &key :start :end)             
REPLACE ITEMS IN SEQUENCE
     Defined in common.lsp
     <seq>     the sequence
     <expr>    new value to place in sequence
     :start   
starting index
     :end     
index of end+1, or NIL for (length <seq>)
     returns  
sequence with items replaced with new item
 
(replace <seq1>
<seq2> &key :start1 :end1 :start2 :end2)
                                    REPLACE ITEMS IN SEQUENCE FROM SEQUENCE
     Defined in common.lsp
     <seq1>    the sequence to modify
     <seq2>    sequence with new items
     :start1  
starting index in <seq1>
     :end1    
index of end+1 in <seq1> or NIL for end of sequence
     :start2  
starting index in <seq2>
     :end2    
index of end+1 in <seq2> or NIL for end of sequence
     returns  
first sequence with items replaced
 
 
 
 
XLISP 2.1g                     LIST FUNCTIONS                       Page 44
 
 
 
LIST FUNCTIONS 
 
(car
<expr>)                                 
RETURN THE CAR OF A LIST NODE
     <expr>    the list node
     returns  
the car of the list node
 
(cdr
<expr>)                                 
RETURN THE CDR OF A LIST NODE
     <expr>    the list node
     returns  
the cdr of the list node
 
(cxxr
<expr>)                                         ALL CxxR COMBINATIONS
(cxxxr
<expr>)                                       ALL CxxxR COMBINATIONS
(cxxxxr
<expr>)                                     ALL CxxxxR COMBINATIONS
 
(first
<expr>)                                            A SYNONYM FOR CAR
(second
<expr>)                                          A SYNONYM FOR CADR
(third
<expr>)                                          A SYNONYM FOR CADDR
(fourth
<expr>)                                        A SYNONYM FOR CADDDR
(rest
<expr>)                                             A SYNONYM FOR CDR
 
(cons <expr1>
<expr2>)                           
CONSTRUCT A NEW LIST NODE
     <expr1>   the car of the new list node
     <expr2>   the cdr of the new list node
     returns  
the new list node
 
(acons <expr1>
<expr2> <alist>)                 
ADD TO FRONT OF ASSOC LIST
     defined in common.lsp
     <expr1>   key of new association
     <expr2>   value of new association
     <alist>   association list
     returns  
new association list, which  is
(cons (cons <expr1> <expr2>)
               <expr3>))
 
(list
<expr>...)                                    CREATE A LIST OF VALUES
(list* <expr>
... <list>)
     <expr>    expressions to be combined into a list
     returns  
the new list
 
(append
<expr>...)                                             APPEND LISTS
     <expr>    lists whose elements are to be appended
     returns  
the new list
 
(list-length
<list>)                             
FIND THE LENGTH OF A LIST
     <list>    the list
     returns  
the length of the list or NIL if the list is circular
 
(last
<list>)                          
RETURN THE LAST LIST NODE OF A LIST
     <list>    the list
     returns   the last list
node in the list
 
(butlast <list>
[<n>])                  RETURN
COPY OF ALL BUT LAST OF LIST
     <list>    the list
     <n>       count of elements to omit (default 1)
     returns  
copy of list with last element(s) absent.
 
 
 
 
XLISP 2.1g                     LIST FUNCTIONS                       Page 45
 
 
(nth <n>
<list>)                          
RETURN THE NTH ELEMENT OF A LIST
     <n>       the number of the element to return (zero origin)
     <list>    the list
     returns  
the nth element or NIL if the list isn't that long
 
(nthcdr <n>
<list>)                           
RETURN THE NTH CDR OF A LIST
     <n>       the number of the element to return (zero origin)
     <list>    the list
     returns  
the nth cdr or NIL if the list isn't that long
 
(member <expr>
<list> &key :test :test-not :key)
                                              
FIND AN EXPRESSION IN A LIST
     <expr>    the expression to find
     <list>    the list to search
     :test    
the test function (defaults to eql)
     :test-not the test function (sense
inverted)
     :key     
function to  apply to test
function  list argument (defaults
               to identity)
     returns  
the remainder of the list starting with the expression
 
(assoc <expr>
<alist> &key :test :test-not :key)
                                           
FIND AN EXPRESSION IN AN A-LIST
     <expr>    the expression to find
     <alist>   the association list
     :test    
the test function (defaults to eql)
     :test-not the test function (sense
inverted)
     :key     
function to  apply to test
function  list argument (defaults
               to identity)
     returns  
the alist entry or NIL
 
(mapc <fcn>
<list1> <list>...)           
APPLY FUNCTION TO SUCCESSIVE CARS
     <fcn>     the function or function name
     <listn>   a list for each argument of the function
     returns  
the first list of arguments
 
(mapcar <fcn>
<list1> <list>...)         
APPLY FUNCTION TO SUCCESSIVE CARS
     <fcn>     the function or function name
     <listn>   a list for each argument of the function
     returns  
a list of the values returned
 
(mapl <fcn>
<list1> <list>...)           
APPLY FUNCTION TO SUCCESSIVE CDRS
     <fcn>     the function or function name
     <listn>   a list for each argument of the function
     returns  
the first list of arguments
 
(maplist <fcn>
<list1> <list>...)        
APPLY FUNCTION TO SUCCESSIVE CDRS
     <fcn>     the function or function name
     <listn>   a list for each argument of the function
     returns  
a list of the values returned
 
(mapcan <fcn>
<list1> <list>...)          
APPL FUNCTION TO SUCCESSIVE CARS
     <fcn>     the function or function name
     <listn>   a list for each argument of the function
     returns  
list of return values nconc'd together
 
 
 
 
XLISP 2.1g                     LIST FUNCTIONS                       Page 46
 
 
(mapcon <fcn>
<list1> <list>...)          
APPL FUNCTION TO SUCCESSIVE CDRS
     <fcn>     the function or function name
     <listn>   a list for each argument of the function
     returns  
list of return values nconc'd together
 
(subst <to>
<from> <expr> &key :test :test-not :key)
(nsubst <to>
<from> <expr> &key :test :test-not :key)
                                                    
SUBSTITUTE EXPRESSIONS
     SUBST does minimum  copying as required by Common Lisp.  NSUBST is the
     destructive version.
     <to>      the new expression
     <from>    the old expression
     <expr>    the expression in which to do the substitutions
     :test    
the test function (defaults to eql)
     :test-not the test function (sense
inverted)
     :key     
function  to  apply 
to  subtree  test 
function  expression
               argument (defaults to identity)
     returns  
the expression with substitutions
 
(sublis <alist>
<expr> &key :test :test-not :key)
(nsublis <alist>
<expr> &key :test :test-not :key)
                                                 
SUBSTITUTE WITH AN A-LIST
     SUBLIS does minimum copying as required
by Common Lisp. NSUBLIS is the
     destructive version.
     <alist>   the association list
     <expr>    the expression in which to do the substitutions
     :test    
the test function (defaults to eql)
     :test-not the test function (sense
inverted)
     :key     
function  to  apply 
to  subtree  test 
function  expression
               argument (defaults to identity)
     returns  
the expression with substitutions
 
(pairlis <keys>
<values> [<alist>])         
BUILD AN A-LIST FROM TWO LISTS
     In file common.lsp
     <keys>    list of association keys
     <values>  list of association values, same length as keys
     <alist>   existing association list, default NIL
     returns  
new association list
 
(copy-list
<list>)                            
COPY THE TOP LEVEL OF A LIST
     In file common.lsp
     <list>    the list
     returns  
a copy of the list (new cons cells in top level)
 
(copy-alist
<alist>)                              
COPY AN ASSOCIATION LIST
     In file common.lsp
     <alist>   the association list
     returns   a copy of the association list (keys and values not copies)
 
(copy-tree
<tree>)                                              COPY A TREE
     In file common.lsp
     <tree>    a tree structure of cons cells
     returns  
a copy of the tree structure
 
 
 
 
XLISP 2.1g                     LIST FUNCTIONS                       Page 47
 
 
(intersection
<list1> <list2> &key :test :test-not :key)      SET FUNCTIONS
(union <list1>
<list2> &key :test :test-not :key)
(set-difference
<list1> <list2> &key :test :test-not :key)
(set-exclusive-or
<list1> <list2> &key :test :test-not :key)
(nintersection
<list1> <list2> &key :test :test-not :key)
(nunion <list1>
<list2> &key :test :test-not :key)
(nset-difference
<list1> <list2> &key :test :test-not :key)
(nset-exclusive-or
<list1> <list2> &key :test :test-not :key)
     set-exclusive-or and nset-exclusive-or
defined in  common.lsp. nunion,
     nintersection,    and  
nset-difference    are   aliased   
to   their
     non-destructive counterparts in
common.lsp.
     <list1>   first list
     <list2>   second list
     :test    
the test function (defaults to eql)
     :test-not the test function (sense
inverted)
     :key     
function to  apply to  test function arguments  (defaults to
               identity)
     returns  
intersection: list of all elements in both lists
               union: list of all elements in
either list
               set-diference: list of all
elements in first list but not in
               second list
               set-exclusive-or: list of all
elements in only one list
               "n" versions are
potentially destructive.
 
(adjoin <expr>
<list> :test :test-not :key)             
ADD UNIQUE TO LIST
     <expr>    new element to add
     <list>    the list
     :test    
the test function (defaults to eql)
     :test-not the test function <sense
inverted)
     :key     
function to  apply to  test function arguments  (defaults to
               identity)
     returns  
if  element not  in 
list then  (cons  <expr> <list>),  else
               <list>.
 
 
 
 
XLISP 2.1g               DESTRUCTIVE LIST FUNCTIONS                 Page 48
 
 
 
DESTRUCTIVE LIST
FUNCTIONS
 
Destructive functions
that have  non-desctructive equivalents
are listed in
other  sections.  
See  also sort,  map-into, nreverse,  delete, delete-if,
delete-if-not,  fill, 
and replace  under  SEQUENCE 
FUNCTIONS, setf  under
SYMBOL  FUNCTIONS, 
and  mapcan,  mapcon, 
nsubst, nsublis,  nintersection,
nunion,
nset-difference, and nset-exclusive-or under LIST FUNCTIONS.
 
(rplaca <list>
<expr>)                      
REPLACE THE CAR OF A LIST NODE
     <list>    the list node
     <expr>    the new value for the car of the list node
     returns  
the list node after updating the car
 
(rplacd <list>
<expr>)                      
REPLACE THE CDR OF A LIST NODE
     <list>    the list node
     <expr>    the new value for the cdr of the list node
     returns  
the list node after updating the cdr
 
(nconc
<list>...)                          
DESTRUCTIVELY CONCATENATE LISTS
     <list>    lists to concatenate
     returns  
the result of concatenating the lists
 
(nsubst-if <to>
<test> <expr> &key :key)
(nsubst-if-not
<to> <test> <expr> &key :key)
                                                    
SUBSTITUTE EXPRESSIONS
     <to>      the new expression
     <test>    function of one argument to test each subtree
     <expr>    the expression in which to do the substitutions
     :key     
function  to apply  to test 
function argument  (defaults to
               identity)
     returns  
the expression with substitutions
 
 
 
 
XLISP 2.1g                  ARITHMETIC FUNCTIONS                    Page 49
 
 
 
ARITHMETIC FUNCTIONS
 
Warning: integer and
ratio calculations that overflow become floating point
values  as part 
of the  math extension,  but give 
no error  otherwise. On
systems  with IEEE 
floating point, the  values
+INF  and -INF  result from
overflowing floating
point calculations.
 
The  math extension option adds complex numbers,
ratios, new functions, and
additional
functionality to some existing functions. Because of the size of
the extension, and the
performance loss it entails, some users may not wish
to include  it. This 
section documents the  math
functions  both with  and
without the extension.
 
Functions  that are described as  having floating point  arguments (SIN COS
TAN ASIN ACOS  ATAN EXPT EXP SQRT) will take arguments of
any type (real or
complex)  when the math extension  is used. In 
the descriptions, "rational
number"  means integer  or ratio   only, and  "real number"  means floating
point number or
rational only.
 
Any  rational 
results  are reduced  to 
canonical  form  (the 
gcd of  the
numerator  and 
denominator is  1, the  denominator is  positive); integral
results  are 
reduced  to  integers. 
Integer  complex  numbers 
with  zero
imaginary parts are
reduced to integers.
 
(truncate <expr>
<denom>)                            
TRUNCATES TOWARD ZERO
(round <expr>
<denom>)                   ROUNDS
TOWARD NEAREST EVEN INTEGER
(floor <expr>
<denom>)                   TRUNCATES
TOWARD NEGATIVE INFINITY
(ceiling <expr>
<denom>)                         
TRUNCATES TOWARD INFINITY
     Round, 
floor, and ceiling, and  the
second argument  of truncate, are
     part 
of the  math extension.  Results too 
big to  be represented  as
     integers are returned  as floating point numbers  as part of the  math
     extension. Integers are returned as is.
     <expr>    the real number
     <denom>   real number to divide <expr> by before converting
     returns  
the integer  result  of converting  the  number, and,  as  a
               second return value, the
remainder of the operation, defined
               as expr - result*denom. the
type is float if either argument
               is float, otherwise it is
rational.
 
(float
<expr>)               CONVERTS AN
INTEGER TO A FLOATING POINT NUMBER
     <expr>    the real number
     returns  
the number as a floating point number
 
(rational
<expr>)                     
CONVERTS A REAL NUMBER TO A RATIONAL
     Floating 
point numbers too large to express return the floating point
     number, 
while numbers  too  small to 
express  return zero.  Rational
     numbers are returned as is.
     <expr>    the real number
     returns  
the number as a ratio or integer. 
 
(+
[<expr>...])                                       ADD A LIST OF NUMBERS
     With no arguments returns addition
identity, 0 (integer)
     <expr>    the numbers
     returns  
the result of the addition
 
 
 
 
XLISP 2.1g                  ARITHMETIC FUNCTIONS                    Page 50
 
 
(-
<expr>...)          SUBTRACT A
LIST OF NUMBERS OR NEGATE A SINGLE NUMBER
     <expr>    the numbers
     returns  
the result of the subtraction
 
(*
[<expr>...])                                  MULTIPLY A LIST OF NUMBERS
     With no arguments returns multiplication
identity, 1
     <expr>    the numbers
     returns  
the result of the multiplication
 
(/
<expr>...)            DIVIDE A
LIST OF NUMBERS OR INVERT A SINGLE NUMBER
     With 
the math  extension,
division  of integer  numbers results  in a
     rational quotient,  rather than integer. To  perform integer division,
     use TRUNCATE.  When an integer complex 
is divided by  an integer, the
     quotient is floating point complex.
     <expr>    the numbers
     returns  
the result of the division
 
(1+ <expr>)                                            
ADD ONE TO A NUMBER
     <expr>    the number
     returns  
the number plus one
 
(1- <expr>)                                      SUBTRACT
ONE FROM A NUMBER
     <expr>    the number
     returns  
the number minus one
 
(rem
<expr>...)                             
REMAINDER OF A LIST OF NUMBERS
     With the math extension, only two
arguments allowed.
     <expr>    the real numbers (must be integers, without math extension)
     returns  
the  result  of 
the  remainder  operation 
(remainder  with
               truncating division)
 
(mod <expr1>
<expr2>)                         
NUMBER MODULO ANOTHER NUMBER
     Part of math extension.
     <expr1>   real number
     <expr2>   real number divisor (may not be zero)
     returns  
the  remainder  after 
dividing  <expr1>  by 
<expr2>  using
               flooring  division, thus  there is  no discontinuity  in the
               function around zero.
 
(min
<expr>...)                          
THE SMALLEST OF A LIST OF NUMBERS
     <expr>    the real numbers
     returns  
the smallest number in the list
 
(max
<expr>...)                           
THE LARGEST OF A LIST OF NUMBERS
     <expr>    the real numbers
     returns  
the largest number in the list
 
(abs
<expr>)                                
THE ABSOLUTE VALUE OF A NUMBER
     <expr>    the number
     returns  
the  absolute value  of 
the number,  which is  the floating
               point magnitude for complex
numbers.
 
 
 
 
XLISP 2.1g                  ARITHMETIC FUNCTIONS                    Page 51
 
 
(signum
<expr>)                                    GET THE SIGN OF A NUMBER
     Defined in common.lsp
     <expr>    the number
     returns  
zero if number is zero, one  if
positive, or negative one if
               negative.  Numeric type  is  same as  number. For 
a complex
               number, returns unit magnitude
but same phase as number.
 
(gcd
[<n>...])                         
COMPUTE THE GREATEST COMMON DIVISOR
     With no arguments returns 0, with one
argument returns the argument.
     <n>       The number(s) (integer)
     returns  
the greatest common divisor
 
(lcm
<n>...)                             
COMPUTE THE LEAST COMMON MULTIPLE
     Part 
of  math extension.  A result 
which  would be  larger 
than the
     largest integer causes an error.
     <n>       The number(s) (integer)
     returns  
the least common multiple
 
(random <n>
[<state>])                      
COMPUTE A PSEUDO-RANDOM NUMBER
     <n>       the real number upper bound
     <state>   a random-state (default is *random-state*)
     returns  
a random number in range [0,n)
 
(make-random-state
[<state>])                        
CREATE A RANDOM-STATE
     <state>   a  random-state,   t, 
or  NIL  (default   NIL).  NIL 
means
               *random-state*
     returns  
If  <state> is t, a random
random-state, otherwise a copy of
               <state>
 
(sin
<expr>)                                  
COMPUTE THE SINE OF A NUMBER
(cos
<expr>)                                
COMPUTE THE COSINE OF A NUMBER
(tan
<expr>)                               
COMPUTE THE TANGENT OF A NUMBER
(asin
<expr>)                             
COMPUTE THE ARC SINE OF A NUMBER
(acos
<expr>)                           
COMPUTE THE ARC COSINE OF A NUMBER
     <expr>    the floating point number
     returns  
the  sine, cosine, tangent,
arc  sine, or arc  cosine of the
               number
 
(atan <expr>
[<expr2>])                 COMPUTE
THE ARC TANGENT OF A NUMBER
     <expr>    the floating point number (numerator)
     <expr2>   the denominator,  default
1. May  only be specified  if math
               extension installed
     returns  
the arc tangent of <expr>/<expr2>
 
(sinh
<expr>)                      
COMPUTE THE HYPERBOLIC SINE OF A NUMBER
(cosh
<expr>)                    
COMPUTE THE HYPERBOLIC COSINE OF A NUMBER
(tanh
<expr>)                    COMPUTE
THE HYPERBOLIC TANGENT OF A NUMBER
(asinh
<expr>)                  COMPUTE
THE HYPERBOLIC ARC SINE OF A NUMBER
(acosh
<expr>)                COMPUTE THE
HYPERBOLIC ARC COSINE OF A NUMBER
(atanh
<expr>)               COMPUTE THE
HYPERBOLIC ARC TANGENT OF A NUMBER
     Defined in common.lsp
     <expr>    the number
     returns  
the hyperbolic sine, cosine, 
tangent, arc sine, arc cosine,
               or arc tangent of the number.
 
 
 
 
XLISP 2.1g                  ARITHMETIC FUNCTIONS                    Page 52
 
 
(expt <x-expr>
<y-expr>)                          
COMPUTE X TO THE Y POWER
     <x-expr>  the number 
     <y-expr>  the exponent 
     returns  
x to the y power. If y is a fixnum, then  the result type is
               the same  as the type 
of x, unless  fixnum or ratio  and it
               would overflow, then the result
type is a flonum.
 
(exp <x-expr>)                                     COMPUTE E
TO THE X POWER
     <x-expr>  the floating point number 
     returns  
e to the x power
 
(cis
<x-expr>)                                      COMPUTE COSINE + I SINE
     Defined in common.lsp
     <x-expr>  the number
     returns  
e to the ix power
 
(log <expr>
[<base>])                                  COMPUTE THE LOGRITHM
     Part of the math extension
     <expr>    the number
     <base>    the base, default is e
     returns  
log base <base> of <expr>
 
(sqrt
<expr>)                          
COMPUTE THE SQUARE ROOT OF A NUMBER
     <expr>    the number 
     returns  
the square root of the number
 
(numerator
<expr>)                           
GET THE NUMERATOR OF A NUMBER
     Part of math extension
     <expr>    rational number
     returns  
numerator of number (number if integer)
 
(denominator
<expr>)                        GET
THE DENOMINATOR OF A NUMBER
     Part of math extension
     <expr>    rational number
     returns  
denominator of number (1 if integer)
 
(complex <real>
[<imag>])                        
CONVERT TO COMPLEX NUMBER
     Part of math extension
     <real>    real number real part
     <imag>    real number imaginary part (default 0)
     returns  
the complex number
 
(realpart
<expr>)                            
GET THE REAL PART OF A NUMBER
     Part of the math extension
     <expr>    the number
     returns  
the real part of a complex number, or the number itself if a
     real number
 
(imagpart
<expr>)                        GET THE IMAGINARY PART OF A NUMBER
     Part of the math extension
     <expr>    the number
     returns  
the imaginary part  of a complex
number, or zero of the type
               of the number if a real number.
 
 
 
 
XLISP 2.1g                  ARITHMETIC FUNCTIONS                    Page 53
 
 
(conjugate
<expr>)                           
GET THE CONJUGATE OF A NUMBER
     Part of the math extension
     <expr>    the number
     returns  
the conjugate of a complex number, or the number itself if a
     real number.
 
(phase
<expr>)                                    GET THE PHASE OF A NUMBER
     Part of the math extension
     <expr>    the number
     returns  
the  phase  angle, 
equivalent to  (atan  (imagpart 
<expr>)
               (realpart <expr>))
 
(< <n1>
<n2>...)                                         TEST FOR LESS THAN
(<= <n1>
<n2>...)                           
TEST FOR LESS THAN OR EQUAL TO
(= <n1>
<n2>...)                                          TEST FOR EQUAL TO
(/= <n1>
<n2>...)                                     TEST FOR NOT EQUAL TO
(>= <n1>
<n2>...)                        
TEST FOR GREATER THAN OR EQUAL TO
(> <n1>
<n2>...)                                      TEST FOR GREATER THAN
     <n1>      the first real number to compare
     <n2>      the second real number to compare
     returns  
the result of comparing <n1> with <n2>...
 
 
 
 
XLISP 2.1g               BITWISE LOGICAL FUNCTIONS                  Page 54
 
 
 
BITWISE LOGICAL
FUNCTIONS
 
(logand
[<expr>...])                  THE BITWISE AND OF A LIST OF INTEGERS
     With no arguments returns identity -1
     <expr>    the integers
     returns  
the result of the and operation
 
(logior
[<expr>...])         THE BITWISE
INCLUSIVE OR OF A LIST OF INTEGERS
     With no arguments returns identity 0
     <expr>    the integers
     returns  
the result of the inclusive or operation
 
(logxor
[<expr>...])         THE BITWISE
EXCLUSIVE OR OF A LIST OF INTEGERS
     With no arguments returns identity 0
     <expr>    the integers
    
returns   the result of the
exclusive or operation
 
(lognot
<expr>)                               
THE BITWISE NOT OF A INTEGER
     <expr>    the integer
     returns  
the bitwise inversion of integer
 
(logtest <expr1>
<expr2>)                  TEST
BITWISE AND OF TWO INTEGERS
     Defined in common.lsp
     <expr1>   the first integer
     <expr2>   the second integer
     returns  
T if the result of the and operation is non-zero, else NIL
 
(ash <expr1>
<expr2>)                                      ARITHMETIC SHIFT
     Part of math extension
     <expr1>   integer to shift
     <expr2>   number of bit positions to shift (positive is to left)
     returns  
shifted integer
 
 
 
 
XLISP 2.1g                    STRING FUNCTIONS                      Page 55
 
 
 
STRING FUNCTIONS
 
Note: functions with
names starting "string"  will
also accept a symbol, in
which case the
symbol's print name is used.
 
(string
<expr>)                   MAKE A
STRING FROM AN INTEGER ASCII VALUE
     <expr>    an  integer  (which  is   first  converted 
into  its  ASCII
               character value), string,
character, or symbol
     returns  
the string representation of the argument
 
(string-trim
<bag> <str>)                       
TRIM BOTH ENDS OF A STRING
     <bag>     a string containing characters to trim
     <str>     the string to trim
     returns  
a trimed copy of the string
 
(string-left-trim
<bag> <str>)               
TRIM THE LEFT END OF A STRING
     <bag>     a string containing characters to trim
     <str>     the string to trim
     returns  
a trimed copy of the string
 
(string-right-trim
<bag> <str>)             
TRIM THE RIGHT END OF A STRING
     <bag>     a string containing characters to trim
     <str>     the string to trim
     returns  
a trimed copy of the string
 
(string-upcase
<str> &key :start :end)                 CONVERT TO UPPERCASE
     <str>     the string
     :start   
the starting offset
     :end     
the ending offset + 1 or NIL for end of string
     returns  
a converted copy of the string
 
(string-downcase
<str> &key :start :end)              
CONVERT TO LOWERCASE
     <str>     the string
     :start   
the starting offset
     :end     
the ending offset + 1 or NIL for end of string
     returns  
a converted copy of the string
 
(string-capitalize
<str> &key :start :end)                CAPITALIZE STRING
     <str>     the string
     :start   
the starting offset
     :end     
the ending offset + 1 or NIL for end of string
     returns  
a  converted copy  of the 
string with  each word  having an
               initial uppercase letter and
following lowercase letters
 
(nstring-upcase
<str> &key :start :end)                CONVERT TO UPPERCASE
     <str>     the string
     :start   
the starting offset
     :end     
the ending offset + 1 or NIL for end of string
     returns  
the converted string (not a copy)
 
 
 
 
XLISP 2.1g                    STRING FUNCTIONS                      Page 56
 
 
(nstring-downcase
<str> &key :start :end)             
CONVERT TO LOWERCASE
     <str>     the string
     :start   
the starting offset
     :end     
the ending offset + 1 or NIL for end of string
     returns  
the converted string (not a copy)
 
(nstring-capitalize
<str> &key :start :end)              
CAPITALIZE STRING
     <str>     the string
     :start   
the starting offset
     :end     
the ending offset + 1 or NIL for end of string
     returns  
the string with each word having an initial uppercase letter
               and following lowercase letters
(not a copy)
 
(strcat
<expr>...)                                      CONCATENATE STRINGS
     Macro in init.lsp, to maintain
compatibility with XLISP.
     See CONCATENATE for preferred function.
     <expr>    the strings to concatenate
     returns  
the result of concatenating the strings
 
(string<
<str1> <str2> &key :start1 :end1 :start2 :end2)
(string<=
<str1> <str2> &key :start1 :end1 :start2 :end2)
(string= <str1>
<str2> &key :start1 :end1 :start2 :end2)
(string/= <str1>
<str2> &key :start1 :end1 :start2 :end2)
(string>=
<str1> <str2> &key :start1 :end1 :start2 :end2)
(string>
<str1> <str2> &key :start1 :end1 :start2 :end2)
     <str1>    the first string to compare
     <str2>    the second string to compare
     :start1  
first substring starting offset
     :end1    
first substring ending offset + 1 or NIL for end of string
     :start2  
second substring starting offset
     :end2    
second substring ending offset + 1 or NIL for end of string
     returns  
string=: t if predicate is true, NIL otherwise
               others: If predicate is true
then number of initial matching
               characters, else NIL
     Note: case is significant with these
comparison functions.
 
(string-lessp
<str1> <str2> &key :start1 :end1 :start2 :end2)
(string-not-greaterp
<str1> <str2> &key :start1 :end1 :start2 :end2)
(string-equal
<str1> <str2> &key :start1 :end1 :start2 :end2)
(string-not-equal
<str1> <str2> &key :start1 :end1 :start2 :end2)
(string-not-lessp
<str1> <str2> &key :start1 :end1 :start2 :end2)
(string-greaterp
<str1> <str2> &key :start1 :end1 :start2 :end2)
     <str1>    the first string to compare
     <str2>    the second string to compare
     :start1  
first substring starting offset
     :end1    
first substring ending offset + 1 or NIL for end of string
     :start2  
second substring starting offset
     :end2    
second substring ending offset + 1 or NIL for end of string
     returns  
string-equal: t if predicate is true, NIL otherwise
               others: If predicate is true
then number of initial matching
               characters, else NIL
     Note: case is not  significant with these comparison
functions  -- all
     uppercase characters are converted to
lowercase before being compared.
 
 
 
 
XLISP 2.1g                  CHARACTER FUNCTIONS                     Page 57
 
 
 
CHARACTER FUNCTIONS
 
(char <string>
<index>)                   EXTRACT
A CHARACTER FROM A STRING
     <string>  the string
     <index>   the string index (zero relative)
     returns  
the ascii code of the character
 
(alphanumericp
<chr>)                       IS THIS CHARACTER
ALPHANUMERIC?
     <chr>     the character
     returns  
true  if  the 
character   is  alphabetic 
or  numeric,  NIL
               otherwise
 
(upper-case-p
<chr>)                       IS
THIS AN UPPER CASE CHARACTER?
     <chr>     the character
     returns  
true if the character is upper case, NIL otherwise
 
(lower-case-p
<chr>)                        IS
THIS A LOWER CASE CHARACTER?
     <chr>     the character
     returns  
true if the character is lower case, NIL otherwise
 
(alpha-char-p
<chr>)                       IS
THIS AN ALPHABETIC CHARACTER?
     <chr>     the character
     returns  
true if the character is alphabetic, NIL otherwise
 
(both-case-p
<chr>)          IS THIS AN
ALPHABETIC (EITHER CASE) CHARACTER?
     <chr>     the character
     returns  
true  if the  character 
is  available  in both 
cases,  NIL
               otherwise
 
(digit-char-p
<chr>)                            
IS THIS A DIGIT CHARACTER?
     <chr>     the character
     returns  
the digit weight if character is a digit, NIL otherwise
 
(char-code
<chr>)                         GET
THE ASCII CODE OF A CHARACTER
     <chr>     the character
     returns  
the ASCII character code (integer, parity bit stripped)
 
(code-char
<code>)             GET THE
CHARACTER WITH A SPECFIED ASCII CODE
     <code>    the ASCII code (integer, range 0-127)
     returns  
the character with that code or NIL
 
(char-upcase
<chr>)                      
CONVERT A CHARACTER TO UPPER CASE
     <chr>     the character
     returns  
the upper  case  version of 
the character,  if one  exists,
               otherwise returns the character
 
(char-downcase
<chr>)                     CONVERT
A CHARACTER TO LOWER CASE
     <chr>     the character
     returns  
the  lower case  version 
of the  character, if  one exists,
               otherwise returns the character
 
(digit-char
<n>)                         
CONVERT A DIGIT WEIGHT TO A DIGIT
     <n>       the digit weight (integer)
     returns  
the digit character or NIL
 
 
 
 
XLISP 2.1g                  CHARACTER FUNCTIONS                     Page 58
 
 
(char-int
<chr>)                         
CONVERT A CHARACTER TO AN INTEGER
     <chr>     the character
     returns  
the ASCII character code (range 0-255)
 
(int-char
<int>)                         
CONVERT AN INTEGER TO A CHARACTER
     <int>     the ASCII character code (treated modulo 256)
     returns  
the character with that code
 
(char< <chr1>
<chr2>...)
(char<=
<chr1> <chr2>...)
(char= <chr1>
<chr2>...)
(char/= <chr1>
<chr2>...)
(char>=
<chr1> <chr2>...)
(char> <chr1>
<chr2>...)
     <chr1>    the first character to compare
     <chr2>    the second character(s) to compare
     returns  
t if predicate is true, NIL otherwise
     Note: case is significant with these
comparison functions.
 
(char-lessp
<chr1> <chr2>...)
(char-not-greaterp
<chr1> <chr2>...)
(char-equal
<chr1> <chr2>...)
(char-not-equal
<chr1> <chr2>...)
(char-not-lessp
<chr1> <chr2>...)
(char-greaterp
<chr1> <chr2>...)
     <chr1>    the first string to compare
     <chr2>    the second string(s) to compare
     returns  
t if predicate is true, NIL otherwise
     Note: case is not  significant with these comparison
functions  -- all
     uppercase characters are converted to
lowercase before the comparison.
 
 
 
 
XLISP 2.1g                  STRUCTURE FUNCTIONS                     Page 59
 
 
 
STRUCTURE FUNCTIONS
 
XLISP provides a
subset  of the Common Lisp
structure  definition facility.
No  slot options  are allowed,  but
slots  can have  default initialization
expressions.
 
     (defstruct name [<comment>]
<slot-desc>...)
or
     (defstruct (name <option>...)
[<comment>] <slot-desc>...)
               fsubr
               <name>              the structure name symbol
(quoted)
               <option>            option description (quoted)
               <comment>           comment string (ignored)
               <slot-desc>         slot descriptions (quoted)
               returns             the structure name
 
The recognized options
are:
 
     (:conc-name name)
     (:include name [<slot-desc>...])
     (:print-function <function>)
 
Note that if
:CONC-NAME appears, it should be before :INCLUDE.
 
Each slot description
takes the form:
 
     <name>
or
     (<name> <defexpr>)
 
If the default
initialization expression is not specified, the slot will be
initialized  to NIL 
if  no keyword  argument 
is  passed to  the 
creation
function.
 
The  optional 
:PRINT-FUNCTION  overrides  the 
default  #S  notation. 
The
function must take
three arguments, the structure instance, the stream, and
the current printing
depth.
 
DEFSTRUCT  causes access functions to be created  for each of the slots and
also arranges that
SETF will work  with those access
functions. The  access
function  names are constructed by  taking the structure  name, appending a
'-' and then
appending  the slot name. This can
be  overridden by using the
:CONC-NAME option.
 
DEFSTRUCT also  makes a creation function called  MAKE-<structname>, a copy
function  called 
COPY-<structname>  
and  a   predicate  function   called
<structname>-P.
The creation  function takes keyword
arguments  for each of
the slots. Structures
can be created using the #S( read macro, as well.
 
The  property 
*struct-slots*  is  added 
to  the  symbol  that  names 
the
structure. This
property  consists of an association
list of slot names and
closures  that evaluate  to the  initial
values  (NIL if  no initial 
value
expression).
 
 
 
 
XLISP 2.1g                  STRUCTURE FUNCTIONS                     Page 60
 
 
For instance:
 
     (defstruct foo bar (gag 2))
 
creates the following
functions:
 
     (foo-bar <expr>)
     (setf (foo-bar <expr>)
<value>)
     (foo-gag <expr>)
     (setf (foo-gag <expr>)
<value>)
     (make-foo &key :bar :gag)
     (copy-foo <expr>)
     (foo-p <expr>)
 
 
 
 
XLISP 2.1g                    OBJECT FUNCTIONS                      Page 61
 
 
 
OBJECT FUNCTIONS
 
Note  that the 
functions  provided  in 
classes.lsp  are  useful 
but  not
necessary.
 
Messages defined for
Object and Class are listed starting on page 20.
 
(send <object>
<message> [<args>...])                        SEND A MESSAGE
     <object>  the object to receive the message
     <message> message sent to object
     <args>    arguments to method (if any)
     returns  
the result of the method
 
(send-super
<message> [<args>])               
SEND A MESSAGE TO SUPERCLASS
     valid only in method context
     <message> message sent to method's
superclass
     <args>    arguments to method (if any)
     returns  
the result of the method
 
(defclass <sym>
<ivars> [<cvars> [<super>]])             DEFINE A NEW CLASS
     defined in class.lsp as a macro
     <sym>     symbol  whose
value  is  to be  bound  to the 
class  object
               (quoted)
     <ivars>   list  of instance  variables 
(quoted).  Instance  variables
               specified  either as 
<ivar> or  (<ivar>
<init>)  to specify
               non-NIL default initial value.
     <cvars>   list of class variables (quoted)
     <super>   superclass, or Object if absent.
     This function  sends :SET-PNAME  (defined
in  classes.lsp) to  the new
     class to set the class' print name
instance variable.
     Methods defined for classes defined with
defclass:
     (send <object> :<ivar>)
               Returns the specified instance
variable
     (send <object> :SET-IVAR
<ivar> <value>)
               Used to set an instance
variable, typically with setf.
     (send <sym> :NEW {:<ivar>
<init>})
               Actually   definition 
for   :ISNEW.   Creates 
new   object
               initializing  instance 
variables  as  specified 
in keyword
               arguments,  or 
to  their  default if 
keyword  argument  is
               missing. Returns the object.
 
(defmethod
<class> <sym> <fargs> <expr> ...)            DEFINE A NEW METHOD
     defined in class.lsp as a macro
     <class>   Class which will respond to message
     <sym>     Message name (quoted)
     <fargs>   Formal argument list. Leading "self" is implied
(quoted)
     <expr>    Expressions constituting body of method (quoted)
     returns  
the class object.
 
 
 
 
XLISP 2.1g                    OBJECT FUNCTIONS                      Page 62
 
 
(definst <class>
<sym> [<args>...])           
DEFINE A NEW GLOBAL INSTANCE
     defined in class.lsp as a macro
     <class>   Class of new object
     <sym>     Symbol whose value will be set to new object
     <args>    Arguments  passed  to 
:NEW  (typically initial  values 
for
               instance variables)
 
 
 
 
XLISP 2.1g                  PREDICATE FUNCTIONS                     Page 63
 
 
 
PREDICATE FUNCTIONS
 
(atom
<expr>)                                              IS THIS AN ATOM?
     <expr>    the expression to check
     returns  
t if the value is an atom, NIL otherwise
 
(symbolp
<expr>)                                          IS THIS A SYMBOL?
     <expr>    the expression to check
     returns  
t if the expression is a symbol, NIL otherwise
 
(numberp
<expr>)                                          IS THIS A NUMBER?
     <expr>    the expression to check
     returns  
t if the expression is a number, NIL otherwise
 
(null
<expr>)                                        IS THIS AN EMPTY LIST?
     <expr>    the list to check
     returns  
t if the list is empty, NIL otherwise
 
(not
<expr>)                                                 IS THIS FALSE?
     <expr>    the expression to check
     return   
t if the value is NIL, NIL otherwise
 
(listp
<expr>)                                              IS THIS A LIST?
     <expr>    the expression to check
     returns  
t if the value is a cons or NIL, NIL otherwise
 
(endp
<list>)                                    IS THIS THE END OF A LIST?
     <list>    the list
     returns  
t if the value is NIL, NIL otherwise
 
(consp
<expr>)                                    IS THIS A NON-EMPTY LIST?
     <expr>    the expression to check
     returns  
t if the value is a cons, NIL otherwise
 
(constantp
<expr>)                                      IS THIS A CONSTANT?
     <expr>    the expression to check
     returns  
t if the value  is a constant
(basically, would  EVAL <expr>
               repeatedly return the same
thing?), NIL otherwise.
 
(specialp
<expr>)                                
IS THIS A SPECIAL SYMBOL?
     <expr>    the expression to check
     returns  
t if the value is a symbol which is SPECIAL, NIL otherwise.
 
(integerp
<expr>)                                       IS THIS AN INTEGER?
     <expr>    the expression to check
     returns  
t if the value is an integer, NIL otherwise
 
(floatp
<expr>)                                            IS THIS A FLOAT?
     <expr>    the expression to check
     returns  
t if the value is a float, NIL otherwise
 
 
 
 
XLISP 2.1g                  PREDICATE FUNCTIONS                     Page 64
 
 
(rationalp
<expr>)                              
IS THIS A RATIONAL NUMBER?
     Part of math extension.
     <expr>    the expression to check
     returns  
t if the value is rational (integer or ratio), NIL otherwise
 
(complexp
<expr>)                                
IS THIS A COMPLEX NUMBER?
     Part of math extension.
     <expr>    the expression to check
     returns  
t if the value is a complex number, NIL otherwise
 
(stringp
<expr>)                                          IS THIS A STRING?
     <expr>    the expression to check
     returns  
t if the value is a string, NIL otherwise
 
(characterp
<expr>)                                    IS THIS A CHARACTER?
     <expr>    the expression to check
     returns  
t if the value is a character, NIL otherwise
 
(arrayp
<expr>)                                           IS THIS
AN ARRAY?
     <expr>    the expression to check
     returns  
t if the value is an array, NIL otherwise
 
(streamp
<expr>)                                          IS THIS A STREAM?
     <expr>    the expression to check
     returns  
t if the value is a stream, NIL otherwise
 
(open-stream-p
<stream>)                                    IS STREAM OPEN?
     <stream>  the stream
     returns  
t if the stream is open, NIL otherwise
 
(input-stream-p
<stream>)                               IS STREAM READABLE?
     <stream>  the stream
     returns  
t if stream is readable, NIL otherwise
 
(output-stream-p
<stream>)                             
IS STREAM WRITABLE?
     <stream>  the stream
     returns  
t if stream is writable, NIL otherwise
 
(objectp
<expr>)                                         IS THIS AN OBJECT?
     <expr>    the expression to check
     returns  
t if the value is an object, NIL otherwise
 
(classp
<expr>)                                     IS THIS A CLASS OBJECT?
     <expr>    the expression to check
     returns  
t if the value is a class object, NIL otherwise
 
(boundp
<sym>)                            
IS A VALUE BOUND TO THIS SYMBOL?
     <sym>     the symbol
     returns  
t if a value is bound to the symbol, NIL otherwise
 
(fboundp
<sym>)                 IS A
FUNCTIONAL VALUE BOUND TO THIS SYMBOL?
     <sym>     the symbol
     returns  
t  if a  functional  value  is 
bound  to  the 
symbol,  NIL
               otherwise
 
 
 
 
XLISP 2.1g                  PREDICATE FUNCTIONS                     Page 65
 
 
(functionp
<sym>)                                       IS THIS A FUNCTION?
     Defined in common.lsp
     <expr>    the expression to check
     returns  
t if the value  is a function --
that is,  can it be applied
               to arguments. This is  true for any symbol (even  those with
               no function binding), list with
car being lambda, a closure,
               or subr. Otherwise returns NIL.
 
(minusp
<expr>)                                    IS THIS NUMBER
NEGATIVE?
     <expr>    the number to test
     returns  
t if the number is negative, NIL otherwise
 
(zerop
<expr>)                                         IS THIS NUMBER ZERO?
     <expr>    the number to test
     returns  
t if the number is zero, NIL otherwise
 
(plusp
<expr>)                                     IS THIS NUMBER POSITIVE?
     <expr>    the number to test
     returns  
t if the number is positive, NIL otherwise
 
(evenp
<expr>)                                        IS THIS INTEGER EVEN?
     <expr>    the integer to test
     returns  
t if the integer is even, NIL otherwise
 
(oddp
<expr>)                                          IS THIS INTEGER ODD?
     <expr>    the integer to test
     returns  
t if the integer is odd, NIL otherwise
 
(subsetp <list1>
<list2> &key :test :test-not :key)        IS SET A SUBSET?
     <list1>   the first list
     <list2>   the second list
     :test    
test function (defaults to eql)
     :test-not test function (sense inverted)
     :key     
function to  apply to  test function arguments  (defaults to
               identity)
     returns  
t if  every element of the first
list is in the second list,
               NIL otherwise
 
(eq <expr1>
<expr2>)                            
ARE THE EXPRESSIONS EQUAL?
(eql <expr1>
<expr2>)
(equal <expr1>
<expr2>)
(equalp <expr1>
<expr2>)
     equalp defined in common.lsp
     <expr1>   the first expression
     <expr2>   the second expression
     returns  
t  if  equal,  NIL  otherwise. Each  is  progressively  more
               liberal in what is
"equal":
               eq: identical  pointers -- 
works with characters,  symbols,
                         and arbitrarily small
integers
               eql: works with  all numbers, if  same type (see  also =  on
               page 53)
               equal: lists and strings
               equalp: case  insensitive characters (and  strings), numbers
                         of differing types,
arrays (which can be equalp to
                         string containing same elements)
 
 
 
 
XLISP 2.1g                  PREDICATE FUNCTIONS                     Page 66
 
 
(typep <expr>
<type>)                            
IS THIS A SPECIFIED TYPE?
     <expr>    the expression to test
     <type>    the  type
specifier.  Symbols  can either 
be  one of  those
               listed under type-of (on page
87) or one of:
               ATOM      any atom
               NULL      NIL
               LIST      matches NIL or any cons cell
               STREAM    any stream
               NUMBER    any number type
               RATIONAL  fixnum or ratio (math extension)
               STRUCT    any structure (except hash-table)
               FUNCTION  any function, as defined by functionp (page
65)
               The specifer can also be  a form (which can be  nested). All
               form elements are quoted. Valid
form cars:
               or        any of the cdr type specifiers must be true
               and       all of the cdr type specifiers must be true
               not       the single cdr type specifier must be false
               satisfies the  result of applying the cdr predicate
function
                         to <expr>
               member    <expr> must be eql to one of the cdr
values
               object    <expr> must  be an 
object, of class  specified by
                         the  single 
cdr value.  The  cdr value 
can  be a
                         symbol which must
evaluate to a class.
               Note that  everything is of type  T, and nothing  is of type
               NIL.
     returns  
t if <expr> is of type <type>, NIL otherwise.
 
 
 
 
XLISP 2.1g                   CONTROL CONSTRUCTS                     Page 67
 
 
 
CONTROL CONSTRUCTS
 
(cond
<pair>...)                                     EVALUATE CONDITIONALLY
     fsubr
     <pair>    pair consisting of:
               (<pred> <expr>...)
               where
               <pred>    is a predicate expression
               <expr>    evaluated if the predicate is not NIL
     returns  
the value of the first expression whose predicate is not NIL
 
(and
<expr>...)                    THE
LOGICAL AND OF A LIST OF EXPRESSIONS
     fsubr
     <expr>    the expressions to be ANDed
     returns  
NIL if any  expression evaluates
to NIL, otherwise the value
               of  the last  expression  (evaluation 
of expressions  stops
               after the first expression that
evaluates to NIL)
 
(or
<expr>...)                     
THE LOGICAL OR OF A LIST OF EXPRESSIONS
     fsubr
     <expr>    the expressions to be ORed
     returns  
NIL if all expressions evaluate to NIL, otherwise  the value
               of the  first non-NIL expression (evaluation  of expressions
               stops  after the first expression 
that does not evaluate to
               NIL)
 
(if <texpr>
<expr1> [<expr2>])          
EVALUATE EXPRESSIONS CONDITIONALLY
     fsubr
     <texpr>   the test expression
     <expr1>   the expression to be evaluated if texpr is non-NIL
     <expr2>   the expression to be evaluated if texpr is NIL
     returns  
the value of the selected expression
 
(when <texpr>
<expr>...)             EVALUATE
ONLY WHEN A CONDITION IS TRUE
     fsubr
     <texpr>   the test expression
     <expr>    the expression(s) to be evaluted if texpr is non-NIL
     returns  
the value of the last expression or NIL
 
(unless <texpr>
<expr>...)          EVALUATE ONLY
WHEN A CONDITION IS FALSE
     fsubr
     <texpr>   the test expression
     <expr>    the expression(s) to be evaluated if texpr is NIL
     returns  
the value of the last expression or NIL
 
 
 
 
XLISP 2.1g                   CONTROL CONSTRUCTS                     Page 68
 
 
(case <expr>
<case>...[(t <expr>)])                          SELECT BY CASE
     fsubr
     <expr>    the selection expression
     <case>    pair consisting of:
               (<value> <expr>...)
               where:
               <value>   is a 
single expression  or a list  of expressions
                         (unevaluated)
               <expr>    are expressions to execute if the case
matches
     (t <expr>)          default case (no previous matching)
     returns  
the value of the last expression of the matching case
 
(let
(<binding>...) <expr>...)                        CREATE LOCAL BINDINGS
(let*
(<binding>...) <expr>...)                 LET WITH SEQUENTIAL BINDING
     fsubr
     <binding> the variable bindings
each of which is either:
               1)        a symbol (which is initialized to NIL)
               2)        a  list whose car is
a symbol and whose cadr is an
                         initialization
expression
     <expr>    the expressions to be evaluated
     returns  
the value of the last expression
 
(flet
(<binding>...) <expr>...)                      CREATE LOCAL FUNCTIONS
(labels
(<binding>...) <expr>...)             FLET WITH RECURSIVE FUNCTIONS
(macrolet
(<binding>...) <expr>...)                     CREATE LOCAL MACROS
     fsubr
     <binding> the function bindings
each of which is:
               (<sym> <fargs>
<expr>...)
               where:
               <sym>     the function/macro name
               <fargs>   formal argument list (lambda list)
               <expr>    expressions   constituting   the   body  
of   the
                         function/macro
     <expr>    the expressions to be evaluated
     returns  
the value of the last expression
 
(catch <sym>
<expr>...)               EVALUATE
EXPRESSIONS AND CATCH THROWS
     fsubr
     <sym>     the catch tag
     <expr>    expressions to evaluate
     returns   the value of the last expression or the throw expression
 
(throw <sym>
[<expr>])                                     THROW TO A CATCH
     fsubr
     <sym>     the catch tag
     <expr>    the value for the catch to return (defaults to NIL)
     returns  
never returns
 
 
 
 
XLISP 2.1g                   CONTROL CONSTRUCTS                     Page 69
 
 
(unwind-protect
<expr> <cexpr>...)     
PROTECT EVALUATION OF AN EXPRESSION
     fsubr
     <expr>    the expression to protect
     <cexpr>   the cleanup expressions
     returns  
the value of the expression
     Note:  
unwind-protect guarantees  to
execute the  cleanup expressions
     even 
if a non-local exit  terminates
the evaluation  of the protected
     expression
 
 
 
 
XLISP 2.1g                   LOOPING CONSTRUCTS                     Page 70
 
 
 
LOOPING CONSTRUCTS
 
(loop
<expr>...)                                         BASIC LOOPING FORM
     fsubr
     <expr>    the body of the loop
     returns  
never returns (must use non-local exit, such as RETURN)
 
(do
(<binding>...) (<texpr> <rexpr>...) <expr>...)     GENERAL LOOPING FORM
(do*
(<binding>...) (<texpr> <rexpr>...) <expr>...)
     fsubr. do binds simultaneously, do* binds
sequentially
     <binding> the variable bindings
each of which is either:
               1)        a symbol (which is initialized to NIL)
               2)        a list of the form: (<sym> <init>
[<step>])
               where:
                         <sym>     is the symbol to bind
                         <init>    the initial value of the symbol
                         <step>    a step expression
     <texpr>   the termination test expression
     <rexpr>   result expressions (the default is NIL)
     <expr>    the body of the loop (treated like an implicit prog)
     returns  
the value of the last result expression
 
(dolist (<sym>
<expr> [<rexpr>]) <expr>...)             LOOP THROUGH A LIST
     fsubr
     <sym>     the symbol to bind to each list element
     <expr>    the list expression
     <rexpr>   the result expression (the default is NIL)
     <expr>    the body of the loop (treated like an implicit prog)
     returns  
the result expression
 
(dotimes (<sym>
<expr> [<rexpr>]) <expr>...)          LOOP FROM ZERO TO N-1
     fsubr
     <sym>     the symbol to bind to each value from 0 to n-1
     <expr>    the number of times to loop
     <rexpr>   the result expression (the default is NIL)
     <expr>    the body of the loop (treated like an implicit prog)
     returns  
the result expression
 
 
 
 
XLISP 2.1g                  THE PROGRAM FEATURE                     Page 71
 
 
 
THE PROGRAM FEATURE
 
(prog
(<binding>...) <expr>...)                         THE PROGRAM FEATURE
(prog*
(<binding>...) <expr>...)               PROG WITH SEQUENTIAL BINDING
     fsubr -- equivalent to (let () (block NIL
(tagbody ...)))
     <binding> the variable bindings
each of which is either:
               1)        a symbol (which is initialized to NIL)
               2)        a list whose car is a 
symbol and whose cadr is an
                         initialization expression
     <expr>    expressions to evaluate or tags (symbols)
     returns  
NIL or the argument passed to the return function
 
(block <name>
<expr>...)                                        NAMED BLOCK
     fsubr
     <name>    the block name (quoted symbol)
     <expr>    the block body
     returns  
the value of the last expression
 
(return
[<expr>])                  CAUSE A
PROG CONSTRUCT TO RETURN A VALUE
     fsubr
     <expr>    the value (defaults to NIL)
     returns  
never returns
 
(return-from
<name> [<value>])       
RETURN FROM A NAMED BLOCK OR FUNCTION
     fsubr. 
In traditional  Xlisp,  the names 
are  dynamically scoped.  A
     compilation option (default) uses lexical
scoping like Common Lisp.
     <name>    the  block or function
name (quoted symbol). If name is NIL,
               use function RETURN.
     <value>   the value to return (defaults to NIL)
     returns  
never returns
 
(tagbody
<expr>...)                                       BLOCK WITH LABELS
     fsubr
     <expr>    expression(s) to evaluate or tags (symbols)
     returns  
NIL
 
(go <sym>)                                     GO TO A
TAG WITHIN A TAGBODY
     fsubr. 
In   traditional  Xlisp,  
tags  are  dynamically   scoped.  A
     compilation option (default) uses lexical
scoping like Common Lisp.
     <sym>     the tag (quoted)
     returns  
never returns
 
(progv <slist>
<vlist> <expr>...)                 
DYNAMICALLY BIND SYMBOLS
     fsubr
     <slist>   list of symbols (evaluated)
    
<vlist>   list of values to
bind to the symbols (evaluated)
     <expr>    expression(s) to evaluate
     returns  
the value of the last expression
 
(prog1 <expr1>
<expr>...)                 
EXECUTE EXPRESSIONS SEQUENTIALLY
     fsubr
     <expr1>   the first expression to evaluate
     <expr>    the remaining expressions to evaluate
     returns  
the value of the first expression
 
 
 
 
XLISP 2.1g                  THE PROGRAM FEATURE                     Page 72
 
 
(prog2 <expr1>
<expr2> <expr>...)          EXECUTE EXPRESSIONS SEQUENTIALLY
     fsubr
     <expr1>   the first expression to evaluate
     <expr2>   the second expression to evaluate
     <expr>    the remaining expressions to evaluate
     returns  
the value of the second expression
 
(progn
<expr>...)                         
EXECUTE EXPRESSIONS SEQUENTIALLY
     fsubr
     <expr>    the expressions to evaluate
     returns  
the value of the last expression (or NIL)
 
 
 
 
XLISP 2.1g                 INPUT/OUTPUT FUNCTIONS                   Page 73
 
 
 
INPUT/OUTPUT FUNCTIONS
 
Note  that when printing objects,  printing is accomplished  by sending the
message :prin1 to the
object.
 
(read [<stream>
[<eofp> [<eof> [<rflag>]]]])             READ AN EXPRESSION
     NOTE: 
there has been an  incompatible
change in  arguments from prior
     versions.
     <stream>  the input stream (default, or NIL, is *standard-input*, T is
               *terminal-io*)
     <eofp>    When T,  signal an  error on end  of file,  when NIL  return
               <eof> (default is T)
     <eof>     the value to return on end of file (default is NIL)
     <rflag>   recursive read flag. The value is ignored
     returns  
the expression read
 
(set-macro-character
<ch> <fcn> [ T ])                    MODIFY READ TABLE
     defined in init.lsp
     <ch>      character to define
     <fcn>     function to bind to character (see page 12)
     T        
if TMACRO rather than NMACRO
 
(get-macro-character
<ch>)                              
EXAMINE READ TABLE
     defined in init.lsp
     <ch>      character
     returns  
function bound to character
 
(print <expr>
[<stream>])                 PRINT
AN EXPRESSION ON A NEW LINE
     The expression is printed using prin1,
then current line is terminated
     (Note: this is backwards from Common
Lisp).
     <expr>    the expression to be printed
     <stream>  the output stream (default, 
or NIL, is *standard-output*, T
               is *terminal-io*)
     returns  
the expression
 
(prin1 <expr>
[<stream>])                              
PRINT AN EXPRESSION
     symbols, cons cells (without
circularities), arrays, strings, numbers,
     and characters are  printed in 
a format generally  acceptable to  the
     read 
function.  Printing  format 
can  be   affected  by  the 
global
     formatting variables: *print-level*
and  *print-length* for lists  and
     arrays, 
*integer-format*  for  fixnums, 
*float-format*  for flonums,
     *ratio-format* for  ratios, and *print-case* and  *readtable-case* for
     symbols.
     <expr>    the expression to be printed
     <stream>  the output stream (default, 
or NIL, is *standard-output*, T
               is *terminal-io*)
     returns  
the expression
 
 
 
 
XLISP 2.1g                 INPUT/OUTPUT FUNCTIONS                   Page 74
 
 
(princ <expr>
[<stream>])               PRINT AN
EXPRESSION WITHOUT QUOTING
     Like 
PRIN1  except  symbols 
(including  uninterned),  strings,  
and
     characters are printed without using any
quoting mechanisms.
     <expr>    the expressions to be printed
     <stream>  the output stream (default, 
or NIL, is *standard-output*, T
               is *terminal-io*)
     returns  
the expression
 
(pprint <expr>
[<stream>])                      
PRETTY PRINT AN EXPRESSION
     Uses prin1 for printing.
     <expr>    the expressions to be printed
     <stream>  the output stream (default, 
or NIL, is *standard-output*, T
               is *terminal-io*)
     returns  
the expression
 
(terpri
[<stream>])                       
TERMINATE THE CURRENT PRINT LINE
     <stream>  the output stream (default, 
or NIL, is *standard-output*, T
               is *terminal-io*)
     returns  
NIL
 
(fresh-line
[<stream>])                                    START A NEW LINE
     <stream>  the output stream (default, 
or NIL, is *standard-output*, T
               is *terminal-io*)
     returns  
t if  a new list was started, NIL
if already at the start of
               a line.
 
(flatsize
<expr>)              LENGTH OF
PRINTED REPRESENTATION USING PRIN1
     <expr>    the expression
     returns   the length
 
(flatc
<expr>)                 LENGTH OF
PRINTED REPRESENTATION USING PRINC
     <expr>    the expression
     returns  
the length
 
(y-or-n-p [<fmt>
[<arg>...]])                     
ASK A YES OR NO QUESTION
(yes-or-no-p
[<fmt> [<arg>...]])
     defined 
in common.lsp.  Uses  *terminal-io* stream  for 
interaction.
     y-or-n-p 
strives for  a  single character  answer,  using
get-key  if
     defined.
     <fmt>     optional format string for question (see page 75)
     <arg>     arguments, if any, for
format string
     returns  
T for yes, NIL for no.
 
 
 
 
XLISP 2.1g                  THE FORMAT FUNCTION                     Page 75
 
 
 
THE FORMAT FUNCTION
 
(format <stream>
<fmt> [<arg>...])                      DO FORMATTED OUTPUT
     <stream>  the output stream (T is *standard-output*)
     <fmt>     the format string
     <arg>     the format arguments
     returns  
output string if <stream> is NIL, NIL otherwise
 
The format string can
contain characters that  should be
copied directly to
the output and
formatting directives. The formatting directives are:
 
     ~A or ~a 
print next argument using princ
     ~S or ~s 
print next argument using prin1
     ~D or ~d 
print next argument as decimal integer
     ~E or ~e 
print next argument in exponential form
     ~F or ~f 
print next argument in fixed point form
     ~G or ~g 
print next  argument  using either  ~E  or ~F  depending 
on
     magnitude
     ~O or ~o 
print next argument as octal integer
     ~X or ~x 
print next argument as hexidecimal integer
     ~%       
start a new line
     ~&        start a new line if not on a new line
     ~|       
start a new page
     ~?       
use next argument as recursive format string
     ~( ~)    
process format string with case conversion
     ~{ ~}    
process format string repetitively
     ~[ ~; ~] 
process format string conditionally
     ~*       
skip arguments
     ~t or ~T 
go to a specified column
     ~~       
print a tilde character
     ~\n      
ignore return and following whitespace
 
The format directives
can contain optional prefix and optional colon (:) or
at-sign (@)  modifiers between  the tilde  and
directive  character. Prefix
characters  are unsigned integers,  the character '#'  which represents the
remaining number of
arguments, the character  'v' to
indicate the number is
taken from the  next argument, or a  single quote (') followed  by a single
character for those
parameters that should be a single character.
 
For ~A and ~S the full
form is:
 
     ~mincol,colinc,minpad,padchar:@A        (or S)
 
If :  is given, NIL  will print  as
"()" rather  than
"NIL". The  string is
padded on the right
(or left, if @ is given) with  at least
"minpad" copies
of the  "padchar". Padding characters are
then inserted "colinc" characters
at  a time until the  total width is at least 
"mincol". The defaults are 0
for mincol and minpad,
1 for colinc, and #\space for padchar. For example:
 
     ~15,,2,'.@A
 
The  output is padded on the left with  at least 2 periods until the output
is at least 15
characters wide.
 
 
 
 
XLISP 2.1g                  THE FORMAT FUNCTION                     Page 76
 
 
For ~D, ~O, and ~X the
full form is ("D" shown):
 
     ~mincol,padchar@D
 
If the argument  is not a 
FIXNUM, then the  format
"~mincolA" is used.  If
"mincol" is
specified then the  number is padded on
the left to be at least
that  many characters long using  "padchar". "padchar"
defaults to #\space.
If @ is used and the
value is positive, then a leading plus sign is printed
before the first digit.
 
For ~E ~F and ~G the
full form is:
 
     ~mincol,round,padchar@E                 (or F or G)
 
(This implementation
is not Common Lisp compatible.) If the argument is not
a   real  
number   (FIXNUM,   RATIO,  
or   FLONUM),   then  
the   format
"~mincol,padcharD"
is  used. The number is printed  using the C language e,
f, or g formats. If
the number could potentially take more 
than 100 digits
to print, then  F format is forced  to E format, although some 
C libraries
will do this  at a lower 
number of digits. If 
"round" is specified, 
than
that is the number of
digits to the right of the decimal point that will be
printed,
otherwise  six digits (or  whatever is necessary in  G format) are
printed.  In G format, trailing zeroes are deleted and
exponential notation
is used if the
exponent of the number is greater than the precision or less
than  -4. If the @ modifier is used,  a leading plus sign is printed before
positive values. If
"mincol" is specified, the number is padded on the left
to be at least
"mincol" characters long using "padchar".
"padchar" defaults
to #\space.
 
For  ~%, ~|, 
and  ~~, the  full 
form  is ~n%,  ~n|, 
or ~n~.  "n"  copies
(default=1) of the
character are output.
 
For ~&, the full
form  is ~n&. ~0& does nothing.
Otherwise  enough new line
characters are emited
to move down to the "n"th new line (default=1).
 
For ~?,  the next argument  is taken  as a format  string, upon  completion
execution resumes in
the current format string. The argument after is taken
as  the list 
of arguments  used for  the new 
format string  unless the  @
modifier is used, in
which case the current argument list is used.
 
For ~(, the full
form  is ~(string~). The string  is processed as a  format
string, however case
conversion is performed on the output. If no modifiers
are used,  the string is converted  to lowercase. If the  colon modifier is
used alone then all
words are capitalized. If the @ modifier 
is used alone
then the  first character is converted  to upper case and  all remaining to
lowercase.  If both 
modifiers are  used, all  characters are  converted to
uppercase.
 
For  ~{, the full  form is  ~n{string~}.
Repeatedly  processes string  as a
format string,  or if the string is zero length, takes the
next argument as
the string.  Iteration stops  when processing  has  occured n 
times or  no
arguments remain. If
the colon modifier is used on the ~} command, and n is
non-zero then the  string will be processed at least  once. If no modifiers
are used on ~{, then
the  arguments are taken from the
next  argument (like
in ~?). If  the colon modifier  is used, the  arguments
are taken  from the
 
 
 
 
XLISP 2.1g                  THE FORMAT FUNCTION                     Page 77
 
 
next argument which
must be a list of sublists -- the sublists are 
used in
turn to provide
arguments on each iteration. In either case, the @ modifier
will  cause the current arguement list to be used
rather than a single list
argument.
 
For    ~[,   
there   are    three   
formats.    The    first  
form    is
~n[clause0~;clause1...~;clausen~].   Only 
one   clause  string  
is  used,
depending on the value
of n. When n is absent, its value is taken 
from the
argument list (as
though 'v'  had been used.) The last
clause is treated as
an  "otherwise"  clause if 
a  colon modifier  is 
used in  its  leading ~;
command. The second
form  is ~:[clauset~;clausenil~]. The
next argument  is
examined  (but not 
consumed),  and if  nil 
clausenil is  used,  otherwise
clauset is  used. The third form  is ~@[string~]. If then  next argument is
non-nil, then it
is  not used up and  the format string is used,  otherwise
the argument is used
up and the string is not used.
 
For ~*, the full form
is ~n*. The count, n, defaults to 1 and is the number
of  arguments to  skip. If the  colon
modifier  is used,  n is 
negated and
skipping  is backwards. The @ modifier causes  n to be an absolute argument
position  (with default  of 0),  where the  first argument  is argument  0.
Attempts to position
before  the first argument will position
at  the first
argument, while
attempts  to position  after the last  argument signals  an
error.
 
For ~T, the full form
is:
 
     ~count,tabwidth@T
 
The  cursor is 
moved  to column  "count"  (default 1).  If  the cursor 
is
initially at count or
beyond, then the  cursor is moved
forward to the next
position that is a
multiple of "tabwidth" (default 1) columns beyond count.
When the @
modifier  is used, then positioning is
relative.  "count" spaces
are  printed, then additional spaces are  printed to make the column number
be a multiple of
"tabwidth". Note that column calcuations will be incorrect
if ASCII tab
characters or ANSI cursor positioning sequences are used.
 
For ~\n,  if the 
colon  modifier is  used, then 
the  format directive  is
ignored (allowing
embedded returns in the source for enhanced readability).
If  the at-sign modifier  is used, then  a carriage return  is
emitted, and
following whitespace
is ignored. 
 
 
 
 
XLISP 2.1g                   FILE I/O FUNCTIONS                     Page 78
 
 
 
FILE I/O FUNCTIONS
 
Note  that initially, when starting XLISP-PLUS,
there are six system stream
symbols which are
associated with three streams. *TERMINAL-IO* is a special
stream  that 
is  bound  to 
the  keyboard  and 
display,  and  allows 
for
interactive  editing. *STANDARD-INPUT*  is bound 
to standard  input  or to
*TERMINAL-IO*  if not 
redirected. *STANDARD-OUTPUT*  is
bound  to standard
output or to
*TERMINAL-IO* if not redirected. *ERROR-OUTPUT* (error message
output),  *TRACE-OUTPUT* (for  TRACE 
and TIME  functions), and  *DEBUG-IO*
(break loop i/o,  and messages)  are all bound  to
*TERMINAL-IO*.  Standard
input and output can
be redirected on most systems.
 
File streams  are printed using the  #< format that  cannot be read  by the
reader.  Console, standard input,  standard output, and  closed streams are
explicitly  indicated. Other file streams  will typically indicate the name
of the attached file.
 
When the transcript is
active (either -t on the command line or the DRIBBLE
function),  all 
characters  that   would 
be  sent  to 
the   display  via
*TERMINAL-IO* are also
placed in the transcript file.
 
*TERMINAL-IO*  should not 
be changed.  Any other  system streams  that are
changed by an
application should be restored to their original values.
 
(read-char
[<stream>[<eofp>[<eof>]]])        READ A CHARACTER FROM A STREAM
     NOTE: New eof arguments are incompatible
with older XLISP versions.
     <stream>  the input stream (default, or NIL, is *standard-input*, T is
               *terminal-io*)
     <eofp>    When  T, signal 
an error  on end  of file, when  NIL return
               <eof> (default is T)
     <eof>     the value to return on end of file (default is NIL)
     returns  
the character or <eof> at end of file
 
(peek-char
[<flag> [<stream>]])                  PEEK AT THE NEXT CHARACTER
     <flag>    flag for skipping white space (default is NIL)
     <stream>  the input stream (default, or NIL, is *standard-input*, T is
               *terminal-io*)
     returns  
the character or NIL at end of file
 
(write-char <ch>
[<stream>])                  WRITE
A CHARACTER TO A STREAM
     <ch>      the character to write
     <stream>  the output stream (default, 
or NIL, is *standard-output*, T
               is *terminal-io*)
     returns  
the character
 
(read-line
[<stream>[<eofp>[<eof>]]])             READ A LINE FROM A STREAM
     NOTE: New eof arguments are incompatible
with older XLISP versions.
     <stream>  the input stream (default, or NIL, is *standard-input*, T is
               *terminal-io*)
     <eofp>    When  T, signal  an error 
on end of  file, when  NIL return
               <eof> (default is T)
     <eof>     the value to return on end of file (default is NIL)
     returns  
the string excluding the #\newline, or <eof> at end of file
 
 
 
 
XLISP 2.1g                   FILE I/O FUNCTIONS                     Page 79
 
 
(open <fname>
&key :direction :element-type :if-exists :if-does-not-exist)
                                                         OPEN A
FILE STREAM
     The function OPEN has been significantly
enhanced over original XLISP.
     The original function only had the  :direction keyword argument, which
     could only  have  the values  :input or 
:output. When  used with  the
     :output keyword, it was equivalent to
(open <fname> :direction :output
     :if-exists :supersede). A maximum of ten
files can be open  at any one
     time, including any files open via the
LOAD, DRIBBLE, SAVE and RESTORE
     commands. The open command  may force a garbage collection  to reclaim
     file slots used by unbound file streams.
 
     <fname>        the file  name
string,  symbol, or file  stream created
                    via OPEN. In the last
case, the name is used  to open a
                    second stream  on 
the  same  file -- 
this  can  cause
                    problems if one or more
streams is used for writing.
     :direction     Read  and  write 
permission  for  stream 
(default  is
                    :input).
       :input       Open file for read operations only.
       :probe       Open file for reading, 
then close it (use to  test for
                    file existance)
       :output      Open file for write operations only.
       :io          Like :output, but reading also allowed.
     :element-type  FIXNUM or CHARACTER (default is CHARACTER), as returned
                    by  type-of function  (on page  87). Files  opened with
                    type FIXNUM  are binary 
files instead of  ascii, which
                    means no  crlf to/from  lf conversion takes 
place, and
                    control-Z will not
terminate an  input file. It is  the
                    intent  of 
Common  Lisp  that 
binary  files  only 
be
                    accessed  with 
read-byte  and write-byte  while 
ascii
                    files be  accessed with any function  but read-byte and
                    write-byte. XLISP does not
enforce that distinction.
     :if-exists     action  to take  if file 
exists. Argument  ignored for
                    :input (file is positioned
at start) or :probe (file is
                    closed)
       :error       give error message
       :rename      rename file to generated backup  name, then open a  new
                    file of the original name.
This is the default action
       :new-version same as :rename
       :overwrite   file is positioned to start, original data intact
       :append      file is positioned to end
       :supersede   delete original file and open new file of the same name
       :rename-and-delete  same as :supersede
       NIL          close file and return NIL
     :if-does-not-exist    action to take if file does not exist.
       :error       give error  message
(default for :input,  or :overwrite
                    or :append)
       :create      create  a new file
(default for :output or :io when not
                    :overwrite or :append)
       NIL          return NIL (default for :probe)
     returns        a file stream, or sometimes NIL
 
 
 
 
XLISP 2.1g                   FILE I/O FUNCTIONS                     Page 80
 
 
(close
<stream>)                                        CLOSE A FILE STREAM
     The stream becomes a  "closed stream." Note that
unbound  file streams
     are closed automatically during a garbage
collection.
     <stream>  the stream, which may be a string stream
     returns  
t  if stream closed, NIL  if terminal (cannot  be closed) or
               already closed.
 
(delete-file
<fname>)                                         DELETE A FILE
     <fname>   file name string, symbol or a stream opened with OPEN
     returns  
t  if file  does not exist  or is  deleted. If  <fname> is a
               stream,  the stream is closed before the file is
deleted. An
               error occurs if the file cannot
be deleted.
 
(truename
<fname>)                               
OBTAIN THE FILE PATH NAME
     <fname>   file name string, symbol, or a stream opened with OPEN
     returns  
string  representing the  true file 
name (absolute  path to
     file).
 
(with-open-file
(<var> <fname> [<karg>...]) [<expr>...])
                                                     
EVALUATE USING A FILE
     Defined in common.lsp  as a 
macro. File  will always  be closed 
upon
     completion
     <var>     symbol name to bind 
stream to while evaluating expresssions
               (quoted)
     <fname>   file name string or symbol
     <karg>    keyword arguments for the implicit open command
     <expr>    expressions to evaluate while file is open (implicit progn)
     returns  
value of last <expr>.
 
(read-byte
[<stream>[<eofp>[<eof>]]])             READ A BYTE FROM A STREAM
     NOTE: New eof arguments are incompatible
with older XLISP versions.
     <stream>  the input stream (default, or NIL, is *standard-input*, T is
               *terminal-io*)
     <eofp>    When T,  signal an  error on end  of file,  when NIL  return
               <eof> (default is T)
     <eof>     the value to return on end of file (default is NIL)
     returns  
the byte (integer) or <eof> at end of file
 
(write-byte <byte>
[<stream>])                    
WRITE A BYTE TO A STREAM
     <byte>    the byte to write (integer)
     <stream>  the output stream (default, 
or NIL, is *standard-output*, T
               is *terminal-io*)
     returns  
the byte (integer)
 
(file-length
<stream>)                                   GET LENGTH OF FILE
     For 
an ascii file, the length reported 
may be larger than the number
     of characters read or written because of
CR conversion.
     <stream>  the file stream (should be disk file)
     returns  
length of file, or NIL if cannot be determined.
 
 
 
 
XLISP 2.1g                   FILE I/O FUNCTIONS                     Page 81
 
 
(file-position
<stream> [<expr>])                 
GET OR SET FILE POSITION
     For an ascii file, the file position may
not be the same as the number
     of characters read  or written 
because of CR  conversion. It
will  be
     correct 
when using  file-position to  position a 
file at  a location
     earlier reported by file-position.
     <stream>  the file stream (should be a disk file)
     <expr>    desired  file
position,  if  setting position.  Can
also  be
               :start for start of file or
:end for end of file.
     returns  
if  setting position,  and 
successful, then  T; if  getting
               position and successful then
the position; otherwise NIL
 
 
 
 
XLISP 2.1g                STRING STREAM FUNCTIONS                   Page 82
 
 
 
STRING STREAM
FUNCTIONS
 
These  functions 
operate  on unnamed  streams. 
An  unnamed output  stream
collects
characters  sent to it when it  is used as the  destination of any
output function. The
functions 'get-output-stream' string and list return a
sting or list of the
characters.
 
An  unnamed 
input  stream  is setup 
with  the  'make-string-input-stream'
function  and returns each character of  the string when it  is used as the
source of any input
function.
 
Note that  there is no difference between unnamed input
and output streams.
Unnamed input streams
may be written  to by output functions,
in which case
the characters are
appended to  the tail end of the
stream.  Unnamed output
streams  may also be (destructively) read by  any input function as well as
the get-output-stream
functions.
 
(make-string-input-stream
<str> [<start> [<end>]])
     <str>     the string
     <start>   the starting offset
     <end>     the ending offset + 1 or NIL for end of string
     returns  
an unnamed stream that reads from the string
 
(make-string-output-stream)
     returns  
an unnamed output stream
 
(get-output-stream-string
<stream>)
     The output stream is emptied by this
function
     <stream>  the output stream
     returns  
the output so far as a string
 
(get-output-stream-list
<stream>)
     The output stream is emptied by this
function
     <stream>  the output stream
     returns  
the output so far as a list
 
(with-input-from-string
(<var> <str> &key :start :end :index) [<expr>...])
     Defined in common.lsp as a macro
     <var>     symbol  that   stream 
is  bound  to  
during  execution  of
               expressions (quoted)
     <str>     the string
     :start   
starting offset into string (default 0)
     :end     
ending offset + 1  (default, or
NIL, is end of string)
     :index   
setf  place form which  gets final 
index into  string after
               last expression is executed
(quoted)
     <expr>    expressions to evaluate (implicit progn)
     returns  
the value of the last <expr>
 
(with-output-to-string
(<var>) [<expr>...])
     Defined in common.lsp as a macro
     <var>     symbol  that   stream 
is  bound  to  
during  execution  of
               expressions (quoted)
     <expr>    expressions to evaluate (implicit progn)
     returns  
contents of stream, as a string
 
 
 
 
XLISP 2.1g              DEBUGGING AND ERROR
HANDLING                Page 83
 
 
 
DEBUGGING AND ERROR
HANDLING FUNCTIONS
 
(trace
[<sym>...])                        
ADD A FUNCTION TO THE TRACE LIST
     fsubr
     <sym>     the function(s) to add (quoted)
     returns  
the trace list
 
(untrace
[<sym>...])                  REMOVE A FUNCTION FROM THE TRACE LIST
     fsubr. If no functions given, all
functions are removed from the trace
     list.
     <sym>     the function(s) to remove (quoted)
     returns  
the trace list
 
(error <emsg>
{<arg>})                      
SIGNAL A NON-CORRECTABLE ERROR
     Note 
that the definition  of this
function has  changed from 2.1e and
     earlier so to match Common Lisp.
     <emsg>    the error message string, which is processed by FORMAT
     <arg>     optional argument{s} for FORMAT 
     returns  
never returns
 
(cerror <cmsg>
<emsg> {<arg>})                  
SIGNAL A CORRECTABLE ERROR
     Note that the definition  of this function  has changed from 2.1e  and
     earlier so to match Common Lisp.
     <cmsg>    the continue message string, which is processed by FORMAT
     <emsg>    the error message string, which is processed by FORMAT
     <arg>     optional argument(s) for both FORMATs (arguments are useable
               twice)
     returns  
NIL when continued from the break loop
 
(break <bmsg>
{<arg>})                                   ENTER A BREAK LOOP
     Note that the  definition of this function 
has changed from 2.1e  and
     earlier so to match Common Lisp.
     <bmsg>    the break message string, which is processed by FORMAT
     <arg>     optional argument(s) for FORMAT
     returns  
NIL when continued from the break loop
 
(clean-up)                                         
CLEAN-UP AFTER AN ERROR
     returns  
never returns
 
(top-level)             CLEAN-UP AFTER AN ERROR AND
RETURN TO THE TOP LEVEL
     Runs 
the function in  variable
*top-level-loop*  (ususally TOP-LEVEL-
LOOP)
     returns  
never returns
 
(continue)                                CONTINUE FROM
A CORRECTABLE ERROR
     returns  
never returns
 
(errset <expr>
[<pflag>])                                       TRAP ERRORS
     fsubr
     <expr>    the expression to execute
     <pflag>   flag to control printing of the error message (default t)
     returns  
the value of  the last expression
consed with NIL  or NIL on
               error
 
 
 
 
XLISP 2.1g              DEBUGGING AND ERROR
HANDLING                Page 84
 
 
(baktrace
[<n>])                   PRINT N
LEVELS OF TRACE BACK INFORMATION
     <n>       the number of levels (defaults to all levels)
     returns  
NIL
 
(evalhook <expr>
<ehook> <ahook> [<env>])               EVALUATE WITH HOOKS
     <expr>    the expression to evaluate. 
<ehook> is not used at  the
top
               level.
     <ehook>   the value for *evalhook*
     <ahook>   the value for *applyhook*
     <env>     the  environment
(default  is NIL). The  format is 
a dotted
               pair of value (car)  and function (cdr) binding lists.  Each
               binding  list is a list  of level binding  a-lists,
with the
               innermost a-list  first. The level binding a-list associates
               the bound symbol with its
value.
     returns  
the result of evaluating the expression
 
(applyhook <fun>
<arglist> <ehook> <ahook>)                APPLY WITH HOOKS
     <fun>     The function closure. <ahook> is not used  for this function
               application.
     <arglist> The list of arguments.
     <ehook>   the value for *evalhook*
     <ahook>   the value for *applyhook*
     returns  
the result of applying <fun> to <arglist>
 
(debug)                                                
ENABLE DEBUG BREAKS
(nodebug)                                             
DISABLE DEBUG BREAKS
     Defined in init.lsp
 
 
 
 
XLISP 2.1g                    SYSTEM FUNCTIONS                      Page 85
 
 
 
SYSTEM FUNCTIONS
 
(load <fname>
&key :verbose :print)                     
LOAD A SOURCE FILE
     An 
implicit ERRSET exists  in this
function  so that  if error occurs
     during 
loading, and *breakenable* is NIL, then the error message will
     be printed and  NIL will  be returned.
The  OS environmental  variable
     XLPATH is  used as a  search path
for  files in this  function. If the
     filename 
does not contain path  separators
('/' for  UNIX, and either
     '/' or  '\' for MS-DOS)
and  XLPATH is defined, then  each pathname in
     XLPATH is tried in turn until a matching
file is found.  If no file is
     found, 
then one last  attempt is
made  in the current  directory. The
     pathnames are separated by either a space
or semicolon, and a trailing
     path separator character is optional.
     <fname>   the filename string, 
symbol, or a file stream  created
with
               OPEN. The extension
"lsp" is assumed.
     :verbose 
the verbose flag (default is t)
     :print   
the print flag (default is NIL)
     returns  
t if successful, else NIL
 
(restore
<fname>)                            
RESTORE WORKSPACE FROM A FILE
     The OS 
environmental variable XLPATH  is
used  as a  search path  for
     files in this function. See the note
under function "load", above. The
     standard 
system streams  are  restored to 
the  defaults as  of 
when
     XLISP-PLUS  was started. Files streams 
are restored in  the same mode
     they were created, if possible, and  are positioned where they were at
     the time of the  save. If the files  have
been altered or moved  since
     the time 
of the save, the restore  will
not be completely successful.
     Memory 
allocation will  not be  the same as 
the current  settings of
     ALLOC are  used. Execution  proceeds
at the  top-level read-eval-print
     loop. The  state of  the
transcript  logging is  not affected  by this
     function.
     <fname>   the filename string, 
symbol, or a file stream  created
with
               OPEN. The extension
"wks" is assumed.
     returns  
NIL on failure, otherwise never returns
 
(save
<fname>)                                     SAVE WORKSPACE TO A FILE
     You cannot save from within a load.  Not all of the state may be saved
     -- see "restore", above. By
saving a workspace with the  name
"xlisp",
     that 
workspace   will  be  
loaded  automatically  when  
you  invoke
     XLISP-PLUS.
     <fname>   the filename string, 
symbol, or a file stream  created
with
               OPEN. The extension "wks" is assumed.
     returns  
t if workspace was written, NIL otherwise
 
(savefun
<fcn>)                                     SAVE FUNCTION TO A FILE
     defined in init.lsp
     <fcn>     function name (saves it to file of same name, with extension
               ".lsp")
     returns  
t if successful
 
(dribble
[<fname>])            CREATE A
FILE WITH A TRANSCRIPT OF A SESSION
     <fname>   file name string, symbol, or file stream created with OPEN
               (if missing, close current
transcript)
     returns  
t if the transcript is opened, NIL if it is closed
 
 
 
 
XLISP 2.1g                    SYSTEM FUNCTIONS                      Page 86
 
 
(gc)                                              
FORCE GARBAGE COLLECTION
     returns  
NIL
 
(expand
[<num>])                          
EXPAND MEMORY BY ADDING SEGMENTS
     <num>     the number of segments to add, default 1
     returns  
the number of segments added
 
(alloc <num>
[<num2>])                                  CHANGE SEGMENT SIZE
     <num>     the number of nodes to allocate
     <num2>    the  number  of pointer 
elements  to allocate  in 
an array
               segment (when dynamic array
allocation compiled). Default is
               no change.
     returns  
the old number of nodes to allocate
 
(room)                                    SHOW
MEMORY ALLOCATION STATISTICS
     Statistics (which are sent to
*STANDARD-OUTPUT*) include:
               Nodes - number of nodes, free
and used
               Free nodes - number of free
nodes
               Segments - number of node
segments, including those reserved
                         for characters and
small integers.
               Allocate  - 
number of  nodes to  allocate 
in any  new node
                         segments
               Total  - total  memory  bytes allocated  for node  segments,
                         arrays, and strings
               Collections - number of garbage
collections
               Time  -  time  spent 
performing   garbage  collections 
(in
               seconds)
     When dynamic  array allocation  is
compiled, the  following additional
     statistics are printed:
               Vector  nodes 
- number  of  pointers 
in arrays  and  (size
                         equivalent) strings
               Vector free - free  space in vector area (may  be fragmented
                         across segments)
               Vector  segs 
- number  of  vector 
segments. Increases  and
                         decreases as needed.
               Vec allocate - number of pointer elements to allocate in any
                         new vector segment
     returns  
NIL
 
(time
<expr>)                                        MEASURE EXECUTION TIME
     fsubr.
     <expr>    the expression to evaluate
     returns  
the result of  the expression.
The execution time is printed
               to *TRACE-OUTPUT*
 
(get-internal-real-time)                             GET ELAPSED CLOCK
TIME
(get-internal-run-time)                          GET ELAPSED EXECUTION
TIME
     returns  
integer      time      in      
system      units       (see
              
internal-time-units-per-second 
on  page  23).  
meaning  of
               absolute values is system
dependent.
 
 
 
 
XLISP 2.1g                    SYSTEM FUNCTIONS                      Page 87
 
 
(coerce <expr>
<type>)                  FORCE
EXPRESSION TO DESIGNATED TYPE
     Sequences  can  be  coerced 
into other  sequences,  single 
character
     strings or  symbols with  single
character  printnames can  be coerced
     into characters, fixnums  can be coerced  into characters or 
flonums.
     Ratios can be coerced into flonums.
Flonums and  ratios can be coerced
     into complex (so can fixnums, but they
turn back into fixnums).
     <expr>    the expression to coerce
     <type>    desired type, as returned by type-of (see page 87)
     returns  
<expr> if type is correct, or converted object.
 
(type-of
<expr>)                        
RETURNS THE TYPE OF THE EXPRESSION
     It is recommended that typep  be used instead, as it is  more general.
     In the original XLISP, the value NIL was
returned for NIL.
     <expr>    the expression to return the type of
     returns  
One of the symbols:
               LIST                for NIL (lists, conses return CONS)
               SYMBOL              for symbols
               OBJECT              for objects
               CONS                for conses
               SUBR                for built-in functions
               FSUBR               for special forms
               CLOSURE             for defined functions
               STRING              for strings
               FIXNUM              for integers
               RATIO               for ratios
               FLONUM              for floating point numbers
               COMPLEX             for complex numbers
               CHARACTER           for characters
               FILE-STREAM         for file pointers
               UNNAMED-STREAM      for unnamed streams
               ARRAY               for arrays
               HASH-TABLE          for hash tables
               sym                 for structures of type "sym"
 
(peek
<addrs>)                                
PEEK AT A LOCATION IN MEMORY
     <addrs>   the address to peek at (integer)
     returns  
the value at the specified address (integer)
 
(poke <addrs>
<value>)                            
POKE A VALUE INTO MEMORY
     <addrs>   the address to poke (integer)
     <value>   the value to poke into the address (integer)
     returns  
the value
 
(address-of
<expr>)                        GET
THE ADDRESS OF AN XLISP NODE
     <expr>    the node
     returns  
the address of the node (integer)
 
(get-key)                                     READ A
KEYSTROKE FROM CONSOLE
     OS dependent.
     returns  
integer value of key (no echo)
 
 
 
 
XLISP 2.1g                    SYSTEM FUNCTIONS                      Page 88
 
 
(system
<command>)                                 EXECUTE A SYSTEM COMMAND
     OS dependent -- not always available.
     <command> Command string, if 0
length then spawn OS shell
     returns  
T if successful (note that MS/DOS command.com always returns
               success)
 
(set-stack-mark
<size>)                      SET
SYSTEM STACK WARNING POINT
     OS 
dependent --  not  always available.  The  system will  perform 
a
     continuable  error when the  amount
of  remaining system  stack passes
     below this setting. The trap is
reset  at the top-level. This function
     is useful for debugging runaway recursive
functions.
     <size>    Remaining stack,  in
bytes.  Minimum value  is fixed 
at the
               value that causes the system
stack overflow error, while the
               maximum value is limitied to
somewhat less than  the current
               remaining stack space. Use
"0" to turn the warnings off.
     returns  
the previous value.
 
(top-level-loop)                                     DEFAULT
TOP LEVEL LOOP
     Runs 
the XLISP  top  level read-eval-print  loop, described  earlier.
     Never returns.
 
(reset-system)                                         
FLUSH INPUT BUFFERS
     Used by user-implemented top level loops
to flush the input buffer
     returns  
NIL
 
(exit)                                                           EXIT
XLISP
     returns  
never returns
 
(generic
<expr>)              CREATE A
GENERIC TYPED COPY OF THE EXPRESSION
     Note: added function, Tom Almy's creation
for debugging xlisp.
     <expr>    the expression to copy
     returns  
NIL if  value is NIL  and NILSYMBOL  compilation option  not
               declared, otherwise if type is:
               SYMBOL              copy as an ARRAY
               OBJECT              copy as an ARRAY
               CONS                (CONS (CAR <expr>)(CDR <expr>))
               CLOSURE             copy as an ARRAY
               STRING              copy of the string
               FIXNUM              value
               FLONUM              value
               RATIO               value
               CHARACTER           value
               UNNAMED-STREAM     
copy as a CONS
               ARRAY               copy of the array
               COMPLEX             copy as an ARRAY
               HASH-TABLE          copy as an ARRAY
               structure           copy as an ARRAY
 
(eval-when
<condition> <body> ...)
     Macro 
defined in common.lsp, and provided to assist in porting Common
     Lisp applications to XLISP-PLUS.
     <condition>         List of conditions
     <body>    expressions which are evaluated if  one of the conditions is
               EXECUTE or LOAD.
     returns  
result of last body expression
 
 
 
 
XLISP 2.1g                    SYSTEM FUNCTIONS                      Page 89
 
 
The following graphic
and  display functions represent an
extension  by Tom
Almy:
 
(cls)                                                         CLEAR
DISPLAY
     Clear the display and position cursor at
upper left corner.
     returns  
nil
 
(cleol)                                               
CLEAR TO END OF LINE
     Clears current line to end.
     returns  
nil
 
(goto-xy
[<column> <row>])                       GET OR SET CURSOR POSITION
     Cursor  
is  repositioned   if 
optional   arguments   are 
specified.
     Coordinates are clipped to actual size of
display.
     <column>  0-based column (x coordinate)
     <row>     0-based row (y coordinate)
     returns  
list of original column and row positions
 
(color
<value>)                                           SET DRAWING COLOR
     <value>   Drawing color (not checked for validity)
     returns  
<value>
 
(move <x1>
<y1> [<x2> <y2> ...])                              ABSOLUTE MOVE
(moverel <x1>
<y2> [<x2> <y2> ...])                           RELATIVE MOVE
     For moverel, all coordinates are relative
to the preceeding point.
     <x1> <y1> Moves to point
x1,y1 in anticipation of draw.
     <x2> <y2> Draws to points
specified in additional arguments.
     returns  
T if succeeds, else NIL
 
(draw [<x1>
<y1> ...])                                        ABSOLUTE DRAW
(drawrel [<x1>
<y1> ...])                                     RELATIVE DRAW
     For drawrel, all coordinates are relative
to the preceeding point.
     <x1> <y1> Point(s) drawn to,
in order.
     returns  
T if succeeds, else NIL
 
 
 
 
XLISP 2.1g                    SYSTEM FUNCTIONS                      Page 90
 
 
(mode <ax>
[<bx> <width> <height>)                         SET DISPLAY MODE
     Standard modes  require only <ax> argument. Extended modes are "Super-
     VGA"  or  "Super-EGA"
and  are display  card 
specific. Not  all XLISP
     versions support all modes.
     <ax>      Graphic mode (value passed in register AX)
               Common standard Modes:
               0,1 - 40x25 text
               2,3 - 80x25 text
               4,5 - 320x200 4 color graphics
(CGA)
               6 - 640x200 monchrome graphics
(CGA)
               13 - 320x200 16 color graphics
(EGA)
               14 - 640x200 16 color graphics
(EGA)
               16 - 640x350 16 color graphics
(EGA)
               18 - 640x480 16 color graphics
(VGA)
               19 - 320x200 256 color graphics
(VGA)
     <bx>      BX value for some extended graphic modes
     <width>   width for extended graphic modes
     <height>  height for extended graphic modes
     returns  
a  list of  the number 
of columns,  number of lines  (1 for
               CGA), maximum  X graphic coordinate (-1 for text modes),
and
               the maximum Y graphic
coordinate (-1 for text modes), or NIL
               if fails
 
 
 
 
XLISP 2.1g                  ADDITIONAL FUNCTIONS                    Page 91
 
 
 
ADDITIONAL FUNCTIONS
AND UTILITIES
 
STEP.LSP
 
This file  contains a simple Lisp  single-step debugger. It   started as an
implementation  of the 
"hook" example  in
chapter  20 of  Steele's "Common
Lisp". This
version was brought up on Xlisp 1.7 for the Amiga, and  then on
VAXLISP.
 
When  the package 
feature is  compiled in,  the debugger  is in  the TOOLS
package. 
 
To invoke: (step
(whatever-form with args))
 
For  each 
list   (interpreted  function 
call),  the  stepper 
prints  the
environment and the
list, then enters a read-eval-print loop. At this point
the available commands
are:
 
(a
list)<CR>   evaluate  the list 
in  the current  environment, print  the
               result, and repeat.
<CR>           step into the called function
anything_else<CR>        step over the called function.
 
If the stepper comes
to a  form that is not a  list it prints the form  and
the value, and
continues on without stopping.
 
Note that stepper
commands  are executed in the current  environment. Since
this  is the case, the stepper commands can change
the current environment.
For example,  a SETF will change an environment variable
and thus can alter
the course of
execution.
 
Global variables -
newline, *hooklevel*
 
Functions/macros -
while step eval-hool-function step-spaces step-flush
 
Note -- an even more
powerful  stepper package is in
stepper.lsp (documented
in stepper.doc).
 
 
 
 
XLISP 2.1g                  ADDITIONAL FUNCTIONS                    Page 92
 
 
PP.LSP
 
In  addition to 
the  pretty-printer  itself, 
this  file  contains 
a  few
functions that
illustrate some simple but useful applications.
 
When the  package feature is compiled  in, these funtions are  in the TOOLS
package.
 
(pp <object>
[<stream>])                           
PRETTY PRINT EXPRESSION
(pp-def <funct>
[<stream>])                    
PRETTY PRINT FUNCTION/MACRO
(pp-file <file>
[<stream>])                              
PRETTY PRINT FILE
     <object>  The expression to print
     <funct>   Function to print (as DEFUN or DEFMACRO)
     <file>    File to print (specify either as string or quoted symbol)
     <stream>  Output stream (default is *standard-output*)
     returns  
T
 
Global variables:
tabsize maxsize miser-size min-miser-car max-normal-car
 
Functions/Macros:
sym-function pp-file pp-def make-def pp pp1 moveto spaces
pp-rest-across     pp-rest    printmacrop    
pp-binding-form    pp-do-form
pp-defining-form
pp-pair-form
 
See the source file
for more information.
 
 
 
 
XLISP 2.1g                  ADDITIONAL FUNCTIONS                    Page 93
 
 
INSPECT.LSP
 
INSPECT..LSP
contains  an XLISP editor/inspector.
When  the package feature
is compiled in, the
editor is in the TOOLS package.
 
Execute
     (ins 
'symbol) to edit a symbol.
     (insf 
symbol)  to  edit the 
function  binding  of  a
symbol  (allows
               changing  the 
argument list  or  function 
type, lambda  or
               macro).
 
The  editor alters the  current selection by 
copying so that  aborting all
changes is generally
posible; the  exception is when editing
a  closure, if
the closure is  backed out 
of, the change  is permanent.
Also,  naturally,
changing the
values  of structure elements, instance
variables,  or symbols
cannot be undone.
 
For  all commands  taking  a numeric  argument, 
the first  element  of the
selection is the 0th
(as in NTH function).
 
Do  not create 
new closures,  because the  environment will  be incorrect.
Closures  become LAMBDA  or MACRO  expressions
as  the selection.  Only the
closure  body 
may be  changed; the  argument 
list cannot  be successfully
modified, nor can the
environment.
 
For class  objects, the class variables,  methods and message names  can be
modified.  For instance objects, instance variables can
be examined (if the
object  under-stands  the message 
:<ivar>  for the  particular 
ivar), and
changed (if :SET-IVAR
is defined for that class, as it is if CLASSES.LSP is
used). Structure
elements can be examined and changed. 
 
(command list on next
page)
 
 
 
 
XLISP 2.1g                  ADDITIONAL FUNCTIONS                    Page 94
 
 
COMMANDS (all
"hot keyed and case sensitive"):
     ?        
List available commands
     A        
select the CAR of the current selection.
     D        
select the CDR of the current selection.
     e n      
select ("Edit") element n
     r n x    
Replaces element n with  x.
     X        
eXit, saving all changes
     Q        
Quit, without saving changes
     b        
go Back one level (backs up A, D or e commands)
     B n      
go Back n levels.
     l        
List selection  using
pprint;  if selection is  symbol, give
               short description
     v        
Verbosity toggle
     . n      
change maximum print length (default 10)
      # n     
change maximum print depth (default 3)
     ! x      
evaluates  x and prints
result,  the symbol tools:@ is bound
               to the selection
     R x      
Replaces the selection with 
evaluated x, the symbol tools:@
               is bound to the selection
 
ADDITIONAL
COMMANDS  (selection is a list or
array):
     ( n m    
inserts parenthesis starting 
with the nth  element,  for 
m
               elements.
      ) n     
removes  parenthesis
surrounding  nth element  of selection,
               which may be array or list
     [ n m    
as in (, but makes elements into an array
     i n x    
Inserts x before nth element in selection.
     d n      
Deletes nth element in selection.
     S x y    
Substitute all  occurances of
y  with x in  selection (which
               must be a list).  EQUAL is used for the comparison.
 
 
 
 
XLISP 2.1g                BUG FIXES AND EXTENSIONS                  Page 95
 
 
 
BUG FIXES AND
EXTENSIONS
 
 
In this section, CL
means "Common Lisp compatible  to
the extent possible".
CX  means 
"now works  with  complex numbers".  CR 
means  "now works  with
ratios".  * 
means   "implemented  in  
LISP  rather  than  
C".  #   means
"implementation
moved from LISP to C".
 
                                 Bug Fixes
 
RESTORE did  not work -- several  bugs for 80x86 systems.  Only one restore
would work per session
-- all systems.
 
:downcase for variable
*printcase* did not work with some compilers.
 
Modifications to make
the source acceptable to ANSI C compilers.
 
Values for ADEPTH  and EDEPTH changed to  more reasonable values  -- before
this change the
processor stack would overflow first, causing a crash.
 
On systems  with 16 bit 
integers: STRCAT  crashes
when  aggregate size  of
argument strings  were greater than  32k. MAKE-ARRAY  crashes
on  too-large
arrays.    DOTIMES,   AREF,   AREF  
and   NTH   place  
forms   of   SETF,
MAKE-STRING-INPUT-STREAM    and  
GET-OUTPUT-STREAM-STRING 
treat   numeric
argument  modulo 
65536.  
MAKE-STRING-INPUT-STREAM 
did   not  check  
for
start>end.
 
Strings containing
nulls could not be read or printed.
 
NTH and NTHCDR failed
for zero length lists.
 
Unnamed streams did
not survive garbage collections.
 
(format nil ...) did
not protect from garbage collection the unnamed stream
it creates.
 
SORT did not protect
some pointers from garbage collection.
 
SYMBOL-NAME
SYMBOL-VALUE SYMBOL-PLIST BOUNDP and FBOUNDP failed with symbol
NIL as argument.
 
LAST returned wrong
value when its argument list ended with a dotted pair.
 
*gc-hook*  was 
not rebound  to NIL  during 
execution of  gchook function,
causing potential
infinite recursion and crash.
 
Executing RETURN from
within a DOLIST  or DOTIMES caused the
environment to
be wrong.
 
When errors occured
during  loading, which were not
caught,  the file would
be  left open. 
EVAL and  LOAD did  not use global  environment. EVALHOOK's
default environment
was not global.
 
 
 
 
XLISP 2.1g                BUG FIXES AND EXTENSIONS                  Page 96
 
 
Invalid symbols (those
containing control characters, for instance), can no
longer be created with
intern and make-symbol.
 
The key T,
meaning  "otherwise" in the
CASE function used  to be allowed in
any position. Now it
only means "otherwise" when used as the last case.
 
The  lexical and functional environment of send
of :answer (which defines a
new method) are  now used during the  method's evaluation, rather  than the
global environment.
 
Signatures added for
WKS files so that invalid ones will be rejected.
 
Checks added for file
names and identifier names being too long.
 
Indexing code fixed to
allow almost 64k long strings  in 16 bit
systems. It
is no longer
possible  to allocate arrays or strings
that are  too long for
the underlying system.
 
Circularity  checks added  to  PRINT LAST  BUTLAST 
LENGTH MEMBER  and  MAP
functions. An  error is  produced for  all but  MEMBER, which  will execute
correctly.
 
Code for  SETF modified so that  a Common Lisp compatible  DEFSETF could be
used.
 
Circularity checks
added to EQUAL.
 
Check for  even number of arguments  to SETQ, SETF, and  PSETQ added. PSETQ
changed to return NIL
rather than result of first assignment (really now!).
 
 
                           User Interface
Changes
 
-w command line
argument to specify alternate or no workspace.
 
-b command line
argument for batch operation.
 
-? command line
argument gives usage message.
 
init.lsp not loaded if
workspace loaded.
 
Search path can be
provided for workspaces and .lsp files.
 
Standard input  and output 
can be  redirected.
*TERMINAL-IO*  stream added
which is always bound
to console (stderr).
 
Non-error  messages  
are  sent  to  
*DEBUG-IO*  so  they  
don't  clutter
*STANDARD-OUTPUT*
 
Results of evaluations
are printed  on a fresh line rather than
at  the end
of the preceeding line
(if any). This enhances readability.
 
Display writes are
buffered.
 
Character literals
available for all 256 values. CL
 
 
 
 
XLISP 2.1g                BUG FIXES AND EXTENSIONS                  Page 97
 
 
Uninterned symbols
print with leading #:. CL
 
PRIN1  generates  
appropriate  escape  sequences 
for   control  and 
meta
characters in strings.
CL
 
Read macro #. added.
CL
 
Lisp code for nested
backquote macros added. CL
 
Read macro #C added
for complex numbers. CL
 
Semantics  for #S 
read macro  changed so  that it 
can read  in structures
written by PRINT. CL
 
PRINT of file streams
shows file name, or "closed" if a closed file stream.
 
*PRINT-CASE* now
applies to PRINC. CL
 
Added
*READTABLE-CASE*  to control  case 
conversion on  input and  output,
allowing case
sensitive code. CL-like
 
Reader macros #+ and
#- added, along with global variable *FEATURES*. CL
 
Added optional
and  OS dependent  checking of system  stack overflow,  with
checks  in READ, 
PRINT, EVAL, and  in the  garbage collector.  Added a new
function  SET-STACK-MARK  which  performs  a 
continuable  error  when 
the
remaining stack space
drops below a preset amount.
 
Improved  command line  editing, symbol  name
lookup, and  history (command
recall) for MS-DOS.
 
*PRINT-CASE* can now
be :CAPITALIZE. CL
 
Packages added.
 
                           New/Changed Data
Types
 
NIL -- was treated as
a special case, now just a normal symbol.
symbols -- value
binding can optionally be constant or special. "*unbound*"
     is no longer a symbol so does not have to
be specially treated.
ratio numbers -- new
type.
complex numbers -- new
type, can be integer or real.
character strings --
The ASCII NUL (code 0) is now a valid character.
objects -- objects of
class Class have a new instance variable which is the
     print name of the class.
hash-table -- new
type, close to CL
random-state -- new
type, CL
Property list
properties are no longer limited to just symbols CL
Multiple value returns
added where appropriate
Packages added where
appropriate
 
                        New Variables and
Constants
 
*apply-hook* Now activated
*command-line*
 
 
 
 
XLISP 2.1g                BUG FIXES AND EXTENSIONS                  Page 98
 
 
*displace-macros*
Macros  are replaced with their  expansions when possible
     *dos-input* MSDOS  only, uses 
DOS interface  to  interact with  user.
     Allows recall of earlier command(s).
*load-file-arguments*
*print-level* CL
*print-length* CL
*random-state* CL
*ratio-format*
*readtable-case*
CL-like
*startup-functions*
*terminal-io* CL
*top-level-loop*
internal-time-units-per-second
CL
pi CL
 
 
                               New functions
 
ACONS CL*
ACOSH CL*
ADJOIN CL
ALPHA-CHAR-P CL
APPLYHOOK CL
APROPOS CL*
APROPOS-LIST CL*
ASH CL
ASINH CL*
ATANH CL*
BUTLAST CL
CEILING CL
CIS CL*
CLREOL (clear to end
of line -- MS/DOS only)
CLRHASH CL
CLS (clear screen --
MS/DOS only)
COERCE CL
COLOR (graphics --
MS/DOS only)
COMPLEMENT CL
COMPLEX CL
COMPLEXP CL
CONCATENATE CL
CONJUGATE CL
CONSTANTP CL
COPY-ALIST CL*
COPY-LIST CL*
COPY-TREE CL*
COSH CL*
COUNT-IF CL except no
:from-end
DECF CL*
DECLARE *
DEFCLASS * (define a
new class)
DEFINST * (define a
new instance)
DEFMETHOD * (define a
new method)
DEFPACKAGE CL*
DEFSETF CL*
DELETE-FILE CL
 
 
 
 
XLISP 2.1g                BUG FIXES AND EXTENSIONS                  Page 99
 
 
DELETE-PACKAGE CL
DENOMINATOR CL
DO-ALL-SYMBOLS CL*
DO-EXTERNAL-SYMBOLS
CL*
DO-SYMBOLS CL*
DRAW (graphics --
MS/DOS only)
DRAWREL (graphics --
MS/DOS only)
ELT CL
EQUALP CL*
EVAL-WHEN *
EVERY CL
EXPORT CL
FILE-LENGTH CL
FILE-POSITION CL
FILL CL*
FIND-ALL-SYMBOLS CL
FIND-IF CL except no
:from-end
FIND-PACKAGE CL
FLOOR CL
FRESH-LINE CL
FUNCTIONP CL*
GENERIC
(implementation debugging function)
GET-INTERNAL-REAL-TIME
CL
GET-INTERNAL-RUN-TIME
CL
GETF CL
GETHASH CL
GOTO-XY (position
cursor -- MS/DOS only)
HASH-TABLE-COUNT CL
IDENTITY CL
IMAGPART CL
IMPORT CL
INCF CL*
IN-PACKAGE CL
INPUT-STREAM-P CL
INTERSECTION CL
LCM CL
LIST* CL
LIST-ALL-PACKAGES CL
LIST-LENGTH CL
LOG CL
LOGTEST CL*
MAKE-HASK-TABLE CL
MAKE-PACKAGE CL
MAKE-RANDOM-STATE CL
MAP CL
MAP-INTO CL
MAPHASH CL
MARK-AS-SPECIAL
MODE (graphics -- MS/DOS
only)
MOVE (graphics --
MS/DOS only)
MOVEREL (graphics --
MS/DOS only)
MULTIPLE-VALUE-BIND
CL*
MULTIPLE-VALUE-CALL CL
MULTIPLE-VALUE-LIST
CL*
MULTIPLE-VALUE-PROG1
CL
 
 
 
 
XLISP 2.1g                BUG FIXES AND EXTENSIONS                 Page 100
 
 
MULTIPLE-VALUE-SETQ
CL*
NINTERSECTION CL*
NTH-VALUE
NOTANY CL
NOTEVERY CL
NREVERSE CL
NSET-DIFFERENCE CL*
NSET-EXCLUSIVE-OR CL*
NSTRING-CAPITALIZE CL
NUMERATOR CL
NUNION CL*
OPEN-STREAM-P CL
OUTPUT-STREAM-P CL
PACKAGE-NAME CL
PACKAGE-NICKNAMES CL
PACKAGE-OBARRAY
PACKAGE-SHADOWING-SYMBOLS
CL
PACKAGE-USED-BY-LIST
CL
PACKAGE-USE-LIST CL
PACKAGE-VALID-P
PAIRLIS CL*
PHASE CL
POP CL*
POSITION-IF CL except
no :from-end
PROCLAIM *
PSETF CL
PUSH CL*
PUSHNEW CL*
RATIONAL CL
RATIONALP CL
REALPART CL
REDUCE CL except no
:from-end
REMF CL*
REMHASH CL
REMOVE-DUPLICATES CL
except no :from-end
RENAME-PACKAGE CL
REPLACE CL*
RESET-SYSTEM
ROUND CL
SEARCH CL except no
:from-end
SET-DIFFERENCE CL
SET-EXCLUSIVE-OR CL*
SET-STACK-MARK
SETF Placeform
ELT  CL
SETF Placeform GETF CL
SETF Placeform
GETHASH  CL
SETF Placeform SEND*
(set instance variable)
SHADOW CL
SHADOWING-IMPORT CL
SIGNUM CL*
SINH CL*
SOME CL
SPECIALP CL
STRING-CAPITALIZE CL
SUBSETP CL
 
 
 
 
XLISP 2.1g                BUG FIXES AND EXTENSIONS                 Page 101
 
 
SYMBOL-PACKAGE CL
TANH CL*
TIME CL
TOP-LEVEL-LOOP
TRUENAME CL
TYPEP CL
UNEXPORT CL
UNINTERN CL*
UNION CL
UNUSE-PACKAGE CL
USE-PACKAGE CL
VALUES CL
VALUES-LIST CL
WITH-INPUT-FROM-STRING
CL*
WITH-OPEN-FILE CL*
WITH-OUTPUT-TO-STRING
CL*
Y-OR-N-P CL*
YES-OR-NO-P CL*
 
 
                             Changed functions
 
&ALLOW-OTHER-KEYS
CL (now functions, is no longer ignored)
:ALLOW-OTHER-KEYS CL
* CL CR CX (with no
arguments, returns 1)
+ CL CR CX (with no
arguments, returns 0)
- CL CR CX
/ CL CR CX
1+ CL CR CX
1- CL CR CX
ABS CL CR CX
ACOS CL CR CX
ALLOC (new optional
second argument)
APPLY CL (allows
multiple arguments)
AREF CL (now works on
strings)
ASIN CL CR CX
ASSOC CL (added :key)
ATAN CL CR CX (second
argument now allowed)
BREAK CL
CERROR CL
CHAR-CODE CL (parity
bit is stripped)
CLOSE CL (will close
unnamed stream strings)
COS CL CR CX
DEFCONSTANT CL# (true
constants)
DEFPARAMETER CL# (true
special variables)
DEFSTRUCT (added
option :print-function, comment field)
DEFVAR CL# (true
special variables)
DELETE (added keywords
:key :start :end. Works on arrays and strings)
DELETE-IF (added
keywords :key :start :end. Works on arrays and strings) 
DELETE-IF-NOT  (added 
keywords  :key  :start 
:end.  Works  on arrays 
and
     strings)
ERROR CL
EXP CL CR CX
EXPT CL CR CX
FMAKUNBOUND #
 
 
 
 
XLISP 2.1g                BUG FIXES AND EXTENSIONS                 Page 102
 
 
FORMAT  (added directives # ~D ~E ~F  ~G ~O ~X ~& ~* ~?  ~| ~( ~[ ~{ ~T ~\N
     and lowercase directives) 
GET CL
HASH (hashes
everything, not just symbols or strings)
LOAD CL (uses path to
find file, allows file stream for name argument) 
LOGAND CL (with no
arguments, returns -1)
LOGIOR CL (with no
arguments, returns 0)
LOGXOR CL (with no
arguments returns 0)
MAKE-ARRAY (added
keywords :initial-contents and :initial-element)
MAKE-STRING-INPUT-STREAM
CL (:end NIL means end of string)
MAKUNBOUND #
MAPCAN #
MAPCON #
MEMBER CL (added :key)
NSTRING-DOWNCASE CL
(string  argument can be symbol, :end
NIL  means end of
     string)
NSTRING-UPCASE CL
(string  argument can be  symbol, :end NIL  means end  of
     string)
NSUBLIS CL
NSUBST CL
NSUBST-IF CL
NSUBST-IF-NOT CL
OPEN CL (many
additional options, as in Common Lisp)
PEEK (fixnum sized
location is fetched)
PEEK-CHAR CL (input
stream NIL is *standard-input*, T is *terminal-io*) 
POKE (fixnum sized
location is stored)
PPRINT (output stream
NIL is *standard-output*, T is *terminal-io*)
PRIN1 CL (output
stream NIL is *standard-output*, T is *terminal-io*)
PRINC CL (output
stream NIL is *standard-output*, T is *terminal-io*)
PRINT (output stream
NIL is *standard-output*, T is *terminal-io*)
RANDOM CL (works with
random-states)
READ  (input 
stream  NIL  is 
*standard-input*,  T  is *terminal-io*,  eof
     arguments)
READ-BYTE CL (input
stream NIL is *standard-input*, T is *terminal-io*, eof
     arguments) 
READ-CHAR CL (input
stream NIL is *standard-input*, T is *terminal-io*, eof
     arguments) 
READ-LINE CL (input
stream NIL is *standard-input*, T is *terminal-io*, eof
     arguments) 
REM CR CL (only two
arguments now allowed, may be floating point)
REMOVE (added keywords
:key :start :end. Works on arrays and strings)
REMOVE-IF (added
keywords :key :start :end. Works on arrays and strings) 
REMOVE-IF-NOT  (added 
keywords :key  :start  :end. 
Works  on  arrays 
and
     strings) 
RESTORE (uses path to
find file, restores file streams, fine name 
argument
     may be file stream)
REVERSE CL (works on
arrays and strings)
ROUND CL (rounds to
nearest even)
SAVE (file name
argument may be file stream)
SIN CL CR CX
SORT (added :key) CL
(with most compilers)
SQRT CL CR CX
STRCAT * (now a macro,
use of CONCATENATE is recommended)
STRING-comparisonFunctions
CL (string arguments can be symbols)
 
 
 
 
XLISP 2.1g                BUG FIXES AND EXTENSIONS                 Page 103
 
 
STRING-DOWNCASE CL
(string argument  can be symbol,  :end NIL means end  of
     string)
STRING-LEFT-TRIM CL
(string argument can be symbol)
STRING-RIGHT-TRIM CL
(string argument can be symbol)
STRING-TRIM CL (string
argument can be symbol)
STRING-UPCASE  CL (string 
argument can be  symbol,
:end  NIL means  end of
     string) 
SUBLIS CL (modified to
do minimum copying)
SUBSEQ CL (works on
arrays and lists)
SUBST CL (modified to
do minimum copying)
TAN CL CR CX
TERPRI CL (output
stream NIL is *standard-output*, T is *terminal-io*) 
TRUNCATE CR CL (allows
denominator argument)
TYPE-OF  (returns HASH-TABLE for hashtables,
COMPLEX  for complex, and LIST
     for NIL)
UNTRACE CL (with no
arguments, untraces all functions)
VALUES CL
VALUES-LIST CL
WRITE-BYTE CL (output
stream NIL is *standard-output*, T is *terminal-io*)
WRITE-CHAR CL (output
stream NIL is *standard-output*, T is *terminal-io*)
 
 
                       New messages for class
Object
 
:prin1 <stream>
:superclass *
:ismemberof
<cls> *
:iskindof <cls>
*
:respondsto
<selector> * 
:storeon (returns form
that will create a copy of the object) *
 
                        New messages for class
Class
 
:superclass *
:messages *
:storeon (returns form
that will recreate class and methods) *
 
 
 
 
XLISP 2.1g                        EXAMPLES                         Page 104
 
 
 
EXAMPLES: FILE I/O
FUNCTIONS
 
 
Input from a File
 
To open a file
for  input, use the OPEN function
with  the keyword argument
:DIRECTION set to
:INPUT. To open a file for output, use the OPEN  function
with  the keyword 
argument :DIRECTION  set to  :OUTPUT. The  OPEN function
takes  a single 
required  argument which  is the 
name of  the file  to be
opened. This  name can be 
in the form  of a string  or a symbol.  The OPEN
function returns an
object  of type FILE-STREAM  if it succeeds in  opening
the specified  file. It 
returns the value  NIL if  it fails. 
In order  to
manipulate the file,
it is necessary to save the value returned by the OPEN
function. This is
usually done by assigning it to  a
variable with the SETQ
special form or by
binding it using LET or LET*. Here is an example:
 
    (setq fp (open "init.lsp"
:direction :input))
 
Evaluating this
expression will result in the file "init.lsp" being opened.
The file object that
will be returned by the OPEN function will be assigned
to the variable
"fp".
 
It is now  possible to use the  file for input. To read  an expression from
the file,  just supply 
the  value of  the "fp"  variable  as the  optional
"stream"
argument to READ.
 
    (read fp)
 
Evaluating this
expression will result in reading the first expression from
the  file "init.lsp". The expression
will be  returned as the result of the
READ function.
More  expressions can be  read from 
the file using  further
calls to the READ
function. When there are no more expressions to read, the
READ function will
give an error (or if a second nil argument is specified,
will return  nil or whatever  value was supplied  as the
third  argument to
READ).
 
Once you are done
reading from the  file, you should close
it. To close the
file, use the
following expression:
 
    (close fp)
 
Evaluating this
expression will cause the file to be closed.
 
 
 
 
XLISP 2.1g                        EXAMPLES                         Page 105
 
 
 
Output to a File
 
Writing to a file is
pretty much the same  as reading from
one. You need to
open the file first.
This time you should use the OPEN function to indicate
that you will do
output to the file. For example:
 
    (setq fp (open "test.dat"
:direction :output :if-exists :supersede))
 
Evaluating this
expression will open the file "test.dat" for output. If the
file already exists,
its current contents will be discarded. 
If it doesn't
already exist, it will
be  created. In any case, a
FILE-STREAM  object will
be returned by the
OPEN function. This file object will be assigned  to the
"fp"
variable.
 
It is now possible to
write to this file by supplying the value of the "fp"
variable as the
optional "stream" parameter in the PRINT function.
 
    (print "Hello there" fp)
 
Evaluating  this expression will result  in the string  "Hello there" being
written to the file
"test.dat".  More data can be
written to the file using
the same technique.
 
Once you  are done 
writing to the  file, you
should  close it.  Closing an
output file is just
like closing an input file.
 
    (close fp)
 
Evaluating  this 
expression  will  close 
the  output  file 
and  make  it
permanent.
 
 
 
A Slightly More
Complicated File Example
 
This example shows how
to  open a file, read each Lisp
expression  from the
file and  print it. It  demonstrates the  use of
files  and the use  of the
optional
"stream" argument to the READ
function.
 
    (do* ((fp (open "test.dat"
:direction :input))
          (ex (read fp nil) (read fp nil)))
         ((null ex) (close fp) nil)
      (print ex))
 
The file will be
closed with the next garbage collection.
 
 
 
 
XLISP 2.1g                         INDEX                           Page 106
 
 
INDEX
 
 
:allow-other-keys  17                   :start 
40-43, 55, 56, 81
:answer  21                             :start1  40, 43, 56
:append  79                             :start2  40, 43, 56
:capitalize  14                         :storeon 
20, 21
:class  20                              :superclass  20, 21
:conc-name  59                          :supersede  79
:constituent  12                        :test      
29,   37,   40-43,
:create  79                                       45-47, 65
:direction  79                          :test-not        29,    40-43,
:downcase  14                                     45-47, 65
:element-type  79                       :tmacro 
12
:end  40-43, 55, 56, 81                 :upcase  14
:end1  40, 43, 56                       :use 
33
:end2  40, 43, 56                       :verbose 
85
:error  79                              :white-space  12
:external  30, 33                       + 
24, 49
:if-does-not-exist  79                  ++  24
:if-exists  79                          +++ 
24
:include  59                            - 
24, 50
:inherited  30, 33  
                   *  24, 50
:initial-contents  38                   **  24
:initial-element  38                    ***  24
:initial-value  43                      *applyhook* 
8, 23
:input  79                              *breakenable*  4, 23
:internal  30, 33                       *command-line*  24
:invert  14                             *debug-io*  23
:io  79                                 *displace-macros*  7, 24
:iskindof  20                           *dos-input*  3, 24
:ismemberof  20                         *error-output*  23
:isnew  20, 21                          *evalhook*  8, 23
:key  29, 40-43, 45-48, 65              *features*  13, 24
:mescape  12                            *float-format*  24, 73
:messages  21                           *gc-flag*  23
:new  21                                *gc-hook*  8, 23
:new-version  79                        *integer-format*  24, 73
:nicknames  33                          *load-file-arguments*  2, 24
:nmacro  12                             *obarray*  23
:output  79                             *package*  23
:overwrite  79                          *print-case*  14, 24, 73
:preserve  14                           *print-length*  24, 73
:prin1  20                              *print-level*  24, 73
:print  85                              *random-state*  24
:print-function  59                     *ratio-format*  24, 73
:probe  79                              *read-suppress*  24
:rename  79                             *readtable-case*  14, 24, 73
:rename-and-delete  79                  *readtable* 
12, 23
:respondsto  20                         *standard-input*  23
:sescape  12                            *standard-output*  23
:set-ivar  61                           *startup-functions*  2, 24
:set-pname  61                          *struct-slots*  59
:show  20                               *terminal-io*  23
:size  37                               *top-level-loop*  24
 
 
 
 
XLISP 2.1g                         INDEX                           Page 107
 
 
*trace-output*  23   
                  char  57
*tracelimit*  4, 23                     char-code 
57
*tracelist*  23                         char-downcase  57
*tracenable*  4, 23                     char-equal 
58
/  50                                   char-greaterp  58
/=  53                                  char-int  58
<  53                                   char-lessp  58
<=  53                                  char-not-equal  58
=  53                                   char-not-greaterp  58
>  53                                   char-not-lessp  58
>=  53                                  char-upcase  57
&allow-other-keys  17                   char/= 
58
&aux  17                                char<  58
&key  17                                char<=  58
&optional  17                           char= 
58
&rest  17                               char>  58
1+  50                                  char>=  58
1-  50                                  CHARACTER  87
abs  50                                 characterp  64
acons  44      
                        cis  52
acos  51                                class  23
acosh  51                               classp  64
address-of  87                          clean-up 
3, 83
adjoin  47                              clean-up,  4
alloc  86                               close  80
alpha-char-p  57                        CLOSURE 
87
and  66, 67                             clrhash  37
append  44                              cls 
89
apply  25                               code-char  57
applyhook  8, 84                        coerce 
87
apropos  32                             color 
89
apropos-list  32                        comma 
25
aref  28, 38                            comma-at  26
ARRAY  87                               complement  25
arrayp  64                              complex  52, 87
ash  54                                 complexp  64
asin  51                                concatenate  39
asinh  51                               cond  67
assoc  45                               conjugate  53
atan  51                                cons  44, 87
atanh  51                               consp  63
atom  63, 66                            constantp  63
backquote  25                           continue  3, 4, 83
baktrace  84                            copy-alist  46
block  71                               copy-list  46
both-case-p  57                         copy-tree 
46
boundp  64                              cos 
51
break  83                               cosh  51
butlast  44                             count  41
car  28, 44                             count-if  41
case  68                                count-if-not  41
catch  68                               cxxr  44
cdr  28, 44                             cxxxr 
44
ceiling  49                             cxxxxr  44
cerror  83                              debug  84
 
 
 
 
XLISP 2.1g                         INDEX                           Page 108
 
 
decf  30                                find-all-symbols  33
declare  31                             find-if  41
defclass  61                            find-if-not  41
defconstant  31                         find-package  33
definst  62                             find-symbol  33
defmacro  30                            first 
44
defmethod  61                           FIXNUM 
87
defpackage  32                          flatc 
74
defparameter  31                        flatsize 
74
defsetf  29                             flet 
68
defstruct  59                           float 
49
defun  30                               floatp  63
defvar  31                              FLONUM  87
delete  42                              floor  49
delete-file  80                         fmakunbound  31
delete-if  42                           format 
75
delete-if-not  42                       fourth 
44
delete-package  32                      fresh-line 
74
denominator  52                         FSUBR 
87
digit-char  57                          funcall 
25
digit-char-p  57                        function 
25, 66
do  70                                  functionp 
65
do-all-symbols  33                      gc  86
do-external-symbols  33                 gcd  51
do-symbols  33                          generic 
88
do*  70                                 gensym  30
dolist  70                              get 
28, 36
dotimes  70                             get-internal-real-time  86
draw  89                                get-internal-run-time  86
drawrel  89                             get-key  87
dribble  85                             get-lambda-expression  26
elt  28, 39                             get-macro-character  73
endp  63                                get-output-stream-list  82
eq  65                                  get-output-stream-string  82
eql  65                                 getf  36
equal  65                               gethash  28, 37
equalp  65                              go 
71
error  83                               goto-xy  89
errset  4, 83                           hash 
30
eval  25                                HASH-TABLE  87
eval-when  88                           hash-table-count  37
evalhook  8, 84                         identity 
25
evenp  65                               if 
67
every  39                               imagpart  52
exit  88                                import  33
exp  52                                 in-package  33
expand  86                              incf 
30
export  33                              input-stream-p  64
expt  52                                int-char  58
fboundp  64                             integerp  63
file-length  80                         intern 
30
file-position  81                       internal-time-units-per-second
FILE-STREAM  87                                   23
fill  43                                intersection  47
find  41                                labels  68
 
 
 
 
XLISP 2.1g                         INDEX                           Page 109
 
 
lambda  26                              NIL 
23
last  44                                nintersection  47
lcm  51                                 nodebug  84
length  39                              not 
63, 66
let  68                                 notany  39
let*  68                                notevery  39
list  44, 66, 87                        nreverse 
39
list-all-packages  33                   nset-difference 
47
list-length  44                         nset-exclusive-or  47
list*  44                               nstring-capitalize  56
listp  63                               nstring-downcase  56
load  85                                nstring-upcase  55
log  52                                 nsubst  46
logand  54                              nsubst-if  48
logior  54                              nsubst-if-not  48
lognot  54                              nth 
28, 45
logtest  54                             nth-value  27
logxor  54                              nthcdr  45
loop  70                                null  63, 66
lower-case-p  57                        NUMBER 
66
macroexpand  26                         numberp  63
macroexpand-1  26                       numerator 
52
macrolet  68                            nunion 
47
make-array  38                          object 
23, 66, 87
make-hash-table  37                     objectp 
64
make-package  33                        oddp 
65
make-random-state  51                   open  79
make-string-input-stream  82            open-stream-p 
64
make-string-output-stream  82          
or  66, 67
make-symbol  30                         output-stream-p  64
makunbound  31                          package-name  34
map  39                                 package-nicknames  34
map-into  39                            package-obarray  34
mapc  45                                package-shadowingsymbols  34
mapcan  45                              package-use-list  34
mapcar  45                              package-used-by-list  34
mapcon  46                              package-valid-p  34
maphash  37                             pairlis  46
mapl  45                                peek  87
maplist  45                             peek-char  78
mark-as-special  31                     phase 
53
max  50                                 pi  23
member  45, 66                          plusp 
65
min  50                                 poke  87
minusp  65                              pop 
29
mod  50                                 position  42
mode  90                                position-if  42
move  89                                position-if-not  42
moverel  89                             pp  92
multiple-value-bind  27                 pprint  74
multiple-value-call  27                 prin1  73
multiple-value-list  27                 princ  74
multiple-value-prog1  27                print  73
multiple-value-setq  27                 proclaim 
31
nconc  48                               prog  71
 
 
 
 
XLISP 2.1g                         INDEX                           Page 110
 
 
prog*  71                               setf  28
prog1  71                               setq  28
prog2  72                               shadow  34
progn  72                               shadowing-import  34
progv  71                               signum  51
psetf  29                               sin 
51
psetq  28                               sinh  51
push  29                                some  39
pushnew  29                             sort 
40
putprop  36                             specialp  63
quote  25                               sqrt  52
random  51                              step 
91
RATIO  87     
                         strcat 
56
rational  49, 66                        STREAM 
66
rationalp  64                           streamp 
64
read  73                                string  55, 87
read-byte  80                           string-capitalize  55
read-char  78                           string-downcase  55
read-line  78                           string-equal  56
realpart  52                            string-greaterp  56
reduce  43                              string-left-trim  55
rem  50          
                      string-lessp 
56
remf  36                                string-not-equal  56
remhash  37                             string-not-greaterp  56
remove  40                              string-not-lessp  56
remove-duplicates  43                   string-right-trim  55
remove-if  40                           string-trim  55
remove-if-not  40                       string-upcase  55
remprop  36                             string/=  56
rename-package  34                      string< 
56
repair  93                              string<=  56
repairf  93                             string=  56
replace  43                             string>  56
reset-system  88                        string>=  56
rest  44                                stringp  64
restore  85                             STRUCT  66
return  71                              sublis  46
return-from  71                         SUBR 
87
reverse  39                             subseq  40
room  86                                subsetp  65
round  49                               subst  46
rplaca  48                              SYMBOL  87
rplacd  48                              symbol-function  28, 30
satisfies  66                           symbol-name  30
save  85                                symbol-package  34
search  40                              symbol-plist  28, 30
second  44                              symbol-value  28, 30
self  19, 23                            symbolp  63
send  19, 28, 61                        system 
88
send-super  19, 61                      t  23
set  28                                 tagbody  71
set-difference  47                      tan 
51
set-exclusive-or  47                    tanh  51
set-macro-character  73                 terpri  74
set-stack-mark  88                      third 
44
 
 
 
 
XLISP 2.1g                         INDEX                           Page 111
 
 
throw  68
time  86
top-level  3, 83
top-level-loop  2, 88
trace  83
truename  80
truncate  49
type-of  87
typep  66
unexport  35
union  47
unless  67
UNNAMED-STREAM  87
untrace  83
unuse-package  35
unwind-protect  69
upper-case-p  57
use-package  35
values  27
values-list  27
vector  38
when  67
with-input-from-string  82
with-open-file  80
with-output-to-string  82
write-byte  80
write-char  78
XLPATH  85
y-or-n-p  74
yes-or-no-p  74
zerop  65