summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/boot.clj22
-rw-r--r--src/xml.clj39
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"))