v10i092: XLisP 2.1 sources 3a (1/2) / 5

Gary Murphy garym at cognos.UUCP
Tue Feb 27 14:11:53 AEST 1990


Posting-number: Volume 10, Issue 92
Submitted-by: garym at cognos.UUCP (Gary Murphy)
Archive-name: xlisp21/part05

#!/bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #!/bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	xlisp.doc
# This archive created: Sun Feb 18 23:35:09 1990
# By:	Gary Murphy ()
export PATH; PATH=/bin:$PATH
echo shar: extracting "'xlisp.doc'" '(80928 characters)'
if test -f 'xlisp.doc'
then
	echo shar: over-writing existing file "'xlisp.doc'"
fi
sed 's/^X//' << \SHAR_EOF > 'xlisp.doc'
X
X
X
X
X
X
X                         XLISP: An Object-oriented Lisp
X
X                                  Version 2.0
X
X                                February 6, 1988
X
X
X                                       by
X                               David Michael Betz
X                                127 Taylor Road
X                             Peterborough, NH 03458
X
X                             (603) 924-6936 (home)
X                             (603) 882-1599 (BBS)
X
X                   Copyright (c) 1988, by David Michael Betz
X                              All Rights Reserved
X           Permission is granted for unrestricted non-commercial use
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                  TABLE OF CONTENTS                  Page 2
X
X
X                               Table of Contents
X
X
X                TABLE OF CONTENTS                        2
X
X                INTRODUCTION                             4
X
X                A NOTE FROM THE AUTHOR                   5
X
X                XLISP COMMAND LOOP                       6
X
X                BREAK COMMAND LOOP                       7
X
X                DATA TYPES                               8
X
X                THE EVALUATOR                            9
X
X                LEXICAL CONVENTIONS                     10
X
X                READTABLES                              11
X
X                LAMBDA LISTS                            12
X
X                OBJECTS                                 14
X
X                SYMBOLS                                 17
X
X                EVALUATION FUNCTIONS                    18
X
X                SYMBOL FUNCTIONS                        19
X
X                PROPERTY LIST FUNCTIONS                 21
X
X                ARRAY FUNCTIONS                         22
X
X                LIST FUNCTIONS                          23
X
X                DESTRUCTIVE LIST FUNCTIONS              26
X
X                PREDICATE FUNCTIONS                     27
X
X                CONTROL CONSTRUCTS                      29
X
X                LOOPING CONSTRUCTS                      31
X
X                THE PROGRAM FEATURE                     32
X
X                DEBUGGING AND ERROR HANDLING            33
X
X                ARITHMETIC FUNCTIONS                    34
X
X                BITWISE LOGICAL FUNCTIONS               36
X
X                STRING FUNCTIONS                        37
X
X
X
X
X
X
X
X
X
X        XLISP                  TABLE OF CONTENTS                  Page 3
X
X
X                CHARACTER FUNCTIONS                     39
X
X                INPUT/OUTPUT FUNCTIONS                  41
X
X                THE FORMAT FUNCTION                     42
X
X                FILE I/O FUNCTIONS                      43
X
X                STRING STREAM FUNCTIONS                 44
X
X                SYSTEM FUNCTIONS                        45
X
X                EXAMPLES                                47
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                     INTRODUCTION                    Page 4
X
X
X        INTRODUCTION
X
X        XLISP is an experimental programming language combining some of
X        the features of Common Lisp with an object-oriented extension
X        capability.  It was implemented to allow experimentation with
X        object-oriented programming on small computers.
X
X        There are currently implementations of XLISP running on the IBM-
X        PC and clones under MS-DOS, on the Macintosh, the Atari-ST and
X        the Amiga.  It is completely written in the programming language
X        'C' and is easily extended with user written built-in functions
X        and classes.  It is available in source form to non-commercial
X        users.
X
X        Many Common Lisp functions are built into XLISP.  In addition,
X        XLISP defines the objects 'Object' and 'Class' as primitives.
X        'Object' is the only class that has no superclass and hence is
X        the root of the class heirarchy tree.  'Class' is the class of
X        which all classes are instances (it is the only object that is
X        an instance of itself).
X
X        This document is a brief description of XLISP.  It assumes some
X        knowledge of LISP and some understanding of the concepts of
X        object-oriented programming.
X
X        I recommend the book "LISP" by Winston and Horn and published by
X        Addison Wesley for learning Lisp.  The first edition of this
X        book is based on MacLisp and the second edition is based on
X        Common Lisp.  XLISP will continue to migrate towards
X        compatibility with Common Lisp.
X
X        You will probably also need a copy of "Common Lisp: The
X        Language" by Guy L. Steele, Jr., published by Digital Press to
X        use as a reference for some of the Common Lisp functions that
X        are described only briefly in this document.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                A NOTE FROM THE AUTHOR               Page 5
X
X
X        A NOTE FROM THE AUTHOR
X
X        If you have any problems with XLISP, feel free to contact me for
X        help or advice.  Please remember that since XLISP is available
X        in source form in a high level language, many users have been
X        making versions available on a variety of machines.  If you call
X        to report a problem with a specific version, I may not be able
X        to help you if that version runs on a machine to which I don't
X        have access.  Please have the version number of the version that
X        you are running readily accessible before calling me.
X
X        If you find a bug in XLISP, first try to fix the bug yourself
X        using the source code provided.  If you are successful in fixing
X        the bug, send the bug report along with the fix to me.  If you
X        don't have access to a C compiler or are unable to fix a bug,
X        please send the bug report to me and I'll try to fix it.
X
X        Any suggestions for improvements will be welcomed.  Feel free to
X        extend the language in whatever way suits your needs.  However,
X        PLEASE DO NOT RELEASE ENHANCED VERSIONS WITHOUT CHECKING WITH ME
X        FIRST!!  I would like to be the clearing house for new features
X        added to XLISP.  If you want to add features for your own
X        personal use, go ahead.  But, if you want to distribute your
X        enhanced version, contact me first.  Please remember that the
X        goal of XLISP is to provide a language to learn and experiment
X        with LISP and object-oriented programming on small computers.  I
X        don't want it to get so big that it requires megabytes of memory
X        to run.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                 XLISP COMMAND LOOP                  Page 6
X
X
X        XLISP COMMAND LOOP
X
X        When XLISP is started, it first tries to load the workspace
X        "xlisp.wks" from the current directory.  If that file doesn't
X        exist, XLISP builds an initial workspace, empty except for the
X        built-in functions and symbols.
X
X        Then XLISP attempts to load "init.lsp" from the current
X        directory.  It then loads any files named as parameters on the
X        command line (after appending ".lsp" to their names).
X
X        XLISP then issues the following prompt:
X
X        >
X
X        This indicates that XLISP is waiting for an expression to be
X        typed.
X
X        When a complete expression has been entered, XLISP attempts to
X        evaluate that expression.  If the expression evaluates
X        successfully, XLISP prints the result and then returns to the
X        initial prompt waiting for another expression to be typed.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                 BREAK COMMAND LOOP                  Page 7
X
X
X        BREAK COMMAND LOOP
X
X        When XLISP encounters an error while evaluating an expression,
X        it attempts to handle the error in the following way:
X
X        If the symbol '*breakenable*' is true, the message corresponding
X        to the error is printed.  If the error is correctable, the
X        correction message is printed.
X
X        If the symbol '*tracenable*' is true, a trace back is printed.
X        The number of entries printed depends on the value of the symbol
X        '*tracelimit*'.  If this symbol is set to something other than a
X        number, the entire trace back stack is printed.
X
X        XLISP then enters a read/eval/print loop to allow the user to
X        examine the state of the interpreter in the context of the
X        error.  This loop differs from the normal top-level
X        read/eval/print loop in that if the user invokes the function
X        'continue', XLISP will continue from a correctable error.  If
X        the user invokes the function 'clean-up', XLISP will abort the
X        break loop and return to the top level or the next lower
X        numbered break loop.  When in a break loop, XLISP prefixes the
X        break level to the normal prompt.
X
X        If the symbol '*breakenable*' is nil, XLISP looks for a
X        surrounding errset function.  If one is found, XLISP examines
X        the value of the print flag.  If this flag is true, the error
X        message is printed.  In any case, XLISP causes the errset
X        function call to return nil.
X
X        If there is no surrounding errset function, XLISP prints the
X        error message and returns to the top level.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                      DATA TYPES                     Page 8
X
X
X        DATA TYPES
X
X        There are several different data types available to XLISP
X        programmers.
X
X            o lists
X            o symbols
X            o strings
X            o integers
X            o characters
X            o floats
X            o objects
X            o arrays
X            o streams
X            o subrs (built-in functions)
X            o fsubrs (special forms)
X            o closures (user defined functions)
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                    THE EVALUATOR                    Page 9
X
X
X        THE EVALUATOR
X
X        The process of evaluation in XLISP:
X
X        Strings, integers, characters, floats, objects, arrays, streams,
X        subrs, fsubrs and closures evaluate to themselves.
X
X        Symbols act as variables and are evaluated by retrieving the
X        value associated with their current binding.
X
X        Lists are evaluated by examining the first element of the list
X        and then taking one of the following actions:
X
X            If it is a symbol, the functional binding of the symbol is
X            retrieved.
X
X            If it is a lambda expression, a closure is constructed for
X            the function described by the lambda expression.
X
X            If it is a subr, fsubr or closure, it stands for itself.
X
X            Any other value is an error.
X
X        Then, the value produced by the previous step is examined:
X
X            If it is a subr or closure, the remaining list elements are
X            evaluated and the subr or closure is called with these
X            evaluated expressions as arguments.
X
X            If it is an fsubr, the fsubr is called using the remaining
X            list elements as arguments (unevaluated).
X
X            If it is a macro, the macro is expanded using the remaining
X            list elements as arguments (unevaluated).  The macro
X            expansion is then evaluated in place of the original macro
X            call.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                 LEXICAL CONVENTIONS                Page 10
X
X
X        LEXICAL CONVENTIONS
X
X        The following conventions must be followed when entering XLISP
X        programs:
X
X        Comments in XLISP code begin with a semi-colon character and
X        continue to the end of the line.
X
X        Symbol names in XLISP can consist of any sequence of non-blank
X        printable characters except the following:
X
X                ( ) ' ` , " ;
X
X        Uppercase and lowercase characters are not distinguished within
X        symbol names.  All lowercase characters are mapped to uppercase
X        on input.
X
X        Integer literals consist of a sequence of digits optionally
X        beginning with a '+' or '-'.  The range of values an integer can
X        represent is limited by the size of a C 'long' on the machine on
X        which XLISP is running.
X
X        Floating point literals consist of a sequence of digits
X        optionally beginning with a '+' or '-' and including an embedded
X        decimal point.  The range of values a floating point number can
X        represent is limited by the size of a C 'float' ('double' on
X        machines with 32 bit addresses) on the machine on which XLISP is
X        running.
X
X        Literal strings are sequences of characters surrounded by double
X        quotes.  Within quoted strings the '\' character is used to
X        allow non-printable characters to be included.  The codes
X        recognized are:
X
X                \\        means the character '\'
X                \n       means newline
X                \t       means tab
X                \r       means return
X                \f       means form feed
X                \nnn     means the character whose octal code is nnn
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                      READTABLES                    Page 11
X
X
X        READTABLES
X
X        The behaviour of the reader is controlled by a data structure
X        called a "readtable".  The reader uses the symbol *READTABLE* to
X        locate the current readtable.  This table controls the
X        interpretation of input characters.  It is an array with 128
X        entries, one for each of the ASCII character codes.  Each entry
X        contains one of the following things:
X
X                NIL             Indicating an invalid character
X                :CONSTITUENT    Indicating a symbol constituent
X                :WHITE-SPACE    Indicating a whitespace character
X                (:TMACRO . fun) Terminating readmacro
X                (:NMACRO . fun) Non-terminating readmacro
X                :SESCAPE        Single escape character ('\')
X                :MESCAPE        Multiple escape character ('|')
X
X        In the case of :TMACRO and :NMACRO, the "fun" component is a
X        function.  This can either be a built-in readmacro function or a
X        lambda expression.  The function should take two parameters.
X        The first is the input stream and the second is the character
X        that caused the invocation of the readmacro.  The readmacro
X        function should return NIL to indicate that the character should
X        be treated as white space or a value consed with NIL to indicate
X        that the readmacro should be treated as an occurance of the
X        specified value.  Of course, the readmacro code is free to read
X        additional characters from the input stream.
X
X        XLISP defines several useful read macros:
X
X                '<expr>         == (quote <expr>)
X                #'<expr>        == (function <expr>)
X                #(<expr>...)    == an array of the specified expressions
X                #x<hdigits>     == a hexadecimal number (0-9,A-F)
X                #o<odigits>     == an octal number (0-7)
X                #b<bdigits>     == a binary number (0-1)
X                #\<char> == the ASCII code of the character
X                #| ... |#       == a comment
X                #:<symbol>      == an uninterned symbol
X                `<expr>         == (backquote <expr>)
X                ,<expr>         == (comma <expr>)
X                ,@<expr>        == (comma-at <expr>)
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                     LAMBDA LISTS                   Page 12
X
X
X        LAMBDA LISTS
X
X        There are several forms in XLISP that require that a "lambda
X        list" be specified.  A lambda list is a definition of the
X        arguments accepted by a function.  There are four different
X        types of arguments.
X
X        The lambda list starts with required arguments.  Required
X        arguments must be specified in every call to the function.
X
X        The required arguments are followed by the &optional arguments.
X        Optional arguments may be provided or omitted in a call.  An
X        initialization expression may be specified to provide a default
X        value for an &optional argument if it is omitted from a call.
X        If no initialization expression is specified, an omitted
X        argument is initialized to NIL.  It is also possible to provide
X        the name of a 'supplied-p' variable that can be used to
X        determine if a call provided a value for the argument or if the
X        initialization expression was used.  If specified, the supplied-
X        p variable will be bound to T if a value was specified in the
X        call and NIL if the default value was used.
X
X        The &optional arguments are followed by the &rest argument.  The
X        &rest argument gets bound to the remainder of the argument list
X        after the required and &optional arguments have been removed.
X
X        The &rest argument is followed by the &key arguments.  When a
X        keyword argument is passed to a function, a pair of values
X        appears in the argument list.  The first expression in the pair
X        should evaluate to a keyword symbol (a symbol that begins with a
X        ':').  The value of the second expression is the value of the
X        keyword argument.  Like &optional arguments, &key arguments can
X        have initialization expressions and supplied-p variables.  In
X        addition, it is possible to specify the keyword to be used in a
X        function call.  If no keyword is specified, the keyword obtained
X        by adding a ':' to the beginning of the keyword argument symbol
X        is used.  In other words, if the keyword argument symbol is
X        'foo', the keyword will be ':foo'.
X
X        The &key arguments are followed by the &aux variables.  These
X        are local variables that are bound during the evaluation of the
X        function body.  It is possible to have initialization
X        expressions for the &aux variables.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                     LAMBDA LISTS                   Page 13
X
X
X        Here is the complete syntax for lambda lists:
X
X                (<rarg>...
X                 [&optional [<oarg> | (<oarg> [<init> [<svar>]])]...]
X                 [&rest <rarg>]
X                 [&key
X                   [<karg> | ([<karg> | (<key> <karg>)] [<init> [<svar>]])]...
X                   &allow-other-keys]
X                 [&aux
X                   [<aux> | (<aux> [<init>])]...])
X
X            where:
X
X                <rarg>  is a required argument symbol
X                <oarg>  is an &optional argument symbol
X                <rarg>  is the &rest argument symbol
X                <karg>  is a &key argument symbol
X                <key>   is a keyword symbol
X                <aux>   is an auxiliary variable symbol
X                <init>  is an initialization expression
X                <svar>  is a supplied-p variable symbol
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                       OBJECTS                      Page 14
X
X
X        OBJECTS
X
X        Definitions:
X
X            o selector - a symbol used to select an appropriate method
X            o message - a selector and a list of actual arguments
X            o method - the code that implements a message
X
X        Since XLISP was created to provide a simple basis for
X        experimenting with object-oriented programming, one of the
X        primitive data types included is 'object'.  In XLISP, an object
X        consists of a data structure containing a pointer to the
X        object's class as well as an array containing the values of the
X        object's instance variables.
X
X        Officially, there is no way to see inside an object (look at the
X        values of its instance variables).  The only way to communicate
X        with an object is by sending it a message.
X
X        You can send a message to an object using the 'send' function.
X        This function takes the object as its first argument, the
X        message selector as its second argument (which must be a symbol)
X        and the message arguments as its remaining arguments.
X
X        The 'send' function determines the class of the receiving object
X        and attempts to find a method corresponding to the message
X        selector in the set of messages defined for that class.  If the
X        message is not found in the object's class and the class has a
X        super-class, the search continues by looking at the messages
X        defined for the super-class.  This process continues from one
X        super-class to the next until a method for the message is found.
X        If no method is found, an error occurs.
X
X        A message can also be sent from the body of a method by using
X        the current object, but the method lookup starts with the
X        object's superclass rather than its class.  This allows a
X        subclass to invoke a standard method in its parent class even
X        though it overrides that method with its own specialized
X        version.
X
X        When a method is found, the evaluator binds the receiving object
X        to the symbol 'self' and evaluates the method using the
X        remaining elements of the original list as arguments to the
X        method.  These arguments are always evaluated prior to being
X        bound to their corresponding formal arguments.  The result of
X        evaluating the method becomes the result of the expression.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                       OBJECTS                      Page 15
X
X
X        THE 'Object' CLASS
X
X        Classes:
X
X        Object  THE TOP OF THE CLASS HEIRARCHY
X
X            Messages:
X
X                :show  SHOW AN OBJECT'S INSTANCE VARIABLES
X                    returns     the object
X
X                :class  RETURN THE CLASS OF AN OBJECT
X                    returns     the class of the object
X
X                :isnew  THE DEFAULT OBJECT INITIALIZATION ROUTINE
X                    returns     the object
X
X                :sendsuper <sel> <args>...  SEND SUPERCLASS A MESSAGE
X                    <sel>       the message selector
X                    <args>      the message arguments
X                    returns     the result of sending the message
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                       OBJECTS                      Page 16
X
X
X        THE 'Class' CLASS
X
X        Class   THE CLASS OF ALL OBJECT CLASSES (including itself)
X
X            Messages:
X
X                :new  CREATE A NEW INSTANCE OF A CLASS
X                    returns     the new class object
X
X                :isnew <ivars> [<cvars> [<super>]]  INITIALIZE A NEW CLASS
X                    <ivars>     the list of instance variable symbols
X                    <cvars>     the list of class variable symbols
X                    <super>     the superclass (default is Object)
X                    returns     the new class object
X
X                :answer <msg> <fargs> <code>  ADD A MESSAGE TO A CLASS
X                    <msg>       the message symbol
X                    <fargs>     the formal argument list (lambda list)
X                    <code>      a list of executable expressions
X                    returns     the object
X
X
X        When a new instance of a class is created by sending the message
X        ':new' to an existing class, the message ':isnew' followed by
X        whatever parameters were passed to the ':new' message is sent to
X        the newly created object.
X
X        When a new class is created by sending the ':new' message to the
X        object 'Class', an optional parameter may be specified
X        indicating the superclass of the new class.  If this parameter
X        is omitted, the new class will be a subclass of 'Object'.  A
X        class inherits all instance variables, class variables, and
X        methods from its super-class.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                       SYMBOLS                      Page 17
X
X
X        SYMBOLS
X
X            o self - the current object (within a method context)
X            o *obarray* - the object hash table
X            o *standard-input* - the standard input stream
X            o *standard-output* - the standard output stream
X            o *error-output* - the error output stream
X            o *trace-output* - the trace output stream
X            o *debug-io* - the debug i/o stream
X            o *breakenable* - flag controlling entering break loop on errors
X            o *tracelist* - list of names of functions to trace
X            o *tracenable* - enable trace back printout on errors
X            o *tracelimit* - number of levels of trace back information
X            o *evalhook* - user substitute for the evaluator function
X            o *applyhook* - (not yet implemented)
X            o *readtable* - the current readtable
X            o *unbound* - indicator for unbound symbols
X            o *gc-flag* - controls the printing of gc messages
X            o *gc-hook* - function to call after garbage collection
X            o *integer-format* - format for printing integers ("%d" or "%ld")
X            o *float-format* - format for printing floats ("%g")
X            o *print-case* - symbol output case (:upcase or :downcase)
X
X        There are several symbols maintained by the read/eval/print
X        loop.  The symbols '+', '++', and '+++' are bound to the most
X        recent three input expressions.  The symbols '*', '**' and '***'
X        are bound to the most recent three results.  The symbol '-' is
X        bound to the expression currently being evaluated.  It becomes
X        the value of '+' at the end of the evaluation.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                 EVALUATION FUNCTIONS               Page 18
X
X
X        EVALUATION FUNCTIONS
X
X        (eval <expr>)  EVALUATE AN XLISP EXPRESSION
X            <expr>      the expression to be evaluated
X            returns     the result of evaluating the expression
X
X        (apply <fun> <args>)  APPLY A FUNCTION TO A LIST OF ARGUMENTS
X            <fun>       the function to apply (or function symbol)
X            <args>      the argument list
X            returns     the result of applying the function to the arguments
X
X        (funcall <fun> <arg>...)  CALL A FUNCTION WITH ARGUMENTS
X            <fun>       the function to call (or function symbol)
X            <arg>       arguments to pass to the function
X            returns     the result of calling the function with the arguments
X
X        (quote <expr>)  RETURN AN EXPRESSION UNEVALUATED
X            <expr>      the expression to be quoted (quoted)
X            returns     <expr> unevaluated
X
X        (function <expr>)  GET THE FUNCTIONAL INTERPRETATION
X            <expr>      the symbol or lambda expression (quoted)
X            returns     the functional interpretation
X
X        (backquote <expr>)  FILL IN A TEMPLATE
X            <expr>      the template
X            returns     a copy of the template with comma and comma-at
X                        expressions expanded
X
X        (lambda <args> <expr>...)  MAKE A FUNCTION CLOSURE
X            <args>      formal argument list (lambda list) (quoted)
X            <expr>      expressions of the function body
X            returns     the function closure
X
X        (get-lambda-expression <closure>)  GET THE LAMBDA EXPRESSION
X            <closure>   the closure
X            returns     the original lambda expression
X
X        (macroexpand <form>)  RECURSIVELY EXPAND MACRO CALLS
X            <form>      the form to expand
X            returns     the macro expansion
X
X        (macroexpand-1 <form>)  EXPAND A MACRO CALL
X            <form>      the macro call form
X            returns     the macro expansion
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                   SYMBOL FUNCTIONS                 Page 19
X
X
X        SYMBOL FUNCTIONS
X
X        (set <sym> <expr>)  SET THE VALUE OF A SYMBOL
X            <sym>       the symbol being set
X            <expr>      the new value
X            returns     the new value
X
X        (setq [<sym> <expr>]...)  SET THE VALUE OF A SYMBOL
X            <sym>       the symbol being set (quoted)
X            <expr>      the new value
X            returns     the new value
X
X        (psetq [<sym> <expr>]...)  PARALLEL VERSION OF SETQ
X            <sym>       the symbol being set (quoted)
X            <expr>      the new value
X            returns     the new value
X
X        (setf [<place> <expr>]...)  SET THE VALUE OF A FIELD
X            <place>     the field specifier (quoted):
X                          <sym>                   set value of a symbol
X                          (car <expr>)            set car of a cons node
X                          (cdr <expr>)            set cdr of a cons node
X                          (nth <n> <expr>)        set nth car of a list
X                          (aref <expr> <n>)       set nth element of an array
X                          (get <sym> <prop>)      set value of a property
X                          (symbol-value <sym>)    set value of a symbol
X                          (symbol-function <sym>) set functional value of a symbol
X                          (symbol-plist <sym>)    set property list of a symbol
X            <value>     the new value
X            returns     the new value
X
X        (defun <sym> <fargs> <expr>...)  DEFINE A FUNCTION
X        (defmacro <sym> <fargs> <expr>...)  DEFINE A MACRO
X            <sym>       symbol being defined (quoted)
X            <fargs>     formal argument list (lambda list) (quoted)
X            <expr>      expressions constituting the body of the
X                        function (quoted)
X            returns     the function symbol
X
X        (gensym [<tag>])  GENERATE A SYMBOL
X            <tag>       string or number
X            returns     the new symbol
X
X        (intern <pname>)  MAKE AN INTERNED SYMBOL
X            <pname>     the symbol's print name string
X            returns     the new symbol
X
X        (make-symbol <pname>)  MAKE AN UNINTERNED SYMBOL
X            <pname>     the symbol's print name string
X            returns     the new symbol
X
X        (symbol-name <sym>)  GET THE PRINT NAME OF A SYMBOL
X            <sym>       the symbol
X            returns     the symbol's print name
X
X
X
X
X
X
X
X
X
X        XLISP                   SYMBOL FUNCTIONS                 Page 20
X
X
X        (symbol-value <sym>)  GET THE VALUE OF A SYMBOL
X            <sym>       the symbol
X            returns     the symbol's value
X
X        (symbol-function <sym>)  GET THE FUNCTIONAL VALUE OF A SYMBOL
X            <sym>       the symbol
X            returns     the symbol's functional value
X
X        (symbol-plist <sym>)  GET THE PROPERTY LIST OF A SYMBOL
X            <sym>       the symbol
X            returns     the symbol's property list
X
X        (hash <sym> <n>)  COMPUTE THE HASH INDEX FOR A SYMBOL
X            <sym>       the symbol or string
X            <n>         the table size (integer)
X            returns     the hash index (integer)
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP               PROPERTY LIST FUNCTIONS              Page 21
X
X
X        PROPERTY LIST FUNCTIONS
X
X        (get <sym> <prop>)  GET THE VALUE OF A PROPERTY
X            <sym>       the symbol
X            <prop>      the property symbol
X            returns     the property value or nil
X
X        (putprop <sym> <val> <prop>)  PUT A PROPERTY ONTO A PROPERTY LIST
X            <sym>       the symbol
X            <val>       the property value
X            <prop>      the property symbol
X            returns     the property value
X
X        (remprop <sym> <prop>)  REMOVE A PROPERTY
X            <sym>       the symbol
X            <prop>      the property symbol
X            returns     nil
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                   ARRAY FUNCTIONS                  Page 22
X
X
X        ARRAY FUNCTIONS
X
X        (aref <array> <n>)  GET THE NTH ELEMENT OF AN ARRAY
X            <array>     the array
X            <n>         the array index (integer)
X            returns     the value of the array element
X
X        (make-array <size>)  MAKE A NEW ARRAY
X            <size>      the size of the new array (integer)
X            returns     the new array
X
X        (vector <expr>...)  MAKE AN INITIALIZED VECTOR
X            <expr>      the vector elements
X            returns     the new vector
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                    LIST FUNCTIONS                  Page 23
X
X
X        LIST FUNCTIONS
X
X        (car <expr>)  RETURN THE CAR OF A LIST NODE
X            <expr>      the list node
X            returns     the car of the list node
X
X        (cdr <expr>)  RETURN THE CDR OF A LIST NODE
X            <expr>      the list node
X            returns     the cdr of the list node
X
X        (cxxr <expr>)  ALL CxxR COMBINATIONS
X        (cxxxr <expr>)  ALL CxxxR COMBINATIONS
X        (cxxxxr <expr>)  ALL CxxxxR COMBINATIONS
X
X        (first <expr>)   A SYNONYM FOR CAR
X        (second <expr>)  A SYNONYM FOR CADR
X        (third <expr>)   A SYNONYM FOR CADDR
X        (fourth <expr>)  A SYNONYM FOR CADDDR
X        (rest <expr>)    A SYNONYM FOR CDR
X
X        (cons <expr1> <expr2>)  CONSTRUCT A NEW LIST NODE
X            <expr1>     the car of the new list node
X            <expr2>     the cdr of the new list node
X            returns     the new list node
X
X        (list <expr>...)  CREATE A LIST OF VALUES
X            <expr>      expressions to be combined into a list
X            returns     the new list
X
X        (append <expr>...)  APPEND LISTS
X            <expr>      lists whose elements are to be appended
X            returns     the new list
X
X        (reverse <expr>)  REVERSE A LIST
X            <expr>      the list to reverse
X            returns     a new list in the reverse order
X
X        (last <list>)  RETURN THE LAST LIST NODE OF A LIST
X            <list>      the list
X            returns     the last list node in the list
X
X        (member <expr> <list> &key :test :test-not)  FIND AN EXPRESSION IN A LIST
X            <expr>      the expression to find
X            <list>      the list to search
X            :test       the test function (defaults to eql)
X            :test-not   the test function (sense inverted)      
X            returns     the remainder of the list starting with the expression
X
X        (assoc <expr> <alist> &key :test :test-not)  FIND AN EXPRESSION IN AN A-LIST
X            <expr>      the expression to find
X            <alist>     the association list
X            :test       the test function (defaults to eql)
X            :test-not   the test function (sense inverted)      
X            returns     the alist entry or nil
X
X
X
X
X
X
X
X
X
X        XLISP                    LIST FUNCTIONS                  Page 24
X
X
X        (remove <expr> <list> &key :test :test-not)  REMOVE ELEMENTS FROM A LIST
X            <expr>      the element to remove
X            <list>      the list
X            :test       the test function (defaults to eql)
X            :test-not   the test function (sense inverted)      
X            returns     copy of list with matching expressions removed
X
X        (remove-if <test> <list>)  REMOVE ELEMENTS THAT PASS TEST
X            <test>      the test predicate
X            <list>      the list
X            returns     copy of list with matching elements removed
X
X        (remove-if-not <test> <list>)  REMOVE ELEMENTS THAT FAIL TEST
X            <test>      the test predicate
X            <list>      the list
X            returns     copy of list with non-matching elements removed
X
X        (length <expr>)  FIND THE LENGTH OF A LIST, VECTOR OR STRING
X            <expr>      the list, vector or string
X            returns     the length of the list, vector or string
X
X        (nth <n> <list>)  RETURN THE NTH ELEMENT OF A LIST
X            <n>         the number of the element to return (zero origin)
X            <list>      the list
X            returns     the nth element or nil if the list isn't that long
X
X        (nthcdr <n> <list>)  RETURN THE NTH CDR OF A LIST
X            <n>         the number of the element to return (zero origin)
X            <list>      the list
X            returns     the nth cdr or nil if the list isn't that long
X
X        (mapc <fcn> <list1> <list>...)  APPLY FUNCTION TO SUCCESSIVE CARS
X            <fcn>       the function or function name
X            <listn>     a list for each argument of the function
X            returns     the first list of arguments
X
X        (mapcar <fcn> <list1> <list>...)  APPLY FUNCTION TO SUCCESSIVE CARS
X            <fcn>       the function or function name
X            <listn>     a list for each argument of the function
X            returns     a list of the values returned
X
X        (mapl <fcn> <list1> <list>...)  APPLY FUNCTION TO SUCCESSIVE CDRS
X            <fcn>       the function or function name
X            <listn>     a list for each argument of the function
X            returns     the first list of arguments
X
X        (maplist <fcn> <list1> <list>...)  APPLY FUNCTION TO SUCCESSIVE CDRS
X            <fcn>       the function or function name
X            <listn>     a list for each argument of the function
X            returns     a list of the values returned
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                    LIST FUNCTIONS                  Page 25
X
X
X        (subst <to> <from> <expr> &key :test :test-not)  SUBSTITUTE EXPRESSIONS
X            <to>        the new expression
X            <from>      the old expression
X            <expr>      the expression in which to do the substitutions
X            :test       the test function (defaults to eql)
X            :test-not   the test function (sense inverted)      
X            returns     the expression with substitutions
X
X        (sublis <alist> <expr> &key :test :test-not)  SUBSTITUTE WITH AN A-LIST
X            <alist>     the association list
X            <expr>      the expression in which to do the substitutions
X            :test       the test function (defaults to eql)
X            :test-not   the test function (sense inverted)      
X            returns     the expression with substitutions
X
X
X
X
X
X
X
X
X        XLISP              DESTRUCTIVE LIST FUNCTIONS            Page 26
X
X
X        DESTRUCTIVE LIST FUNCTIONS
X
X        (rplaca <list> <expr>)  REPLACE THE CAR OF A LIST NODE
X            <list>      the list node
X            <expr>      the new value for the car of the list node
X            returns     the list node after updating the car
X
X        (rplacd <list> <expr>)  REPLACE THE CDR OF A LIST NODE
X            <list>      the list node
X            <expr>      the new value for the cdr of the list node
X            returns     the list node after updating the cdr
X
X        (nconc <list>...)  DESTRUCTIVELY CONCATENATE LISTS
X            <list>      lists to concatenate
X            returns     the result of concatenating the lists
X
X        (delete <expr> &key :test :test-not)  DELETE ELEMENTS FROM A LIST
X            <expr>      the element to delete
X            <list>      the list
X            :test       the test function (defaults to eql)
X            :test-not   the test function (sense inverted)      
X            returns     the list with the matching expressions deleted
X
X        (delete-if <test> <list>)  DELETE ELEMENTS THAT PASS TEST
X            <test>      the test predicate
X            <list>      the list
X            returns     the list with matching elements deleted
X
X        (delete-if-not <test> <list>)  DELETE ELEMENTS THAT FAIL TEST
X            <test>      the test predicate
X            <list>      the list
X            returns     the list with non-matching elements deleted
X
X        (sort <list> <test>)  SORT A LIST
X            <list>      the list to sort
X            <test>      the comparison function
X            returns     the sorted list
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                 PREDICATE FUNCTIONS                Page 27
X
X
X        PREDICATE FUNCTIONS
X
X        (atom <expr>)  IS THIS AN ATOM?
X            <expr>      the expression to check
X            returns     t if the value is an atom, nil otherwise
X
X        (symbolp <expr>)  IS THIS A SYMBOL?
X            <expr>      the expression to check
X            returns     t if the expression is a symbol, nil otherwise
X
X        (numberp <expr>)  IS THIS A NUMBER?
X            <expr>      the expression to check
X            returns     t if the expression is a number, nil otherwise
X
X        (null <expr>)  IS THIS AN EMPTY LIST?
X            <expr>      the list to check
X            returns     t if the list is empty, nil otherwise
X
X        (not <expr>)  IS THIS FALSE?
X            <expr>      the expression to check
X            return      t if the value is nil, nil otherwise
X
X        (listp <expr>)  IS THIS A LIST?
X            <expr>      the expression to check
X            returns     t if the value is a cons or nil, nil otherwise
X
X        (endp <list>)  IS THIS THE END OF A LIST
X            <list>      the list
X            returns     t if the value is nil, nil otherwise
X
X        (consp <expr>)  IS THIS A NON-EMPTY LIST?
X            <expr>      the expression to check
X            returns     t if the value is a cons, nil otherwise
X
X        (integerp <expr>)  IS THIS AN INTEGER?
X            <expr>      the expression to check
X            returns     t if the value is an integer, nil otherwise
X
X        (floatp <expr>)  IS THIS A FLOAT?
X            <expr>      the expression to check
X            returns     t if the value is a float, nil otherwise
X
X        (stringp <expr>)  IS THIS A STRING?
X            <expr>      the expression to check
X            returns     t if the value is a string, nil otherwise
X
X        (characterp <expr>)  IS THIS A CHARACTER?
X            <expr>      the expression to check
X            returns     t if the value is a character, nil otherwise
X
X        (arrayp <expr>)  IS THIS AN ARRAY?
X            <expr>      the expression to check
X            returns     t if the value is an array, nil otherwise
X
X
X
X
X
X
X
X
X
X
X        XLISP                 PREDICATE FUNCTIONS                Page 28
X
X
X        (streamp <expr>)  IS THIS A STREAM?
X            <expr>      the expression to check
X            returns     t if the value is a stream, nil otherwise
X
X        (objectp <expr>)  IS THIS AN OBJECT?
X            <expr>      the expression to check
X            returns     t if the value is an object, nil otherwise
X
X        (boundp <sym>)  IS A VALUE BOUND TO THIS SYMBOL?
X            <sym>       the symbol
X            returns     t if a value is bound to the symbol, nil otherwise
X
X        (fboundp <sym>)  IS A FUNCTIONAL VALUE BOUND TO THIS SYMBOL?
X            <sym>       the symbol
X            returns     t if a functional value is bound to the symbol,
X                        nil otherwise
X
X        (minusp <expr>)  IS THIS NUMBER NEGATIVE?
X            <expr>      the number to test
X            returns     t if the number is negative, nil otherwise
X
X        (zerop <expr>)  IS THIS NUMBER ZERO?
X            <expr>      the number to test
X            returns     t if the number is zero, nil otherwise
X
X        (plusp <expr>)  IS THIS NUMBER POSITIVE?
X            <expr>      the number to test
X            returns     t if the number is positive, nil otherwise
X
X        (evenp <expr>)  IS THIS INTEGER EVEN?
X            <expr>      the integer to test
X            returns     t if the integer is even, nil otherwise
X
X        (oddp <expr>)  IS THIS INTEGER ODD?
X            <expr>      the integer to test
X            returns     t if the integer is odd, nil otherwise
X
X        (eq <expr1> <expr2>)  ARE THE EXPRESSIONS IDENTICAL?
X            <expr1>     the first expression
X            <expr2>     the second expression
X            returns     t if they are equal, nil otherwise
X
X        (eql <expr1> <expr2>)  ARE THE EXPRESSIONS IDENTICAL?
X                                (WORKS WITH ALL NUMBERS)
X            <expr1>     the first expression
X            <expr2>     the second expression
X            returns     t if they are equal, nil otherwise
X
X        (equal <expr1> <expr2>)  ARE THE EXPRESSIONS EQUAL?
X            <expr1>     the first expression
X            <expr2>     the second expression
X            returns     t if they are equal, nil otherwise
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                  CONTROL CONSTRUCTS                Page 29
X
X
X        CONTROL CONSTRUCTS
X
X        (cond <pair>...)  EVALUATE CONDITIONALLY
X            <pair>      pair consisting of:
X                            (<pred> <expr>...)
X                          where
X                            <pred>      is a predicate expression
X                            <expr>      evaluated if the predicate
X                                        is not nil
X            returns     the value of the first expression whose predicate
X                        is not nil
X
X        (and <expr>...)  THE LOGICAL AND OF A LIST OF EXPRESSIONS
X            <expr>      the expressions to be ANDed
X            returns     nil if any expression evaluates to nil,
X                        otherwise the value of the last expression
X                        (evaluation of expressions stops after the first
X                         expression that evaluates to nil)
X
X        (or <expr>...)  THE LOGICAL OR OF A LIST OF EXPRESSIONS
X            <expr>      the expressions to be ORed
X            returns     nil if all expressions evaluate to nil,
X                        otherwise the value of the first non-nil expression
X                        (evaluation of expressions stops after the first
X                         expression that does not evaluate to nil)
X
X        (if <texpr> <expr1> [<expr2>])  EVALUATE EXPRESSIONS CONDITIONALLY
X            <texpr>     the test expression
X            <expr1>     the expression to be evaluated if texpr is non-nil
X            <expr2>     the expression to be evaluated if texpr is nil
X            returns     the value of the selected expression
X
X        (when <texpr> <expr>...)  EVALUATE ONLY WHEN A CONDITION IS TRUE
X            <texpr>     the test expression
X            <expr>      the expression(s) to be evaluted if texpr is non-nil
X            returns     the value of the last expression or nil
X
X        (unless <texpr> <expr>...)  EVALUATE ONLY WHEN A CONDITION IS FALSE
X            <texpr>     the test expression
X            <expr>      the expression(s) to be evaluated if texpr is nil
X            returns     the value of the last expression or nil
X
X          (case <expr> <case>...)  SELECT BY CASE
X            <expr>      the selection expression
X            <case>      pair consisting of:
X                            (<value> <expr>...)
X                          where:
X                            <value>     is a single expression or a list of
X                                        expressions (unevaluated)
X                            <expr>      are expressions to execute if the
X                                        case matches
X            returns     the value of the last expression of the matching case
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                  CONTROL CONSTRUCTS                Page 30
X
X
X        (let (<binding>...) <expr>...)  CREATE LOCAL BINDINGS
X        (let* (<binding>...) <expr>...)  LET WITH SEQUENTIAL BINDING
X            <binding>   the variable bindings each of which is either:
X                        1)  a symbol (which is initialized to nil)
X                        2)  a list whose car is a symbol and whose cadr
X                                is an initialization expression
X            <expr>      the expressions to be evaluated
X            returns     the value of the last expression
X
X        (flet (<binding>...) <expr>...)  CREATE LOCAL FUNCTIONS
X        (labels (<binding>...) <expr>...)  FLET WITH RECURSIVE FUNCTIONS
X        (macrolet (<binding>...) <expr>...)  CREATE LOCAL MACROS
X            <binding>   the function bindings each of which is:
X                          (<sym> <fargs> <expr>...)
X                        where:
X                            <sym>       the function/macro name
X                            <fargs>     formal argument list (lambda list)
X                            <expr>      expressions constituting the body of
X                                        the function/macro
X            <expr>      the expressions to be evaluated
X            returns     the value of the last expression
X
X        (catch <sym> <expr>...)  EVALUATE EXPRESSIONS AND CATCH THROWS
X            <sym>       the catch tag
X            <expr>      expressions to evaluate
X            returns     the value of the last expression the throw expression
X
X        (throw <sym> [<expr>])  THROW TO A CATCH
X            <sym>       the catch tag
X            <expr>      the value for the catch to return (defaults to nil)
X            returns     never returns
X
X        (unwind-protect <expr> <cexpr>...)  PROTECT EVALUATION OF AN EXPRESSION
X            <expr>      the expression to protect
X            <cexpr>     the cleanup expressions
X            returns     the value of the expression
X          Note:  unwind-protect guarantees to execute the cleanup expressions
X                 even if a non-local exit terminates the evaluation of the
X                 protected expression
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                  LOOPING CONSTRUCTS                Page 31
X
X
X        LOOPING CONSTRUCTS
X
X        (loop <expr>...)  BASIC LOOPING FORM
X            <expr>      the body of the loop
X            returns     never returns (must use non-local exit)
X
X        (do (<binding>...) (<texpr> <rexpr>...) <expr>...)
X        (do* (<binding>...) (<texpr> <rexpr>...) <expr>...)
X            <binding>   the variable bindings each of which is either:
X                        1)  a symbol (which is initialized to nil)
X                        2)  a list of the form: (<sym> <init> [<step>])
X                            where:
X                                <sym>  is the symbol to bind
X                                <init> is the initial value of the symbol
X                                <step> is a step expression
X            <texpr>     the termination test expression
X            <rexpr>     result expressions (the default is nil)
X            <expr>      the body of the loop (treated like an implicit prog)
X            returns     the value of the last result expression
X
X        (dolist (<sym> <expr> [<rexpr>]) <expr>...)  LOOP THROUGH A LIST
X            <sym>       the symbol to bind to each list element
X            <expr>      the list expression
X            <rexpr>     the result expression (the default is nil)
X            <expr>      the body of the loop (treated like an implicit prog)
X
X        (dotimes (<sym> <expr> [<rexpr>]) <expr>...)  LOOP FROM ZERO TO N-1
X            <sym>       the symbol to bind to each value from 0 to n-1
X            <expr>      the number of times to loop
X            <rexpr>     the result expression (the default is nil)
X            <expr>      the body of the loop (treated like an implicit prog)
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                 THE PROGRAM FEATURE                Page 32
X
X
X        THE PROGRAM FEATURE
X
X        (prog (<binding>...) <expr>...)  THE PROGRAM FEATURE
X        (prog* (<binding>...) <expr>...)  PROG WITH SEQUENTIAL BINDING
X            <binding>   the variable bindings each of which is either:
X                        1)  a symbol (which is initialized to nil)
X                        2)  a list whose car is a symbol and whose cadr
X                                is an initialization expression
X            <expr>      expressions to evaluate or tags (symbols)
X            returns     nil or the argument passed to the return function
X
X        (block <name> <expr>...)  NAMED BLOCK
X            <name>      the block name (symbol)
X            <expr>      the block body
X            returns     the value of the last expression
X
X        (return [<expr>])  CAUSE A PROG CONSTRUCT TO RETURN A VALUE
X            <expr>      the value (defaults to nil)
X            returns     never returns
X
X        (return-from <name> [<value>])  RETURN FROM A NAMED BLOCK
X            <name>      the block name (symbol)
X            <value>     the value to return (defaults to nil)
X            returns     never returns
X
X        (tagbody <expr>...)  BLOCK WITH LABELS
X            <expr>      expression(s) to evaluate or tags (symbols)
X            returns     nil
X
X        (go <sym>)  GO TO A TAG WITHIN A TAGBODY OR PROG
X            <sym>       the tag (quoted)
X            returns     never returns
X
X        (progv <slist> <vlist> <expr>...)  DYNAMICALLY BIND SYMBOLS
X            <slist>     list of symbols
X            <vlist>     list of values to bind to the symbols
X            <expr>      expression(s) to evaluate
X            returns     the value of the last expression
X
X        (prog1 <expr1> <expr>...)  EXECUTE EXPRESSIONS SEQUENTIALLY
X            <expr1>     the first expression to evaluate
X            <expr>      the remaining expressions to evaluate
X            returns     the value of the first expression
X
X        (prog2 <expr1> <expr2> <expr>...)  EXECUTE EXPRESSIONS SEQUENTIALLY
X            <expr1>     the first expression to evaluate
X            <expr2>     the second expression to evaluate
X            <expr>      the remaining expressions to evaluate
X            returns     the value of the second expression
X
X        (progn <expr>...)  EXECUTE EXPRESSIONS SEQUENTIALLY
X            <expr>      the expressions to evaluate
X            returns     the value of the last expression (or nil)
X
X
X
X
X
X
X
X
X
X
X        XLISP             DEBUGGING AND ERROR HANDLING           Page 33
X
X
X        DEBUGGING AND ERROR HANDLING
X
X        (trace <sym>)  ADD A FUNCTION TO THE TRACE LIST
X            <sym>       the function to add (quoted)
X            returns     the trace list
X
X        (untrace <sym>)  REMOVE A FUNCTION FROM THE TRACE LIST
X            <sym>       the function to remove (quoted)
X            returns     the trace list
X
X        (error <emsg> [<arg>])  SIGNAL A NON-CORRECTABLE ERROR
X            <emsg>      the error message string
X            <arg>       the argument expression (printed after the message)
X            returns     never returns
X
X        (cerror <cmsg> <emsg> [<arg>])  SIGNAL A CORRECTABLE ERROR
X            <cmsg>      the continue message string
X            <emsg>      the error message string
X            <arg>       the argument expression (printed after the message)
X            returns     nil when continued from the break loop
X
X        (break [<bmsg> [<arg>]])  ENTER A BREAK LOOP
X            <bmsg>      the break message string (defaults to "**BREAK**")
X            <arg>       the argument expression (printed after the message)
X            returns     nil when continued from the break loop
X
X        (clean-up)  CLEAN-UP AFTER AN ERROR
X            returns     never returns
X
X        (top-level)  CLEAN-UP AFTER AN ERROR AND RETURN TO THE TOP LEVEL
X            returns     never returns
X
X        (continue)  CONTINUE FROM A CORRECTABLE ERROR
X            returns     never returns
X
X        (errset <expr> [<pflag>])  TRAP ERRORS
X            <expr>      the expression to execute
X            <pflag>     flag to control printing of the error message
X            returns     the value of the last expression consed with nil
X                        or nil on error
X
X        (baktrace [<n>])  PRINT N LEVELS OF TRACE BACK INFORMATION
X            <n>         the number of levels (defaults to all levels)
X            returns     nil
X
X        (evalhook <expr> <ehook> <ahook> [<env>])  EVALUATE WITH HOOKS
X            <expr>      the expression to evaluate
X            <ehook>     the value for *evalhook*
X            <ahook>     the value for *applyhook*
X            <env>       the environment (default is nil)
X            returns     the result of evaluating the expression
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                 ARITHMETIC FUNCTIONS               Page 34
X
X
X        ARITHMETIC FUNCTIONS
X
X        (truncate <expr>)  TRUNCATES A FLOATING POINT NUMBER TO AN INTEGER
X            <expr>      the number
X            returns     the result of truncating the number
X
X        (float <expr>)  CONVERTS AN INTEGER TO A FLOATING POINT NUMBER
X            <expr>      the number
X            returns     the result of floating the integer
X
X        (+ <expr>...)  ADD A LIST OF NUMBERS
X            <expr>      the numbers
X            returns     the result of the addition
X
X        (- <expr>...)  SUBTRACT A LIST OF NUMBERS OR NEGATE A SINGLE NUMBER
X            <expr>      the numbers
X            returns     the result of the subtraction
X
X        (* <expr>...)  MULTIPLY A LIST OF NUMBERS
X            <expr>      the numbers
X            returns     the result of the multiplication
X
X        (/ <expr>...)  DIVIDE A LIST OF NUMBERS
X            <expr>      the numbers
X            returns     the result of the division
X
X        (1+ <expr>)  ADD ONE TO A NUMBER
X            <expr>      the number
X            returns     the number plus one
X
X        (1- <expr>)  SUBTRACT ONE FROM A NUMBER
X            <expr>      the number
X            returns     the number minus one
X
X        (rem <expr>...)  REMAINDER OF A LIST OF NUMBERS
X            <expr>      the numbers
X            returns     the result of the remainder operation
X
X        (min <expr>...)  THE SMALLEST OF A LIST OF NUMBERS
X            <expr>      the expressions to be checked
X            returns     the smallest number in the list
X
X        (max <expr>...)  THE LARGEST OF A LIST OF NUMBERS
X            <expr>      the expressions to be checked
X            returns     the largest number in the list
X
X        (abs <expr>)  THE ABSOLUTE VALUE OF A NUMBER
X            <expr>      the number
X            returns     the absolute value of the number
X
X        (gcd <n1> <n2>...)  COMPUTE THE GREATEST COMMON DIVISOR
X            <n1>        the first number (integer)
X            <n2>        the second number(s) (integer)
X            returns     the greatest common divisor
X
X
X
X
X
X
X
X
X
X        XLISP                 ARITHMETIC FUNCTIONS               Page 35
X
X
X        (random <n>)  COMPUTE A RANDOM NUMBER BETWEEN 1 and N-1
X            <n>         the upper bound (integer)
X            returns     a random number
X
X        (sin <expr>)  COMPUTE THE SINE OF A NUMBER
X            <expr>      the floating point number
X            returns     the sine of the number
X
X        (cos <expr>)  COMPUTE THE COSINE OF A NUMBER
X            <expr>      the floating point number
X            returns     the cosine of the number
X
X        (tan <expr>)  COMPUTE THE TANGENT OF A NUMBER
X            <expr>      the floating point number
X            returns     the tangent of the number
X
X        (expt <x-expr> <y-expr>)  COMPUTE X TO THE Y POWER
X            <x-expr>    the floating point number
X            <y-expr>    the floating point exponent
X            returns     x to the y power
X
X        (exp <x-expr>)  COMPUTE E TO THE X POWER
X            <x-expr>    the floating point number
X            returns     e to the x power
X
X        (sqrt <expr>)  COMPUTE THE SQUARE ROOT OF A NUMBER
X            <expr>      the floating point number
X            returns     the square root of the number
X
X        (< <n1> <n2>...)  TEST FOR LESS THAN
X        (<= <n1> <n2>...)  TEST FOR LESS THAN OR EQUAL TO
X        (= <n1> <n2>...)  TEST FOR EQUAL TO
X        (/= <n1> <n2>...)  TEST FOR NOT EQUAL TO
X        (>= <n1> <n2>...)  TEST FOR GREATER THAN OR EQUAL TO
X        (> <n1> <n2>...)  TEST FOR GREATER THAN
X            <n1>        the first number to compare
X            <n2>        the second number to compare
X            returns     the result of comparing <n1> with <n2>...
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP              BITWISE LOGICAL FUNCTIONS             Page 36
X
X
X        BITWISE LOGICAL FUNCTIONS
X
X        (logand <expr>...)  THE BITWISE AND OF A LIST OF NUMBERS
X            <expr>      the numbers
X            returns     the result of the and operation
X
X        (logior <expr>...)  THE BITWISE INCLUSIVE OR OF A LIST OF NUMBERS
X            <expr>      the numbers
X            returns     the result of the inclusive or operation
X
X        (logxor <expr>...)  THE BITWISE EXCLUSIVE OR OF A LIST OF NUMBERS
X            <expr>      the numbers
X            returns     the result of the exclusive or operation
X
X        (lognot <expr>)  THE BITWISE NOT OF A NUMBER
X            <expr>      the number
X            returns     the bitwise inversion of number
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                   STRING FUNCTIONS                 Page 37
X
X
X        STRING FUNCTIONS
X
X        (string <expr>)  MAKE A STRING FROM AN INTEGER ASCII VALUE
X            <expr>      the integer
X            returns     a one character string
X
X        (string-trim <bag> <str>)  TRIM BOTH ENDS OF A STRING
X            <bag>       a string containing characters to trim
X            <str>       the string to trim
X            returns     a trimed copy of the string
X
X        (string-left-trim <bag> <str>)  TRIM THE LEFT END OF A STRING
X            <bag>       a string containing characters to trim
X            <str>       the string to trim
X            returns     a trimed copy of the string
X
X        (string-right-trim <bag> <str>)  TRIM THE RIGHT END OF A STRING
X            <bag>       a string containing characters to trim
X            <str>       the string to trim
X            returns     a trimed copy of the string
X
X        (string-upcase <str> &key :start :end)  CONVERT TO UPPERCASE
X            <str>       the string
X            :start      the starting offset
X            :end        the ending offset + 1
X            returns     a converted copy of the string
X
X        (string-downcase <str> &key :start :end)  CONVERT TO LOWERCASE
X            <str>       the string
X            :start      the starting offset
X            :end        the ending offset + 1
X            returns     a converted copy of the string
X
X        (nstring-upcase <str> &key :start :end)  CONVERT TO UPPERCASE
X            <str>       the string
X            :start      the starting offset
X            :end        the ending offset + 1
X            returns     the converted string (not a copy)
X
X        (nstring-downcase <str> &key :start :end)  CONVERT TO LOWERCASE
X            <str>       the string
X            :start      the starting offset
X            :end        the ending offset + 1
X            returns     the converted string (not a copy)
X
X        (strcat <expr>...)  CONCATENATE STRINGS
X            <expr>      the strings to concatenate
X            returns     the result of concatenating the strings
X
X        (subseq <string> <start> [<end>]) EXTRACT A SUBSTRING
X            <string>    the string
X            <start>     the starting position (zero origin)
X            <end>       the ending position + 1 (defaults to end)
X            returns     substring between <start> and <end>
X
X
X
X
X
X
X
X
X
X        XLISP                   STRING FUNCTIONS                 Page 38
X
X
X        (string< <str1> <str2> &key :start1 :end1 :start2 :end2)
X        (string<= <str1> <str2> &key :start1 :end1 :start2 :end2)
X        (string= <str1> <str2> &key :start1 :end1 :start2 :end2)
X        (string/= <str1> <str2> &key :start1 :end1 :start2 :end2)
X        (string>= <str1> <str2> &key :start1 :end1 :start2 :end2)
X        (string> <str1> <str2> &key :start1 :end1 :start2 :end2)
X            <str1>      the first string to compare
X            <str2>      the second string to compare
X            :start1     first substring starting offset
X            :end1       first substring ending offset + 1
X            :start2     second substring starting offset
X            :end2       second substring ending offset + 1
X            returns     t if predicate is true, nil otherwise
X          Note: case is significant with these comparison functions.
X
X        (string-lessp <str1> <str2> &key :start1 :end1 :start2 :end2)
X        (string-not-greaterp <str1> <str2> &key :start1 :end1 :start2 :end2)
X        (string-equalp <str1> <str2> &key :start1 :end1 :start2 :end2)
X        (string-not-equalp <str1> <str2> &key :start1 :end1 :start2 :end2)
X        (string-not-lessp <str1> <str2> &key :start1 :end1 :start2 :end2)
X        (string-greaterp <str1> <str2> &key :start1 :end1 :start2 :end2)
X            <str1>      the first string to compare
X            <str2>      the second string to compare
X            :start1     first substring starting offset
X            :end1       first substring ending offset + 1
X            :start2     second substring starting offset
X            :end2       second substring ending offset + 1
X            returns     t if predicate is true, nil otherwise
X          Note: case is not significant with these comparison functions.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                 CHARACTER FUNCTIONS                Page 39
X
X
X        CHARACTER FUNCTIONS
X
X        (char <string> <index>)  EXTRACT A CHARACTER FROM A STRING
X            <string>    the string
X            <index>     the string index (zero relative)
X            returns     the ascii code of the character
X
X        (upper-case-p <chr>)  IS THIS AN UPPER CASE CHARACTER?
X            <chr>       the character
X            returns     true if the character is upper case, nil otherwise
X
X        (lower-case-p <chr>)  IS THIS A LOWER CASE CHARACTER?
X            <chr>       the character
X            returns     true if the character is lower case, nil otherwise
X
X        (both-case-p <chr>)  IS THIS AN ALPHABETIC (EITHER CASE) CHARACTER?
X            <chr>       the character
X            returns     true if the character is alphabetic, nil otherwise
X
X        (digit-char-p <chr>)  IS THIS A DIGIT CHARACTER?
X            <chr>       the character
X            returns     the digit weight if character is a digit, nil otherwise
X
X        (char-code <chr>)  GET THE ASCII CODE OF A CHARACTER
X            <chr>       the character
X            returns     the ASCII character code (integer)
X
X        (code-char <code>)  GET THE CHARACTER WITH A SPECFIED ASCII CODE
X            <code>      the ASCII code (integer)
X            returns     the character with that code or nil
X
X        (char-upcase <chr>)  CONVERT A CHARACTER TO UPPER CASE
X            <chr>       the character
X            returns     the upper case character
X
X        (char-downcase <chr>)  CONVERT A CHARACTER TO LOWER CASE
X            <chr>       the character
X            returns     the lower case character
X
X        (digit-char <n>)  CONVERT A DIGIT WEIGHT TO A DIGIT
X            <n>         the digit weight (integer)
X            returns     the digit character or nil
X
X        (char-int <chr>) CONVERT A CHARACTER TO AN INTEGER
X            <chr>       the character
X            returns     the ASCII character code
X
X        (int-char <int>) CONVERT AN INTEGER TO A CHARACTER
X            <int>       the ASCII character code
X            returns     the character with that code
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                 CHARACTER FUNCTIONS                Page 40
X
X
X        (char< <chr1> <chr2>...)
X        (char<= <chr1> <chr2>...)
X        (char= <chr1> <chr2>...)
X        (char/= <chr1> <chr2>...)
X        (char>= <chr1> <chr2>...)
X        (char> <chr1> <chr2>...)
X            <chr1>      the first character to compare
X            <chr2>      the second character(s) to compare
X            returns     t if predicate is true, nil otherwise
X          Note: case is significant with these comparison functions.
X
X        (char-lessp <chr1> <chr2>...)
X        (char-not-greaterp <chr1> <chr2>...)
X        (char-equalp <chr1> <chr2>...)
X        (char-not-equalp <chr1> <chr2>...)
X        (char-not-lessp <chr1> <chr2>...)
X        (char-greaterp <chr1> <chr2>...)
X            <chr1>      the first string to compare
X            <chr2>      the second string(s) to compare
X            returns     t if predicate is true, nil otherwise
X          Note: case is not significant with these comparison functions.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                INPUT/OUTPUT FUNCTIONS              Page 41
X
X
X        INPUT/OUTPUT FUNCTIONS
X
X        (read [<stream> [<eof> [<rflag>]]])  READ AN EXPRESSION
X            <stream>    the input stream (default is standard input)
X            <eof>       the value to return on end of file (default is nil)
X            <rflag>     recursive read flag (default is nil)
X            returns     the expression read
X
X        (print <expr> [<stream>])  PRINT AN EXPRESSION ON A NEW LINE
X            <expr>      the expression to be printed
X            <stream>    the output stream (default is standard output)
X            returns     the expression
X
X        (prin1 <expr> [<stream>])  PRINT AN EXPRESSION
X            <expr>      the expression to be printed
X            <stream>    the output stream (default is standard output)
X            returns     the expression
X
X        (princ <expr> [<stream>])  PRINT AN EXPRESSION WITHOUT QUOTING
X            <expr>      the expressions to be printed
X            <stream>    the output stream (default is standard output)
X            returns     the expression
X
X        (pprint <expr> [<stream>])  PRETTY PRINT AN EXPRESSION
X            <expr>      the expressions to be printed
X            <stream>    the output stream (default is standard output)
X            returns     the expression
X
X        (terpri [<stream>])  TERMINATE THE CURRENT PRINT LINE
X            <stream>    the output stream (default is standard output)
X            returns     nil
X
X        (flatsize <expr>)  LENGTH OF PRINTED REPRESENTATION USING PRIN1
X            <expr>      the expression
X            returns     the length
X
X        (flatc <expr>)  LENGTH OF PRINTED REPRESENTATION USING PRINC
X            <expr>      the expression
X            returns     the length
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                 THE FORMAT FUNCTION                Page 42
X
X
X        THE FORMAT FUNCTION
X
X        (format <stream> <fmt> <arg>...)  DO FORMATTED OUTPUT
X            <stream>    the output stream
X            <fmt>       the format string
X            <arg>       the format arguments
X            returns     output string if <stream> is nil, nil otherwise
X
X        The format string can contain characters that should be copied
X        directly to the output and formatting directives.  The
X        formatting directives are:
X
X            ~A          print next argument using princ
X            ~S          print next argument using prin1
X            ~%          start a new line
X            ~~          print a tilde character
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                  FILE I/O FUNCTIONS                Page 43
X
X
X        FILE I/O FUNCTIONS
X
X        (open <fname> &key :direction)  OPEN A FILE STREAM
X            <fname>     the file name string or symbol
X            :direction  :input or :output (default is :input)
X            returns     a stream
X
X        (close <stream>)  CLOSE A FILE STREAM
X            <stream>    the stream
X            returns     nil
X
X        (read-char [<stream>])  READ A CHARACTER FROM A STREAM
X            <stream>    the input stream (default is standard input)
X            returns     the character
X
X        (peek-char [<flag> [<stream>]])  PEEK AT THE NEXT CHARACTER
X            <flag>      flag for skipping white space (default is nil)
X            <stream>    the input stream (default is standard input)
X            returns     the character (integer)
X
X        (write-char <ch> [<stream>])  WRITE A CHARACTER TO A STREAM
X            <ch>        the character to write
X            <stream>    the output stream (default is standard output)
X            returns     the character
X
X        (read-line [<stream>])  READ A LINE FROM A STREAM
X            <stream>    the input stream (default is standard input)
X            returns     the string
X
X        (read-byte [<stream>])  READ A BYTE FROM A STREAM
X            <stream>    the input stream (default is standard input)
X            returns     the byte (integer)
X
X        (write-byte <byte> [<stream>])  WRITE A BYTE TO A STREAM
X            <byte>      the byte to write (integer)
X            <stream>    the output stream (default is standard output)
X            returns     the byte (integer)
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP               STRING STREAM FUNCTIONS              Page 44
X
X
X        STRING STREAM FUNCTIONS
X
X        These functions operate on unnamed streams.  An unnamed output
X        stream collects characters sent to it when it is used as the
X        destination of any output function.  The functions 'get-output-
X        stream-string' and string or a list of characters.
X
X        An unnamed input stream is setup with the 'make-string-input-
X        stream' function and returns each character of the string when
X        it is used as the source of any input function.
X
X        (make-string-input-stream <str> [<start> [<end>]])
X            <str>       the string
X            <start>     the starting offset
X            <end>       the ending offset + 1
X            returns     an unnamed stream that reads from the string
X
X        (make-string-output-stream)
X            returns     an unnamed output stream
X
X        (get-output-stream-string <stream>)
X            <stream>    the output stream
X            returns     the output so far as a string
X          Note:  the output stream is emptied by this function
X
X        (get-output-stream-list <stream>)
X            <stream>    the output stream
X            returns     the output so far as a list
X          Note:  the output stream is emptied by this function
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                   SYSTEM FUNCTIONS                 Page 45
X
X
X        SYSTEM FUNCTIONS
X
X        (load <fname> &key :verbose :print)  LOAD A SOURCE FILE
X            <fname>     the filename string or symbol
X            :verbose    the verbose flag (default is t)
X            :print      the print flag (default is nil)
X            returns     the filename
X
X        (save <fname>) SAVE WORKSPACE TO A FILE
X            <fname>     the filename string or symbol
X            returns     t if workspace was written, nil otherwise
X
X        (restore <fname>) RESTORE WORKSPACE FROM A FILE
X            <fname>     the filename string or symbol
X            returns     nil on failure, otherwise never returns
X
X        (dribble [<fname>])  CREATE A FILE WITH A TRANSCRIPT OF A SESSION
X            <fname>     file name string or symbol
X                        (if missing, close current transcript)
X            returns     t if the transcript is opened, nil if it is closed
X
X        (gc)  FORCE GARBAGE COLLECTION
X            returns     nil
X
X        (expand <num>)  EXPAND MEMORY BY ADDING SEGMENTS
X            <num>       the number of segments to add
X            returns     the number of segments added
X
X        (alloc <num>)  CHANGE NUMBER OF NODES TO ALLOCATE IN EACH SEGMENT
X            <num>       the number of nodes to allocate
X            returns     the old number of nodes to allocate
X
X        (room)  SHOW MEMORY ALLOCATION STATISTICS
X            returns     nil
X
X        (type-of <expr>)  RETURNS THE TYPE OF THE EXPRESSION
X            <expr>      the expression to return the type of
X            returns     nil if the value is nil otherwise one of the symbols:
X                          SYMBOL          for symbols
X                          OBJECT          for objects
X                          CONS            for conses
X                          SUBR            for built-in functions
X                          FSUBR           for special forms
X                          CLOSURE         for defined functions
X                          STRING          for strings
X                          FIXNUM          for integers
X                          FLONUM          for floating point numbers
X                          CHARACTER       for characters
X                          FILE-STREAM     for file pointers
X                          UNNAMED-STREAM  for unnamed streams
X                          ARRAY           for arrays
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                   SYSTEM FUNCTIONS                 Page 46
X
X
X        (peek <addrs>)  PEEK AT A LOCATION IN MEMORY
X            <addrs>     the address to peek at (integer)
X            returns     the value at the specified address (integer)
X
X        (poke <addrs> <value>)  POKE A VALUE INTO MEMORY
X            <addrs>     the address to poke (integer)
X            <value>     the value to poke into the address (integer)
X            returns     the value
X
X        (address-of <expr>)  GET THE ADDRESS OF AN XLISP NODE
X            <expr>      the node
X            returns     the address of the node (integer)
X
X        (exit)  EXIT XLISP
X            returns     never returns
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                       EXAMPLES                     Page 47
X
X
X        FILE I/O FUNCTIONS
X
X        Input from a File
X
X        To open a file for input, use the OPEN function with the keyword
X        argument :DIRECTION set to :INPUT.  To open a file for output,
X        use the OPEN function with the keyword argument :DIRECTION set
X        to :OUTPUT.  The OPEN function takes a single required argument
X        which is the name of the file to be opened.  This name can be in
X        the form of a string or a symbol.  The OPEN function returns an
X        object of type FILE-STREAM if it succeeds in opening the
X        specified file.  It returns the value NIL if it fails.  In order
X        to manipulate the file, it is necessary to save the value
X        returned by the OPEN function.  This is usually done by
X        assigning it to a variable with the SETQ special form or by
X        binding it using LET or LET*.  Here is an example:
X
X            (setq fp (open "init.lsp" :direction :input))
X
X        Evaluating this expression will result in the file "init.lsp"
X        being opened.  The file object that will be returned by the OPEN
X        function will be assigned to the variable "fp".
X
X        It is now possible to use the file for input.  To read an
X        expression from the file, just supply the value of the "fp"
X        variable as the optional "stream" argument to READ.
X
X            (read fp)
X
X        Evaluating this expression will result in reading the first
X        expression from the file "init.lsp".  The expression will be
X        returned as the result of the READ function.  More expressions
X        can be read from the file using further calls to the READ
X        function.  When there are no more expressions to read, the READ
X        function will return NIL (or whatever value was supplied as the
X        second argument to READ).
X
X        Once you are done reading from the file, you should close it.
X        To close the file, use the following expression:
X
X            (close fp)
X
X        Evaluating this expression will cause the file to be closed.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                       EXAMPLES                     Page 48
X
X
X        Output to a File
X
X        Writing to a file is pretty much the same as reading from one.
X        You need to open the file first.  This time you should use the
X        OPEN function to indicate that you will do output to the file.
X        For example:
X
X            (setq fp (open "test.dat" :direction :output))
X
X        Evaluating this expression will open the file "test.dat" for
X        output.  If the file already exists, its current contents will
X        be discarded.  If it doesn't already exist, it will be created.
X        In any case, a FILE-STREAM object will be returned by the OPEN
X        function.  This file object will be assigned to the "fp"
X        variable.
X
X        It is now possible to write to this file by supplying the value
X        of the "fp" variable as the optional "stream" parameter in the
X        PRINT function.
X
X            (print "Hello there" fp)
X
X        Evaluating this expression will result in the string "Hello
X        there" being written to the file "test.dat".  More data can be
X        written to the file using the same technique.
X
X        Once you are done writing to the file, you should close it.
X        Closing an output file is just like closing an input file.
X
X            (close fp)
X
X        Evaluating this expression will close the output file and make
X        it permanent.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X        XLISP                       EXAMPLES                     Page 49
X
X
X        A Slightly More Complicated File Example
X
X        This example shows how to open a file, read each Lisp expression
X        from the file and print it.  It demonstrates the use of files
X        and the use of the optional "stream" argument to the READ
X        function.
X
X            (do* ((fp (open "test.dat" :direction :input))
X                  (ex (read fp) (read fp)))
X                 ((null ex) nil)
X              (print ex))
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
SHAR_EOF
if test 80928 -ne "`wc -c 'xlisp.doc'`"
then
	echo shar: error transmitting "'xlisp.doc'" '(should have been 80928 characters)'
fi
#	End of shell archive
exit 0
-- 
Gary Murphy                   uunet!mitel!sce!cognos!garym
                              (garym%cognos.uucp at uunet.uu.net)
(613) 738-1338 x5537          Cognos Inc. P.O. Box 9707 Ottawa K1G 3N3
"There are many things which do not concern the process" - Joan of Arc



More information about the Comp.sources.misc mailing list