<div dir="ltr"><div>Ah, I should've said that performance is not ideal with either compose (or thrush), since they build the entire e.g. 10 million long function chain before calling it, so tail-recursive variants below</div><div><br></div><div>(define (iterate f n x)</div><div>  (for/fold ([x x])</div><div>            ([i n])</div><div>    (f x)))</div><div><br></div><div>or with the thread-through thingy</div><div><br></div><div><div>(define (iterate f n x)</div><div>  (for/fold ([x x])</div><div>            ([i n])</div><div>    (~> x f)))</div></div><div><br></div><div>With 128 MB default, DrRacket even ran out of memory with my compose variant. Sorry!</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Mar 14, 2015 at 6:41 PM, Alexis King <span dir="ltr"><<a href="mailto:lexi.lambda@gmail.com" target="_blank">lexi.lambda@gmail.com</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>There’s also the <font face="Courier">thrush</font> function from the point-free package, which uses the argument order of the threading macro while providing the functional style of compose.</div><div><br></div><div><a href="http://pkg-build.racket-lang.org/doc/point-free/index.html?q=thrush#(def._((lib._point-free/main..rkt)._thrush))" target="_blank">http://pkg-build.racket-lang.org/doc/point-free/index.html?q=thrush#%28def._%28%28lib._point-free%2Fmain..rkt%29._thrush%29%29</a></div><div><div class="h5"><br><div><blockquote type="cite"><div>On Mar 14, 2015, at 15:35, Sean Kanaley <<a href="mailto:skanaley@gmail.com" target="_blank">skanaley@gmail.com</a>> wrote:</div><br><div><div dir="ltr">If "thread-through macro" refers to "<a href="http://www.greghendershott.com/2013/05/the-threading-macro.html" target="_blank">http://www.greghendershott.com/2013/05/the-threading-macro.html</a>" then I recommend a functional alternative called "compose":<div><br></div><div><div>(define print/cdr</div><div>  (match-lambda</div><div>    [(cons x xs) (print x) xs]))</div><div><br></div><div>(define print-two</div><div>  (compose print/cdr print/cdr))</div></div><div><br></div><div>The result is chained through naturally since the input and output type of the lower level function are equal.</div><div><br></div><div>For any number of printings</div><div><br></div><div><div>(define (print-n n)</div><div>  (for/fold ([print-n identity])</div><div>            ([i n])</div><div>    (compose print/cdr print-n)))</div></div><div><br></div><div>(define print-two (print-n 2))</div><div><br></div><div>And for any number of anythings</div><div><br></div><div><div>(define (iterate f n)</div><div>  (for/fold ([chain identity])</div><div>            ([i n])</div><div>    (compose f chain)))</div><div><br></div><div>(define print-two (iterate print/cdr 2))</div></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 12, 2015 at 2:25 PM, Don Green <span dir="ltr"><<a href="mailto:infodeveloperdon@gmail.com" target="_blank">infodeveloperdon@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>;Design A:<br></div>;Rating: 1 out of 10<br>;Poor because it uses set!<br><div><div>(define print-two <br>  (lambda (f)<br>   (print (first f))<br>   (set! f (rest f))<br>   (print (first f))<br>   (set! f (rest f))<br>   f))<br><br>(void (print-two '(1 2))) ;=> 12<br>;-------------------------<br><div><div>;Design B:<br></div><div>;Rating: 2 out of 10<br></div>;Better because it nests expressions to avoid using set!<br></div><div>;Poor because it less readable.<br>(define print-two<br>  (lambda (f)<br>    (print (first f))<br>    (print (first (rest f)))<br>    f))<br><br>(void (print-two '(1 2))) ;=> 12<br></div><div>When called in situations that allow one expression only, enclose call within a 'begin' expression.<br></div><div>;-------------------------<br></div><div>;Design C:<br></div><div>;Rating: 3 out of 10<br></div>;Is this an even better design because it is more readable than nesting expressions as in Design B above?<br><div>(define (print-two f)<br>  (let* ([_ (print (first f))]<br>         [f (rest f)]<br>         [_ (print (first f))]<br>         [f (rest f)])<br>    f))<br></div>(void (print-two '(1 2))) ;=> 12<br>;-------------------------<br></div><div>My questions are: <br>"Can you recommend a better method?"<br></div><div>"Can you recommend a better method using 'define with lambda'?"<br>"Does your better method use a macro?"<br></div><div>"Does your better method use a thread-through macro?"  If so, could you please provide the definition of the thread-through macro.<br></div><div>THANKS!<br></div><div><br></div></div></div>
<br>____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br></blockquote></div><br></div>
____________________<br>  Racket Users list:<br>  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br></div></blockquote></div><br></div></div></div></blockquote></div><br></div>