diff options
-rw-r--r-- | src/boot.clj | 22 | ||||
-rw-r--r-- | src/xml.clj | 39 |
2 files changed, 37 insertions, 24 deletions
diff --git a/src/boot.clj b/src/boot.clj index c47005c5..92492706 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -999,18 +999,10 @@ (defn distinct [coll] (keys (to-set coll))) -(defn filter-vals [pred amap] +(defn filter-key [keyfn pred amap] (loop [ret {} es (seq amap)] (if es - (if (pred (val (first es))) - (recur (assoc ret (key (first es)) (val (first es))) (rest es)) - (recur ret (rest es))) - ret))) - -(defn filter-keys [pred amap] - (loop [ret {} es (seq amap)] - (if es - (if (pred (key (first es))) + (if (pred (keyfn (first es))) (recur (assoc ret (key (first es)) (val (first es))) (rest es)) (recur ret (rest es))) ret))) @@ -1038,12 +1030,12 @@ (.. *ns* (intern sym) (setExported true)))) (defn exports [#^clojure.lang.Namespace ns] - (filter-vals (fn [v] (and (instance? clojure.lang.Var v) + (filter-key val (fn [v] (and (instance? clojure.lang.Var v) (. v (isExported)))) (ns-map ns))) (defn imports [#^clojure.lang.Namespace ns] - (filter-vals (partial instance? Class) (ns-map ns))) + (filter-key val (partial instance? Class) (ns-map ns))) (defn refer [ns-sym & filters] (let [ns (find-ns ns-sym) @@ -1060,12 +1052,12 @@ (. *ns* (refer (or (rename sym) sym) var))))))) (defn refers [#^clojure.lang.Namespace ns] - (filter-vals (fn [v] (and (instance? clojure.lang.Var v) + (filter-key val (fn [v] (and (instance? clojure.lang.Var v) (!= ns (. v ns)))) (ns-map ns))) (defn interns [#^clojure.lang.Namespace ns] - (filter-vals (fn [v] (and (instance? clojure.lang.Var v) + (filter-key val (fn [v] (and (instance? clojure.lang.Var v) (= ns (. v ns)))) (ns-map ns))) @@ -1152,7 +1144,7 @@ export exports imports ns-map identical? instance? load-file in-ns find-ns - filter-vals filter-keys find-ns create-ns remove-ns + filter-key find-ns create-ns remove-ns take-nth interleave get-var set-var with-local-vars resolve-in resolve all-ns ns-name diff --git a/src/xml.clj b/src/xml.clj index fd5e13e5..f1b15fb9 100644 --- a/src/xml.clj +++ b/src/xml.clj @@ -6,7 +6,8 @@ ; the terms of this license. ; You must not remove this notice, or any other, from this software. -(in-namespace 'xml) +(in-ns 'xml) +(clojure/refer 'clojure) (import '(org.xml.sax ContentHandler Attributes SAXException) '(javax.xml.parsers SAXParser SAXParserFactory)) @@ -30,13 +31,13 @@ (if (neg? i) ret (recur (assoc ret - (. clojure.lang.Keyword (intern (sym (. atts (getQName i))))) + (. clojure.lang.Keyword (intern (symbol (. atts (getQName i))))) (. atts (getValue i))) (dec i)))) e (struct element - :tag (. clojure.lang.Keyword (intern (sym q-name))) - :attrs (when (pos? (. atts (getLength))) - (attrs {} (dec (. atts (getLength))))))] + (. clojure.lang.Keyword (intern (symbol q-name))) + (when (pos? (. atts (getLength))) + (attrs {} (dec (. atts (getLength))))))] (set! *stack* (conj *stack* *current*)) (set! *current* e) (set! *state* :element)) @@ -44,15 +45,15 @@ (endElement [uri local-name q-name] (let [push-content (fn [e c] (assoc e :content (conj (or (:content e) []) c)))] - (when (eql? *state* :chars) + (when (= *state* :chars) (set! *current* (push-content *current* (str *sb*)))) (set! *current* (push-content (peek *stack*) *current*)) (set! *stack* (pop *stack*)) (set! *state* :between)) nil) (characters [ch start length] - (when-not (eql? *state* :between) - (when (eql? *state* :element) + (when-not (= *state* :between) + (when (= *state* :element) (set! *sb* (new StringBuilder))) (let [#^StringBuilder sb *sb*] (. sb (append ch start length)) @@ -68,7 +69,27 @@ (. p (parse s content-handler)) ((:content *current*) 0)))) -(def *exports* '(xml tag attrs content parse)) +(defn emit-element [e] + (if (instance? String e) + (println e) + (do + (print (strcat "<" (name (:tag e)))) + (when (:attrs e) + (doseq attr (:attrs e) + (print (strcat " " (name (key attr)) "='" (val attr)"'")))) + (if (:content e) + (do + (println ">") + (doseq c (:content e) + (emit-element c)) + (println (strcat "</" (name (:tag e)) ">"))) + (println "/>"))))) + +(defn emit [x] + (println "<?xml version='1.0' encoding='UTF-8'?>") + (emit-element x)) + +(export '(tag attrs content parse element emit emit-element)) ;(load-file "/Users/rich/dev/clojure/src/xml.clj") ;(def x (xml/parse "http://arstechnica.com/journals.rssx")) |