<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>