diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-10-15 21:02:08 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-10-15 21:02:08 +0000 |
commit | bd0ca4e2dc44f98935db5806886be898313028e3 (patch) | |
tree | 000c1453559bf4f422448248221e79f9ed211c2c /src | |
parent | be542947ad5a96930fca37b760c93eb5ced10950 (diff) |
simplified regex literal format - no longer need to escape \
patch from Chouser
Diffstat (limited to 'src')
-rw-r--r-- | src/clj/clojure/boot.clj | 22 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 18 |
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());
}
}
|