<div dir="ltr">Thanks for your answer.<br>Too bad -- I guess I'll have to rewrite the custom print then.<br><br>Laurent<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Dec 2, 2013 at 9:16 PM, Vincent St-Amour <span dir="ltr"><<a href="mailto:stamourv@ccs.neu.edu" target="_blank">stamourv@ccs.neu.edu</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">`define/generic' binds the specified generic function to a new<br>
identifier, to allow methods to call the generic function recursively.<br>
In your case, your `write-proc' calls `super-write' which, after<br>
dispatch, calls your `write-proc' again.<br>
<br>
What you want would be some a bit like CLOS's `call-next-method', which<br>
Racket's generics don't have.<br>
<br>
I can't think of a way to do what you want, short of reimplementing the<br>
behavior for `print' in your method.<br>
<br>
The interface for `gen:custom-write' (which it inherited from<br>
`prop:custom-write') is not great. IMO, it would be nicer to have<br>
`write', `display' and `print' be separate methods (which would support<br>
your use case), but I don't know how to retrofit that on top of the<br>
existing custom-write interface provided by runtime system.<br>
<br>
Vincent<br>
<br>
<br>
<br>
At Mon, 2 Dec 2013 18:05:59 +0100,<br>
Laurent wrote:<br>
><br>
> [1  <multipart/alternative (7bit)>]<br>
> [1.1  <text/plain; ISO-8859-1 (7bit)>]<br>
<div><div class="h5">> Anyone has an answer to this?<br>
><br>
> Thanks,<br>
> Laurent<br>
><br>
><br>
> On Tue, Nov 12, 2013 at 1:58 PM, Laurent <<a href="mailto:laurent.orseau@gmail.com">laurent.orseau@gmail.com</a>> wrote:<br>
><br>
> > I'm trying to implement a custom writer for a struct with generics, but I<br>
> > think I'm misunderstanding something.<br>
> ><br>
> > What I want to do is specialize only the behavior for `write' and<br>
> > `display', but leave the behavior for `print' untouched. So I thought that<br>
> > is what define/generic was for, but the following loops indefinitely:<br>
> ><br>
> > #lang racket<br>
> > (require racket/generic)<br>
> ><br>
> > (struct A (x y)<br>
> >   #:transparent<br>
> >   #:methods gen:custom-write<br>
> >   [(define/generic super-write write-proc)<br>
> >    (define (write-proc a port mode)<br>
> >      (case mode<br>
> >        [(#t) (write (list (A-x a) (A-y a)) port)]<br>
> >        [(#f) (display (list (A-x a) (A-y a)) port)]<br>
> >        [else (super-write a port mode)]))])<br>
> ><br>
> > (define a (A 1 'b))<br>
> > (displayln a) ; ok<br>
> > (write a)(newline) ; ok<br>
> > (print a)(newline) ; infinite loop<br>
> ><br>
> > What's the correct way to do that then?<br>
> ><br>
> > Thanks,<br>
> > Laurent<br>
> ><br>
</div></div>> [1.2  <text/html; ISO-8859-1 (quoted-printable)>]<br>
><br>
> [2  <text/plain; us-ascii (7bit)>]<br>
> ____________________<br>
>   Racket Users list:<br>
>   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</blockquote></div><br></div>