Summary

coops: Hygiene issue with ensure-generic-procedure

Metadata

Attachments

Description

This program:

 (use extras coops)
 
 (define-class <foo> ())
 (define-class <bar> (<foo>))
 
 (define-method (foo (x <foo>)) `(<foo>  ,x))
 
 (define-syntax define-foo
   (syntax-rules ()
     ((_ class)
      (define-method (foo (x class))
        `(class ,x)))))
 
 (define-foo <bar>)
 
 (pp (foo (make <foo>)))
 (pp (foo (make <bar>)))

results in this output:

 Note: implicitly defining generic-procedure: foo
 
 Note: implicitly defining generic-procedure: foo170
 
 Error: (foo) no method defined for given argument classes: (#<coops standard-class `<foo>'>)
 
 	Call history:
 
 	<eval>	  (list198 (quote197 x171))
 	<eval>	  (funcallable-generic-procedure200 (slot-value201 %gp195 (quote197 generic-procedure202)) %gp195)
 	<eval>	  (slot-value201 %gp195 (quote197 generic-procedure202))
 	<eval>	  (create-generic-procedure207 (quote208 (setter191 foo170)) (list209 (quote208 x171)))
 	<eval>	  (list209 (quote208 x171))
 	<eval>	  (funcallable-generic-procedure211 (slot-value212 %gp206 (quote208 generic-procedure213)) %gp206)
 	<eval>	  (slot-value212 %gp206 (quote208 generic-procedure213))
 	<eval>	  ((slot-value180 foo170 (quote181 add-new-primary-method182)) (list183 <bar>) (call-next-method-lambd......
 	<eval>	  (slot-value180 foo170 (quote181 add-new-primary-method182))
 	<eval>	  (list183 <bar>)
 	<syntax>	  (pp (foo (make <foo>)))
 	<syntax>	  (foo (make <foo>))
 	<syntax>	  (make <foo>)
 	<eval>	  (pp (foo (make <foo>)))
 	<eval>	  (foo (make <foo>))
 	<eval>	  (make <foo>)	<--

Note how the second implicit generic procedure definition mentions a renamed identifier. Indeed, using an equivalent but direct method definition like this instead:

 (define-method (foo (x <bar>))
   `(<bar> ,x))

works fine. The attached patch fixes this but I'm not sure if it's the correct way to do it.

Changes and comments

[2013-07-28 23:51:52 UTC] syn attached ensure-generic-procedure-fix.diff (description=#f)

[2014-05-02 00:15:02 UTC] felix changed status from new to closed

[2014-05-02 00:15:02 UTC] felix set resolution to fixed

[2014-05-02 00:15:02 UTC] felix wrote:

Thanks - I have added the change to coops 1.93.