I've been playing around with GOOPS and the metaobject protocol lately. It has been fun, but I've hit a snag with redefinable classes. Here's a contrived example program that demonstrates my problem:
(use-modules (oop goops) (srfi srfi-111)) (define-class <meta> (<class>)) (define (boxed-slot? slot) (get-keyword #:box? (slot-definition-options slot))) (define-method (compute-getter-method (class <meta>) slot) (if (boxed-slot? slot) (make <method> #:specializers (list class) #:procedure (let ((slot-name (slot-definition-name slot))) (lambda (obj) (unbox (slot-ref obj slot-name))))) (next-method))) (define-method (compute-setter-method (class <meta>) slot) (if (boxed-slot? slot) (make <method> #:specializers (list class <top>) #:procedure (let ((slot-name (slot-definition-name slot))) (lambda (obj value) (set-box! (slot-ref obj slot-name) value)))) (next-method))) (define-class <foo> () (bar #:accessor bar #:box? #t #:init-form (box 123)) #:metaclass <meta>) (define-class <redefinable-foo> () (bar #:accessor bar #:box? #t #:init-form (box 123)) #:metaclass <redefinable-class>) ;; This works: (pk (+ (bar (make <foo>)) 456)) ;; This throws an error: (pk (+ (bar (make <redefinable-foo>)) 456)) The above code introduces a metaclass, <meta>, that supports a special slot option: #:box? The metaclass arranges for boxed slots to be boxed/unboxed transparently via the slot's accessor methods when it detects the presence of #:box? #t in the slot options. However, the redefinable class implementation does a transformation of the slot definitions in its compute-slot method and discards all non-standard slot options, so the final line throws an error because the bar method returns a box, not a number. I see two possibilities: 1) Slots are not designed to be extended with custom options, but it just happens to work in the case of <class> 2) There's a bug in compute-slots for <redefinable-class> Is this a bug or as-designed? Thanks, - Dave