<HTML><BODY>Ok, so <br><br>(define (printable %)<br>   (cond<br>     [(implementation % printable<%>) %] ;; already have<br>     [(method-in-interface? 'print (class->interface %)) ;; have another print, should override<br>      ((mixin () (printable<%>) (define/override (print) (displayln this))) %)<br>     [else ;; no method, add<br>       ((mixin () (printable<%>) (define/public (print) (displayln this))) %)))<br><br>Without second clause (method-in-interface? ....), I cannont make an implemetation of printable<%> with given superclass.<br><br><br>Sat, 24 May 2014 12:22:20 +0200 от Laurent <laurent.orseau@gmail.com>:<br>
<blockquote style="margin: 10px; padding: 0px 0px 0px 10px; border-left-color: rgb(8, 87, 166); border-left-width: 1px; border-left-style: solid;">
        <div>
        



    









        
        


        
        
        
        
        

        
        

        
        



<div class="js-helper js-readmsg-msg">
        <style type="text/css"></style>
        <div>
                <base href="https://e.mail.ru/" target="_self">
                
                        <div id="style_14009269620000000437_BODY"><div dir="ltr"><div><div><div> </div><blockquote style="margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;"><div>Another example is a mixin. Suppose I have an interface printable<%> = (interface () print)) and I want to make a mixin printable, that should make any class to implement printable.<br>

The only solution is:<br><br>(define (printable %)<br>   (if (method-in-interface? 'print (class->interface %))<br>       %<br>       ((mixin () (print) (define (print) (displayln this))) %)))<br></div></blockquote>

<div><br></div><div>Here too, and the new class should implement `printable<%>` instead of just implementing the method.<br></div><div>Then to know if you can call `print` on a given object, you should first check that it implements `printable`.<br>

<br></div>Checking for the implementation of the right interface ensures that the method does what you think it should do; because maybe someone has defined another interface `my-printable<%>` that also declares `print` but has a quite different purpose from `printable<%>`.<br>

<div></div><div><br></div><div>Maybe I'm  totally missing something here, but the only correct use I see to `method-in-interface?` is in Racket's implementation of the class system, to check for errors if the method is called but may not exist.</div>

</div><br></div><div>Laurent<br></div></div>

</div>
                        
                
                <base href="https://e.mail.ru/" target="_self">
        </div>

        
</div>


</div>
</blockquote>
<br>
<br>-- <br>Roman Klochkov<br></BODY></HTML>