On Nov 6, 7:48 pm, Stuart Halloway <[EMAIL PROTECTED]> wrote: > I am playing around with using Clojure to control Ant, something along > the lines of Groovy's Gant. [....]
I know next to nothing about ant, and what kind of control will lancet provide, but the proposed syntax reminds me of what I got playing with XML generation. As an exercise, I tried to reproduce clojure's build.xml and pom.xml (the output of the code below differs only in whitespace). Your proposal is more succint (in particular when it comes to properties), but I think it can be easily "expanded" to the representation below (which maps directly into XML). Cheers, Carlos (defn write-attributes [key val & attrs] (print (format " %s=\"%s\"" (name key) val)) (when attrs (apply write-attributes attrs))) (defn write-tag [data close] (let [tag (name (if (coll? data) (first data) data))] (print (format "<%s" tag)) (when (coll? data) (apply write-attributes (rest data))) (if close (do (print "/>") nil) (do (print ">") tag)))) (defn write-xml [tree] (if (coll? tree) (let [values (rest tree) close-tag (write-tag (first tree) (not values))] (when (or (not (= 1 (count values))) (coll? (first values))) (println)) (doall (map write-xml values)) (when close-tag (println (format "</%s>" close-tag)))) (print tree))) ;; build.xml (write-xml '((:project :name "clojure" :default "jar") (:description "Build with \"ant jar\" and then start the REPL via \"java -cp clojure.jar clojure.lang.Repl src/boot.clj\".") ((:property :name "src" :location "src")) ((:property :name "jsrc" :location "${src}/jvm")) ((:property :name "cljsrc" :location "${src}/clj")) ((:property :name "build" :location "classes")) ((:property :name "clojure_jar" :location "clojure.jar")) ((:property :name "bootclj" :location "${cljsrc}/clojure/ boot.clj")) ((:target :name "init") (:tstamp) ((:mkdir :dir "${build}"))) ((:target :name "compile" :depends "init" :description "Compile Java sources.") ((:javac :srcdir "${jsrc}" :destdir "${build}" :includeJavaRuntime "yes" :debug "true" :target "1.5"))) ((:target :name "jar" :depends "compile" :description "Create jar file.") ((:jar :jarfile "${clojure_jar}" :basedir "${build}") ((:fileset :dir "${cljsrc}" :includes "**/*.clj")) (:manifest ((:attribute :name "Main-Class" :value "clojure.lang.Repl")) ((:attribute :name "Class-Path" :value "."))))) ((:target :name "clean" :description "Remove autogenerated files and directories.") ((:delete :dir "${build}"))))) ;; pom.xml (defn write-pom [pom] (println "<?xml version=\"1.0\" encoding=\"UTF-8\"?>") (write-xml (conj pom '(:project :xmlns "http://maven.apache.org/POM/4.0.0" :xmlns:xsi "http//www.w3.org/2001/XMLSchema-instance" :xsi:schemaLocation "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd")))) (write-pom '((:modelVersion "4.0.0") (:groupId "jvm.clojure") (:artifactId "clojure-lang") (:name "clojure-lang") (:version "1.0-SNAPSHOT") (:url "http://clojure.org/") (:build (:sourceDirectory "src/jvm") (:scriptSourceDirectory "src/clj") (:plugins (:plugin (:artifactId "maven-compiler-plugin") (:configuration (:source "1.5") (:target "1.5") (:optimize "true")))) (:resources (:resource (:directory "src/clj/")))))) --~--~---------~--~----~------------~-------~--~----~ 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 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 -~----------~----~----~----~------~----~------~--~---