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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.