Hi there! I found this while writing some code for work earlier (I'm lucky enough to be able to write testing programs in the language of my choice). I define a class and a generic method in a module in a file, then load it into the REPL. I can make an instance of that class, binding it to a variable at the toplevel, and use the generic method just fine. If I then reload my code, I cannot use the generic method with the bound instance: I get the "no method defined for given argument classes" error. If my class and generic method definitions are not in a module, everything works fine. I'm wondering if this is me misunderstanding something, or it is intentional behaviour, or maybe it's a bug. Here is a concrete example:
;; FILE: coops-test-1.scm (define-class <a-class> (<standard-object>) ((a 2) (b 3))) (define-method (lols (instance <a-class>)) (+ (slot-value instance 'a) (slot-value instance 'b))) ;; FILE: coops-test-2.scm (module foo (<a-class> lols) (import scheme chicken coops) (define-class <a-class> (<standard-object>) ((a 2) (b 3))) (define-method (lols (instance <a-class>)) (+ (slot-value instance 'a) (slot-value instance 'b))) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #;1> (use coops) ; loading /opt/chicken/lib/chicken/5/coops.import.so ... ; loading /opt/chicken/lib/chicken/5/scheme.import.so ... ; loading /opt/chicken/lib/chicken/5/chicken.import.so ... ; loading /opt/chicken/lib/chicken/5/matchable.import.so ... ; loading /opt/chicken/lib/chicken/5/srfi-1.import.so ... ; loading /opt/chicken/lib/chicken/5/data-structures.import.so ... ; loading /opt/chicken/lib/chicken/5/extras.import.so ... ; loading /opt/chicken/lib/chicken/5/record-variants.import.so ... ; loading /opt/chicken/lib/chicken/5/foreign.import.so ... ; loading /opt/chicken/lib/chicken/5/coops.so ... #;2> (load "coops-test-1.scm") ; loading coops-test-1.scm ... Note: implicitly defining generic-procedure: lols #;3> (define instance (make <a-class>)) #;4> (lols instance) 5 #;5> (load "coops-test-1.scm") ; loading coops-test-1.scm ... #;6> (lols instance) 5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #;1> (use coops) ; loading /opt/chicken/lib/chicken/5/coops.import.so ... ; loading /opt/chicken/lib/chicken/5/scheme.import.so ... ; loading /opt/chicken/lib/chicken/5/chicken.import.so ... ; loading /opt/chicken/lib/chicken/5/matchable.import.so ... ; loading /opt/chicken/lib/chicken/5/srfi-1.import.so ... ; loading /opt/chicken/lib/chicken/5/data-structures.import.so ... ; loading /opt/chicken/lib/chicken/5/extras.import.so ... ; loading /opt/chicken/lib/chicken/5/record-variants.import.so ... ; loading /opt/chicken/lib/chicken/5/foreign.import.so ... ; loading /opt/chicken/lib/chicken/5/coops.so ... #;2> (load "coops-test-2.scm") ; loading coops-test-2.scm ... Note: implicitly defining generic-procedure: lols #;3> (import foo) #;4> (define instance (make <a-class>)) #;5> (lols instance) 5 #;6> (load "coops-test-2.scm") ; loading coops-test-2.scm ... Note: implicitly defining generic-procedure: lols #;7> (lols instance) Error: (lols) no method defined for given argument classes: (#<coops standard-class `<a-class>'>) Call history: <syntax> (lols instance) <eval> (lols instance) <-- I'm using Chicken 4.6.1 (git 7ac10a2fb9b04d114af97d8c9918bffae38cc534) on Linux AMD64 with COOPS 0.8 to test this. I notice that you get the warning about automatically defining the generic method twice, at each load, maybe that's indicative of the problem? Is there a way to make this work? Thanks. -- Taylor C. Venable http://metasyntax.net/
_______________________________________________ Chicken-users mailing list Chicken-users@nongnu.org http://lists.nongnu.org/mailman/listinfo/chicken-users