<HTML><BODY><p>I like to make syntax-optimized functions.<br><br>(define-syntax (square stx)<br>&nbsp; (syntax-case stx (square expt)<br>&nbsp; &nbsp; [(square (square expr)) #'(expt expr 4)]<br>&nbsp; &nbsp; [(square (expt expr n)) (if (number? (syntax-e #'n))<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#`(expt expr #,(* (syntax-e #'n) 2))<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#'(expt expr (* n 2)))]<br>&nbsp; &nbsp; [(square x) #'(* x x)]<br>&nbsp; &nbsp; [square #'(lambda (x) (* x x))]))<br><br>So I can write &nbsp;(square (expt x 5)) and have evaluate (expt x 10) and I can write (map square '(1 2 3)) and it is also works.<br><br>But I dislike to repeate the body of the function in last two cases.<br><br>I tryed &nbsp;<br><br></p><p>(define-syntax (square stx)<br>&nbsp; (let ([body #'(* x x)])<br>&nbsp; &nbsp;&nbsp;(syntax-case stx (square expt)<br>&nbsp; &nbsp; &nbsp; ...<br>&nbsp; &nbsp; &nbsp; ...<br>&nbsp; &nbsp; &nbsp; [(square x) body]<br>&nbsp; &nbsp; &nbsp; [square #'(lambda (x) #`body)]))<br><br>but hygiene prevents me from that: &nbsp;x: unbound identifier in module in: x</p>How can I bind template body with some variable? Or how to rewrite the syntax to evade duplication?<br><br>-- <br>Roman Klochkov</BODY></HTML>