<HTML><BODY>OK. I agree, that in common case it is not good. <br><br><br>Sat, 24 May 2014 15:43:17 +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_14009390180000000757_BODY"><div dir="ltr"><div><div><div><div>That doesn't sound right to me.<br></div>In the second clause, there already is a `print` method from some superclass, and this `print` method quite probably has a purpose, possibly not related to `printable<%>`, and you may not know what it is for.<br>
</div>But here this behavior is completely overridden for `printable<%>`, which means that if the method is used for its original purpose (which you may not be able to control, e.g., on instantiation) the program may crash.<br>
</div><div>If you do have control on what this original `print` is, then probably it should be renamed to avoid name collision.<br></div><div><br></div>Here I think the correct behavior is to throw an error saying that the class cannot be made `printable<%>` (or maybe implement an `printable2<%>`, but that too looks like bad duct tape).<br>
<br></div><div>Laurent<br></div><div><div><div><div><div><div><div><br><div>On Sat, May 24, 2014 at 3:16 PM, Roman Klochkov <span dir="ltr"><<a href="//e.mail.ru/compose/?mailto=mailto%3akalimehtar@mail.ru" target="_blank">kalimehtar@mail.ru</a>></span> wrote:<br>
<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>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 <<a href="//e.mail.ru/compose/?mailto=mailto%3alaurent.orseau@gmail.com" target="_blank">laurent.orseau@gmail.com</a>>:<div><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>
<div>
<div><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>
</div>
</div>
</div>
</blockquote>
<br>
<br></div><span><font color="#888888">-- <br>Roman Klochkov<br></font></span></div>
</blockquote></div><br></div></div></div></div></div></div></div></div>
</div>
<base href="https://e.mail.ru/" target="_self">
</div>
</div>
</div>
</blockquote>
<br>
<br>-- <br>Roman Klochkov<br></BODY></HTML>