HLISP INSTALLATION AND RELEASE NOTES Installation of HLISP is relatively straightforward. The executeable image file is named LISP.EXE, and may reside anywhere appropriate. It is most easily invoked by defining a global symbol (usually in your LOGIN.COM) such as: $ LISP :== $dev:[dir]LISP When HLISP is invoked in this manner, it will prompt for input at the terminal. Input is EVAL'd, and the result is PRINTed. Indirect command files are also supported on both the DCL command line, and during interactive use. Command files may be nested up to three levels, and have a default file type of "LSP". HLISP also has an interactive help facility using a VMS standard help library. The filename for the library is LISP.HLB, and it is accessed by HLISP using the logical name LISPHELP. To make this facility work, the following logical name assignment should be performed: $ ASSIGN dev:[dir]LISP LISPHELP Note that the device and directory default to SYS$HELP if they are not specified in the ASSIGN. To invoke the HLISP help facility interactively from within LISP, evaluate the following form: (HELP) LISP will prompt for additional inputs while in the help mode, just as the VMS HELP command does. An alternate form permits an initial topic to be specified: (HELP ) where is the name (or the first few characters of the name) of a topic in the help library. Further documentation on HLISP is contained in the HLISP Reference Manual, included in the delivery in the file LISP.MEM. Please note that this LISP is intended to be most compatible with Standard LISP as defined by the paper "Standard LISP Report", by J. Marti, et al. It is not yet, nor will it likely ever be a fully compatable implementation of this particular definition, however it is the preferred baseline. This LISP presently implements about three fourhts of this standard, but contains many extensions to make the things I am presently working on easier to do. Copies of this paper are available upon request. PLEASE, give me some feedback on what you like and dislike. I'm afraid I am able to do only limited verification, so I would especially appreciate hearing about any problems. Also any items on your wish list may get added to mine! Below are the release notes for all official releases, in reverse chronological order. The trouble report logs are also included in each release as a seperate file. Release Notes Version 6 *** The following new functions have been added: ASPAWN spawn an asynchronous subprocess ATTACH attach the user's terminal to another process (like DCL's) HASHSTR return an integer in a given range, hashed from a string Release Notes Version 5 *** This release is largely a bug fixing release. *** The function SQRT has been added. *** The pretty printer has been modified to be slightly more efficient. Release Notes Version 4 *** A list structure editor has been added. Together with some support routines, it is now possible to edit a list, a function definition (assuming that it is not a compiled or builtin routine), or a variables value. The new functions defined for this new capability are: EDD edit a function definition EDL edit a list EDP edit a variable's property value EDV edit a variable's value EDLAUX auxiliary function used by all of the editor functions EDLNXTCMD auxiliary function EDLNXTVAL auxiliary function These functions are builtin but not compiled. Also, with the addition of these functions, the E function has been deleted. *** The following new functions have been added: COPY returns a copy of its argument (no cyclic structures please) FLAG1 flags a single id GETP get the property list of an id (CDR of an id no longer works) LAST return a list containing the last element of its argument list OUTF redirect output temporarily, evaluate arguments (not compiled) REMFLAG1 removes a flag from a single id In addition, in an effort to migrate more toward the standard, the following functions have also been added: CONSTANTP return T if argument is a constant DIVIDE return quotient and remainder as dotted pair EXPT return arbitrary power of a number FLAG add a flag to a list of ids FLAGP test for the presence of a flag on an id MAX2 return the larger of two values MIN2 return the smaller of two values MINUSP return T if argument is a negative number ONEP return T if argument equals 1 (or 1.0) PLUS2 return the sum of two values REMFLAG remove a flag from a list of ids *** The pretty printer routines were made smarter. Improvements were made in the formatting of LISP code (primarily LAMBDA LET LOOP PROG), and in the way quoted items are output. This also resulted in a new auxilliary function (PPAUX2) being defined to assist the other pretty printing routines, and extending the PRLENGTH function to permit it to compute the print-lengths of expressions using the short hand format for quoted items. PPPL was also improved to not produce to PNAME property, which is non-portable. All of the pretty printer routines that the user is likely to invoke interactively have been modified to invoke TERPRI before they terminate. This required adding a new routine PPINT (PPI with no TERPRI call) for use internal to PPAUX... *** In previous versions there was a problem interrupting garbage collection by using a control-C. As a result, garbage collection messages were defaulted on so the user would beware. This has now been changed now so that control-C is disabled during garbage collection, and garbage collection messages are now defaulted off. Note that when garbage collection is in progress, a control-C will be ignored so you may need to try again if LISP fails to respond to your control-C. *** The implementation of function definition storage and lookup has been changed. The functions GETD, PUTD, and REMD must be used to access a function's definition, since the definition is no longer kept on the property list of the id. This change was made primarily for efficiency. Also, the property list may no longer be accessed using CDR. The function GETP has been provided for this purpose. *** The reference manual has been improved by adding more detail to the descriptions. The help library has also been updated and improved. *** Various minor fixes to make function conform more closely to the LISP Standard LISP Report and to improve shortcomings. *** The functions CSET and CSETQ have been deleted, since they are non-standard and add nothing to the implementation, with the possible exception of confusion. *** SETQ was extended to permit multiple assignments in a single invocation. *** The name of the HLISP help library file has been changed from LISPHELP.HLB to LISP.HLB. Release Notes Version 3 *** One of the most significant new features of this release of HLISP is the addition of a reference manual. The manual is still in preliminary form, but anything is better than nothing. *** Additional MAP composite functions have been added: MAP apply a function to CDR segments of a list MAPC apply a function to CAR segments of a list MAPCAN build a concatenated list of results from applying a function to successive CAR elements of a list MAPCON build a concatenated list of results from applying a function to successive CDR segments of a list MAPLIST build a constructed list of results from applying a function to successive CDR segments of a list *** Vectors have been added, according to the definitions in the Standard LISP Report. The new functions are: MKVECT create a vector UPBV determine the upper bound of a vector GETV get a vector element PUTV store a vector element Each vector element is initialized to NIL, and may reference an arbitrary S-expression. The vector itself is allocated dynamically as new virtual address space, however S-expressions referenced by it must be allocated from the LISP heap. *** The ability to expand the LISP heap has been provided via the function GROWMEM. *** The builtin LISP condition handler was made a little smarter so that when the user overflows the LISP call stack, the resulting access violation error message also includes an indication of the cause of the problem. The error checking routines used internally by many of the builtin primitives have been made smarter, e.g., the expression (SET !*GC T) will no longer give an access violation if !*GC has no APVAL, but return the normal error message. [This expression should more probably have been (SETQ !*GC T). *** The garbage collector now prints messages at the beginning and ending of the collection process by default. This was found desirable because a control-C during garbage collection tends to leave the system in a rather worthless state. *** The SSPAWN function was modified to return the completion status of the process. This status is an integer, which is a standard VMS completion status. The function GETMSG was added to convert this number into the corresponding system message string. *** The message produced by STATUS was made slightly more self explanitory, and the TERPRI call before the message was made conditional on there actually being something in the output buffer. *** MSG was converted from an FSUBR to an LSUBR so that it formats the output based on the result of the argument after evaluation. *** The function QUIT was added as the standard synonym for EXIT (to exit from LISP to the operating system). *** The function PAIRP was added as the standard synonym for CONSP (to detect dotted pairs). *** The function OBLIST replaces the old function SYMLIST to display the ob-list. *** Various minor fixes to make function conform more closely to the LISP Standard Report. Release Notes Version 2 *** READ now supports list syntax using square brackets (aka "super brackets") in addition to parentheses. A right bracket may be used to terminate parenthesized lists early, to any depth. The outermost list is implicitly enclosed in brackets. (Note that these extensions are not supported in LINT.) *** PP.LSP now is much smarter about maximizing the amount of text on a line. PPUAX (the internal smarts used by all of the pretty printer functions) is also smarter about some of the forms it is working with. There are also new functions: PPI Pretty print indented PPPL Pretty print property list in DEFPROP comapatible form E Spawn an edit command line to DCL Note that the E function will probably need to have the command line modified to properly invoke your favorite flavor of editor. PP is now also much faster than in the past due to bringing many of its computational chores into the interpreter as normal primitives. PP is now also builtin, though it is still implemented in LISP. *** The following new functions have been added: APPEND1 append an atom to the end of a list DOWNCASE convert to lower case EXIT exit from LISP to VMS LET define & initialize local variables for a list of forms LOCSTR locate a substring within a string LOOP convenient PROG-like iteration OCML invoke indirect command file programmatically POP pop element from stack POSN return current position on output buffer PRLENGTH return print length of an s-expression PUSH push element onto stack REVERSE return a copy of the input list in reverse order UPCASE convert to upper case See the help file for further information. *** When LISP is initializing, it now checks to see if the logical name LISP_INIT is defined. If it is, its value must be the name of a LISP command file (default type is .LSP). This command file is then executed before control is started at the terminal. E.g., the DCL command line: $ASSIGN PP LISP_INIT will cause LISP to load the PP command file before prompting at the terminal. *** Minor extensions were made to the definitions of the following functions: DEFPROP now handles multiple property-value pairs *** All of the internal calls to builtin LISP functions such as CONS, READ, RATOM, PRIN1, TERPRI, etc., have been made non-traced so that it is now easier to debug macros and such by tracing these primitives without having all of the internal calls cluttering up the trace listing. Release Notes Version 1 This release of LISP is now the "official" version 1, dated August 5, 1983. This version and all subsequent versions will have a builtin symbol defining the current version. This symbol is VERSION. It may be PRINTed. This release has many new features and bug fixes. The previous version was considered to be an alpha test version. This version is considered to be a beta test version. The trouble report log for the alpha test (pre-version 1) version is included in the distribution, as it will be for all subsequent releases, for anyone who is interested. This version contains a couple of incompatabilities with the previous version. The DR form for defining readmacros has been changed to DRM, for compatability with other implementations. The trouble report log mentions the other, the special symbol returned by READCH for an end-of-line has changed. Other than these two items, all other changes are believed to be extensions. This version also contains an updated version of PP, and several other tools, as well as an updated version of SIR, and some example rules. Several other LISP goodies are also in the works. A new version of LINT has also been added, with a more convenient command line.