~ubuntu-branches/ubuntu/quantal/gclcvs/quantal

« back to all changes in this revision

Viewing changes to pcl/notes/8-28-88-notes.text

  • Committer: Bazaar Package Importer
  • Author(s): Camm Maguire
  • Date: 2004-06-24 15:13:46 UTC
  • Revision ID: james.westby@ubuntu.com-20040624151346-xh0xaaktyyp7aorc
Tags: 2.7.0-26
C_GC_OFFSET is 2 on m68k-linux

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
Copyright (c) Xerox Corporation 1988. All rights reserved.
 
2
 
 
3
 
 
4
These notes correspond to the "8/24/88 (beta) AAAI PCL" version of PCL.
 
5
 
 
6
Please read this entire document carefully.
 
7
 
 
8
There have been a number of changes since the 8/2/88 version of PCL.  As
 
9
usual, these changes are part of our efforts to make PCL conform with
 
10
the CLOS specicification (88-002R).  This release contains the big
 
11
changes which the 7/7 through 8/2 releases were really getting ready
 
12
for.
 
13
 
 
14
This version of PCL has been tested at PARC in the following Common
 
15
Lisps:
 
16
 
 
17
  Symbolics 7.2
 
18
  Coral 1.2
 
19
  Lucid 3.0
 
20
  Franz ??
 
21
  Xerox Lyric
 
22
  Xerox Medley (aka EnvOS Medley)
 
23
  KCL (October 15, 1987)
 
24
 
 
25
 
 
26
Most of the changes in this version of PCL fall into one of two
 
27
categories.
 
28
 
 
29
The first major set of changes makes the order of arguments to setf
 
30
generic functions and methods conform with the spec.  In addition, these
 
31
changes allow the first argument to defmethod to be of the form (SETF
 
32
<symbol>).
 
33
 
 
34
The second major set of changes have to do with slot access and instance
 
35
structure.  Importantly, PCL now checks to see if a slot is bound, and
 
36
calls slot-unbound if the slot is unbound.  This is a major change from
 
37
previous releases in which slot access just returned NIL for slots which
 
38
had not yet been set.  These changes affect all the functions which
 
39
access the slots of an instance.  In addition, the generic functions
 
40
which are called by the slot access functions in exceptional
 
41
circumstances are affected.  This set of changes also include the
 
42
implemenentation of the real initialization protocol as specified by
 
43
88-002R.
 
44
 
 
45
In addition, there are a number of other changes.  The most significant
 
46
of these has to do with the symbols which the PCL package exports by
 
47
default.
 
48
 
 
49
The rest of this document goes on to first describe the slot access
 
50
changes, then describe the setf generic function changes, and finally
 
51
describe some of the other minor changes.  
 
52
 
 
53
At the very end of this file is a new section which lists PCL features
 
54
which are scheduled to disappear in future releases.  Please read this
 
55
section and take it to heart.  This features will be disappearing.
 
56
 
 
57
 
 
58
*** Changes to slot access and instance structure ***
 
59
 
 
60
This release includes a number of changes to the way slot access works
 
61
in PCL.  Some of these changes are incompatible with old behavior.  Code
 
62
which was written with the actual CLOS spec in mind should not be
 
63
affected by these incompatible changes, but some older code may be
 
64
affected.
 
65
 
 
66
The basic thrust of the changes to slot access is to bring the following
 
67
functions and generic functions in line with the specification:
 
68
 
 
69
   slot-boundp
 
70
   slot-exists-p
 
71
   slot-makunbound
 
72
   slot-missing      
 
73
   slot-unbound
 
74
   slot-value     
 
75
 
 
76
   slot-boundp-using-class
 
77
   slot-exists-p-using-class
 
78
   slot-makunbound-using-class
 
79
   slot-value-using-class
 
80
 
 
81
   (setf slot-value)
 
82
   (setf slot-value-using-class)
 
83
 
 
84
   change-class
 
85
   make-instances-obsolete
 
86
 
 
87
   make-instance (temporarily called *make-instance)
 
88
   initialize-instance (temporarily called *initialize-instance)
 
89
   reinitialize-instance
 
90
   update-instance-for-different-class
 
91
   update-instance-for-redefined-class
 
92
   shared-initialize
 
93
 
 
94
In this release, these functions accept the specified number of
 
95
arguments, return the specified values, have the specified effects, and
 
96
are called by the rest of PCL in the specified way at the specified
 
97
times (with the exception that PCL does not yet call *make-instance to
 
98
create its own metaobjects).  Because PCL now checks for unbound slots,
 
99
you may notice a slight performance degradation in certain applications.
 
100
 
 
101
For complete information, you should of course see the CLOS specification.
 
102
The rest of this note is a short summary of how this new behavior is
 
103
different from the last release.
 
104
 
 
105
- Dynamic slots are no longer supported.  Various functions like
 
106
  slot-value-always and remove-slot no longer exist.  Also,
 
107
  slot-value-using-class now only accepts the three arguments as
 
108
  described in the spec.  The two extra arguments having to do with
 
109
  dynamic slots are no longer accepted.
 
110
 
 
111
  Shortly, we will release a metaclass which provides the now missing
 
112
  dynamic slot behavior.
 
113
 
 
114
- slot-missing now receives and accepts different arguments.
 
115
 
 
116
- slot-unbound is now implemented, and is called at the appropriate
 
117
  times.
 
118
 
 
119
- the initialization protocol specified in 88-002R is now almost
 
120
  completely implemented.  The only difference is that the current
 
121
  implementation does not currently check the validity of initargs.
 
122
  So, no errors are signalled in improper initargs are supplied.
 
123
 
 
124
  Because of name conflicts with the two other initialization protocols
 
125
  PCL currently supports, some of the specified initialization functions
 
126
  do not have their proper name.  The mapping between names in the
 
127
  specification and names in this version of PCL is as follows:
 
128
 
 
129
     SPECIFIED                                IN PCL
 
130
 
 
131
   make-instance                           *make-instance
 
132
   initialize-instance                     *initialize-instance
 
133
   reinitialize-instance                   <has proper name>
 
134
   update-instance-for-different-class     <has proper name>
 
135
   update-instance-for-redefined-class     <has proper name>
 
136
   shared-initialize                       <has proper name>
 
137
 
 
138
 
 
139
  In a future release of PCL, these functions will have their proper
 
140
  names, and all the old, obsolete initialization protocols will
 
141
  disappear.
 
142
 
 
143
  Convert to using this new wonderful initialization protocol soon.
 
144
 
 
145
  Sometime soon we will release a version of PCL which does significant
 
146
  optimization of calls to make-instance.  This should speed up instance
 
147
  creation dramatically, which should significantly improve the
 
148
  performance of some programs.
 
149
 
 
150
- The function all-slots no longer exists.  There is a new generic
 
151
  function called slots-to-inspect, which controls the default behavior
 
152
  of describe.  It also controls the default behavior of the inspector
 
153
  in ports which have connected their inspectors to PCL.  It specifies
 
154
  which slots of a given class should be inspected.  See the definition
 
155
  in the file high.lisp for more.
 
156
 
 
157
- the metaclass obsolete-class no longer exists.  The mechanism by which
 
158
  instances are marked as being obsolete is now internal, as described
 
159
  in the spec.  The generic-function make-instances-obsolete can be used
 
160
  to force the instances of a class to go through the obsolete instance
 
161
  update protocol (see update-instance-for-redefined-class).
 
162
 
 
163
- all-std-class-readers-miss-1, a generic function which was part of
 
164
  the database interface code I sent out a few weeks ago, has a slightly
 
165
  different argument list.  People using the code I sent out a few weeks
 
166
  ago should replace the definition there with:
 
167
 
 
168
  (defmethod all-std-class-readers-miss-1
 
169
             ((class db-class) wrapper slot-name)
 
170
    (declare (ignore wrapper slot-name))
 
171
    ())
 
172
 
 
173
- The implementation of the slot access generic functions have been
 
174
  considerably streamlined.  The impenetrable macrology which used to be
 
175
  used is now gone.
 
176
 
 
177
- Because the behavior of the underlying slot access generic functions
 
178
  has changed, it is possible that some user code which hacks the
 
179
  underlying instance structure may break.  Most of this code shouldn't
 
180
  break though.  There have been some questions on the mailing list
 
181
  about what is the right way to modify the structure of an instance.
 
182
  I am working on that section of chapter 3 right now, and will answer
 
183
  those questions sometime soon.
 
184
 
 
185
 
 
186
*** Changes to SETF generic functions ***
 
187
 
 
188
This release of PCL includes a significant change related to the order
 
189
of arguments of setf generic functions.  To most user programs, this
 
190
change should be invisible.  Your program should run just fine in the
 
191
new version of PCL.  Even so, there is some conversion you should do to
 
192
your program, since DEFMETHOD-SETF is now obsolete and will be going
 
193
away soon.
 
194
 
 
195
Some programs may take some work to adapt to this change.  This will
 
196
be particularly true of programs which manipulated methods for setf
 
197
generic-functions using make-instance, add-method and friends.
 
198
 
 
199
Included here is a brief overview of this change to PCL.  Most people
 
200
will find that this is all they need to know about this change.
 
201
 
 
202
The CLOS specification assumes a default behavior for SETF in the
 
203
absence of any defsetf or define-modify-macro.  The default behavior is
 
204
to expand forms like:
 
205
 
 
206
   (SETF (FOO x y) a)
 
207
 
 
208
into:
 
209
 
 
210
   (FUNCALL #'(SETF FOO) a x y)
 
211
 
 
212
The key point is that by default, setf expands into a call to a function
 
213
with a well-defined name, and that in that call, the new value argument
 
214
comes before all the other arguments.
 
215
 
 
216
This requires a change in PCL, because previously, PCL arranged for the
 
217
new-value argument to be the last required argument.  This change
 
218
affects the way automatically generated writer methods work, and the way
 
219
that defmethod with a first argument of the form (SETF <symbol>) works.
 
220
 
 
221
An important point is that I cannot implement function names of the form
 
222
(SETF <symbol>) portably in PCL.  As a result, in PCL, I am using names
 
223
of the form |SETF FOO|.  Note that the symbol |SETF FOO| is interned in
 
224
the home package of the symbol FOO.  (See the description of the
 
225
GET-SETF-FUNCTION and GET-SETF-FUNCTION-NAME).
 
226
 
 
227
 
 
228
The user-visible changes are:
 
229
 
 
230
- DEFMETHOD will accept lists of the form (SETF FOO) as a first
 
231
  argument.  This will define methods on the generic function named
 
232
  by the symbol |SETF FOO|.  As specified in the spec, these methods
 
233
  should expect to receive the new-value as their first argument.
 
234
  Calls to defmethod of this form will also arrange for SETF of FOO to
 
235
  expand into an appropriate call to |SETF FOO|.
 
236
 
 
237
- Automatically generated writer methods will expect to receive the new
 
238
  value as their first argument.
 
239
 
 
240
- DEFMETHOD-SETF will also place the new-value as the first argument.
 
241
  This is for backward compatibility, since defmethod-setf itself will
 
242
  be obsolete, and you should convert your code to stop using it.
 
243
 
 
244
- GET-SETF-FUNCTION is a function which takes a function name and
 
245
  returns the setf function for that function if there is one.  Note
 
246
  that it doesn't take an environment argument.  Note that this function
 
247
  is not specified in Common Lisp or CLOS.  PCL will continue to support
 
248
  it as an extra export indefinetely.
 
249
 
 
250
- GET-SETF-FUNCTION-NAME is a function which takes a function name
 
251
  and returns the symbol which names the setf function for that
 
252
  function.  Note that this function  is not specified in Common Lisp
 
253
  or CLOS.  PCL will continue to support it as an extra export
 
254
  indefinetely. 
 
255
 
 
256
- For convenience, PCL defines a macro called DO-STANDARD-DEFSETF which
 
257
  can be used to do the appropriate defsetf.  This may be helpful for
 
258
  programs which have calls to setf of a generic-function before any
 
259
  of the generic function's method definitions.  A use of this macro
 
260
  looks like:
 
261
 
 
262
     (do-standard-defsetf position-x)
 
263
 
 
264
  Afterwards, a form like (SETF (POSITION-X P) V) will expand into a
 
265
  form like (|SETF POSITION-X| V P).
 
266
 
 
267
  The reason you may have to use do-standard-defsetf is that I cannot
 
268
  portably change every implementations SETF to have the new default
 
269
  behavior.  The proper way to use this is to take an early file in
 
270
  your system, and put a bunch of calls to do-standard-defsetf in it.
 
271
  Note that as soon as PCL sees a defmethod with a name argument of
 
272
  the form (SETF FOO), or it sees a :accessor in a defclass, it will
 
273
  do an appropriate do-standard-defsetf for you.
 
274
 
 
275
 
 
276
In summary, the only things that will need to be changed in most
 
277
programs is that uses of defmethod-setf should be converted to
 
278
appropriate uses of defmethod.
 
279
 
 
280
Here is an example of a typical user program which is affected by this
 
281
change.  
 
282
 
 
283
(defclass position ()
 
284
    ((x :initform 0 :accessor pos-x)
 
285
     (y :initform 0 :accessor pos-y)))
 
286
 
 
287
(defclass monitored-position (position)
 
288
    ())
 
289
 
 
290
(defmethod-setf pos-x :before ((p monitored-position)) (new)
 
291
  (format *trace-output* "~&Changing x coord of ~S to ~D." p new))
 
292
 
 
293
(defmethod-setf pos-y :before ((p monitored-position)) (new)
 
294
  (format *trace-output* "~&Changing y coord of ~S to ~D." p new))
 
295
 
 
296
 
 
297
To bring this program up to date, you should convert the two
 
298
defmethod-setf forms as follows:
 
299
 
 
300
(defmethod (setf pos-x) :before (new (p monitored-position))
 
301
  (format *trace-output* "~&Changing x coord of ~S to ~D." p new))
 
302
 
 
303
(defmethod (setf pos-y) :before (new (p monitored-position))
 
304
  (format *trace-output* "~&Changing y coord of ~S to ~D." p new))
 
305
 
 
306
 
 
307
*** Other changes in this release ***
 
308
 
 
309
* The symbols exported by the PCL package have now changed.  The PCL
 
310
package now exports the symbols listed in the table of contents of
 
311
chapter 2 of the spec.  This list of symbols is the value of the
 
312
variable pcl::*exports*.
 
313
 
 
314
Following is the list of symbols which were exported in the 8/2/88
 
315
version but which are not exported in the 8/18/88 version.
 
316
 
 
317
DEFMETHOD-SETF      DEFGENERIC-OPTIONS      DEFGENERIC-OPTIONS-SETF
 
318
CLASS-CHANGED       CLASS-NAMED             SYMBOL-CLASS
 
319
CBOUNDP             GET-METHOD              GET-SETF-GENERIC-FUNCTION
 
320
MAKE-METHOD-CALL 
 
321
 
 
322
Following is the list of symbols which are exported in the 8/18/88
 
323
version, but which were not exported in previous versions:
 
324
 
 
325
CALL-METHOD         CLASS-NAME              COMPUTE-APPLICABLE-METHODS
 
326
DEFGENERIC          ENSURE-GENERIC-FUNCTION FIND-METHOD
 
327
FUNCTION-KEYWORDS   GENERIC-FLET            GENERIC-LABELS
 
328
INITIALIZE-INSTANCE MAKE-INSTANCES-OBSOLETE NO-APPLICABLE-METHOD
 
329
NO-NEXT-METHOD      REINITIALIZE-INSTANCE   SHARED-INITIALIZE
 
330
SLOT-BOUNDP         SLOT-EXISTS-P           SLOT-MAKUNBOUND
 
331
SLOT-MISSING        SLOT-UNBOUND            SYMBOL-MACROLET
 
332
UPDATE-INSTANCE-FOR-DIFFERENT-CLASS
 
333
UPDATE-INSTANCE-FOR-REDEFINED-CLASS
 
334
WITH-ADDED-METHODS
 
335
 
 
336
It should be noted that not all of these newly exported symbols have
 
337
been "implemented" yet.
 
338
 
 
339
 
 
340
* Any program written using PCL will need to be completely recompiled
 
341
to run with this release of PCL.
 
342
 
 
343
* The generic-function generic-function-pretty-arglist now returns a
 
344
nice arglist for any generic function.  It combines all the keyword
 
345
arguments accepted by the methods to get the combined set of keywords.
 
346
In some ports, the environment specific ARGLIST function has been
 
347
connected to this, and so the environments will print out nice arglists
 
348
for generic functions.
 
349
 
 
350
* Some bugs in trace-method have been fixed.  Trace-method should now
 
351
work in all ports of PCL.
 
352
 
 
353
* NO-MATCHING-METHOD has been renamed to NO-APPLICABLE-METHOD.  In
 
354
addition, it now receives arguments as specified.
 
355
 
 
356
* defmethod has been modified to allow macros which expand into
 
357
declarations.
 
358
 
 
359
* The :documentation slot option is now accepted in defclass forms.  The
 
360
documentation string put here cannot yet be retrieved using the
 
361
documentation function.  That will happen in a later release.
 
362
 
 
363
* The :writer slot option is now implemented.
 
364
 
 
365
* Some brain damage in high.lisp which caused method lookup to work
 
366
incorrectly for built in classes.  In addition, it caused the
 
367
class-local-supers and class-direct-subclasses of the built in classes
 
368
to be strange.  People using CLOS browsers should notice this change
 
369
dramatically, as it will make the browse of the built in part of the
 
370
class lattice look right.
 
371
 
 
372
 
 
373
*** Older Changes ***
 
374
 
 
375
Following are changes which appeared in release of PCL from 7/7/88 to
 
376
8/2/88.  Each change is marked with the release it appeared in.
 
377
 
 
378
 
 
379
 
 
380
8/2/88
 
381
Loading defclass forms should be much faster now.  The bug which caused
 
382
all the generic functions in the world to be invalidated whenever a
 
383
class was defined has now been fixed.
 
384
 
 
385
Loading defmethod forms should also be much faster.  A bug which caused
 
386
a tremendous amount of needles computation whenever a method was also
 
387
fixed.
 
388
 
 
389
 
 
390
 
 
391
8/2/88
 
392
A bug which caused several slots of the classes T, OBJECT, CLASS and
 
393
STANDARD-CLASS to be unbound has been fixed.
 
394
 
 
395
 
 
396
 
 
397
8/1/88
 
398
load-pcl now adds the symbols :PCL and :PORTABLE-COMMONLOOPS to
 
399
*features*.
 
400
 
 
401
PCL still doesn't do any sort of call to PROVIDE because of the total
 
402
lack of uniformity in the behavior of require and provide in the various
 
403
common lisp implementations.
 
404
 
 
405
 
 
406
8/1/88
 
407
This version of PCL finally fixes the horrible bug that prevented
 
408
the initform for :class allocation slots from being evaluated when the
 
409
class was defined.
 
410
 
 
411
 
 
412
7/20/88
 
413
PCL now converts the function describe into a generic function of one
 
414
argument.  This is to bring it into conformance with the spec as
 
415
described in 88-002.
 
416
 
 
417
In Symbolics Genera, it is actually a function of one required and one
 
418
optional argument.  This is because the 3600 sometimes calls describe
 
419
with more than one argument.
 
420
 
 
421
In Lucid Lisp, describe only takes an optional argument.  This argument
 
422
defaults to the value of *.  PCL converts describe to a generic function
 
423
of one required argument so it is not possible to call describe with
 
424
only one argument.
 
425
 
 
426
 
 
427
7/7/88
 
428
class-named and symbol-class have been replaced by find-class.
 
429
find-class is documented in 88-002R.
 
430
 
 
431
 
 
432
7/7/88
 
433
with-slots and with-accessors now conform to 88-002R.
 
434
 
 
435
The old definition of with-slots is now called obsolete-with-slots.  The
 
436
same is true for with-accessors.
 
437
 
 
438
   with-slots    ---> obsolete-with-slots
 
439
   with-accessors --> obsolete-with-accessors
 
440
 
 
441
The temporary correct definition of with-slots, with-slots* is now
 
442
called with-slots. The same is true for with-accessors*.
 
443
 
 
444
   with-slots*    --> with-slots
 
445
   with-accessors* -> with-accessors
 
446
 
 
447
 
 
448
7/7/88
 
449
The class-precedence list of the class null now conforms to 88-002R.
 
450
 
 
451
In previous releases of PCL, the class precedence-list of the class
 
452
null was: (null list symbol sequence t).  In this release the class
 
453
precedence list of the class null is: (null symbol list sequence t).
 
454
 
 
455
This change was made to bring PCL into conformance with the spec.
 
456
 
 
457
 
 
458
 
 
459
7/7/88
 
460
 
 
461
print-object now takes only two arguments.
 
462
 
 
463
This changes was made to begin bringing print-object in conformance with
 
464
88-002R.  print-object conforms to the spec to the extent that is is
 
465
called at the approrpiate times for PCL instances.  In most
 
466
implementations, it is not called at the appropriate times for other
 
467
instances.  This is not under my control, encourage your vendor to
 
468
provide the proper support for print-object.
 
469
 
 
470
 
 
471
7/7/88
 
472
This version of PCL now includes a beta test version of a new iteration
 
473
package.  This iteration package was designed by Pavel Curtis and
 
474
implemented by Bill vanMelle.  This iteration package is defined in the
 
475
file iterate.lisp.  Please feel free to experiment with it.  We are all
 
476
very interested in comments on its use.
 
477
 
 
478
 
 
479
 
 
480
*** PCL Features that will be disappearing ***
 
481
 
 
482
This section describes features in PCL that will be disappearing in
 
483
future releases.  For each change, I try to give a release date after
 
484
which I will feel free to remove this feature.  This list should not be
 
485
considered complete.  Certain other PCL features will disappear as well.
 
486
The items on this list are the user-interface level items that it is
 
487
possible to give a lot of warning about.  Other changes will have more
 
488
subtle effects, for example when the lambda-list congruence rules are
 
489
implemented.
 
490
 
 
491
- :accessor-prefix in defclass 
 
492
 
 
493
Can disappear anytime after 8/29.
 
494
 
 
495
Warning that this is obsolete has been out for some time.  You should
 
496
use :accessor in each of the slot specifications of the defclass form.
 
497
It is true that this is slightly more cumbersome, but the semantic
 
498
difficulties associated with :accesor-prefix are even worse.
 
499
 
 
500
- :constructor in defclass
 
501
 
 
502
Can disappear anytime after 8/29.
 
503
 
 
504
Warning that this is obsolete has been out for some time.  It will be
 
505
disappearing shortly because the intialization protocol which it goes
 
506
with will be disappearing.  A future release of PCL will support a
 
507
special mechanism for defining functions of the form:
 
508
 
 
509
(defun make-foo (x y &optional z)
 
510
  (make-instance 'foo 'x x :y y :z z))
 
511
 
 
512
In the case where there are only :after methods on initialize-instance
 
513
and shared-initialize, these functions will run like the wind.  We hope
 
514
to release this facility by 9/15.
 
515
 
 
516
- old definition of make-instance, intialize, initialize-from-defaults,
 
517
  initialize-from-init-plist
 
518
 
 
519
Can disappear anytime after 8/29.
 
520
 
 
521
Convert to using the new initialization protocol as described in the
 
522
spec and above.
 
523
 
 
524
- mki, old definition of initialize-instance
 
525
 
 
526
Can disappear anytime after 8/29.
 
527
 
 
528
Convert to using the new initialization protocol as described in the
 
529
spec and above.
 
530
 
 
531
- defmethod-setf
 
532
 
 
533
Can disappear anytime after 9/15.
 
534
 
 
535
Convert to using (defmethod (setf foo) ...
 
536
 
 
537