1
Copyright (c) Xerox Corporation 1988. All rights reserved.
3
These notes correspond to the beta test release of March 17th 1988.
4
Later versions of this release will run in the usual lisps, but for the
5
time being this has only been tested in Symbolics, Lucid, Coral,
6
Xerox, Ibuki (01/01), TI and VAXLisp Common Lisps.
8
Note may not run in all Franz Lisps, I believe it runs on the SUN3
9
though. I will get back to this in a few days when I get the needed
13
This release will run in Lucid 3.0 beta 2, with the boolean.lbin patch.
16
This release contains a prototype implementation of the make-instance
17
behavior documented in the CLOS specification (X3J13 document # 88-002).
18
This prototype implementation does not provide high performance, but it
19
should conform to the specification with one exception, it does not
20
check the validity of the initargs.
22
All the generic functions in the instance creation protocol are as
23
specified in the CLOS specification except that make-instance is called
24
mki instead. This name is a temporary name, it is so that people can
25
try out the new make-instance protocol without having to convert all
26
their code at once. In a future release, the name make-instance will be
27
switched to the new behavior.
30
Standard method combination is supported. General declarative
31
method combination is not yet supported, so define-method-combination does
32
not yet work, but standard method combination is what generic functions
33
do by default now. :after :before :around and unqualified methods are
34
supported. Error checking is minimal.
37
call-next-method works with standard-method-combination.
38
call-next-method is much faster than it was before, and call-next-method
39
behaves as a lexically defined function. This means it is possible to
40
pass around funargs which include call-next-method.
43
All uses of slot-value within a method body should be optimized. It
44
should no longer be necessary to use with-slots just to get the
48
There are new macros with-slots* and with-accessors*. These correspond
49
to the macros which will appear in the final specification, with-slots
50
and with-accessors. They work as follows:
52
(with-slots* ((x x-slot)
53
(y y-slot)) ===\ (let ((#:g1 (foo)))
54
(foo) ===/ (swapf (slot-value #:g1 'x-slot)
55
(swapf x y)) (slot-value #:g1 'y-slot)))
57
(with-accessors* ((x position-x)
58
(y position-y)) ===\ (let ((#:g1 (foo)))
59
(foo) ===/ (incf (position-x #:g1))
60
(incf x) (incf (position-y #:g1)))
63
As an abbreviation, the (<variable-name> <slot-name>) pairs in with-slots*
64
can be abbreviated to just <variable-and-slot-name> when the variable
65
and slot name are the same. This means that:
67
(with-slots* (x y z) <instance-form> &body <body>)
71
(with-slots* ((x x) (y y) (z z)) <instance-form> &body <body>)
73
You should begin to convert your code to use these macros as soon as
74
possible since the old macro with-slots will swap names with with-slots*
77
A trick you may want to use for remembering the order of the first two
78
arguments to with-slots* and with-accessors* is that it is "like
82
In addition this release includes the beginnings of support for doing
83
some of the compiling which PCL does a load time at compile time
84
instead. To use this support, put the form:
86
(pcl::precompile-random-code-segments)
88
in a file which is compiled after all your other pcl using files are
89
loaded. Then arrange for that file to be loaded before all your
90
other pcl using files are loaded.
92
For example, if your system has two files called "classes" and "methods",
93
create a new file called "precom" that contains:
97
(pcl::precompile-random-code-segments)
100
Then you can use the defsystem stuff defined in the file defsys to
101
maintain your system as follows:
103
(defsystem my-very-own-system
105
((classes (precom) () ())
106
(methods (precom classes) (classes) ())
107
(precom () (classes methods) (classes methods))))
109
This defsystem should be read as follows:
111
* Define a system named MY-VERY-OWN-SYSTEM, the sources and binaries
112
should be in the directory "/usr/me/lisp/". There are three files
113
in the system, there are named classes, methods and precom. (The
114
extension the filenames have depends on the lisp you are running in.)
116
* For the first file, classes, the (precom) in the line means that
117
the file precom should be loaded before this file is loaded. The
118
first () means that no other files need to be loaded before this
119
file is compiled. The second () means that changes in other files
120
don't force this file to be recompiled.
122
* For the second file, methods, the (precom classes) means that both
123
of the files precom and classes must be loaded before this file
124
can be loaded. The (classes) means that the file classes must be
125
loaded before this file can be compiled. The () means that changes
126
in other files don't force this file to be recompiled.
128
* For the third file, precom, the first () means that no other files
129
need to be loaded before this file is loaded. The first use of
130
(classes methods) means that both classes and methods must be
131
loaded before this file can be compiled. The second use of (classes
132
methods) mean that whenever either classes or methods changes precom
135
Then you can compile your system with:
137
(operate-on-system 'my-very-own-system :compile)
139
and load your system with:
141
(operate-on-system 'my-very-own-system :load)
144
The code walker has gone through some signigificant revision. The
145
principle change is that the function walk-form now takes three required
146
arguments, and the walk-function itself now must accept an environment
147
argument. There are other changes having to do with the implementation
148
specific representation of macroexpansion environments. For details see
152
The following functions and macros which used to be supported for
153
backward compatibility only are now not supported at all:
165
There are other small changes in this release. If you notice one that
166
causes you problems please send me a message about it.