Hello,
debian testing
GNU Guile 2.0.11 [ mine is .10-fa1a3-dirty, but it does not matter
[ i'm stuck in that version until goops is patched
[ and compiles guile-gnome again...
#:export does not honor the merge-generics contract
#:export should be adapted to honor the 'merge-generics user request and 'contract'.
What ever forces the 'system' to create a generic function, #:export in this case,
when 'merge-generics has been set, the system should or use the imported generic and
add the newly locally defined method, or create a new one [if that is necessary for its
internal machinery] _but_ [immediately] merge it with th imported one, since it is
the user request.
Right now, even with the merge-generic setting, #:export calls
module-ensure-local-variable! before anything else, creates a new get-with
var, first unbound, later turned into a generic function with 1
applicable [locally defined] method only _but_ it does _not_not merge it, leading to "No
applicable method..." bugs, as in the following example [simple and stupid, but it
only partially mimics real case situation, see the image.scm attachment of this mail
if you're interested http://www.mail-archive.com/guile-devel@gnu.org/msg12618.html
Happy hacking,
David
;; module a starts here
(define-module (a)
#:use-module (oop goops)
#:export (
!width
get-width
set-width))
(define-class ()
(width #:accessor !width #:init-keyword #:width #:init-value 0))
(define-method (get-width (self ))
(!width self))
(define-method (set-width (self ) width)
(set! (!width self) width))
;; module a ends here
;; module b starts here
(define-module (b)
#:use-module (oop goops)
#:use-module (a)
#:export (
!width
get-width
set-width))
(define-class ()
(width #:accessor !width #:init-keyword #:width #:init-value 0))
(define-method (initialize (self ) initargs)
(next-method)
(let ((a (make )))
(set-width self (get-width a))
#;(add-child b a)))
(define-method (get-width (self ))
(!width self))
(define-method (set-width (self ) width)
(set! (!width self) width))
;; module b ends here
scheme@(guile-user)> ,use (oop goops)
scheme@(guile-user)> (default-duplicate-binding-handler '(merge-generics replace warn-override-core warn last))
scheme@(guile-user)> ,use (b)
;;; note: source file ./b.scm
;;; newer than compiled /home/david/.cache/guile/ccache/2.0-LE-8-2.0/usr/alto/projects/guile-tests/goops/export/b.scm.go
;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0
;;; or pass the --no-auto-compile argument to disable.
;;; compiling ./b.scm
;;; compiled /home/david/.cache/guile/ccache/2.0-LE-8-2.0/usr/alto/projects/guile-tests/goops/export/b.scm.go
scheme@(guile-user)> (make )
ERROR: In procedure scm-error:
ERROR: No applicable method for #< get-width (1)> in call (get-width #< 2b70880>)
Entering a new prompt. Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]> ,bt
In oop/goops.scm:
1553:4 3 (# #< 28cb8…>)
In guile-tests/goops/export/b.scm:
17:20 2 (# #<<…> …)
In oop/goops/dispatch.scm:
239:9 1 (cache-miss #< get-width (1)> (#< 2b70880>))
In unknown file:
0 (scm-error goops-error #f "No applicable method for ~S in call ~S" (#< …> …) …)
scheme@(guile-user) [1]>