<br><br><div class="gmail_quote">On Wed, Sep 15, 2010 at 16:17, Matthias Felleisen <span dir="ltr">&lt;<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<br>
Now see Robby&#39;s answer.<br></blockquote><div><br>I have, several times, but I must be blind.<br>The code I gave works for class a%, so certainly a% can be &quot;inspected&quot; by<br>(interface-&gt;method-names (class-&gt;interface a%))<br>

during the expansion of the macro, and it generates the functions names<br>according to the method names, so that their existence is detected at compile <br>time (thanks to datum-&gt;syntax).<br>I suspect this is why the last line &#39;(get-the-val)&#39; in the module doesn&#39;t raise <br>

a syntax error.<br><br>The only remaining problem I have is to abstract class-&gt;singleton over a%,<br>so that the class can be given as an argument to the macro.<br><br>Ah, in fact I&#39;ve just found a (probably ugly) workaround that I hope to improve<br>

(see below):<br>To abstract over a%, I just turned class-&gt;singleton into a macro-maker<br>that takes a class (at compile time) and instantiate define-class-&gt;singleton<br>for a given class.<br><br>I am a bit puzzled since this does not match your (kind) answers so I must<br>

have either badly explained my problem, or badly understood your answers <br>(or both).<br><br>Anyway, thanks a lot for your help.<br><br>Laurent<br>P.S.: If anyone knows how to improve this, I&#39;m interested.<br><br> <br>

<br>&lt;singleton.rkt&gt;<br>#lang racket<br><br>(require (for-syntax racket/class))<br><br>(define-syntax-rule (define-singleton-sender func obj meth)<br>  (begin (printf &quot;define-sender: ~s ~s ~s\n&quot; &#39;func &#39;obj &#39;meth)<br>

         (define (func . args)<br>           (send/apply (obj) meth args))))<br><br>(define-syntax-rule (define-class-&gt;singleton define-name cl)<br>  (define-syntax (define-name stx)<br>    (syntax-case stx ()<br>      [(_ obj)<br>

       (with-syntax ([(name (... ...))<br>                      (map (ë(n)(datum-&gt;syntax #&#39;obj n))<br>                           (interface-&gt;method-names (class-&gt;interface cl)))])<br>         #&#39;(begin (define-singleton-sender name obj name)<br>

                  (... ...)))])))<br><br>; Tests<br><br>(require &quot;a.rkt&quot;<br>         (for-syntax &quot;a.rkt&quot;))<br><br>; Instantiate the macro for a% :<br>(define-class-&gt;singleton a%-&gt;singleton a%)<br>

<br>(define current-a (make-parameter (new a% [val 3])))<br><br>(a%-&gt;singleton current-a)<br><br>(get-the-val)<br><br>-&gt;<br>define-sender: get-the-val current-a get-the-val<br>3<br><br><br></div></div>