Copyright (c) Xerox Corporation 1988. All rights reserved.
These notes correspond to the beta test release of March 17th 1988.
Later versions of this release will run in the usual lisps, but for the
time being this has only been tested in Symbolics, Lucid, Coral,
Xerox, Ibuki (01/01), TI and VAXLisp Common Lisps.
Note may not run in all Franz Lisps, I believe it runs on the SUN3
though. I will get back to this in a few days when I get the needed
code from Franz.
***
This release will run in Lucid 3.0 beta 2, with the boolean.lbin patch.
***
This release contains a prototype implementation of the make-instance
behavior documented in the CLOS specification (X3J13 document # 88-002).
This prototype implementation does not provide high performance, but it
should conform to the specification with one exception, it does not
check the validity of the initargs.
All the generic functions in the instance creation protocol are as
specified in the CLOS specification except that make-instance is called
mki instead. This name is a temporary name, it is so that people can
try out the new make-instance protocol without having to convert all
their code at once. In a future release, the name make-instance will be
switched to the new behavior.
***
Standard method combination is supported. General declarative
method combination is not yet supported, so define-method-combination does
not yet work, but standard method combination is what generic functions
do by default now. :after :before :around and unqualified methods are
supported. Error checking is minimal.
***
call-next-method works with standard-method-combination.
call-next-method is much faster than it was before, and call-next-method
behaves as a lexically defined function. This means it is possible to
pass around funargs which include call-next-method.
***
All uses of slot-value within a method body should be optimized. It
should no longer be necessary to use with-slots just to get the
optimization.
***
There are new macros with-slots* and with-accessors*. These correspond
to the macros which will appear in the final specification, with-slots
and with-accessors. They work as follows:
(with-slots* ((x x-slot)
(y y-slot)) ===\ (let ((#:g1 (foo)))
(foo) ===/ (swapf (slot-value #:g1 'x-slot)
(swapf x y)) (slot-value #:g1 'y-slot)))
(with-accessors* ((x position-x)
(y position-y)) ===\ (let ((#:g1 (foo)))
(foo) ===/ (incf (position-x #:g1))
(incf x) (incf (position-y #:g1)))
(incf y))
As an abbreviation, the () pairs in with-slots*
can be abbreviated to just when the variable
and slot name are the same. This means that:
(with-slots* (x y z) &body )
is equivalent to:
(with-slots* ((x x) (y y) (z z)) &body )
You should begin to convert your code to use these macros as soon as
possible since the old macro with-slots will swap names with with-slots*
sometime soon.
A trick you may want to use for remembering the order of the first two
arguments to with-slots* and with-accessors* is that it is "like
multiple-value-bind".
***
In addition this release includes the beginnings of support for doing
some of the compiling which PCL does a load time at compile time
instead. To use this support, put the form:
(pcl::precompile-random-code-segments)
in a file which is compiled after all your other pcl using files are
loaded. Then arrange for that file to be loaded before all your
other pcl using files are loaded.
For example, if your system has two files called "classes" and "methods",
create a new file called "precom" that contains:
(in-package 'pcl)
(pcl::precompile-random-code-segments)
Then you can use the defsystem stuff defined in the file defsys to
maintain your system as follows:
(defsystem my-very-own-system
"/usr/myname/lisp/"
((classes (precom) () ())
(methods (precom classes) (classes) ())
(precom () (classes methods) (classes methods))))
This defsystem should be read as follows:
* Define a system named MY-VERY-OWN-SYSTEM, the sources and binaries
should be in the directory "/usr/me/lisp/". There are three files
in the system, there are named classes, methods and precom. (The
extension the filenames have depends on the lisp you are running in.)
* For the first file, classes, the (precom) in the line means that
the file precom should be loaded before this file is loaded. The
first () means that no other files need to be loaded before this
file is compiled. The second () means that changes in other files
don't force this file to be recompiled.
* For the second file, methods, the (precom classes) means that both
of the files precom and classes must be loaded before this file
can be loaded. The (classes) means that the file classes must be
loaded before this file can be compiled. The () means that changes
in other files don't force this file to be recompiled.
* For the third file, precom, the first () means that no other files
need to be loaded before this file is loaded. The first use of
(classes methods) means that both classes and methods must be
loaded before this file can be compiled. The second use of (classes
methods) mean that whenever either classes or methods changes precom
must be recompiled.
Then you can compile your system with:
(operate-on-system 'my-very-own-system :compile)
and load your system with:
(operate-on-system 'my-very-own-system :load)
***
The code walker has gone through some signigificant revision. The
principle change is that the function walk-form now takes three required
arguments, and the walk-function itself now must accept an environment
argument. There are other changes having to do with the implementation
specific representation of macroexpansion environments. For details see
the file walk.lisp.
***
The following functions and macros which used to be supported for
backward compatibility only are now not supported at all:
WITH* and WITH
DEFMETH
GET-SLOT
MAKE
***
There are other small changes in this release. If you notice one that
causes you problems please send me a message about it.