Как создать макрос для определения двух функций в clojure

Код ниже не ведет себя так, как я ожидал.

; given a function name, its args and body, create 2 versions:
; i.e., (double-it foo []) should create 2 functions: foo and foo*
(defmacro double-it             
  [fname args & body]       
  `(defn ~fname ~args [email protected]) 
  `(defn ~(symbol (str fname "*")) ~args [email protected]))

Приведенный выше код не создает две функции, как я ожидал бы. Он создает только последний.

user=> (double-it deez [a b] (str b a))
#'user/deez*

Как я могу получить один макрос для определения двух функций?

Ответы

Ответ 1


; given a function name, its args and body, create 2 versions:
; ie (double-it foo [] ) should create 2 functions: foo and foo*
(defmacro double-it                
  [fname args & body]         
  `(do (defn ~fname ~args [email protected])
       (defn ~(symbol (str fname "*")) ~args [email protected])))

(double-it afunc [str] (println str))

(afunc* "asd")
(afunc "asd")

Не нужно указывать их отдельно.