diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-12 17:55:59 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-12 17:55:59 +0000 |
commit | 562e883ed0e195564b924831631ae01897be11c9 (patch) | |
tree | 2a89825f790211bec2b2f78a8191627d3e22fcb6 /src | |
parent | c66048a95c042a098881b7b6d32e9d548f76cdd6 (diff) |
reader line-numbers ISeqs
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 18 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 2 |
3 files changed, 23 insertions, 3 deletions
diff --git a/src/boot.clj b/src/boot.clj index 774bb5b4..b649d531 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -219,4 +219,8 @@ `(let [~gsym ~x] (try-finally (do (monitor-enter ~gsym) ~@body) - (monitor-exit ~gsym)))))
\ No newline at end of file + (monitor-exit ~gsym))))) + +(defmacro .. + ([x form] `(. ~x ~form)) + ([x form & more] `(.. (. ~x ~form) ~@more)))
\ No newline at end of file diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java index 5a12c544..6fa03009 100644 --- a/src/jvm/clojure/lang/LispReader.java +++ b/src/jvm/clojure/lang/LispReader.java @@ -29,6 +29,7 @@ static Symbol APPLY = Symbol.create("clojure", "apply"); static Symbol HASHMAP = Symbol.create("clojure", "hashmap");
static Symbol VECTOR = Symbol.create("clojure", "vector");
static Symbol WITH_META = Symbol.create("clojure", "with-meta");
+static Keyword LINE_KEY = Keyword.intern("clojure", "line");
static IFn[] macros = new IFn[256];
static Pattern symbolPat = Pattern.compile("[:]?([\\D&&[^:/]][^:/]*/)?[\\D&&[^:/]][^:/]*");
@@ -295,14 +296,22 @@ static class QuoteReader extends AFn{ static class MetaReader extends AFn{
public Object invoke(Object reader, Object caret) throws Exception{
PushbackReader r = (PushbackReader) reader;
+ int line = -1;
+ if(r instanceof LineNumberingPushbackReader)
+ line = ((LineNumberingPushbackReader) r).getLineNumber();
Object meta = read(r, true, null, true);
if(meta instanceof Symbol || meta instanceof Keyword)
meta = RT.map(RT.TAG_KEY, meta);
else if(!(meta instanceof IPersistentMap))
throw new IllegalArgumentException("Metadata must be Symbol,Keyword or Map");
+
Object o = read(r, true, null, true);
if(o instanceof IObj)
+ {
+ if(line != -1 && o instanceof ISeq)
+ meta = ((IPersistentMap) meta).assoc(LINE_KEY, line);
return ((IObj) o).withMeta((IPersistentMap) meta);
+ }
else
throw new IllegalArgumentException("Metadata can only be applied to IObjs");
}
@@ -448,10 +457,17 @@ static class CharacterReader extends AFn{ static class ListReader extends AFn{
public Object invoke(Object reader, Object leftparen) throws Exception{
PushbackReader r = (PushbackReader) reader;
+ int line = -1;
+ if(r instanceof LineNumberingPushbackReader)
+ line = ((LineNumberingPushbackReader) r).getLineNumber();
List list = readDelimitedList(')', r, true);
if(list.isEmpty())
return PersistentList.EMPTY;
- return RT.seq(list);
+ IObj s = (IObj) RT.seq(list);
+ if(line != -1)
+ return s.withMeta(RT.map(LINE_KEY, line));
+ else
+ return s;
}
}
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 0a7acf3e..ee760244 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -583,7 +583,7 @@ static public void print(Object x, Writer w) throws Exception{ if(x instanceof Obj) { Obj o = (Obj) x; - if(o.meta() != null) + if(RT.count(o.meta()) > 0) { IPersistentMap meta = o.meta(); w.write("^"); |