Hi all,
Is there any easy-to-use library for generating java code?
I ended up writing simple function that takes strings and characters
and prints them in formatted form (e.g. with tabs and newlines after
braces).
I really like compojure approach to build html page - is there any
similar libraries exist for arbitrary code generation?
P.S.: my approach to code generation is as follows:
;; ==================================================
;; fail function just throws exception
(def tab-count (ref 0))
(def was-newline (ref false))
(def tab-unit " ")
(defn pgf-reset
"Resets printing facility"
{:static true}
[]
(ref-set tab-count 0)
(ref-set was-newline false))
(defn pgf
"Printing facility for java programming language"
{:static true}
[& more]
(letfn [(align []
(let [aligned @was-newline]
(if aligned (print (apply str (repeat @tab-count tab-
unit))))
(ref-set was-newline false)
aligned))
(align-and-print [val]
(align)
(print val))
(put-newline []
(print \newline)
(ref-set was-newline true))]
(doseq [elem more]
(cond
(char? elem) (do
;; update tab-count
(cond
(= elem \tab) (fail "Tab is auto-applied
hence unexpected in " more)
(= elem \newline) (put-newline)
(= elem \{) (do
;; print space before open
block if it isn't first in line
(if-not (align) (print \space))
(ref-set tab-count (inc @tab-
count))
(print \{)
(put-newline))
(= elem \}) (do
(ref-set tab-count (dec @tab-
count))
;; validate tab-count
(if (< @tab-count 0) (fail
"While printing " more ", tab-count=" @tab-count))
;; align, print '\{' and
newline
(align-and-print \})
(put-newline))
;; just print element itself
:else (align-and-print elem)))
(string? elem) (align-and-print elem)
(number? elem) (align-and-print (str elem)) ;; TODO: java-
specific conversion should go here
(symbol? elem) (align-and-print (str elem))
:else (fail "Don't know how to print " elem)))))
#_(dosync
(pgf-reset)
(pgf "class Foo" \{
"public static void main(String[] args)" \{
"System.out.println(" \" "Hello, world!" \" ");" \newline
\}
\})
nil)
;; ==================================================
I personally don't like it for (1) side effects and (2) using outer
variables, but the other approaches I came up with seem to me to be
more verbose/inelegant.
Constructive criticism is greatly appreciated.
--
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