I like to make syntax-optimized functions.

(define-syntax (square stx)
  (syntax-case stx (square expt)
    [(square (square expr)) #'(expt expr 4)]
    [(square (expt expr n)) (if (number? (syntax-e #'n))
                                                 #`(expt expr #,(* (syntax-e 
#'n) 2))
                                                 #'(expt expr (* n 2)))]
    [(square x) #'(* x x)]
    [square #'(lambda (x) (* x x))]))

So I can write  (square (expt x 5)) and have evaluate (expt x 10) and I can 
write (map square '(1 2 3)) and it is also works.

But I dislike to repeate the body of the function in last two cases.

I tryed  

(define-syntax (square stx)
  (let ([body #'(* x x)])
    (syntax-case stx (square expt)
      ...
      ...
      [(square x) body]
      [square #'(lambda (x) #`body)]))

but hygiene prevents me from that:  x: unbound identifier in module in: x How 
can I bind template body with some variable? Or how to rewrite the syntax to 
evade duplication?

-- 
Roman Klochkov
____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to