<div dir="ltr">Thank you. The `prop:procedure` works as hoped, in that the class instance becomes usable in any form that takes a procedure (including things like map).<div><br></div><div>The `prop:sequence` also works, but … what it seems I really want is `prop:list`, which AFAICT doesn't exist (?)</div><div><br></div><div>The class I'm making is basically a list wrapped with some state. So in terms of the class interface, it would be very convenient to allow a class instance to be used anywhere a list is used.</div><div><br></div><div>The problem with `prop:sequence` is that now I have to use the special sequence versions of list functions, or convert to a list explicitly with `sequence->list`. In terms of class interface, this isn't an improvement over just using a method like (send class-instance get-list).<br><div><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 2, 2014 at 7:43 PM, Alexander D. Knauth <span dir="ltr"><<a href="mailto:alexander@knauth.org" target="_blank">alexander@knauth.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>I don’t know if you can do it with generic interfaces (as in racket/generic), </div><div>but you can make classes whose instances have struct-type properties such as prop:procedure and prop:sequence</div><div>(using interfaces as in racket/class, not racket/generic)</div><div><br></div><div><div><font face="Courier New">#lang racket</font></div><div><font face="Courier New"><br></font></div><div><font face="Courier New">(define proc<%></font></div><div><font face="Courier New">  (interface* ()</font></div><div><font face="Courier New">              ([prop:procedure</font></div><div><font face="Courier New">                (lambda (this . args)</font></div><div><font face="Courier New">                  (send/apply this proc args))])</font></div><div><font face="Courier New">              proc))</font></div><div><font face="Courier New"><br></font></div><div><font face="Courier New">(define proc%</font></div><div><font face="Courier New">  (class* object% (proc<%>)</font></div><div><font face="Courier New">    (super-new)</font></div><div><font face="Courier New">    (define/public (proc x)</font></div><div><font face="Courier New">      (displayln "this is the proc method of proc%")</font></div><div><font face="Courier New">      x)))</font></div><div><font face="Courier New"><br></font></div><div><font face="Courier New">(define seq<%></font></div><div><font face="Courier New">  (interface* ()</font></div><div><font face="Courier New">              ([prop:sequence</font></div><div><font face="Courier New">                (lambda (this)</font></div><div><font face="Courier New">                  (send this get-sequence))])</font></div><div><font face="Courier New">              get-sequence))</font></div><div><font face="Courier New"><br></font></div><div><font face="Courier New">(define seq%</font></div><div><font face="Courier New">  (class* object% (seq<%>)</font></div><div><font face="Courier New">    (super-new)</font></div><div><font face="Courier New">    (define/public (get-sequence)</font></div><div><font face="Courier New">      (list 1 2 3))))</font></div></div><div><font face="Courier New"><br></font></div><div><div><font face="Courier New">> (define p (new proc%))</font></div><div><font face="Courier New">> (p 1)</font></div><div><font face="Courier New">this is the proc method of proc%</font></div><div><font face="Courier New">1</font></div><div><font face="Courier New">> (define s (new seq%))</font></div><div><font face="Courier New">> (sequence-for-each displayln s)</font></div><div><font face="Courier New">1</font></div><div><font face="Courier New">2</font></div><div><font face="Courier New">3</font></div></div><br><div><div><div class="h5"><div>On Oct 2, 2014, at 6:21 PM, Matthew Butterick <<a href="mailto:mb@mbtype.com" target="_blank">mb@mbtype.com</a>> wrote:</div><br></div></div><blockquote type="cite"><div><div class="h5">What's the best approach to:<br><br>+ defining a class whose instances can be used as procedures?<br><br>(define ci (new proc-class%))<br>(ci arg arg2 ... )<br><br>+ ... whose instances can be used as lists (or at least support direct iteration?)<br><br>(define li (new listish-class%))<br>(for-each displayln li)<br>(map ci li)<br><br>My intuition is "implement a generic interface..." But then it gets hazy. <br><br><br><br><br></div></div>____________________<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></blockquote></div><br></div></div></div></div>