To provide a little more context, the problem I am trying to solve is this: 
Often in Java I see constructors that have a pattern of (ClassName. X) 
where X is some static integer value. For example, in Swing you build a Box 
like so (Box. BoxLayout/X_AXIS). I want to simplify this by doing something 
along the lines of (make-box :x_axis) by building the symbol and passing it 
into the constructor. Here is a complete example of how I've solved the 
problem using eval:

(import '(javax.swing Box BoxLayout))

(defn make-symbol[sym] (->> x name .toUpperCase (str "BoxLayout/") symbol))

;This works, but I am eval-ing. Seems like I could use a macro instead.
(defn make-box[box-type]
  (Box. (eval (make-symbol box-type))))

;Works
(make-box :x_axis)

;Works
(map make-box [:x_axis :y_axis])

;My first attempt using a macro
(defmacro make-box-macro[box-type]
  `(Box. (make-symbol ~box-type)))

;ClassCastException - Symbol cannot be cast to java.lang.Number
(make-box-macro :x_axis)

;Hmmm, works, but still using eval. Might as well use the defn.
(defmacro make-box-macro2[box-type]
  `(let[x# (make-symbol ~box-type)]
     (Box. (eval x#))))

(make-box-macro2 :x_axis)

Hopefully one of you can point out some small change I need to make to make 
this work. Any help would be appreciated. I've read brave clojure and 
learnxinyminutes, but I am still missing something.

Thanks,
Mark

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to