I want a macro that generates two defn's.

(defn vote-suspend [this] (deref (.state this)))
(defn vote-resume [this state] (reset! (.state this) state))

I have written this:

(defmacro suspendable [prefix]
  `(do (defn ~(symbol (str prefix "suspend")) [~'this] (deref (.state 
~'this)))
       (defn ~(symbol (str prefix "resume")) [~'this ~'state] (reset! 
(.state ~'this) ~'state))))

It works but it has both defn's in *do *block*.*

(*do* (clojure.core/defn vote-suspend [this] (clojure.core/deref (.state 
this))) (clojure.core/defn vote-resume [this state] (clojure.core/reset! 
(.state this) state)))


is it possible to generate defn's without *do* ?


I tried this:

(defmacro suspendable [prefix]
  (list `(defn ~(symbol (str prefix "suspend")) [~'this] (deref (.state 
~'this)))
        `(defn ~(symbol (str prefix "resume")) [~'this ~'state] (reset! 
(.state ~'this) ~'state))))

But it creates parentheses around defn:

user>  (macroexpand-1  '(suspendable vote-))
((clojure.core/defn vote-suspend [this] (clojure.core/deref (.state this))) 
(clojure.core/defn vote-resume [this state] (clojure.core/reset! (.state 
this) state)))


Maybe splice it?

(defmacro suspendable [prefix]
  ~@(list `(defn ~(symbol (str prefix "suspend")) [~'this] (deref (.state 
~'this)))
          `(defn ~(symbol (str prefix "resume")) [~'this ~'state] (reset! 
(.state ~'this) ~'state))))

*Attempting to call unbound fn: #'clojure.core/unquote-splicing*      

*unquote-splicing* must be inside syntax-quote block, right ?    

This creates parentheses again:

(defmacro suspendable [prefix]
  `( ~@(list `(defn ~(symbol (str prefix "suspend")) [~'this] (deref 
(.state ~'this)))
            `(defn ~(symbol (str prefix "resume")) [~'this ~'state] (reset! 
(.state ~'this) ~'state)))))

Is it not possible to return two sexp's from a macro ?

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to