summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-12 17:55:59 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-12 17:55:59 +0000
commit562e883ed0e195564b924831631ae01897be11c9 (patch)
tree2a89825f790211bec2b2f78a8191627d3e22fcb6 /src
parentc66048a95c042a098881b7b6d32e9d548f76cdd6 (diff)
reader line-numbers ISeqs
Diffstat (limited to 'src')
-rw-r--r--src/boot.clj6
-rw-r--r--src/jvm/clojure/lang/LispReader.java18
-rw-r--r--src/jvm/clojure/lang/RT.java2
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("^");