Dec 282017
Public Domain eXperimental LISP. | |||
---|---|---|---|
File Name | File Size | Zip Size | Zip Type |
XLISP.DOC | 84107 | 16590 | deflated |
XLISP.EXE | 135976 | 51375 | deflated |
Download File XLISPPC.ZIP Here
Contents of the XLISP.DOC file
XLISP: An Object-oriented Lisp
Version 2.0
February 6, 1988
by
David Michael Betz
127 Taylor Road
Peterborough, NH 03458
(603) 924-6936 (home)
Copyright (c) 1988, by David Michael Betz
All Rights Reserved
Permission is granted for unrestricted non-commercial use
XLISP TABLE OF CONTENTS Page 2
Table of Contents
TABLE OF CONTENTS 2
INTRODUCTION 4
A NOTE FROM THE AUTHOR 5
XLISP COMMAND LOOP 6
BREAK COMMAND LOOP 7
DATA TYPES 8
THE EVALUATOR 9
LEXICAL CONVENTIONS 10
READTABLES 11
LAMBDA LISTS 12
OBJECTS 14
SYMBOLS 17
EVALUATION FUNCTIONS 18
SYMBOL FUNCTIONS 19
PROPERTY LIST FUNCTIONS 21
ARRAY FUNCTIONS 22
LIST FUNCTIONS 23
DESTRUCTIVE LIST FUNCTIONS 26
PREDICATE FUNCTIONS 27
CONTROL CONSTRUCTS 29
LOOPING CONSTRUCTS 31
THE PROGRAM FEATURE 32
DEBUGGING AND ERROR HANDLING 33
ARITHMETIC FUNCTIONS 34
BITWISE LOGICAL FUNCTIONS 36
STRING FUNCTIONS 37
XLISP TABLE OF CONTENTS Page 3
CHARACTER FUNCTIONS 39
INPUT/OUTPUT FUNCTIONS 41
THE FORMAT FUNCTION 42
FILE I/O FUNCTIONS 43
STRING STREAM FUNCTIONS 44
SYSTEM FUNCTIONS 45
EXAMPLES 47
XLISP INTRODUCTION Page 4
INTRODUCTION
XLISP is an experimental programming language combining some of
the features of Common Lisp with an object-oriented extension
capability. It was implemented to allow experimentation with
object-oriented programming on small computers.
There are currently implementations of XLISP running on the IBM-
PC and clones under MS-DOS, on the Macintosh, the Atari-ST and
the Amiga. It is completely written in the programming language
'C' and is easily extended with user written built-in functions
and classes. It is available in source form to non-commercial
users.
Many Common Lisp functions are built into XLISP. 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. It assumes some
knowledge of LISP and some understanding of the concepts of
object-oriented programming.
I recommend the book "LISP" by Winston and Horn and published by
Addison Wesley for learning Lisp. The first edition of this
book is based on MacLisp and the second edition is based on
Common Lisp. XLISP will continue to migrate towards
compatibility with Common Lisp.
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 A NOTE FROM THE AUTHOR Page 5
A NOTE FROM THE AUTHOR
If you have any problems with XLISP, feel free to contact me for
help or advice. Please remember that since XLISP is available
in source form in a high level language, many users have been
making versions available on a variety of machines. If you call
to report a problem with a specific version, I may not be able
to help you if that version runs on a machine to which I don't
have access. Please have the version number of the version that
you are running readily accessible before calling me.
If you find a bug in XLISP, first try to fix the bug yourself
using the source code provided. If you are successful in fixing
the bug, send the bug report along with the fix to me. If you
don't have access to a C compiler or are unable to fix a bug,
please send the bug report to me and I'll try to fix it.
Any suggestions for improvements will be welcomed. Feel free to
extend the language in whatever way suits your needs. However,
PLEASE DO NOT RELEASE ENHANCED VERSIONS WITHOUT CHECKING WITH ME
FIRST!! I would like to be the clearing house for new features
added to XLISP. If you want to add features for your own
personal use, go ahead. But, if you want to distribute your
enhanced version, contact me first. Please remember that the
goal of XLISP is to provide a language to learn and experiment
with LISP and object-oriented programming on small computers. I
don't want it to get so big that it requires megabytes of memory
to run.
XLISP XLISP COMMAND LOOP Page 6
XLISP COMMAND LOOP
When XLISP is started, it first tries to load the workspace
"xlisp.wks" from the current directory. If that file doesn't
exist, XLISP builds an initial workspace, empty except for the
built-in functions and symbols.
Then XLISP attempts to load "init.lsp" from the current
directory. It then loads any files named as parameters on the
command line (after appending ".lsp" to their names).
XLISP then issues the following prompt:
>
This indicates that XLISP is waiting for an expression to be
typed.
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 to the
initial prompt waiting for another expression to be typed.
XLISP BREAK COMMAND LOOP Page 7
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.
XLISP DATA TYPES Page 8
DATA TYPES
There are several different data types available to XLISP
programmers.
o lists
o symbols
o strings
o integers
o characters
o floats
o objects
o arrays
o streams
o subrs (built-in functions)
o fsubrs (special forms)
o closures (user defined functions)
XLISP THE EVALUATOR Page 9
THE EVALUATOR
The process of evaluation in XLISP:
Strings, integers, characters, floats, objects, arrays, 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 called with these
evaluated expressions as arguments.
If it is an fsubr, the fsubr is called using the remaining
list elements as arguments (unevaluated).
If it is a macro, the macro is expanded using the remaining
list elements as arguments (unevaluated). The macro
expansion is then evaluated in place of the original macro
call.
XLISP LEXICAL CONVENTIONS Page 10
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.
Symbol names in XLISP can consist of any sequence of non-blank
printable characters except the following:
( ) ' ` , " ;
Uppercase and lowercase characters are not distinguished within
symbol names. All lowercase characters are mapped to uppercase
on input.
Integer literals consist of a sequence of digits optionally
beginning with a '+' 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.
Floating point literals consist of a sequence of digits
optionally beginning with a '+' or '-' and including an embedded
decimal point. The range of values a floating point number can
represent is limited by the size of a C 'float' ('double' on
machines with 32 bit addresses) on the machine on which XLISP is
running.
Literal strings are sequences of characters surrounded by double
quotes. 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 READTABLES Page 11
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. It is an array with 128
entries, one for each of the ASCII character codes. Each entry
contains one of the following things:
NIL Indicating an invalid character
:CONSTITUENT Indicating a symbol constituent
:WHITE-SPACE Indicating a whitespace character
(:TMACRO . fun) Terminating readmacro
(:NMACRO . fun) Non-terminating readmacro
:SESCAPE Single escape character ('\')
:MESCAPE Multiple escape character ('|')
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 should take 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.
XLISP defines several useful read macros:
'
#'
#(
#x
#o
#b
#\
#| ... |# == a comment
#:
`
,
,@
XLISP LAMBDA LISTS Page 12
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. In
addition, 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'.
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 LAMBDA LISTS Page 13
Here is the complete syntax for lambda lists:
(
[&optional [
[&rest
[&key
[
&allow-other-keys]
[&aux
[
where:
XLISP OBJECTS Page 14
OBJECTS
Definitions:
o selector - a symbol used to select an appropriate method
o message - a selector and a list of actual arguments
o 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.
A message can also be sent from the body of a method by using
the current object, but the method lookup starts with the
object's superclass rather than its class. 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.
XLISP OBJECTS Page 15
THE 'Object' CLASS
Classes:
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
:isnew THE DEFAULT OBJECT INITIALIZATION ROUTINE
returns the object
:sendsuper
returns the result of sending the message
XLISP OBJECTS Page 16
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
returns the new class object
:answer
ADD A MESSAGE TO A CLASS
the message symbol
the formal argument list (lambda list)
a list of executable expressions
returns the object
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.
When a new class is created by sending the ':new' message to the
object 'Class', 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, class variables, and
methods from its super-class.
XLISP SYMBOLS Page 17
SYMBOLS
o self - the current object (within a method context)
o *obarray* - the object hash table
o *standard-input* - the standard input stream
o *standard-output* - the standard output stream
o *error-output* - the error output stream
o *trace-output* - the trace output stream
o *debug-io* - the debug i/o stream
o *breakenable* - flag controlling entering break loop on errors
o *tracelist* - list of names of functions to trace
o *tracenable* - enable trace back printout on errors
o *tracelimit* - number of levels of trace back information
o *evalhook* - user substitute for the evaluator function
o *applyhook* - (not yet implemented)
o *readtable* - the current readtable
o *unbound* - indicator for unbound symbols
o *gc-flag* - controls the printing of gc messages
o *gc-hook* - function to call after garbage collection
o *integer-format* - format for printing integers ("%d" or "%ld")
o *float-format* - format for printing floats ("%g")
o *print-case* - symbol output case (:upcase or :downcase)
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 EVALUATION FUNCTIONS Page 18
EVALUATION FUNCTIONS
(eval ) EVALUATE AN XLISP EXPRESSION
the expression to be evaluated
returns the result of evaluating the expression
(apply ) APPLY A FUNCTION TO A LIST OF ARGUMENTS
the function to apply (or function symbol)
the argument list
returns the result of applying the function to the arguments
(funcall ...) CALL A FUNCTION WITH ARGUMENTS
the function to call (or function symbol)
arguments to pass to the function
returns the result of calling the function with the arguments
(quote ) RETURN AN EXPRESSION UNEVALUATED
the expression to be quoted (quoted)
returns unevaluated
(function ) GET THE FUNCTIONAL INTERPRETATION
the symbol or lambda expression (quoted)
returns the functional interpretation
(backquote ) FILL IN A TEMPLATE
the template
returns a copy of the template with comma and comma-at
expressions expanded
(lambda ...) MAKE A FUNCTION CLOSURE
formal argument list (lambda list) (quoted)
expressions of the function body
returns the function closure
(get-lambda-expression ) GET THE LAMBDA EXPRESSION
the closure
returns the original lambda expression
(macroexpand