And as long as we're wishing, it would be awfully nice if INSPECT could
also report on closures, telling about the values of the bound variables.
-34:
- WHN test case: Compile this file:
- (eval-when (:compile-toplevel :load-toplevel :execute)
- (defclass a-class () (a)))
- (defconstant +a-constant+ (make-instance 'a-class))
- (defconstant +another-constant+ (vector +a-constant+))
- as reported by Robert Strandh on the CMU CL mailing list 12 Jun 2000:
- $ cat xx.lisp
- (defconstant +a-constant+ (make-instance 'a-class))
- (defconstant +another-constant+ (vector +a-constant+))
- $ lisp
- CMU Common Lisp release x86-linux 2.4.19 8 February 2000 build 456,
- running on
- bobby
- Send bug reports and questions to your local CMU CL maintainer,
- or to pvaneynd@debian.org
- or to cmucl-help@cons.org. (prefered)
- type (help) for help, (quit) to exit, and (demo) to see the demos
- Loaded subsystems:
- Python 1.0, target Intel x86
- CLOS based on PCL version: September 16 92 PCL (f)
- * (defclass a-class () ())
- #<STANDARD-CLASS A-CLASS {48027BD5}>
- * (compile-file "xx.lisp")
- Python version 1.0, VM version Intel x86 on 12 JUN 00 08:12:55 am.
- Compiling:
- /home/strandh/Research/Functional/Common-Lisp/CLIM/Development/McCLIM
- /xx.lisp 12 JUN 00 07:47:14 am
- Compiling Load Time Value of (PCL::GET-MAKE-INSTANCE-FUNCTION-SYMBOL
- '(A-CLASS NIL NIL)):
- Byte Compiling Top-Level Form:
- Error in function C::DUMP-STRUCTURE: Attempt to dump invalid
- structure:
- #<A-CLASS {4803A5B5}>
- How did this happen?
-
35:
The compiler assumes that any time a function of declared FTYPE
doesn't signal an error, its arguments were of the declared type.
80:
(fixed early Feb 2001 by MNA)
+81:
+ As reported by wbuss@TELDA.NET (Wolfhard Buss) on cmucl-help
+ 2001-02-14,
+ According to CLHS
+ (loop with (a . b) of-type float = '(0.0 . 1.0)
+ and (c . d) of-type float = '(2.0 . 3.0)
+ return (list a b c d))
+ should evaluate to (0.0 1.0 2.0 3.0). cmucl-18c disagrees and
+ invokes the debugger: "B is not of type list".
+ SBCL does the same thing.
+
KNOWN BUGS RELATED TO THE IR1 INTERPRETER
some time ago.
changes in sbcl-0.6.11 relative to sbcl-0.6.10:
+* bug 34 fixed by Martin Atzmueller: dumping/loading instances works
+ better
+* fixed bug 40: TYPEP, SUBTYPEP, UPGRADED-ARRAY-ELEMENT-TYPE,
+ and UPGRADED-COMPLEX-PART-TYPE now work better with of compound
+ types built from undefined types, e.g. '(VECTOR SOME-UNDEF-TYPE).
* The Gray subclassable streams extension now works, thanks to a
patch from Martin Atzmueller.
+* DESCRIBE now works on structure objects again.
+* Compiler output is now more verbose, with messages truncated
+ later than before. (There should be some supported way for users
+ to override the default verbosity, but I haven't decided how to
+ provide it yet, so this behavior is still controlled by the internal
+ SB-C::*COMPILER-ERROR-PRINT-FOO* variables in
+ src/compiler/ir1util.lisp.)
* The full LOAD-FOREIGN extension (not just the primitive
LOAD-FOREIGN-1) now works, thanks to a patch from Martin Atzmueller.
* The default behavior of RUN-PROGRAM has changed. Now, unlike CMU CL
but like most other programs, it defaults to copying the Unix
environment from the original process instead of starting the
new process in an empty environment.
-* fixed bug 40: TYPEP, SUBTYPEP, UPGRADED-ARRAY-ELEMENT-TYPE,
- and UPGRADED-COMPLEX-PART-TYPE now work better with of compound
- types built from undefined types, e.g. '(VECTOR SOME-UNDEF-TYPE).
* Extensions which manipulate the Unix environment now support
an :ENVIRONMENT keyword option which doesn't smash case or
do other bad things. The CMU-CL-style :ENV option is retained
for porting convenience.
* LOAD-FOREIGN (and LOAD-1-FOREIGN) now support logical pathnames,
as per Daniel Barlow's suggestion and Martin Atzmueller's patch
-* DESCRIBE now works on structure objects again.
* Fasl file format version numbers have increased again, because
- support for the Gray streams extension changes the format of the
- system's stream objects.
+ support for the Gray streams extension changes the layout of the
+ system's STREAM objects.
planned incompatible changes in 0.7.x:
* The debugger prompt sequence now goes "5]", "5[2]", "5[3]", etc.
((instance :reader unbound-slot-instance :initarg :instance)
(slot :reader unbound-slot-slot :initarg :slot))
(:report (lambda(condition stream)
- (format stream "The slot ~S is unbound in the object ~S"
+ (format stream "The slot ~S is unbound in the object ~S."
(unbound-slot-slot condition)
(unbound-slot-instance condition)))))
(let* ((class (class-of object))
(slot-definition (find-slot-definition class slot-name)))
(if (null slot-definition)
- (slot-missing class object slot-name 'setf)
+ (slot-missing class object slot-name 'setf new-value)
(setf (slot-value-using-class class object slot-definition)
new-value))))
(setf (gdefinition 'set-slot-value-normal) #'set-slot-value)
-(define-compiler-macro set-slot-value (object-form slot-name-form new-value-form)
+(define-compiler-macro set-slot-value (object-form
+ slot-name-form
+ new-value-form)
(if (and (constantp slot-name-form)
(let ((slot-name (eval slot-name-form)))
(and (symbolp slot-name) (symbol-package slot-name))))
(cond ((std-instance-p object)
;; FIXME: EQ T (WRAPPER-STATE ..) is better done
;; through INVALID-WRAPPER-P (here and below).
- (unless (eq 't (wrapper-state (std-instance-wrapper object)))
+ (unless (eq t (wrapper-state (std-instance-wrapper
+ object)))
(check-wrapper-validity object))
(%instance-ref (std-instance-slots object) location))
((fsc-instance-p object)
- (unless (eq 't (wrapper-state (fsc-instance-wrapper object)))
+ (unless (eq t (wrapper-state (fsc-instance-wrapper
+ object)))
(check-wrapper-validity object))
(%instance-ref (fsc-instance-slots object) location))
(t (error "unrecognized instance type"))))
(cons
(cdr location))
(t
- (error "The slot ~S has neither :INSTANCE nor :CLASS allocation, ~@
- so it can't be read by the default ~S method."
+ (error "~@<The slot ~S has neither :INSTANCE nor :CLASS ~
+ allocation, so it can't be read by the default ~
+ ~S method.~@:>"
slotd 'slot-value-using-class)))))
(if (eq value +slot-unbound+)
(slot-unbound class object (slot-definition-name slotd))
(typecase location
(fixnum
(cond ((std-instance-p object)
- (unless (eq 't (wrapper-state (std-instance-wrapper object)))
+ (unless (eq t (wrapper-state (std-instance-wrapper object)))
(check-wrapper-validity object))
- (setf (%instance-ref (std-instance-slots object) location) new-value))
+ (setf (%instance-ref (std-instance-slots object) location)
+ new-value))
((fsc-instance-p object)
- (unless (eq 't (wrapper-state (fsc-instance-wrapper object)))
+ (unless (eq t (wrapper-state (fsc-instance-wrapper object)))
(check-wrapper-validity object))
- (setf (%instance-ref (fsc-instance-slots object) location) new-value))
+ (setf (%instance-ref (fsc-instance-slots object) location)
+ new-value))
(t (error "unrecognized instance type"))))
(cons
(setf (cdr location) new-value))
(t
- (error "The slot ~S has neither :INSTANCE nor :CLASS allocation, ~@
- so it can't be written by the default ~S method."
+ (error "~@<The slot ~S has neither :INSTANCE nor :CLASS allocation, ~
+ so it can't be written by the default ~S method.~:@>"
slotd '(setf slot-value-using-class))))))
(defmethod slot-boundp-using-class
(value (typecase location
(fixnum
(cond ((std-instance-p object)
- (unless (eq 't (wrapper-state (std-instance-wrapper object)))
+ (unless (eq t (wrapper-state (std-instance-wrapper
+ object)))
(check-wrapper-validity object))
(%instance-ref (std-instance-slots object) location))
((fsc-instance-p object)
- (unless (eq 't (wrapper-state (fsc-instance-wrapper object)))
+ (unless (eq t (wrapper-state (fsc-instance-wrapper
+ object)))
(check-wrapper-validity object))
(%instance-ref (fsc-instance-slots object) location))
(t (error "unrecognized instance type"))))
(cons
(cdr location))
(t
- (error "The slot ~S has neither :INSTANCE nor :CLASS allocation, ~@
- so it can't be read by the default ~S method."
+ (error "~@<The slot ~S has neither :INSTANCE nor :CLASS ~
+ allocation, so it can't be read by the default ~S ~
+ method.~@:>"
slotd 'slot-boundp-using-class)))))
(not (eq value +slot-unbound+))))
(typecase location
(fixnum
(cond ((std-instance-p object)
- (unless (eq 't (wrapper-state (std-instance-wrapper object)))
+ (unless (eq t (wrapper-state (std-instance-wrapper object)))
(check-wrapper-validity object))
(setf (%instance-ref (std-instance-slots object) location)
+slot-unbound+))
((fsc-instance-p object)
- (unless (eq 't (wrapper-state (fsc-instance-wrapper object)))
+ (unless (eq t (wrapper-state (fsc-instance-wrapper object)))
(check-wrapper-validity object))
(setf (%instance-ref (fsc-instance-slots object) location)
+slot-unbound+))
(cons
(setf (cdr location) +slot-unbound+))
(t
- (error "The slot ~S has neither :INSTANCE nor :CLASS allocation, ~@
- so it can't be written by the default ~S method."
+ (error "~@<The slot ~S has neither :INSTANCE nor :CLASS allocation, ~
+ so it can't be written by the default ~S method.~@:>"
slotd 'slot-makunbound-using-class))))
nil)
\f
(defmethod slot-missing
((class t) instance slot-name operation &optional new-value)
- (error "When attempting to ~A,~%the slot ~S is missing from the object ~S."
+ (error "~@<When attempting to ~A, the slot ~S is missing from the ~
+ object ~S.~@:>"
(ecase operation
(slot-value "read the slot's value (slot-value)")
(setf (format nil