From: Bruno H. <br...@cl...> - 2004-08-02 11:44:37
|
In SBCL 0.8.11, the function compute-default-initargs is expected to return a list of the form ((keyword function) ...), but according to the MOP it should return a list of the form ((keyword form function) ...). See MOP p. 39, description of compute-default-initargs "The value returned by this generic function is a list of canonicalized default initialization arguments." and MOP p. 16 "A canonicalized default initarg is a list of three elements. The first element is the name; the second is the actual form itself; and the third is a function of zero arguments which, when called, returns the result of evaluating the default value form its proper lexical environment." Here is a test case. If you change (list ':extra '*extra-value* #'(lambda () *extra-value*)) to (list ':extra #'(lambda () *extra-value*)) it works in SBCL. I.e. SBCL implements a different protocol. ;; Check that it's possible to add additional initargs. (progn (defparameter *extra-value* 'extra) (defclass custom-default-initargs-class (standard-class) ()) (defmethod sb-pcl:compute-default-initargs ((class custom-default-initargs-class)) (let ((original-default-initargs (remove-duplicates (reduce #'append (mapcar #'sb-pcl:class-direct-default-initargs (sb-pcl:class-precedence-list class))) :key #'car :from-end t))) (cons (list ':extra '*extra-value* #'(lambda () *extra-value*)) (remove ':extra original-default-initargs :key #'car)))) #-CLISP (defmethod sb-pcl:validate-superclass ((c1 custom-default-initargs-class) (c2 standard-class)) t) (defclass testclass10 () ((slot :initarg :extra)) (:metaclass custom-default-initargs-class)) (slot-value (make-instance 'testclass10) 'slot)) Expected: EXTRA Got: ERROR Bruno |
From: Christophe R. <cs...@ca...> - 2004-08-05 11:39:46
|
Bruno Haible <br...@cl...> writes: > In SBCL 0.8.11, the function compute-default-initargs is expected to return > a list of the form ((keyword function) ...), but according to the MOP it > should return a list of the form ((keyword form function) ...). See > MOP p. 39, description of compute-default-initargs > "The value returned by this generic function is a list of canonicalized > default initialization arguments." > and MOP p. 16 > "A canonicalized default initarg is a list of three elements. The first > element is the name; the second is the actual form itself; and the third > is a function of zero arguments which, when called, returns the result > of evaluating the default value form its proper lexical environment." Interesting. Do you use the actual form itself for anything in CLISP? What could it be used for (error reporting, maybe, if it evaluates to something that is of the wrong type for a slot? Dunno)? Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |
From: Bruno H. <br...@cl...> - 2004-08-05 12:11:53
|
Christophe Rhodes wrote: > Do you use the actual form itself for anything in CLISP? The only use of it in clisp is for the SLOT-DEFINITION-INITFORM generic function, specified by the MOP. Obviously if there is a MOP function for accessing the initializer form, then the compute-default-initargs protocol must have a way for specifying it. > What could it be used for (error reporting Yes, error reporting or stack traces (in case of an error that happens during MAKE-INSTANCE or SHARED-INITIALIZE). Bruno |
From: Christophe R. <cs...@ca...> - 2005-06-01 13:20:46
|
Bruno Haible <br...@cl...> writes: > In SBCL 0.8.11, the function compute-default-initargs is expected to > return a list of the form ((keyword function) ...), but according to > the MOP it should return a list of the form ((keyword form function) > ...). Thanks for the report. I'm hoping that the silence on this issue from member of this list means that no-one has been specializing COMPUTE-DEFAULT-INITARGS for their own purposes, because I have made SBCL conform to the MOP in sbcl-0.9.1.14. Cheers, Christophe |