summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-10-15 21:02:08 +0000
committerRich Hickey <richhickey@gmail.com>2008-10-15 21:02:08 +0000
commitbd0ca4e2dc44f98935db5806886be898313028e3 (patch)
tree000c1453559bf4f422448248221e79f9ed211c2c /src
parentbe542947ad5a96930fca37b760c93eb5ced10950 (diff)
simplified regex literal format - no longer need to escape \
patch from Chouser
Diffstat (limited to 'src')
-rw-r--r--src/clj/clojure/boot.clj22
-rw-r--r--src/jvm/clojure/lang/LispReader.java18
2 files changed, 36 insertions, 4 deletions
diff --git a/src/clj/clojure/boot.clj b/src/clj/clojure/boot.clj
index 98123556..fea6ea32 100644
--- a/src/clj/clojure/boot.clj
+++ b/src/clj/clojure/boot.clj
@@ -3568,8 +3568,26 @@
(.write w "M"))
(defmethod print-method java.util.regex.Pattern [p #^Writer w]
- (.append w \#)
- (print-method (str p) w))
+ (.write w "#\"")
+ (loop [[#^Character c & r :as s] (seq (.pattern #^java.util.regex.Pattern p))
+ qmode false]
+ (when s
+ (cond
+ (= c \\) (let [[#^Character c2 & r2] r]
+ (.append w \\)
+ (.append w c2)
+ (if qmode
+ (recur r2 (not= c2 \E))
+ (recur r2 (= c2 \Q))))
+ (= c \") (do
+ (if qmode
+ (.write w "\\E\\\"\\Q")
+ (.write w "\\\""))
+ (recur r qmode))
+ :else (do
+ (.append w c)
+ (recur r qmode)))))
+ (.append w \"))
(defmethod print-method clojure.lang.Namespace [n #^Writer w]
(.write w "#=(find-ns ")
diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java
index afc95835..e3b01c4b 100644
--- a/src/jvm/clojure/lang/LispReader.java
+++ b/src/jvm/clojure/lang/LispReader.java
@@ -364,8 +364,22 @@ static class RegexReader extends AFn{
static StringReader stringrdr = new StringReader();
public Object invoke(Object reader, Object doublequote) throws Exception{
- String str = (String) stringrdr.invoke(reader, doublequote);
- return Pattern.compile(str);
+ StringBuilder sb = new StringBuilder();
+ Reader r = (Reader) reader;
+ for(int ch = r.read(); ch != '"'; ch = r.read())
+ {
+ if(ch == -1)
+ throw new Exception("EOF while reading regex");
+ sb.append( (char) ch );
+ if(ch == '\\') //escape
+ {
+ ch = r.read();
+ if(ch == -1)
+ throw new Exception("EOF while reading regex");
+ sb.append( (char) ch ) ;
+ }
+ }
+ return Pattern.compile(sb.toString());
}
}